]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/blob
088202764fe085d57bc0b39d61cc2b013f741f5b
[ceph-ci.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 { BsModalRef, BsModalService, ModalModule } from 'ngx-bootstrap/modal';
7 import { ToastrModule } from 'ngx-toastr';
8 import { of } from 'rxjs';
9
10 import {
11   configureTestBed,
12   i18nProviders,
13   PermissionHelper
14 } from '../../../../../testing/unit-test-helper';
15 import { PrometheusService } from '../../../../shared/api/prometheus.service';
16 import { CriticalConfirmationModalComponent } from '../../../../shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
17 import { TableActionsComponent } from '../../../../shared/datatable/table-actions/table-actions.component';
18 import { NotificationType } from '../../../../shared/enum/notification-type.enum';
19 import { NotificationService } from '../../../../shared/services/notification.service';
20 import { SharedModule } from '../../../../shared/shared.module';
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
28   configureTestBed({
29     imports: [
30       BrowserAnimationsModule,
31       SharedModule,
32       ModalModule.forRoot(),
33       ToastrModule.forRoot(),
34       RouterTestingModule,
35       HttpClientTestingModule
36     ],
37     declarations: [SilenceListComponent],
38     providers: [i18nProviders]
39   });
40
41   beforeEach(() => {
42     fixture = TestBed.createComponent(SilenceListComponent);
43     component = fixture.componentInstance;
44     prometheusService = TestBed.inject(PrometheusService);
45   });
46
47   it('should create', () => {
48     fixture.detectChanges();
49     expect(component).toBeTruthy();
50   });
51
52   it('should test all TableActions combinations', () => {
53     const permissionHelper: PermissionHelper = new PermissionHelper(component.permission);
54     const tableActions: TableActionsComponent = permissionHelper.setPermissionsAndGetActions(
55       component.tableActions
56     );
57
58     expect(tableActions).toEqual({
59       'create,update,delete': {
60         actions: ['Create', 'Recreate', 'Edit', 'Expire'],
61         primary: { multiple: 'Create', executing: 'Edit', single: 'Edit', no: 'Create' }
62       },
63       'create,update': {
64         actions: ['Create', 'Recreate', 'Edit'],
65         primary: { multiple: 'Create', executing: 'Edit', single: 'Edit', no: 'Create' }
66       },
67       'create,delete': {
68         actions: ['Create', 'Recreate', 'Expire'],
69         primary: { multiple: 'Create', executing: 'Expire', single: 'Expire', no: 'Create' }
70       },
71       create: {
72         actions: ['Create', 'Recreate'],
73         primary: { multiple: 'Create', executing: 'Create', single: 'Create', no: 'Create' }
74       },
75       'update,delete': {
76         actions: ['Edit', 'Expire'],
77         primary: { multiple: 'Edit', executing: 'Edit', single: 'Edit', no: 'Edit' }
78       },
79       update: {
80         actions: ['Edit'],
81         primary: { multiple: 'Edit', executing: 'Edit', single: 'Edit', no: 'Edit' }
82       },
83       delete: {
84         actions: ['Expire'],
85         primary: { multiple: 'Expire', executing: 'Expire', single: 'Expire', no: 'Expire' }
86       },
87       'no-permissions': {
88         actions: [],
89         primary: { multiple: '', executing: '', single: '', no: '' }
90       }
91     });
92   });
93
94   describe('expire silence', () => {
95     const setSelectedSilence = (silenceName: string) =>
96       (component.selection.selected = [{ id: silenceName }]);
97
98     const expireSilence = () => {
99       component.expireSilence();
100       const deletion: CriticalConfirmationModalComponent = component.modalRef.content;
101       deletion.modalRef = new BsModalRef();
102       deletion.ngOnInit();
103       deletion.callSubmitAction();
104     };
105
106     const expectSilenceToExpire = (silenceId: string) => {
107       setSelectedSilence(silenceId);
108       expireSilence();
109       expect(prometheusService.expireSilence).toHaveBeenCalledWith(silenceId);
110     };
111
112     beforeEach(() => {
113       const mockObservable = () => of([]);
114       spyOn(component, 'refresh').and.callFake(mockObservable);
115       spyOn(prometheusService, 'expireSilence').and.callFake(mockObservable);
116       spyOn(TestBed.inject(BsModalService), 'show').and.callFake((deletionClass, config) => {
117         return {
118           content: Object.assign(new deletionClass(), config.initialState)
119         };
120       });
121     });
122
123     it('should expire a silence', () => {
124       const notificationService = TestBed.inject(NotificationService);
125       spyOn(notificationService, 'show').and.stub();
126       expectSilenceToExpire('someSilenceId');
127       expect(notificationService.show).toHaveBeenCalledWith(
128         NotificationType.success,
129         'Expired Silence someSilenceId',
130         undefined,
131         undefined,
132         'Prometheus'
133       );
134     });
135
136     it('should refresh after expiring a silence', () => {
137       expectSilenceToExpire('someId');
138       expect(component.refresh).toHaveBeenCalledTimes(1);
139       expectSilenceToExpire('someOtherId');
140       expect(component.refresh).toHaveBeenCalledTimes(2);
141     });
142   });
143 });