Skip to content

Commit 2ecaa2a

Browse files
committed
Add transform UI services
1 parent c64899f commit 2ecaa2a

File tree

9 files changed

+624
-0
lines changed

9 files changed

+624
-0
lines changed

x-pack/test/functional/services/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import { UptimeProvider } from './uptime';
4747
import { InfraSourceConfigurationFormProvider } from './infra_source_configuration_form';
4848
import { InfraLogStreamProvider } from './infra_log_stream';
4949
import { MachineLearningProvider } from './ml';
50+
import { TransformProvider } from './transform';
5051

5152
import { SecurityServiceProvider, SpacesServiceProvider } from '../../common/services';
5253

@@ -89,4 +90,5 @@ export const services = {
8990
infraSourceConfigurationForm: InfraSourceConfigurationFormProvider,
9091
infraLogStream: InfraLogStreamProvider,
9192
ml: MachineLearningProvider,
93+
transform: TransformProvider,
9294
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import { FtrProviderContext } from '../ftr_provider_context';
8+
9+
import {
10+
TransformAPIProvider,
11+
TransformManagementProvider,
12+
TransformNavigationProvider,
13+
TransformSourceSelectionProvider,
14+
TransformTableProvider,
15+
TransformWizardProvider,
16+
} from './transform_ui';
17+
18+
export function TransformProvider(context: FtrProviderContext) {
19+
const api = TransformAPIProvider(context);
20+
const management = TransformManagementProvider(context);
21+
const navigation = TransformNavigationProvider(context);
22+
const sourceSelection = TransformSourceSelectionProvider(context);
23+
const table = TransformTableProvider(context);
24+
const wizard = TransformWizardProvider(context);
25+
26+
return {
27+
api,
28+
management,
29+
navigation,
30+
sourceSelection,
31+
table,
32+
wizard,
33+
};
34+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
import expect from '@kbn/expect';
7+
8+
import { isEmpty } from 'lodash';
9+
import { FtrProviderContext } from '../../ftr_provider_context';
10+
11+
export function TransformAPIProvider({ getService }: FtrProviderContext) {
12+
const es = getService('es');
13+
const log = getService('log');
14+
const retry = getService('retry');
15+
16+
return {
17+
async deleteIndices(indices: string) {
18+
log.debug(`Deleting indices: '${indices}'...`);
19+
if ((await es.indices.exists({ index: indices })) === false) {
20+
log.debug(`Indices '${indices}' don't exist. Nothing to delete.`);
21+
return;
22+
}
23+
24+
const deleteResponse = await es.indices.delete({
25+
index: indices,
26+
});
27+
expect(deleteResponse)
28+
.to.have.property('acknowledged')
29+
.eql(true, 'Response for delete request should be acknowledged');
30+
31+
await retry.waitForWithTimeout(`'${indices}' indices to be deleted`, 30 * 1000, async () => {
32+
const getRepsonse = await es.indices.get({
33+
index: indices,
34+
});
35+
36+
if (isEmpty(getRepsonse)) {
37+
return true;
38+
} else {
39+
throw new Error(`expected indices '${indices}' to be deleted`);
40+
}
41+
});
42+
},
43+
44+
async cleanTransformIndices() {
45+
await this.deleteIndices('.transform-*');
46+
},
47+
};
48+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
export { TransformAPIProvider } from './api';
8+
export { TransformManagementProvider } from './management';
9+
export { TransformNavigationProvider } from './navigation';
10+
export { TransformSourceSelectionProvider } from './source_selection';
11+
export { TransformTableProvider } from './transform_table';
12+
export { TransformWizardProvider } from './wizard';
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import { FtrProviderContext } from '../../ftr_provider_context';
8+
9+
export function TransformManagementProvider({ getService }: FtrProviderContext) {
10+
const testSubjects = getService('testSubjects');
11+
12+
return {
13+
async assertTransformListPageExists() {
14+
await testSubjects.existOrFail('transformPageTransformList');
15+
},
16+
17+
async assertNoTransformsFoundMessageExists() {
18+
await testSubjects.existOrFail('transformNoTransformsFound');
19+
},
20+
21+
async assertTransformsTableExists() {
22+
await testSubjects.existOrFail('~transformListTable');
23+
},
24+
25+
async assertCreateNewTransformButtonExists() {
26+
await testSubjects.existOrFail('transformButtonCreate');
27+
},
28+
29+
async assertTransformStatsBarExists() {
30+
await testSubjects.existOrFail('transformStatsBar');
31+
},
32+
33+
async startTransformCreation() {
34+
if (await testSubjects.exists('transformNoTransformsFound')) {
35+
await testSubjects.click('transformCreateFirstButton');
36+
} else {
37+
await testSubjects.click('transformButtonCreate');
38+
}
39+
await testSubjects.existOrFail('transformSelectSourceModal');
40+
},
41+
};
42+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import { FtrProviderContext } from '../../ftr_provider_context';
8+
9+
export function TransformNavigationProvider({ getPageObjects }: FtrProviderContext) {
10+
const PageObjects = getPageObjects(['common']);
11+
12+
return {
13+
async navigateTo() {
14+
return await PageObjects.common.navigateToApp('transform');
15+
},
16+
};
17+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import { FtrProviderContext } from '../../ftr_provider_context';
8+
9+
export function TransformSourceSelectionProvider({ getService }: FtrProviderContext) {
10+
const testSubjects = getService('testSubjects');
11+
12+
return {
13+
async assertSourceListContainsEntry(sourceName: string) {
14+
await testSubjects.existOrFail(`savedObjectTitle${sourceName}`);
15+
},
16+
17+
async filterSourceSelection(sourceName: string) {
18+
await testSubjects.setValue('savedObjectFinderSearchInput', sourceName, {
19+
clearWithKeyboard: true,
20+
});
21+
await this.assertSourceListContainsEntry(sourceName);
22+
},
23+
24+
async selectSource(sourceName: string) {
25+
await this.filterSourceSelection(sourceName);
26+
await testSubjects.clickWhenNotDisabled(`savedObjectTitle${sourceName}`);
27+
await testSubjects.existOrFail('transformPageCreateTransform');
28+
},
29+
};
30+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
import expect from '@kbn/expect';
7+
8+
import { FtrProviderContext } from '../../ftr_provider_context';
9+
10+
export function TransformTableProvider({ getService }: FtrProviderContext) {
11+
const testSubjects = getService('testSubjects');
12+
13+
return new (class TransformTable {
14+
public async parseTransformTable() {
15+
const table = await testSubjects.find('~transformListTable');
16+
const $ = await table.parseDomContent();
17+
const rows = [];
18+
19+
for (const tr of $.findTestSubjects('~transformListRow').toArray()) {
20+
const $tr = $(tr);
21+
22+
rows.push({
23+
id: $tr
24+
.findTestSubject('transformListColumnId')
25+
.find('.euiTableCellContent')
26+
.text()
27+
.trim(),
28+
description: $tr
29+
.findTestSubject('transformListColumnDescription')
30+
.find('.euiTableCellContent')
31+
.text()
32+
.trim(),
33+
sourceIndex: $tr
34+
.findTestSubject('transformListColumnSourceIndex')
35+
.find('.euiTableCellContent')
36+
.text()
37+
.trim(),
38+
destinationIndex: $tr
39+
.findTestSubject('transformListColumnDestinationIndex')
40+
.find('.euiTableCellContent')
41+
.text()
42+
.trim(),
43+
status: $tr
44+
.findTestSubject('transformListColumnStatus')
45+
.find('.euiTableCellContent')
46+
.text()
47+
.trim(),
48+
mode: $tr
49+
.findTestSubject('transformListColumnMode')
50+
.find('.euiTableCellContent')
51+
.text()
52+
.trim(),
53+
progress: $tr
54+
.findTestSubject('transformListColumnProgress')
55+
.findTestSubject('transformListProgress')
56+
.attr('value'),
57+
});
58+
}
59+
60+
return rows;
61+
}
62+
63+
public async refreshTransformList() {
64+
await testSubjects.click('transformRefreshTransformListButton');
65+
await this.waitForTransformsToLoad();
66+
}
67+
68+
public async waitForTransformsToLoad() {
69+
await testSubjects.existOrFail('~transformListTable', { timeout: 60 * 1000 });
70+
await testSubjects.existOrFail('transformListTable loaded', { timeout: 30 * 1000 });
71+
}
72+
73+
public async filterWithSearchString(filter: string) {
74+
await this.waitForTransformsToLoad();
75+
const tableListContainer = await testSubjects.find('transformListTableContainer');
76+
const searchBarInput = await tableListContainer.findByClassName('euiFieldSearch');
77+
await searchBarInput.clearValueWithKeyboard();
78+
await searchBarInput.type(filter);
79+
}
80+
81+
public async assertTransformRowFields(transformId: string, expectedRow: object) {
82+
const rows = await this.parseTransformTable();
83+
const transformRow = rows.filter(row => row.id === transformId)[0];
84+
expect(transformRow).to.eql(expectedRow);
85+
}
86+
})();
87+
}

0 commit comments

Comments
 (0)