Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c0944c8
Add scout tests for Search Homepage
saikatsarkar056 Jan 8, 2026
422ad19
Add Scout test for old Search Homepage (V1)
saikatsarkar056 Jan 8, 2026
0c5f05e
Add more tests
saikatsarkar056 Jan 9, 2026
847374c
Refactor the tests
saikatsarkar056 Jan 9, 2026
3d71e22
Add test for security section
saikatsarkar056 Jan 9, 2026
1399162
Add test for Create index
saikatsarkar056 Jan 9, 2026
99bd0a3
Fix tests for serverless env
saikatsarkar056 Jan 9, 2026
b8d1fdf
Refactor code
saikatsarkar056 Jan 9, 2026
88412cb
Refactor code
saikatsarkar056 Jan 9, 2026
4e56aa8
Remove old FTR tests
saikatsarkar056 Jan 9, 2026
9aad7f6
Remove unused code
saikatsarkar056 Jan 9, 2026
45a49b8
Merge branch 'main' of github.com:elastic/kibana into scout_for_homepage
saikatsarkar056 Jan 9, 2026
b694e0e
Merge branch 'main' into scout_for_homepage
elasticmachine Jan 10, 2026
dba3ad5
Remove tests for old search page
saikatsarkar056 Jan 12, 2026
64e64df
Merge branch 'scout_for_homepage' of github.com:saikatsarkar056/kiban…
saikatsarkar056 Jan 12, 2026
c40f0f1
Add similar tests for viewer
saikatsarkar056 Jan 12, 2026
d2ca387
Add tests for testing body links
saikatsarkar056 Jan 12, 2026
a3f05ea
Add tests for getting_started section
saikatsarkar056 Jan 12, 2026
b72664e
Make the tests runnable in stack as well
saikatsarkar056 Jan 12, 2026
da15645
Remove unused code
saikatsarkar056 Jan 12, 2026
ef62f7e
Merge branch 'main' into scout_for_homepage
elasticmachine Jan 13, 2026
b270fa5
Check the expected urls for BodyLinks
saikatsarkar056 Jan 13, 2026
433d1ea
Merge branch 'scout_for_homepage' of github.com:saikatsarkar056/kiban…
saikatsarkar056 Jan 13, 2026
88be805
Merge branch 'main' of github.com:elastic/kibana into scout_for_homepage
saikatsarkar056 Jan 13, 2026
af3c014
Merge branch 'main' of github.com:elastic/kibana into scout_for_homepage
saikatsarkar056 Jan 14, 2026
ff46dc1
Merge branch 'main' of github.com:elastic/kibana into scout_for_homepage
saikatsarkar056 Jan 14, 2026
790a2ef
Merge branch 'main' of github.com:elastic/kibana into scout_for_homepage
saikatsarkar056 Jan 14, 2026
3428850
Merge branch 'main' into scout_for_homepage
elasticmachine Jan 15, 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
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import type {
BrowserAuthFixture,
KibanaUrl,
PageObjects,
ScoutTestFixtures,
ScoutWorkerFixtures,
Expand All @@ -30,7 +29,6 @@ export const test = base.extend<ExtendedScoutTestFixtures, ScoutWorkerFixtures>(
}: {
pageObjects: ExtendedScoutTestFixtures['pageObjects'];
page: ExtendedScoutTestFixtures['page'];
kbnUrl: KibanaUrl;
},
use: (pageObjects: ExtendedScoutTestFixtures['pageObjects']) => Promise<void>
) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ export class Homepage {
return this.page.testSubj.locator(cardId).click();
}

async getGettingStartedButton() {
return this.page.testSubj.locator(
'searchHomepageGettingStartedBannerGetStartedWithElasticsearchButton'
);
}

async clickGettingStartedButton() {
await this.page.testSubj.waitForSelector(
'searchHomepageGettingStartedBannerGetStartedWithElasticsearchButton'
Expand All @@ -40,14 +46,6 @@ export class Homepage {
.click();
}

async getCloudResourceCards() {
return this.page.locator('[data-test-subj^="cloudResourceCard-"]');
}

async getCloudResourceCardLink(cardId: string) {
return this.page.testSubj.locator(cardId).getByRole('link');
}

async getApiKeyButton() {
return this.page.testSubj.locator('searchHomepageConnectToElasticsearchApiKeysButton');
}
Expand Down Expand Up @@ -85,4 +83,47 @@ export class Homepage {
async getApiKeyValueRow() {
return this.page.testSubj.locator('connectionDetailsApiKeyValueRow');
}

// Embedded Console methods
async expectEmbeddedConsoleControlBarExists() {
await this.page.testSubj.waitForSelector('consoleEmbeddedSection');
}

async getEmbeddedConsoleBody() {
return this.page.testSubj.locator('consoleEmbeddedBody');
}

async clickEmbeddedConsoleControlBar() {
await this.page.testSubj.locator('consoleEmbeddedControlBar').click();
}

async getFullscreenToggleButton() {
return this.page.testSubj.locator('consoleToggleFullscreenButton');
}

async getSearchHomepageContainer() {
return this.page.testSubj.locator('search-homepage');
}

// Elasticsearch endpoint and copy functionality
async getCopyEndpointButton() {
return this.page.testSubj.locator('copyEndpointButton');
}

async getCopyEndpointButtonCopied() {
return this.page.testSubj.locator('copyEndpointButton-copied');
}

async getEndpointValueField() {
return this.page.testSubj.locator('endpointValueField');
}

// Body Links methods
async getBodyLinks() {
return this.page.testSubj.locator('searchHomepageBodyLinkLink');
}

async getBodyLinkByText(text: string) {
return this.page.getByRole('link', { name: text });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import { expect } from '@kbn/scout-search';
import { test } from '../fixtures';

test.describe('Homepage - Admin', { tag: ['@svlSearch'] }, () => {
test.describe('Homepage - Admin', { tag: ['@svlSearch', '@ess'] }, () => {
test.beforeEach(async ({ page, browserAuth, pageObjects }) => {
await browserAuth.loginAsAdmin();
await page.addInitScript(() => {
Expand Down Expand Up @@ -55,4 +55,163 @@ test.describe('Homepage - Admin', { tag: ['@svlSearch'] }, () => {
const apiKeyValueRow = await pageObjects.homepage.getApiKeyValueRow();
await expect(apiKeyValueRow).toBeVisible();
});

// === Embedded Console Tests ===
test('should have embedded dev console that can be toggled', async ({ pageObjects }) => {
await pageObjects.homepage.expectEmbeddedConsoleControlBarExists();

// Console body should be hidden initially
const consoleBodyInitial = await pageObjects.homepage.getEmbeddedConsoleBody();
await expect(consoleBodyInitial).toBeHidden();

// Click to open console
await pageObjects.homepage.clickEmbeddedConsoleControlBar();

// Verify console is open and fullscreen toggle is visible
const fullscreenToggle = await pageObjects.homepage.getFullscreenToggleButton();
await expect(fullscreenToggle).toBeVisible();

const consoleBodyOpen = await pageObjects.homepage.getEmbeddedConsoleBody();
await expect(consoleBodyOpen).toBeVisible();

// Click to close console
await pageObjects.homepage.clickEmbeddedConsoleControlBar();

const consoleBodyClosed = await pageObjects.homepage.getEmbeddedConsoleBody();
await expect(consoleBodyClosed).toBeHidden();
});

// === Endpoint Copy Functionality Tests ===
test('should show Elasticsearch endpoint with copy functionality', async ({ pageObjects }) => {
const endpointValueField = await pageObjects.homepage.getEndpointValueField();
await expect(endpointValueField).toBeVisible();

const copyEndpointButton = await pageObjects.homepage.getCopyEndpointButton();
await expect(copyEndpointButton).toBeVisible();
});

test('should show checkmark feedback when copy button is clicked', async ({ pageObjects }) => {
const copyEndpointButton = await pageObjects.homepage.getCopyEndpointButton();
await expect(copyEndpointButton).toBeVisible();

await copyEndpointButton.click();

// After clicking, the button should show copied state
const copiedButton = await pageObjects.homepage.getCopyEndpointButtonCopied();
await expect(copiedButton).toBeVisible();

// After a short delay, it should revert back to normal state
const normalButton = await pageObjects.homepage.getCopyEndpointButton();
await expect(normalButton).toBeVisible();
});

// === Navigation Cards Tests ===
test('navigation cards should navigate to correct places', async ({ pageObjects, page }) => {
const navigationCards = await pageObjects.homepage.getNavigationCards();
await expect(navigationCards).toHaveCount(5);

const navCardTests = [
{
cardTestId: 'searchHomepageNavLinks-discover',
expectedUrl: 'discover',
},
{
cardTestId: 'searchHomepageNavLinks-dashboards',
expectedUrl: 'dashboards',
},
{
cardTestId: 'searchHomepageNavLinks-agentBuilder',
expectedUrl: 'agent_builder',
},
{
cardTestId: 'searchHomepageNavLinks-machineLearning',
expectedUrl: 'ml/overview',
},
{
cardTestId: 'searchHomepageNavLinks-dataManagement',
expectedUrl: 'index_management',
},
];

for (const { cardTestId, expectedUrl } of navCardTests) {
await pageObjects.homepage.clickNavigationCard(cardTestId);
await expect(page).toHaveURL(new RegExp(expectedUrl));
await pageObjects.homepage.goto();
}
});

// === Getting Started Banner Tests ===
test('should display Getting Started banner with title and button', async ({ pageObjects }) => {
const gettingStartedButton = await pageObjects.homepage.getGettingStartedButton();
await expect(gettingStartedButton).toBeVisible();
await expect(gettingStartedButton).toContainText('Get started with Elasticsearch');
});

test('Get started button should navigate to getting started page', async ({
pageObjects,
page,
}) => {
await pageObjects.homepage.clickGettingStartedButton();
await expect(page).toHaveURL(new RegExp('getting_started'));
});

// === Body Links Tests ===
test('should display all body links with external documentation', async ({ pageObjects }) => {
const bodyLinks = await pageObjects.homepage.getBodyLinks();
await expect(bodyLinks).toHaveCount(3);

// Verify specific links exist
const askExpertLink = await pageObjects.homepage.getBodyLinkByText(
'Contact customer engineering'
);
await expect(askExpertLink).toBeVisible();

const trainingLink = await pageObjects.homepage.getBodyLinkByText('Elastic Training');
await expect(trainingLink).toBeVisible();

const docsLink = await pageObjects.homepage.getBodyLinkByText('View documentation');
await expect(docsLink).toBeVisible();
});

test('body links should have external target attribute', async ({ pageObjects }) => {
const bodyLinks = await pageObjects.homepage.getBodyLinks();
const allLinks = await bodyLinks.all();

for (const link of allLinks) {
await expect(link).toHaveAttribute('target', '_blank');
await expect(link).toHaveAttribute('rel', 'noopener noreferrer');
}
});

test('body links should navigate to correct URLs when clicked', async ({ pageObjects, page }) => {
const bodyLinkTests = [
{
linkText: 'Contact customer engineering',
expectedUrlPattern: /contact\/ce-help/,
},
{
linkText: 'Elastic Training',
expectedUrlPattern: /training/,
},
{
linkText: 'View documentation',
expectedUrlPattern: /solutions\/search\/get-started/,
},
];

for (const { linkText, expectedUrlPattern } of bodyLinkTests) {
const link = await pageObjects.homepage.getBodyLinkByText(linkText);
await expect(link).toBeVisible();

// Click the link and wait for new page to open
const context = page.context();
const [newPage] = await Promise.all([context.waitForEvent('page'), link.click()]);

// Verify the new page URL matches expected pattern
await expect(newPage).toHaveURL(expectedUrlPattern);

// Close the new page and continue with the original page
await newPage.close();
}
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import { expect } from '@kbn/scout-search';
import { test } from '../fixtures';

test.describe('Homepage - Viewer', { tag: ['@svlSearch'] }, () => {
test.describe('Homepage - Viewer', { tag: ['@svlSearch', '@ess'] }, () => {
test.beforeEach(async ({ page, browserAuth, pageObjects }) => {
await browserAuth.loginAsViewer();
await page.addInitScript(() => {
Expand Down Expand Up @@ -71,4 +71,113 @@ test.describe('Homepage - Viewer', { tag: ['@svlSearch'] }, () => {
const apiKeysButton = await pageObjects.homepage.getApiKeyButton();
await expect(apiKeysButton).toBeDisabled();
});

// === Embedded Console Tests ===
test('should have embedded dev console that can be toggled', async ({ pageObjects }) => {
await pageObjects.homepage.expectEmbeddedConsoleControlBarExists();

// Console body should be hidden initially
const consoleBodyInitial = await pageObjects.homepage.getEmbeddedConsoleBody();
await expect(consoleBodyInitial).toBeHidden();

// Click to open console
await pageObjects.homepage.clickEmbeddedConsoleControlBar();

// Verify console is open and fullscreen toggle is visible
const fullscreenToggle = await pageObjects.homepage.getFullscreenToggleButton();
await expect(fullscreenToggle).toBeVisible();

const consoleBodyOpen = await pageObjects.homepage.getEmbeddedConsoleBody();
await expect(consoleBodyOpen).toBeVisible();

// Click to close console
await pageObjects.homepage.clickEmbeddedConsoleControlBar();

const consoleBodyClosed = await pageObjects.homepage.getEmbeddedConsoleBody();
await expect(consoleBodyClosed).toBeHidden();
});

// === Endpoint Copy Functionality Tests ===
test('should show Elasticsearch endpoint with copy functionality', async ({ pageObjects }) => {
const endpointValueField = await pageObjects.homepage.getEndpointValueField();
await expect(endpointValueField).toBeVisible();

const copyEndpointButton = await pageObjects.homepage.getCopyEndpointButton();
await expect(copyEndpointButton).toBeVisible();
});

test('should show checkmark feedback when copy button is clicked', async ({ pageObjects }) => {
const copyEndpointButton = await pageObjects.homepage.getCopyEndpointButton();
await expect(copyEndpointButton).toBeVisible();

await copyEndpointButton.click();

// After clicking, the button should show copied state
const copiedButton = await pageObjects.homepage.getCopyEndpointButtonCopied();
await expect(copiedButton).toBeVisible();

// After a short delay, it should revert back to normal state
const normalButton = await pageObjects.homepage.getCopyEndpointButton();
await expect(normalButton).toBeVisible();
});

// === Body Links Tests ===
test('should display all body links with external documentation', async ({ pageObjects }) => {
const bodyLinks = await pageObjects.homepage.getBodyLinks();
await expect(bodyLinks).toHaveCount(3);

// Verify specific links exist
const askExpertLink = await pageObjects.homepage.getBodyLinkByText(
'Contact customer engineering'
);
await expect(askExpertLink).toBeVisible();

const trainingLink = await pageObjects.homepage.getBodyLinkByText('Elastic Training');
await expect(trainingLink).toBeVisible();

const docsLink = await pageObjects.homepage.getBodyLinkByText('View documentation');
await expect(docsLink).toBeVisible();
});

test('body links should have external target attribute', async ({ pageObjects }) => {
const bodyLinks = await pageObjects.homepage.getBodyLinks();
const allLinks = await bodyLinks.all();

for (const link of allLinks) {
await expect(link).toHaveAttribute('target', '_blank');
await expect(link).toHaveAttribute('rel', 'noopener noreferrer');
}
});

test('body links should navigate to correct URLs when clicked', async ({ pageObjects, page }) => {
const bodyLinkTests = [
{
linkText: 'Contact customer engineering',
expectedUrlPattern: /contact\/ce-help/,
},
{
linkText: 'Elastic Training',
expectedUrlPattern: /training/,
},
{
linkText: 'View documentation',
expectedUrlPattern: /solutions\/search\/get-started/,
},
];

for (const { linkText, expectedUrlPattern } of bodyLinkTests) {
const link = await pageObjects.homepage.getBodyLinkByText(linkText);
await expect(link).toBeVisible();

// Click the link and wait for new page to open
const context = page.context();
const [newPage] = await Promise.all([context.waitForEvent('page'), link.click()]);

// Verify the new page URL matches expected pattern
await expect(newPage).toHaveURL(expectedUrlPattern);

// Close the new page and continue with the original page
await newPage.close();
}
});
});
1 change: 0 additions & 1 deletion x-pack/solutions/search/test/functional_search/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import type { FtrProviderContext } from './ftr_provider_context';

export default ({ loadTestFile }: FtrProviderContext): void => {
describe('Search solution tests', function () {
loadTestFile(require.resolve('./tests/search_homepage'));
loadTestFile(require.resolve('./tests/classic_navigation'));
loadTestFile(require.resolve('./tests/solution_navigation'));
loadTestFile(require.resolve('./tests/agent_builder'));
Expand Down
Loading