Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
54d6aec
add initial tests
csr Jan 14, 2026
9f535b4
add more tests
csr Jan 15, 2026
153e0da
fix test
csr Jan 15, 2026
99c6b19
disable inspect component
csr Jan 15, 2026
3224628
update `tsconfig.json`
csr Jan 15, 2026
1823f4c
remove `preserveCrossAppState()` method
csr Jan 15, 2026
dcc66ad
fix linting erorrs, update existing Scout data views helper, refactor…
csr Jan 15, 2026
b5a53df
Changes from node scripts/lint_ts_projects --fix
kibanamachine Jan 15, 2026
f6e9227
Changes from node scripts/regenerate_moon_projects.js --update
kibanamachine Jan 15, 2026
0375ce2
address flaky tests
csr Jan 15, 2026
4299e45
run tests on ESS only (for now)
csr Jan 21, 2026
84e1e1d
stablize `openNewDashboard`
csr Jan 21, 2026
46c63fe
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Jan 22, 2026
4be4c1d
introduce sample data API helper + simplify `async_dashboard` test
csr Jan 22, 2026
53b4a30
use renderable page to gate dashboard load
csr Jan 22, 2026
b997037
use polling
csr Jan 22, 2026
d03bc2c
check exact counts
csr Jan 22, 2026
3bbfbce
revert ftr changes, update test titles
csr Jan 22, 2026
48f7c16
add more constants
csr Jan 22, 2026
97097c1
merge test cases
csr Jan 22, 2026
fdb62d2
polish maps by-value test suite (merge tests, use constants)
csr Jan 23, 2026
070c597
refactor `dashboard_search_by_value.spec.ts` (move common operations …
csr Jan 23, 2026
44814b2
polish `dashboard_panel_listing.spec.ts` (use constants, move helpers…
csr Jan 23, 2026
c8eed25
keep some constants local to test suite file for readibility
csr Jan 23, 2026
932c7f2
refactor `panel_time_range.spec.ts`
csr Jan 23, 2026
184335f
refactor migration smoke tests
csr Jan 23, 2026
1b9ad60
move migration smoke constants to a single constants file
csr Jan 23, 2026
0352c0e
remove unused home app page object
csr Jan 23, 2026
6b15f62
remove unused page objects methods
csr Jan 23, 2026
5ef4fa9
re-add missing page object methods
csr Jan 23, 2026
d6ccfbc
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Jan 23, 2026
b8bfb5b
refactor `panel_time_range.spec.ts`
csr Jan 23, 2026
554921b
temp updates
csr Jan 23, 2026
71063bc
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Jan 26, 2026
e4597cd
fix `panel_time_range.spec.ts` test
csr Jan 26, 2026
2c95772
remove time-consuming `waitForRenderComplete()` checks
csr Jan 26, 2026
bfd115c
remove more `waitForRenderComplete()` time-consuming calls
csr Jan 26, 2026
521b769
increase Playwright workers to 3
csr Jan 26, 2026
a5f7d0f
remove FTR config and tests
csr Jan 26, 2026
b400e90
reduce Playwright parallel workers to 2
csr Jan 26, 2026
e9c6fce
update tests
csr Jan 27, 2026
2a920a2
update test suite tags
csr Jan 28, 2026
cca53bd
fix linting errors
csr Jan 28, 2026
863190f
use lower-privileges `editor` and `viewer` roles (instead of `admin`)…
csr Jan 28, 2026
a179c32
simplify `async_dashboard.spec.ts` test
csr Jan 28, 2026
55bde57
fix non-existing tag
csr Jan 28, 2026
c5d5390
simplify maps page object
csr Jan 28, 2026
f85ca51
refactor `lens_app.ts` page object
csr Jan 28, 2026
c0c6cde
use `admin` role in async test (serverless projects need it)
csr Jan 28, 2026
800d27c
refactor more page objects
csr Jan 28, 2026
f5a9c20
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Jan 29, 2026
7948c01
fix spacing
csr Jan 29, 2026
7dff239
refine Discover data view switch handling
csr Jan 29, 2026
e197d6d
remove custom timeout in discover test
csr Jan 29, 2026
4a0793e
refactor dashboard page object
csr Jan 29, 2026
8d23cec
re-add missing entry in `scout_ci_config.yml`
csr Jan 29, 2026
465bd23
Changes from node scripts/eslint_all_files --no-cache --fix
kibanamachine Jan 29, 2026
2e8eb75
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Jan 29, 2026
12b79b5
relax edit-mode wait for drag handles
csr Jan 29, 2026
54ffc8b
fix `combo_box` page object
csr Jan 30, 2026
080a6c9
unskip and refactor `sync_colors.spec.ts` file
csr Jan 30, 2026
828ad5a
fix `sync_colors` test
csr Jan 30, 2026
359ff57
further fixes to `sync_colors`
csr Jan 30, 2026
b67eb7f
fix types
csr Jan 30, 2026
94e6436
skip single test
csr Jan 30, 2026
3b80fb3
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Feb 2, 2026
c3068ee
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Feb 3, 2026
6fa029e
remove one-line functions in `panel_titles.spec.ts`
csr Feb 3, 2026
df6c9ed
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Feb 4, 2026
3fb7eaa
remove duplicate comments
csr Feb 4, 2026
f40b1c9
remove `isViewMode` checks
csr Feb 4, 2026
dd98d49
remove conditions from dashboard page object
csr Feb 4, 2026
d24f0ff
more page object updates
csr Feb 4, 2026
11db05a
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Feb 5, 2026
09dc951
remove duplicate items from `scout_ci_config.yml`
csr Feb 5, 2026
f0f5151
remove duplicated Lens page object registration
csr Feb 5, 2026
f26e47c
Changes from node scripts/eslint_all_files --no-cache --fix
kibanamachine Feb 5, 2026
18c6f00
fix typo in filter bar page object file name
csr Feb 5, 2026
2daf0b4
more flaky test fixes
csr Feb 5, 2026
966a8ce
Merge branch 'main' into migrate-dashboard-group2-tests-to-scout
csr Feb 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .buildkite/ftr_platform_stateful_configs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,6 @@ enabled:
- x-pack/platform/test/functional/apps/canvas/config.ts
- x-pack/platform/test/functional/apps/cross_cluster_replication/config.ts
- x-pack/platform/test/functional/apps/dashboard/group1/config.ts
- x-pack/platform/test/functional/apps/dashboard/group2/config.ts
- x-pack/platform/test/functional/apps/dashboard/group3/config.ts
- x-pack/platform/test/functional/apps/data_views/config.ts
- x-pack/platform/test/functional/apps/dev_tools/config.ts
Expand Down
1 change: 1 addition & 0 deletions .buildkite/scout_ci_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ plugins:
- streams
- streams_app
- transform
- dashboard
- workflows_extensions
disabled:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,11 +147,18 @@ export class EuiComboBoxWrapper {
}

// Select a single option in the comboBox
async selectSingleOption(value: string) {
async selectSingleOption(
value: string,
options: { optionTestSubj?: string; optionRoleName?: string } = {}
) {
await this.clear();
await this.comboBoxMainInput.click();
await this.typeValueInSearch(value);
await this.page.getByRole('option', { name: value }).click();
// Prefer a specific test subj when option text is ambiguous.
const optionLocator = options.optionTestSubj
? this.page.testSubj.locator(options.optionTestSubj)
: this.page.getByRole('option', { name: options.optionRoleName ?? value, exact: false });
await optionLocator.click();
expect(await this.getSelectedValue()).toBe(value);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,36 +28,48 @@ export interface DataViewsApiService {
* Get all data views
* @returns Promise with array of data views and status
*/
getAll: () => Promise<DataViewApiResponse<DataView[]>>;
getAll: (spaceId?: string) => Promise<DataViewApiResponse<DataView[]>>;

/**
* Get a single data view by ID
* @param id - The data view ID
* @param spaceId - Optional space ID
* @returns Promise with the data view and status
*/
get: (id: string) => Promise<DataViewApiResponse<DataView>>;
get: (id: string, spaceId?: string) => Promise<DataViewApiResponse<DataView>>;

/**
* Delete a data view by ID
* @param id - The data view ID to delete
* @param spaceId - Optional space ID
* @returns Promise with status code
*/
delete: (id: string) => Promise<DataViewStatusResponse>;
delete: (id: string, spaceId?: string) => Promise<DataViewStatusResponse>;

/**
* Find data views that match a predicate function
* @param predicate - Function to filter data views
* @param spaceId - Optional space ID
* @returns Promise with filtered array of data views and status
*/
find: (predicate: (dataView: DataView) => boolean) => Promise<DataViewApiResponse<DataView[]>>;
find: (
predicate: (dataView: DataView) => boolean,
spaceId?: string
) => Promise<DataViewApiResponse<DataView[]>>;

/**
* Delete a data view by its title (convenience method)
* Finds the first data view matching the title and deletes it
* @param title - The data view title to search for
* @param spaceId - Optional space ID
* @returns Promise with status code
*/
deleteByTitle: (title: string) => Promise<DataViewStatusResponse>;
deleteByTitle: (title: string, spaceId?: string) => Promise<DataViewStatusResponse>;

/**
* Get data view ID by title (optionally within a space)
*/
getIdByTitle: (title: string, spaceId?: string) => Promise<string>;
}

/**
Expand All @@ -70,15 +82,17 @@ export const getDataViewsApiHelper = (
log: ScoutLogger,
kbnClient: KbnClient
): DataViewsApiService => {
const withSpace = (path: string, spaceId?: string) => (spaceId ? `/s/${spaceId}${path}` : path);

return {
getAll: async () => {
getAll: async (spaceId?: string) => {
return await measurePerformanceAsync(
log,
'dataViewsApi.getAll',
async (): Promise<DataViewApiResponse<DataView[]>> => {
const response = await kbnClient.request<GetDataViewsResponse>({
method: 'GET',
path: '/api/data_views',
path: withSpace('/api/data_views', spaceId),
retries: 3,
});

Expand All @@ -90,14 +104,14 @@ export const getDataViewsApiHelper = (
);
},

get: async (id: string) => {
get: async (id: string, spaceId?: string) => {
return await measurePerformanceAsync(
log,
'dataViewsApi.get',
async (): Promise<DataViewApiResponse<DataView>> => {
const response = await kbnClient.request<GetDataViewResponse>({
method: 'GET',
path: `/api/data_views/data_view/${id}`,
path: withSpace(`/api/data_views/data_view/${id}`, spaceId),
retries: 3,
ignoreErrors: [404],
});
Expand All @@ -110,14 +124,14 @@ export const getDataViewsApiHelper = (
);
},

delete: async (id: string) => {
delete: async (id: string, spaceId?: string) => {
return await measurePerformanceAsync(
log,
'dataViewsApi.delete',
async (): Promise<DataViewStatusResponse> => {
const response = await kbnClient.request({
method: 'DELETE',
path: `/api/data_views/data_view/${id}`,
path: withSpace(`/api/data_views/data_view/${id}`, spaceId),
retries: 3,
ignoreErrors: [404],
});
Expand All @@ -129,14 +143,14 @@ export const getDataViewsApiHelper = (
);
},

find: async (predicate: (dataView: DataView) => boolean) => {
find: async (predicate: (dataView: DataView) => boolean, spaceId?: string) => {
return await measurePerformanceAsync(
log,
'dataViewsApi.find',
async (): Promise<DataViewApiResponse<DataView[]>> => {
const response = await kbnClient.request<GetDataViewsResponse>({
method: 'GET',
path: '/api/data_views',
path: withSpace('/api/data_views', spaceId),
retries: 3,
});

Expand All @@ -151,14 +165,14 @@ export const getDataViewsApiHelper = (
);
},

deleteByTitle: async (title: string) => {
deleteByTitle: async (title: string, spaceId?: string) => {
return await measurePerformanceAsync(
log,
'dataViewsApi.deleteByTitle',
async (): Promise<DataViewStatusResponse> => {
const response = await kbnClient.request<GetDataViewsResponse>({
method: 'GET',
path: '/api/data_views',
path: withSpace('/api/data_views', spaceId),
retries: 3,
});

Expand All @@ -172,7 +186,7 @@ export const getDataViewsApiHelper = (

const deleteResponse = await kbnClient.request({
method: 'DELETE',
path: `/api/data_views/data_view/${dataView.id}`,
path: withSpace(`/api/data_views/data_view/${dataView.id}`, spaceId),
retries: 3,
ignoreErrors: [404],
});
Expand All @@ -183,5 +197,24 @@ export const getDataViewsApiHelper = (
}
);
},

getIdByTitle: async (title: string, spaceId?: string) => {
return await measurePerformanceAsync(log, 'dataViewsApi.getIdByTitle', async () => {
const response = await kbnClient.request<GetDataViewsResponse>({
method: 'GET',
path: withSpace('/api/data_views', spaceId),
retries: 3,
});
const match = (response.data.data_view || []).find(
(dataView) => dataView.title === title || dataView.name === title
);
if (!match?.id) {
throw new Error(
`Data view "${title}" not found${spaceId ? ` in space "${spaceId}"` : ''}`
);
}
return match.id;
});
},
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import type { DataViewsApiService } from './data_views';
import { getDataViewsApiHelper } from './data_views';
import type { FleetApiService } from './fleet';
import { getFleetApiHelper } from './fleet';
import type { SampleDataApiService } from './sample_data';
import { getSampleDataApiHelper } from './sample_data';
import type { StreamsApiService } from './streams';
import { getStreamsApiService } from './streams';

Expand All @@ -26,6 +28,7 @@ export interface ApiServicesFixture {
cases: CasesApiService;
dataViews: DataViewsApiService;
fleet: FleetApiService;
sampleData: SampleDataApiService;
streams: StreamsApiService;
core: CoreApiService;
// add more services here
Expand All @@ -45,6 +48,7 @@ export const apiServicesFixture = coreWorkerFixtures.extend<
cases: getCasesApiHelper(log, kbnClient),
dataViews: getDataViewsApiHelper(log, kbnClient),
fleet: getFleetApiHelper(log, kbnClient),
sampleData: getSampleDataApiHelper(log, kbnClient),
streams: getStreamsApiService({ kbnClient, log }),
core: getCoreApiHelper(log, kbnClient),
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import type { KbnClient, ScoutLogger } from '../../../../../../common';
import { measurePerformanceAsync } from '../../../../../../common';

export interface SampleDataApiService {
install: (dataSetId: string, spaceId?: string) => Promise<void>;
remove: (dataSetId: string, spaceId?: string) => Promise<void>;
}

export const getSampleDataApiHelper = (
log: ScoutLogger,
kbnClient: KbnClient
): SampleDataApiService => {
const withSpace = (path: string, spaceId?: string) => (spaceId ? `/s/${spaceId}${path}` : path);

return {
install: async (dataSetId: string, spaceId?: string) => {
await measurePerformanceAsync(log, 'sampleDataApi.install', async () => {
await kbnClient.request({
method: 'POST',
path: withSpace(`/api/sample_data/${dataSetId}`, spaceId),
retries: 3,
});
});
},

remove: async (dataSetId: string, spaceId?: string) => {
await measurePerformanceAsync(log, 'sampleDataApi.remove', async () => {
await kbnClient.request({
method: 'DELETE',
path: withSpace(`/api/sample_data/${dataSetId}`, spaceId),
retries: 3,
ignoreErrors: [404],
});
});
},
};
};
Loading
Loading