]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.spec.ts
cc4b76c327152c6a2ead9cb75ec27ce0720d3e79
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / ceph / cluster / prometheus / silence-list / silence-list.component.spec.ts
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 });