Make Service base type optional
[sdc.git] / catalog-ui / src / app / ng2 / pages / composition / panel / composition-panel.component.spec.ts
1 import { NO_ERRORS_SCHEMA } from '@angular/core';
2 import { async, ComponentFixture } from '@angular/core/testing';
3 import { NgxsModule, Store } from '@ngxs/store';
4 import { Observable } from 'rxjs';
5 import { Mock } from 'ts-mockery';
6 import { ConfigureFn, configureTests } from '../../../../../jest/test-config.helper';
7 import { Service } from '../../../../models/components/service';
8 import { Resource } from '../../../../models/components/resource';
9 import { GroupInstance } from '../../../../models/graph/zones/group-instance';
10 import { PolicyInstance } from '../../../../models/graph/zones/policy-instance';
11 import { ArtifactGroupType } from '../../../../utils/constants';
12 import { WorkspaceState } from '../../../store/states/workspace.state';
13 import { CompositionPanelComponent } from './composition-panel.component';
14 import { ArtifactsTabComponent } from './panel-tabs/artifacts-tab/artifacts-tab.component';
15 import { GroupMembersTabComponent } from './panel-tabs/group-members-tab/group-members-tab.component';
16 import { GroupOrPolicyPropertiesTab } from './panel-tabs/group-or-policy-properties-tab/group-or-policy-properties-tab.component';
17 import { InfoTabComponent } from './panel-tabs/info-tab/info-tab.component';
18 import { PolicyTargetsTabComponent } from './panel-tabs/policy-targets-tab/policy-targets-tab.component';
19 import { PropertiesTabComponent } from './panel-tabs/properties-tab/properties-tab.component';
20 import { ReqAndCapabilitiesTabComponent } from './panel-tabs/req-capabilities-tab/req-capabilities-tab.component';
21 import {SubstitutionFilterTabComponent} from "./panel-tabs/substitution-filter-tab/substitution-filter-tab.component";
22 import {InterfaceOperationsComponent} from "../interface-operatons/interface-operations.component";
23
24 describe('composition-panel component', () => {
25
26     let fixture: ComponentFixture<CompositionPanelComponent>;
27     let store: Store;
28
29     const tabs = {
30         infoTab: {
31             titleIcon: 'info-circle',
32             component: InfoTabComponent,
33             input: {},
34             isActive: true,
35             tooltipText: 'Information',
36             testId: 'detail-tab-information'
37         },
38         policyProperties: {
39             titleIcon: 'settings-o',
40             component: GroupOrPolicyPropertiesTab,
41             input: {type: 'policy'},
42             isActive: false,
43             tooltipText: 'Properties',
44             testId: 'detail-tab-policy-properties'
45         },
46         policyTargets: {
47             titleIcon: 'inputs-o',
48             component: PolicyTargetsTabComponent,
49             input: {},
50             isActive: false,
51             tooltipText: 'Targets',
52             testId: 'detail-tab-policy-targets'
53         },
54         groupMembers: {
55             titleIcon: 'inputs-o',
56             component: GroupMembersTabComponent,
57             input: {},
58             isActive: false,
59             tooltipText: 'Members',
60             testId: 'detail-tab-group-members'
61         },
62         groupProperties: {
63             titleIcon: 'settings-o',
64             component: GroupOrPolicyPropertiesTab,
65             input: {type: 'group'},
66             isActive: false,
67             tooltipText: 'Properties',
68             testId: 'detail-tab-group-properties'
69         },
70         deploymentArtifacts: {
71             titleIcon: 'deployment-artifacts-o',
72             component: ArtifactsTabComponent,
73             input: {type: ArtifactGroupType.DEPLOYMENT},
74             isActive: false,
75             tooltipText: 'Deployment Artifacts',
76             testId: 'detail-tab-deployment-artifacts'
77         },
78         apiArtifacts: {
79             titleIcon: 'api-o',
80             component: ArtifactsTabComponent,
81             input: {type: ArtifactGroupType.SERVICE_API},
82             isActive: false,
83             tooltipText: 'API Artifacts',
84             testId: 'detail-tab-api-artifacts'
85         },
86         infoArtifacts: {
87             titleIcon: 'info-square-o',
88             component: ArtifactsTabComponent,
89             input: {type: ArtifactGroupType.INFORMATION},
90             isActive: false,
91             tooltipText: 'Information Artifacts',
92             testId: 'detail-tab-information-artifacts'
93         },
94         properties: {
95             titleIcon: 'settings-o', component: PropertiesTabComponent,
96             input: {title: 'Properties and Attributes'}, isActive: false, tooltipText: 'Properties',
97             testId: 'detail-tab-properties-attributes'
98         },
99         reqAndCapabilities: {
100             titleIcon: 'req-capabilities-o', component: ReqAndCapabilitiesTabComponent, input: {},
101             isActive: false, tooltipText: 'Requirements and Capabilities',
102             testId: 'detail-tab-requirements-capabilities'
103         },
104         substitutionFilter: {
105             titleIcon: 'composition-o',
106             component: SubstitutionFilterTabComponent,
107             input: {title: 'SUBSTITUTION FILTER'},
108             isActive: false,
109             tooltipText: 'Substitution Filter',
110             testId: 'detail-tab-substitution-filter'
111         },
112         inputs: {
113             titleIcon: 'inputs-o',
114             component: PropertiesTabComponent,
115             input: {title: 'Inputs'},
116             isActive: false,
117             tooltipText: 'Inputs',
118             testId: 'detail-tab-inputs'
119         },
120         settings: {
121             titleIcon: 'settings-o',
122             component: PropertiesTabComponent,
123             input: {},
124             isActive: false,
125             tooltipText: 'Settings',
126             testId: 'detail-tab-settings'
127         },
128         interfaceOperations: {
129             titleIcon: 'composition-o',
130             component: InterfaceOperationsComponent,
131             input: {title: 'Interface Operations'},
132             isActive: false,
133             tooltipText: 'Interface Operations',
134             testId: 'detail-tab-interface-operations'
135         }
136     };
137
138     beforeEach(
139         async(() => {
140
141             const configure: ConfigureFn = (testBed) => {
142                 testBed.configureTestingModule({
143                     declarations: [CompositionPanelComponent],
144                     imports: [NgxsModule.forRoot([WorkspaceState])],
145                     schemas: [NO_ERRORS_SCHEMA],
146                     providers: [],
147                 });
148             };
149
150             configureTests(configure).then((testBed) => {
151                 fixture = testBed.createComponent(CompositionPanelComponent);
152                 store = testBed.get(Store);
153             });
154         })
155     );
156
157     it('When PolicyInstance Selected => Expect (info, policyTargets and policyProperties) tabs appear', () => {
158
159         const testInstance = new PolicyInstance();
160
161         fixture.componentInstance.initTabs(testInstance);
162         expect (fixture.componentInstance.tabs.length).toBe(3);
163         expect (fixture.componentInstance.tabs[0]).toEqual(tabs.infoTab);
164         expect (fixture.componentInstance.tabs[1]).toEqual(tabs.policyTargets);
165         expect (fixture.componentInstance.tabs[2]).toEqual(tabs.policyProperties);
166     });
167
168     it('should match current snapshot of composition-panel component.', () => {
169         expect(fixture).toMatchSnapshot();
170     });
171
172     it('When Topology Template is Service and no instance is selected Expect tabs info, deployment, inputs, info, api, substitution filter', () => {
173         const selectedComponent: Service = new Service(null, null);
174         selectedComponent.isResource = jest.fn(() => false);
175         selectedComponent.isService = jest.fn(() => true);
176         selectedComponent.isSubstituteCandidate = jest.fn(() => true);
177         fixture.componentInstance.store.select = jest.fn(() => Observable.of(selectedComponent));
178
179         fixture.componentInstance.topologyTemplate = selectedComponent;
180
181         // Call ngOnInit
182         fixture.componentInstance.ngOnInit();
183
184         // Expect that
185         expect(fixture.componentInstance.tabs.length).toBe(6);
186         expect(fixture.componentInstance.tabs[0]).toEqual(tabs.infoTab);
187         expect(fixture.componentInstance.tabs[1]).toEqual(tabs.deploymentArtifacts);
188         expect(fixture.componentInstance.tabs[2]).toEqual(tabs.inputs);
189         expect(fixture.componentInstance.tabs[3]).toEqual(tabs.infoArtifacts);
190         expect(fixture.componentInstance.tabs[4]).toEqual(tabs.apiArtifacts);
191         expect(fixture.componentInstance.tabs[5]).toEqual(tabs.substitutionFilter);
192
193     });
194
195     it('When Topology Template is Service without base type, and no instance is selected. Expect tabs info, deployment, inputs, info and api', () => {
196
197         const selectedComponent: Service = new Service(null, null);
198         selectedComponent.isResource = jest.fn(() => false);
199         selectedComponent.isService = jest.fn(() => true);
200         selectedComponent.isSubstituteCandidate = jest.fn(() => false);
201         fixture.componentInstance.store.select = jest.fn(() => Observable.of(selectedComponent));
202
203         fixture.componentInstance.topologyTemplate = selectedComponent;
204
205         // Call ngOnInit
206         fixture.componentInstance.ngOnInit();
207
208         // Expect that
209         expect(fixture.componentInstance.tabs.length).toBe(5);
210         expect(fixture.componentInstance.tabs[0]).toEqual(tabs.infoTab);
211         expect(fixture.componentInstance.tabs[1]).toEqual(tabs.deploymentArtifacts);
212         expect(fixture.componentInstance.tabs[2]).toEqual(tabs.inputs);
213         expect(fixture.componentInstance.tabs[3]).toEqual(tabs.infoArtifacts);
214         expect(fixture.componentInstance.tabs[4]).toEqual(tabs.apiArtifacts);
215
216     });
217
218     it('When Topology Template is Resource and no instance is selected Expect (info, deployment, inputs, info and api)', () => {
219
220         const selectedComponent: Service = new Service(null, null);
221         selectedComponent.isResource = jest.fn(() => true);
222         selectedComponent.isService = jest.fn(() => false );
223
224         fixture.componentInstance.store.select = jest.fn(() => Observable.of(selectedComponent));
225
226         fixture.componentInstance.topologyTemplate = selectedComponent;
227
228         // Call ngOnInit
229         fixture.componentInstance.ngOnInit();
230
231         // Expect that
232         expect (fixture.componentInstance.tabs.length).toBe(5);
233         expect (fixture.componentInstance.tabs[0]).toEqual(tabs.infoTab);
234         expect (fixture.componentInstance.tabs[1]).toEqual(tabs.deploymentArtifacts);
235         expect (fixture.componentInstance.tabs[2]).toEqual(tabs.properties);
236         expect (fixture.componentInstance.tabs[3]).toEqual(tabs.infoArtifacts);
237         expect (fixture.componentInstance.tabs[4]).toEqual(tabs.reqAndCapabilities);
238
239     });
240
241     it('When Topology Template is Service and proxyService instance is selected ' +
242         'Expect (info, deployment, inputs, info and api)', () => {
243
244         const selectedComponent: Service = new Service(null, null);
245         selectedComponent.isResource = jest.fn(() => false);
246         selectedComponent.isService = jest.fn(() => true );
247         selectedComponent.isSubstituteCandidate = jest.fn(() => true );
248
249         fixture.componentInstance.store.select = jest.fn(() => Observable.of(selectedComponent));
250         fixture.componentInstance.selectedComponentIsServiceProxyInstance = jest.fn(() => true);
251
252         fixture.componentInstance.topologyTemplate = selectedComponent;
253
254         // Call ngOnInit
255         fixture.componentInstance.ngOnInit();
256
257         // Expect that
258         expect (fixture.componentInstance.tabs.length).toBe(7);
259         expect (fixture.componentInstance.tabs[0]).toEqual(tabs.infoTab);
260         expect (fixture.componentInstance.tabs[1]).toEqual(tabs.properties);
261         expect (fixture.componentInstance.tabs[2]).toEqual(tabs.reqAndCapabilities);
262         expect (fixture.componentInstance.tabs[6]).toEqual(tabs.interfaceOperations);
263
264     });
265
266     it('When Topology Template is Resource and VL is selected ' +
267         'Expect (info, deployment, inputs, info and api)', () => {
268
269         const topologyTemplate: Resource = new Resource(null, null);
270         topologyTemplate.isResource = jest.fn(() => true);
271         topologyTemplate.isService = jest.fn(() => false );
272
273         const vlMock = Mock.of<Resource>({ resourceType : 'VL', isResource : () => true, isService : () => false });
274         fixture.componentInstance.store.select = jest.fn(() => Observable.of(vlMock));
275
276         fixture.componentInstance.topologyTemplate = topologyTemplate;
277
278         // Call ngOnInit
279         fixture.componentInstance.ngOnInit();
280
281         // Expect that
282         expect (fixture.componentInstance.tabs.length).toBe(6);
283         expect (fixture.componentInstance.tabs[0]).toEqual(tabs.infoTab);
284         expect (fixture.componentInstance.tabs[1]).toEqual(tabs.deploymentArtifacts);
285         expect (fixture.componentInstance.tabs[2]).toEqual(tabs.properties);
286         expect (fixture.componentInstance.tabs[3]).toEqual(tabs.infoArtifacts);
287         expect (fixture.componentInstance.tabs[4]).toEqual(tabs.reqAndCapabilities);
288
289     });
290
291     it('When Topology Template is Service and VL is selected ' +
292         'Expect (info, deployment, inputs, info and api)', () => {
293
294         const topologyTemplate: Service = new Service(null, null);
295         topologyTemplate.isResource = jest.fn(() => true);
296         topologyTemplate.isService = jest.fn(() => false );
297
298         const vlMock = Mock.of<Resource>({ resourceType : 'VL', isResource : () => true, isService : () => false });
299         fixture.componentInstance.store.select = jest.fn(() => Observable.of(vlMock));
300
301         fixture.componentInstance.topologyTemplate = topologyTemplate;
302
303         // Call ngOnInit
304         fixture.componentInstance.ngOnInit();
305
306         // Expect that
307         expect (fixture.componentInstance.tabs.length).toBe(5);
308         expect (fixture.componentInstance.tabs[0]).toEqual(tabs.infoTab);
309         expect (fixture.componentInstance.tabs[1]).toEqual(tabs.deploymentArtifacts);
310         expect (fixture.componentInstance.tabs[2]).toEqual(tabs.properties);
311         expect (fixture.componentInstance.tabs[3]).toEqual(tabs.infoArtifacts);
312         expect (fixture.componentInstance.tabs[4]).toEqual(tabs.reqAndCapabilities);
313
314     });
315
316     it('When GroupInstance Selected => Expect (info, groupMembers and groupProperties) tabs appear.', () => {
317
318         const testInstance = new GroupInstance();
319         fixture.componentInstance.initTabs(testInstance);
320
321         expect (fixture.componentInstance.tabs.length).toBe(3);
322         expect (fixture.componentInstance.tabs[0]).toEqual(tabs.infoTab);
323         expect (fixture.componentInstance.tabs[1]).toEqual(tabs.groupMembers);
324         expect (fixture.componentInstance.tabs[2]).toEqual(tabs.groupProperties);
325     });
326
327 });