Fix 'Upgrading a node does not bring its new capabilities'-bug
[sdc.git] / catalog-ui / src / app / ng2 / pages / composition / panel / panel-header / panel-header.component.spec.ts
1 import {NO_ERRORS_SCHEMA} from '@angular/core';
2 import {ComponentFixture, TestBed} from '@angular/core/testing';
3 import {CompositionService} from 'app/ng2/pages/composition/composition.service';
4 import {EventListenerService} from '../../../../../services/event-listener-service';
5 import {ComponentInstanceServiceNg2} from 'app/ng2/services/component-instance-services/component-instance.service';
6 import {WorkspaceService} from 'app/ng2/pages/workspace/workspace.service';
7 import {GroupsService, PoliciesService} from 'app/services-ng2';
8 import {CompositionPanelHeaderComponent} from './panel-header.component';
9 import {SdcUiServices} from 'onap-ui-angular';
10 import {
11     CapabilitiesGroup,
12     Capability,
13     Component,
14     ComponentInstance,
15     FullComponentInstance,
16     GroupInstance,
17     PolicyInstance,
18     Requirement,
19     RequirementsGroup
20 } from "app/models";
21 import {Observable, of} from "rxjs";
22
23 describe('CompositionPanelHeaderComponent', () => {
24     let component: CompositionPanelHeaderComponent;
25     let fixture: ComponentFixture<CompositionPanelHeaderComponent>;
26     const componentInstanceServiceNg2Stub = {
27         updateComponentInstance: jest.fn()
28     };
29     const valueEditModalInstance = {
30         innerModalContent: {
31             instance: {name: "VF Test"}
32         },
33         buttons: [{id: 'saveButton', text: 'OK', size: 'xsm', callback: jest.fn(), closeModal: false}],
34         closeModal: jest.fn()
35     };
36
37     beforeEach(
38         () => {
39             const compositionServiceStub = {};
40             const eventListenerServiceStub = {};
41
42             const workspaceServiceStub = {
43                 metadata: {
44                     componentType: "SERVICE",
45                     uniqueId: "123"
46                 }
47             };
48             const groupsServiceStub = {
49                 updateName: jest.fn()
50             };
51             const policiesServiceStub = {
52                 updateName: jest.fn()
53             };
54
55             TestBed.configureTestingModule({
56                 schemas: [NO_ERRORS_SCHEMA],
57                 declarations: [CompositionPanelHeaderComponent],
58                 providers: [
59                     {provide: CompositionService, useValue: compositionServiceStub},
60                     {provide: EventListenerService, useValue: eventListenerServiceStub},
61                     {
62                         provide: ComponentInstanceServiceNg2,
63                         useValue: componentInstanceServiceNg2Stub
64                     },
65                     {provide: WorkspaceService, useValue: workspaceServiceStub},
66                     {provide: GroupsService, useValue: groupsServiceStub},
67                     {provide: PoliciesService, useValue: policiesServiceStub},
68                     {provide: SdcUiServices.ModalService, useValue: {}}
69                 ]
70             });
71             fixture = TestBed.createComponent(CompositionPanelHeaderComponent);
72             component = fixture.componentInstance;
73         }
74     );
75
76     it('can load instance', () => {
77         expect(component).toBeTruthy();
78     });
79
80     it('should close the modal without saving if the name has not changed', () => {
81         component.selectedComponent = <FullComponentInstance>{name: "VF Test"};
82         component.valueEditModalInstance = valueEditModalInstance;
83
84         component.saveInstanceName();
85         expect(component.componentInstanceService.updateComponentInstance).not.toHaveBeenCalled();
86         expect(component.valueEditModalInstance.closeModal).toHaveBeenCalled();
87     });
88
89     it('after editing instance name, capabilities/requirements should be updated with new name', () => {
90         const newName = "New VF NAME";
91         component.selectedComponent = new FullComponentInstance(<ComponentInstance>{
92             name: "VF Test",
93             requirements: new RequirementsGroup(),
94             capabilities: new CapabilitiesGroup()
95         }, <Component>{});
96         component.selectedComponent.requirements['key'] = [<Requirement>{ownerName: "VF Test"}, <Requirement>{ownerName: "VF Test"}];
97         component.selectedComponent.capabilities['key'] = [<Capability>{ownerName: "VF Test"}];
98         component.valueEditModalInstance = valueEditModalInstance;
99         component.valueEditModalInstance.innerModalContent.instance.name = newName;
100         jest.spyOn(component.componentInstanceService, 'updateComponentInstance').mockReturnValue(of(<ComponentInstance>{name: newName}));
101         component.saveInstanceName();
102
103         expect(component.selectedComponent.name).toBe(newName);
104         expect(component.selectedComponent.requirements['key'][0].ownerName).toEqual(newName);
105         expect(component.selectedComponent.requirements['key'][1].ownerName).toEqual(newName);
106         expect(component.selectedComponent.capabilities['key'][0].ownerName).toEqual(newName);
107     });
108
109     it('if update fails, name is reverted to old value', () => {
110         component.selectedComponent = new GroupInstance(<GroupInstance>{name: "GROUP NAME"});
111         component.valueEditModalInstance = valueEditModalInstance;
112         jest.spyOn(component.groupService, 'updateName').mockReturnValue(Observable.throw(new Error('Error')));
113         component.saveInstanceName();
114         expect(component.selectedComponent.name).toEqual("GROUP NAME");
115     });
116
117     it('policy instance uses policies service for update name', () => {
118         component.selectedComponent = new PolicyInstance(<PolicyInstance>{name: "Policy OLD NAME"});
119         component.valueEditModalInstance = valueEditModalInstance;
120         jest.spyOn(component.policiesService, 'updateName').mockReturnValue(of(true));
121         component.saveInstanceName();
122         expect(component.policiesService.updateName).toHaveBeenCalledTimes(1);
123     });
124
125     it('group instance uses groups service for update name', () => {
126         component.selectedComponent = new GroupInstance(<GroupInstance>{name: "GROUP NAME"});
127         component.valueEditModalInstance = valueEditModalInstance;
128         jest.spyOn(component.groupService, 'updateName').mockReturnValue(of(true));
129         component.saveInstanceName();
130         expect(component.groupService.updateName).toHaveBeenCalledTimes(1);
131     });
132
133 });