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