]> git.apps.os.sepia.ceph.com Git - ceph.git/blob
a136b2bac1119b6c328e0d909bc5255df1402766
[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: { multiple: 'Create', executing: 'Edit', single: 'Edit', no: 'Create' }
68       },
69       'create,update': {
70         actions: ['Create', 'Recreate', 'Edit'],
71         primary: { multiple: 'Create', executing: 'Edit', single: 'Edit', no: 'Create' }
72       },
73       'create,delete': {
74         actions: ['Create', 'Recreate', 'Expire'],
75         primary: { multiple: 'Create', executing: 'Expire', single: 'Expire', no: 'Create' }
76       },
77       create: {
78         actions: ['Create', 'Recreate'],
79         primary: { multiple: 'Create', executing: 'Create', single: 'Create', no: 'Create' }
80       },
81       'update,delete': {
82         actions: ['Edit', 'Expire'],
83         primary: { multiple: 'Edit', executing: 'Edit', single: 'Edit', no: 'Edit' }
84       },
85       update: {
86         actions: ['Edit'],
87         primary: { multiple: 'Edit', executing: 'Edit', single: 'Edit', no: 'Edit' }
88       },
89       delete: {
90         actions: ['Expire'],
91         primary: { multiple: 'Expire', executing: 'Expire', single: 'Expire', no: 'Expire' }
92       },
93       'no-permissions': {
94         actions: [],
95         primary: { multiple: '', executing: '', single: '', no: '' }
96       }
97     });
98   });
99
100   describe('expire silence', () => {
101     const setSelectedSilence = (silenceName: string) =>
102       (component.selection.selected = [{ id: silenceName }]);
103
104     const expireSilence = () => {
105       component.expireSilence();
106       const deletion: CriticalConfirmationModalComponent = component.modalRef.componentInstance;
107       // deletion.modalRef = new BsModalRef();
108       deletion.ngOnInit();
109       deletion.callSubmitAction();
110     };
111
112     const expectSilenceToExpire = (silenceId: string) => {
113       setSelectedSilence(silenceId);
114       expireSilence();
115       expect(prometheusService.expireSilence).toHaveBeenCalledWith(silenceId);
116     };
117
118     beforeEach(() => {
119       const mockObservable = () => of([]);
120       spyOn(component, 'refresh').and.callFake(mockObservable);
121       spyOn(prometheusService, 'expireSilence').and.callFake(mockObservable);
122       spyOn(TestBed.inject(ModalService), 'show').and.callFake((deletionClass, config) => {
123         return {
124           componentInstance: Object.assign(new deletionClass(), config)
125         };
126       });
127     });
128
129     it('should expire a silence', () => {
130       const notificationService = TestBed.inject(NotificationService);
131       spyOn(notificationService, 'show').and.stub();
132       expectSilenceToExpire('someSilenceId');
133       expect(notificationService.show).toHaveBeenCalledWith(
134         NotificationType.success,
135         'Expired Silence someSilenceId',
136         undefined,
137         undefined,
138         'Prometheus'
139       );
140     });
141
142     it('should refresh after expiring a silence', () => {
143       expectSilenceToExpire('someId');
144       expect(component.refresh).toHaveBeenCalledTimes(1);
145       expectSilenceToExpire('someOtherId');
146       expect(component.refresh).toHaveBeenCalledTimes(2);
147     });
148   });
149 });