Skip to content

Commit 43a0cfd

Browse files
ymao1kibanamachine
andauthored
[Alerting] Saved object remover for all e2e triggers_actions_ui tests (#86837) (#87158)
* wip * Using object remover for alerts list * wip - using supertest instead of axios * wip - using supertest instead of axios * Removing custom services in favor of supertest * Fixing test * Fixing test * Fixing types check Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
1 parent 46bbbd1 commit 43a0cfd

15 files changed

Lines changed: 320 additions & 572 deletions

File tree

x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alert_create_flyout.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,9 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import uuid from 'uuid';
87
import expect from '@kbn/expect';
98
import { FtrProviderContext } from '../../ftr_provider_context';
10-
11-
function generateUniqueKey() {
12-
return uuid.v4().replace(/-/g, '');
13-
}
9+
import { generateUniqueKey } from '../../lib/get_test_data';
1410

1511
export default ({ getPageObjects, getService }: FtrProviderContext) => {
1612
const testSubjects = getService('testSubjects');

x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts

Lines changed: 45 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -4,67 +4,50 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import uuid from 'uuid';
87
import { times } from 'lodash';
98
import expect from '@kbn/expect';
109
import { FtrProviderContext } from '../../ftr_provider_context';
11-
12-
function generateUniqueKey() {
13-
return uuid.v4().replace(/-/g, '');
14-
}
10+
import { ObjectRemover } from '../../lib/object_remover';
11+
import { generateUniqueKey, getTestAlertData, getTestActionData } from '../../lib/get_test_data';
1512

1613
export default ({ getPageObjects, getService }: FtrProviderContext) => {
17-
const alerting = getService('alerting');
1814
const testSubjects = getService('testSubjects');
1915
const find = getService('find');
2016
const pageObjects = getPageObjects(['common', 'triggersActionsUI', 'header']);
2117
const supertest = getService('supertest');
2218
const retry = getService('retry');
19+
const objectRemover = new ObjectRemover(supertest);
2320

24-
async function deleteAlerts(alertIds: string[]) {
25-
alertIds.forEach(async (alertId: string) => {
26-
await supertest.delete(`/api/alerts/alert/${alertId}`).set('kbn-xsrf', 'foo').expect(204, '');
27-
});
28-
}
29-
30-
async function createAlert(overwrites: Record<string, any> = {}) {
21+
async function createAlertManualCleanup(overwrites: Record<string, any> = {}) {
3122
const { body: createdAlert } = await supertest
3223
.post(`/api/alerts/alert`)
3324
.set('kbn-xsrf', 'foo')
34-
.send({
35-
enabled: true,
36-
name: generateUniqueKey(),
37-
tags: ['foo', 'bar'],
38-
alertTypeId: 'test.noop',
39-
consumer: 'alerts',
40-
schedule: { interval: '1m' },
41-
throttle: '1m',
42-
actions: [],
43-
params: {},
44-
...overwrites,
45-
})
25+
.send(getTestAlertData(overwrites))
4626
.expect(200);
4727
return createdAlert;
4828
}
4929

50-
async function createFailingAlert(overwrites: Record<string, any> = {}) {
51-
const { body: createdAlert } = await supertest
52-
.post(`/api/alerts/alert`)
30+
async function createFailingAlert() {
31+
return await createAlert({
32+
alertTypeId: 'test.failing',
33+
schedule: { interval: '30s' },
34+
});
35+
}
36+
37+
async function createAlert(overwrites: Record<string, any> = {}) {
38+
const createdAlert = await createAlertManualCleanup(overwrites);
39+
objectRemover.add(createdAlert.id, 'alert', 'alerts');
40+
return createdAlert;
41+
}
42+
43+
async function createAction(overwrites: Record<string, any> = {}) {
44+
const { body: createdAction } = await supertest
45+
.post(`/api/actions/action`)
5346
.set('kbn-xsrf', 'foo')
54-
.send({
55-
enabled: true,
56-
name: generateUniqueKey(),
57-
tags: ['foo', 'bar'],
58-
alertTypeId: 'test.failing',
59-
consumer: 'alerts',
60-
schedule: { interval: '30s' },
61-
throttle: '1m',
62-
actions: [],
63-
params: {},
64-
...overwrites,
65-
})
47+
.send(getTestActionData(overwrites))
6648
.expect(200);
67-
return createdAlert;
49+
objectRemover.add(createdAction.id, 'action', 'actions');
50+
return createdAction;
6851
}
6952

7053
async function refreshAlertsList() {
@@ -77,11 +60,15 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
7760
await testSubjects.click('alertsTab');
7861
});
7962

63+
afterEach(async () => {
64+
await objectRemover.removeAll();
65+
});
66+
8067
it('should display alerts in alphabetical order', async () => {
8168
const uniqueKey = generateUniqueKey();
82-
const a = await createAlert({ name: 'b', tags: [uniqueKey] });
83-
const b = await createAlert({ name: 'c', tags: [uniqueKey] });
84-
const c = await createAlert({ name: 'a', tags: [uniqueKey] });
69+
await createAlert({ name: 'b', tags: [uniqueKey] });
70+
await createAlert({ name: 'c', tags: [uniqueKey] });
71+
await createAlert({ name: 'a', tags: [uniqueKey] });
8572
await refreshAlertsList();
8673
await pageObjects.triggersActionsUI.searchAlerts(uniqueKey);
8774

@@ -90,8 +77,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
9077
expect(searchResults[0].name).to.eql('a');
9178
expect(searchResults[1].name).to.eql('b');
9279
expect(searchResults[2].name).to.eql('c');
93-
94-
await deleteAlerts([a.id, b.id, c.id]);
9580
});
9681

9782
it('should search for alert', async () => {
@@ -108,7 +93,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
10893
interval: '1m',
10994
},
11095
]);
111-
await deleteAlerts([createdAlert.id]);
11296
});
11397

11498
it('should search for tags', async () => {
@@ -125,16 +109,14 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
125109
interval: '1m',
126110
},
127111
]);
128-
await deleteAlerts([createdAlert.id]);
129112
});
130113

131114
it('should display an empty list when search did not return any alerts', async () => {
132-
const createdAlert = await createAlert();
115+
await createAlert();
133116
await refreshAlertsList();
134117
await pageObjects.triggersActionsUI.searchAlerts(`An Alert That For Sure Doesn't Exist!`);
135118

136119
expect(await pageObjects.triggersActionsUI.isAlertsListDisplayed()).to.eql(true);
137-
await deleteAlerts([createdAlert.id]);
138120
});
139121

140122
it('should disable single alert', async () => {
@@ -153,7 +135,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
153135
const disableSwitchAfterDisable = await testSubjects.find('disableSwitch');
154136
const isChecked = await disableSwitchAfterDisable.getAttribute('aria-checked');
155137
expect(isChecked).to.eql('true');
156-
await deleteAlerts([createdAlert.id]);
157138
});
158139

159140
it('should re-enable single alert', async () => {
@@ -178,7 +159,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
178159
const disableSwitchAfterReEnable = await testSubjects.find('disableSwitch');
179160
const isChecked = await disableSwitchAfterReEnable.getAttribute('aria-checked');
180161
expect(isChecked).to.eql('false');
181-
await deleteAlerts([createdAlert.id]);
182162
});
183163

184164
it('should mute single alert', async () => {
@@ -197,7 +177,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
197177
const muteSwitchAfterMute = await testSubjects.find('muteSwitch');
198178
const isChecked = await muteSwitchAfterMute.getAttribute('aria-checked');
199179
expect(isChecked).to.eql('true');
200-
await deleteAlerts([createdAlert.id]);
201180
});
202181

203182
it('should unmute single alert', async () => {
@@ -222,12 +201,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
222201
const muteSwitchAfterUnmute = await testSubjects.find('muteSwitch');
223202
const isChecked = await muteSwitchAfterUnmute.getAttribute('aria-checked');
224203
expect(isChecked).to.eql('false');
225-
await deleteAlerts([createdAlert.id]);
226204
});
227205

228206
it('should delete single alert', async () => {
229-
const firstAlert = await createAlert();
230-
const secondAlert = await createAlert();
207+
await createAlert();
208+
const secondAlert = await createAlertManualCleanup();
231209
await refreshAlertsList();
232210
await pageObjects.triggersActionsUI.searchAlerts(secondAlert.name);
233211

@@ -247,7 +225,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
247225
await pageObjects.triggersActionsUI.searchAlerts(secondAlert.name);
248226
const searchResultsAfterDelete = await pageObjects.triggersActionsUI.getAlertsList();
249227
expect(searchResultsAfterDelete.length).to.eql(0);
250-
await deleteAlerts([firstAlert.id]);
251228
});
252229

253230
it('should mute all selection', async () => {
@@ -271,7 +248,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
271248
const muteSwitch = await testSubjects.find('muteSwitch');
272249
const isChecked = await muteSwitch.getAttribute('aria-checked');
273250
expect(isChecked).to.eql('true');
274-
await deleteAlerts([createdAlert.id]);
275251
});
276252

277253
it('should unmute all selection', async () => {
@@ -297,7 +273,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
297273
const muteSwitch = await testSubjects.find('muteSwitch');
298274
const isChecked = await muteSwitch.getAttribute('aria-checked');
299275
expect(isChecked).to.eql('false');
300-
await deleteAlerts([createdAlert.id]);
301276
});
302277

303278
it('should disable all selection', async () => {
@@ -321,7 +296,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
321296
const disableSwitch = await testSubjects.find('disableSwitch');
322297
const isChecked = await disableSwitch.getAttribute('aria-checked');
323298
expect(isChecked).to.eql('true');
324-
await deleteAlerts([createdAlert.id]);
325299
});
326300

327301
it('should enable all selection', async () => {
@@ -347,14 +321,13 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
347321
const disableSwitch = await testSubjects.find('disableSwitch');
348322
const isChecked = await disableSwitch.getAttribute('aria-checked');
349323
expect(isChecked).to.eql('false');
350-
await deleteAlerts([createdAlert.id]);
351324
});
352325

353326
it.skip('should delete all selection', async () => {
354327
const namePrefix = generateUniqueKey();
355328
let count = 0;
356329
const createdAlertsFirstPage = await Promise.all(
357-
times(2, () => createAlert({ name: `${namePrefix}-0${count++}` }))
330+
times(2, () => createAlertManualCleanup({ name: `${namePrefix}-0${count++}` }))
358331
);
359332
await refreshAlertsList();
360333
await pageObjects.triggersActionsUI.searchAlerts(namePrefix);
@@ -381,30 +354,28 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
381354
});
382355

383356
it('should filter alerts by the status', async () => {
384-
const createdAlert = await createAlert();
385-
const failinfAlert = await createFailingAlert();
357+
await createAlert();
358+
const failingAlert = await createFailingAlert();
386359
// initialy alert get Pending status, so we need to retry refresh list logic to get the post execution statuses
387360
await retry.try(async () => {
388361
await refreshAlertsList();
389362
const refreshResults = await pageObjects.triggersActionsUI.getAlertsListWithStatus();
390-
expect(refreshResults.map((item) => item.status).sort()).to.eql(['Error', 'Ok']);
363+
expect(refreshResults.map((item: any) => item.status).sort()).to.eql(['Error', 'Ok']);
391364
});
392365
await testSubjects.click('alertStatusFilterButton');
393366
await testSubjects.click('alertStatuserrorFilerOption'); // select Error status filter
394367
await retry.try(async () => {
395368
const filterErrorOnlyResults = await pageObjects.triggersActionsUI.getAlertsListWithStatus();
396369
expect(filterErrorOnlyResults).to.eql([
397370
{
398-
name: failinfAlert.name,
371+
name: failingAlert.name,
399372
tagsText: 'foo, bar',
400373
alertType: 'Test: Failing',
401374
interval: '30s',
402375
status: 'Error',
403376
},
404377
]);
405378
});
406-
407-
await deleteAlerts([createdAlert.id, failinfAlert.id]);
408379
});
409380

410381
it('should display total alerts by status and error banner only when exists alerts with status error', async () => {
@@ -428,7 +399,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
428399
);
429400
expect(alertsErrorBannerWhenNoErrors).to.have.length(0);
430401

431-
const failingAlert = await createFailingAlert();
402+
await createFailingAlert();
432403
await retry.try(async () => {
433404
await refreshAlertsList();
434405
const alertsErrorBannerExistErrors = await find.allByCssSelector(
@@ -450,13 +421,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
450421
expect(await testSubjects.getVisibleText('totalErrorAlertsCount')).to.be('Error: 1');
451422
expect(await testSubjects.getVisibleText('totalPendingAlertsCount')).to.be('Pending: 0');
452423
expect(await testSubjects.getVisibleText('totalUnknownAlertsCount')).to.be('Unknown: 0');
453-
454-
await deleteAlerts([createdAlert.id, failingAlert.id]);
455424
});
456425

457426
it('should filter alerts by the alert type', async () => {
458-
const noopAlert = await createAlert();
459-
const failinfAlert = await createFailingAlert();
427+
await createAlert();
428+
const failingAlert = await createFailingAlert();
460429
await refreshAlertsList();
461430
await testSubjects.click('alertTypeFilterButton');
462431
expect(await (await testSubjects.find('alertType0Group')).getVisibleText()).to.eql('Alerts');
@@ -466,27 +435,18 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
466435
const filterFailingAlertOnlyResults = await pageObjects.triggersActionsUI.getAlertsList();
467436
expect(filterFailingAlertOnlyResults).to.eql([
468437
{
469-
name: failinfAlert.name,
438+
name: failingAlert.name,
470439
tagsText: 'foo, bar',
471440
alertType: 'Test: Failing',
472441
interval: '30s',
473442
},
474443
]);
475444
});
476-
477-
await deleteAlerts([noopAlert.id, failinfAlert.id]);
478445
});
479446

480447
it('should filter alerts by the action type', async () => {
481-
const noopAlert = await createAlert();
482-
const action = await alerting.actions.createAction({
483-
name: `slack-${Date.now()}`,
484-
actionTypeId: '.slack',
485-
config: {},
486-
secrets: {
487-
webhookUrl: 'https://test',
488-
},
489-
});
448+
await createAlert();
449+
const action = await createAction();
490450
const noopAlertWithAction = await createAlert({
491451
actions: [
492452
{
@@ -512,8 +472,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
512472
},
513473
]);
514474
});
515-
516-
await deleteAlerts([noopAlertWithAction.id, noopAlert.id]);
517475
});
518476
});
519477
};

x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,35 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import uuid from 'uuid';
87
import expect from '@kbn/expect';
98
import { FtrProviderContext } from '../../ftr_provider_context';
10-
11-
function generateUniqueKey() {
12-
return uuid.v4().replace(/-/g, '');
13-
}
9+
import { ObjectRemover } from '../../lib/object_remover';
10+
import { generateUniqueKey, getTestActionData } from '../../lib/get_test_data';
1411

1512
export default ({ getPageObjects, getService }: FtrProviderContext) => {
16-
const alerting = getService('alerting');
1713
const testSubjects = getService('testSubjects');
1814
const pageObjects = getPageObjects(['common', 'triggersActionsUI', 'header']);
1915
const find = getService('find');
2016
const retry = getService('retry');
2117
const comboBox = getService('comboBox');
18+
const supertest = getService('supertest');
2219

2320
describe('Connectors', function () {
24-
before(async () => {
25-
await alerting.actions.createAction({
26-
name: `slack-${Date.now()}`,
27-
actionTypeId: '.slack',
28-
config: {},
29-
secrets: {
30-
webhookUrl: 'https://test',
31-
},
32-
});
21+
const objectRemover = new ObjectRemover(supertest);
3322

23+
before(async () => {
24+
const { body: createdAction } = await supertest
25+
.post(`/api/actions/action`)
26+
.set('kbn-xsrf', 'foo')
27+
.send(getTestActionData())
28+
.expect(200);
3429
await pageObjects.common.navigateToApp('triggersActions');
3530
await testSubjects.click('connectorsTab');
31+
objectRemover.add(createdAction.id, 'action', 'actions');
32+
});
33+
34+
after(async () => {
35+
await objectRemover.removeAll();
3636
});
3737

3838
it('should create a connector', async () => {

0 commit comments

Comments
 (0)