]> git.apps.os.sepia.ceph.com Git - ceph.git/blob
3609467db1e36657fbaa813f0ee53760824e2798
[ceph.git] /
1 import { HttpClientTestingModule } from '@angular/common/http/testing';
2 import { ComponentFixture, TestBed } from '@angular/core/testing';
3 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
4 import { RouterTestingModule } from '@angular/router/testing';
5
6 import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
7 import { ToastrModule } from 'ngx-toastr';
8 import { of } from 'rxjs';
9
10 import { PrometheusService } from '~/app/shared/api/prometheus.service';
11 import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
12 import { TableActionsComponent } from '~/app/shared/datatable/table-actions/table-actions.component';
13 import { NotificationType } from '~/app/shared/enum/notification-type.enum';
14 import { Permission } from '~/app/shared/models/permissions';
15 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
16 import { ModalService } from '~/app/shared/services/modal.service';
17 import { NotificationService } from '~/app/shared/services/notification.service';
18 import { SharedModule } from '~/app/shared/shared.module';
19 import { configureTestBed, PermissionHelper } from '~/testing/unit-test-helper';
20 import { PrometheusTabsComponent } from '../prometheus-tabs/prometheus-tabs.component';
21 import { SilenceListComponent } from './silence-list.component';
22
23 describe('SilenceListComponent', () => {
24   let component: SilenceListComponent;
25   let fixture: ComponentFixture<SilenceListComponent>;
26   let prometheusService: PrometheusService;
27   let authStorageService: AuthStorageService;
28   let prometheusPermissions: Permission;
29
30   configureTestBed({
31     imports: [
32       BrowserAnimationsModule,
33       SharedModule,
34       ToastrModule.forRoot(),
35       RouterTestingModule,
36       HttpClientTestingModule,
37       NgbNavModule
38     ],
39     declarations: [SilenceListComponent, PrometheusTabsComponent]
40   });
41
42   beforeEach(() => {
43     authStorageService = TestBed.inject(AuthStorageService);
44     prometheusPermissions = new Permission(['update', 'delete', 'read', 'create']);
45     spyOn(authStorageService, 'getPermissions').and.callFake(() => ({
46       prometheus: prometheusPermissions
47     }));
48     fixture = TestBed.createComponent(SilenceListComponent);
49     component = fixture.componentInstance;
50     prometheusService = TestBed.inject(PrometheusService);
51   });
52
53   it('should create', () => {
54     fixture.detectChanges();
55     expect(component).toBeTruthy();
56   });
57
58   it('should test all TableActions combinations', () => {
59     const permissionHelper: PermissionHelper = new PermissionHelper(component.permission);
60     const tableActions: TableActionsComponent = permissionHelper.setPermissionsAndGetActions(
61       component.tableActions
62     );
63
64     expect(tableActions).toEqual({
65       'create,update,delete': {
66         actions: ['Create', 'Recreate', 'Edit', 'Expire'],
67         primary: {
68           multiple: 'Create',
69           executing: 'Create',
70           single: 'Create',
71           no: 'Create'
72         }
73       },
74       'create,update': {
75         actions: ['Create', 'Recreate', 'Edit'],
76         primary: {
77           multiple: 'Create',
78           executing: 'Create',
79           single: 'Create',
80           no: 'Create'
81         }
82       },
83       'create,delete': {
84         actions: ['Create', 'Recreate', 'Expire'],
85         primary: {
86           multiple: 'Create',
87           executing: 'Create',
88           single: 'Create',
89           no: 'Create'
90         }
91       },
92       create: {
93         actions: ['Create', 'Recreate'],
94         primary: {
95           multiple: 'Create',
96           executing: 'Create',
97           single: 'Create',
98           no: 'Create'
99         }
100       },
101       'update,delete': {
102         actions: ['Edit', 'Expire'],
103         primary: {
104           multiple: '',
105           executing: '',
106           single: '',
107           no: ''
108         }
109       },
110       update: {
111         actions: ['Edit'],
112         primary: {
113           multiple: 'Edit',
114           executing: 'Edit',
115           single: 'Edit',
116           no: 'Edit'
117         }
118       },
119       delete: {
120         actions: ['Expire'],
121         primary: {
122           multiple: 'Expire',
123           executing: 'Expire',
124           single: 'Expire',
125           no: 'Expire'
126         }
127       },
128       'no-permissions': {
129         actions: [],
130         primary: {
131           multiple: '',
132           executing: '',
133           single: '',
134           no: ''
135         }
136       }
137     });
138   });
139
140   describe('expire silence', () => {
141     const setSelectedSilence = (silenceName: string) =>
142       (component.selection.selected = [{ id: silenceName }]);
143
144     const expireSilence = () => {
145       component.expireSilence();
146       const deletion: CriticalConfirmationModalComponent = component.modalRef.componentInstance;
147       // deletion.modalRef = new BsModalRef();
148       deletion.ngOnInit();
149       deletion.callSubmitAction();
150     };
151
152     const expectSilenceToExpire = (silenceId: string) => {
153       setSelectedSilence(silenceId);
154       expireSilence();
155       expect(prometheusService.expireSilence).toHaveBeenCalledWith(silenceId);
156     };
157
158     beforeEach(() => {
159       const mockObservable = () => of([]);
160       spyOn(component, 'refresh').and.callFake(mockObservable);
161       spyOn(prometheusService, 'expireSilence').and.callFake(mockObservable);
162       spyOn(TestBed.inject(ModalService), 'show').and.callFake((deletionClass, config) => {
163         return {
164           componentInstance: Object.assign(new deletionClass(), config)
165         };
166       });
167     });
168
169     it('should expire a silence', () => {
170       const notificationService = TestBed.inject(NotificationService);
171       spyOn(notificationService, 'show').and.stub();
172       expectSilenceToExpire('someSilenceId');
173       expect(notificationService.show).toHaveBeenCalledWith(
174         NotificationType.success,
175         'Expired Silence someSilenceId',
176         undefined,
177         undefined,
178         'Prometheus'
179       );
180     });
181
182     it('should refresh after expiring a silence', () => {
183       expectSilenceToExpire('someId');
184       expect(component.refresh).toHaveBeenCalledTimes(1);
185       expectSilenceToExpire('someOtherId');
186       expect(component.refresh).toHaveBeenCalledTimes(2);
187     });
188   });
189 });