Skip to content

Commit 0c21fca

Browse files
authored
refactor and improve tests (#74)
* speedup tests, remove redundant steps and unused code * improve readability * rename methods * improve logging * improve asserts (verify splunk alert results in DataSet)
1 parent 79d0377 commit 0c21fca

File tree

7 files changed

+79
-87
lines changed

7 files changed

+79
-87
lines changed

e2e/alert_action.spec.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
import {test, expect, Page} from '@playwright/test';
2-
import {dataSetSearch} from './utils';
2+
import {searchDataSet} from './utils';
33
import {setTimeout} from 'timers/promises';
44

55
test('Alert action - create and delete alert with results propagation to DataSet', async ({page}) => {
6-
const serverHost = 'host_splunk';
7-
const alertName = 'test_alert';
6+
test.setTimeout(120000); //default 60s may time out since job are scheduled for every 60s
7+
const serverHost = 'dataset_addon_for_splunk_playwright_CI_CD_e2e_test_host';
8+
const alertName = 'splunk_addon_test_alert_'+ Math.random().toString(36).substring(2,7);
89
await removeAlertIfExists(page, alertName);
910

10-
await dataSetSearch(page, "| dataset");
11+
await searchDataSet(page, "| dataset");
1112
await saveAsAlertWithDataSetTrigger(page, alertName, serverHost);
13+
14+
// verify splunk alert results in DataSet
15+
await setTimeout(60000); // wait for alert job to be triggered (cron job every 1 minute)
16+
await searchDataSet(page, "| dataset search=\"serverHost='" + serverHost + "' '" + alertName + "'\"");
17+
await page.screenshot({path: `playwright-screenshots/page-search-query-splunk-alert-results-from_dataset.png`, fullPage: true});
18+
1219
await removeAlertIfExists(page, alertName);
1320
});
1421

@@ -45,10 +52,8 @@ async function saveAsAlertWithDataSetTrigger(page: Page, alertName: string, serv
4552
}
4653

4754
async function removeAlertIfExists(page: Page, alertName: string) {
48-
await page.goto('/');
49-
console.log("View Alerts")
50-
await page.getByRole('button', {name: 'Settings'}).click();
51-
await page.getByRole('menuitem', {name: 'Searches, reports, and alerts'}).click();
55+
console.log("View Alerts");
56+
await page.goto('/app/TA_dataset/saved/searches');
5257
await page.screenshot({path: `playwright-screenshots/page-alerts-list.png`, fullPage: true});
5358

5459
const alertRow = page.getByRole("row").filter({hasText: alertName})

e2e/deploy.spec.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import {test, expect, Page} from '@playwright/test';
2+
import {searchDataSet} from './utils';
3+
import {setTimeout} from 'timers/promises';
4+
5+
test('Verify SDL addon is deployed properly', async ({page}) => {
6+
await page.goto('/');
7+
await page.screenshot({ path: 'playwright-screenshots/splunk-launcher-page.png', fullPage: true });
8+
const sdlAddonLinks = page.getByLabel('Navigate to Security Data Lake Add-On for Splunk app');
9+
await expect(sdlAddonLinks).toHaveCount(1);
10+
11+
console.log("Go to DataSet page")
12+
await sdlAddonLinks.click();
13+
await page.screenshot({ path: 'playwright-screenshots/dataset-addon-home.png', fullPage: true });
14+
const inputLinks = page.getByRole('link', {name: 'Input'});
15+
await expect(inputLinks).toHaveCount(1);
16+
await expect(inputLinks.first()).toHaveAttribute('href','/en-US/app/TA_dataset/inputs');
17+
const configLinks = page.getByRole('link', {name: 'Configuration'});
18+
await expect(configLinks).toHaveCount(1);
19+
await expect(configLinks.first()).toHaveAttribute('href','/en-US/app/TA_dataset/configuration');
20+
const exampleLinks = page.getByRole('link', {name: 'DataSet by Example'});
21+
await expect(exampleLinks).toHaveCount(1);
22+
await expect(exampleLinks.first()).toHaveAttribute('href','/en-US/app/TA_dataset/dataset_by_example');
23+
const searchLinks = page.getByRole('link', {name: 'Search'});
24+
await expect(searchLinks).toHaveCount(1);
25+
await expect(searchLinks.first()).toHaveAttribute('href','/en-US/app/TA_dataset/search');
26+
});

e2e/examples.spec.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
11
import { test, expect } from '@playwright/test';
2-
import { goToDataSet, goToExamples, waitForData } from './utils';
3-
4-
test.beforeEach(async ({ page }) => {
5-
await page.goto('/');
6-
7-
await goToDataSet(page);
8-
await goToExamples(page);
9-
});
10-
2+
import { goToDataSetExamplesPage, waitForSearchResults } from './utils';
113

124
test('Check example page', async ({ page }) => {
5+
await goToDataSetExamplesPage(page);
136
// wait for elements to load
147
await expect(page.getByRole("main").getByText("4. Timeseries Query: This will calculate numeric values over time.")).toHaveCount(1)
158

16-
await waitForData(page, "examples");
9+
await waitForSearchResults(page, "examples");
1710

1811
await page.screenshot({ path: 'playwright-screenshots/page-examples-after-checks.png', fullPage: true });
1912
});

e2e/global.setup.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { join as pjoin } from 'path';
22
import { test as setup, expect } from '@playwright/test';
3-
import { goToDataSet, goToConfiguration } from './utils';
3+
import { goToDataSetPage, goToDataSetConfigurationPage } from './utils';
44

55
export const STORAGE_STATE = pjoin(__dirname, '.auth.json');
66

@@ -41,11 +41,11 @@ setup('login and create account', async ({ page }) => {
4141

4242
await page.screenshot({ path: 'playwright-screenshots/page-after-login-after-pop-up.png', fullPage: true });
4343

44-
await goToDataSet(page);
44+
await goToDataSetPage(page);
4545

4646
await page.screenshot({ path: 'playwright-screenshots/page-home.png', fullPage: true });
4747

48-
await goToConfiguration(page);
48+
await goToDataSetConfigurationPage(page);
4949

5050
const accountCount = await page.getByRole("main").getByRole("row").getByText(/E2E_T/).count();
5151
console.log("Number of accounts: ", accountCount);

e2e/inputs.spec.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import { test, expect, Page } from '@playwright/test';
2-
import { goToDataSet, goToInputs, waitForData, query2file, checkRowExists } from './utils';
2+
import { goToDataSetInputsPage, query2file, checkRowExists } from './utils';
33

44
test.beforeEach(async ({ page }) => {
5-
await page.goto('/');
6-
7-
await goToDataSet(page);
8-
await goToInputs(page);
5+
await goToDataSetInputsPage(page);
96
await clearInputs(page);
107
});
118

@@ -37,7 +34,7 @@ test('New Input - DataSet Query', async ({ page }) => {
3734

3835
await goToSplunkSearch(page);
3936

40-
await searchFor(page, `source="dataset_query://${queryName}"`)
37+
await searchSplunk(page, `source="dataset_query://${queryName}"`)
4138
});
4239

4340
test('New Input - DataSet PowerQuery', async ({ page }) => {
@@ -64,7 +61,7 @@ test('New Input - DataSet PowerQuery', async ({ page }) => {
6461

6562
await goToSplunkSearch(page);
6663

67-
await searchFor(page, `source="dataset_powerquery://${queryName}"`)
64+
await searchSplunk(page, `source="dataset_powerquery://${queryName}"`)
6865
});
6966

7067
test('New Input - DataSet Alerts', async ({ page }) => {
@@ -89,7 +86,7 @@ test('New Input - DataSet Alerts', async ({ page }) => {
8986

9087
await goToSplunkSearch(page);
9188

92-
await searchFor(page, `source="dataset_alerts://${queryName}"`)
89+
await searchSplunk(page, `source="dataset_alerts://${queryName}"`)
9390
});
9491

9592
async function clearInputs(page: Page) {
@@ -146,8 +143,8 @@ async function confirmDialog(page: Page) {
146143
await locAddConfirm.click();
147144
}
148145

149-
async function searchFor(page: Page, query: string) {
150-
console.log(`Search for: ${query}`);
146+
async function searchSplunk(page: Page, query: string) {
147+
console.log(`Search in Splunk for: ${query}`);
151148
await page.getByRole('textbox', { name: 'Search' }).fill(query);
152149
await page.getByLabel("Search Button").click();
153150

e2e/search.spec.ts

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,14 @@
1-
import { test, expect, Page } from '@playwright/test';
2-
import {waitForData, query2file, dataSetSearch, goToDataSetSearchPage} from './utils';
3-
4-
test.beforeEach(async ({ page }) => {
5-
await goToDataSetSearchPage(page);
6-
});
7-
1+
import {test, expect} from '@playwright/test';
2+
import {searchDataSet} from './utils';
83

94
test('Simple search - dataset', async ({ page }) => {
10-
await dataSetSearch(page, "| dataset");
11-
5+
await searchDataSet(page, "| dataset maxcount=5");
126
await page.screenshot({ path: 'playwright-screenshots/page-search-simple-search-dataset.png', fullPage: true });
7+
await expect(page.getByText(`Events (5)`)).toHaveCount(1);
138
});
149

1510
test('Simple search - s1query', async ({ page }) => {
16-
await dataSetSearch(page, "| s1query");
17-
11+
await searchDataSet(page, "| s1query maxcount=5");
1812
await page.screenshot({ path: 'playwright-screenshots/page-search-simple-search-s1query.png', fullPage: true });
13+
await expect(page.getByText(`Events (5)`)).toHaveCount(1);
1914
});
20-
21-
async function searchFor(page: Page, query: string, maxCount: number | undefined = undefined) {
22-
if (maxCount === undefined) {
23-
maxCount = Math.ceil(1000 * Math.random()) % 10 + 5;
24-
}
25-
26-
const finalQuery = `${query} maxcount=${maxCount}`
27-
28-
console.log(`Searching for '${finalQuery}', original was: ${query}`);
29-
30-
await page.getByRole('textbox', { name: 'Search' }).fill(finalQuery);
31-
32-
await page.getByLabel("Search Button").click();
33-
34-
await waitForData(page, query2file(query))
35-
36-
await expect(page.getByText(`Events (${maxCount})`)).toHaveCount(1);
37-
}

e2e/utils.ts

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,22 @@ import { test, expect } from '@playwright/test';
33
import {setTimeout} from "timers/promises";
44

55
export async function goToDataSetSearchPage(page: Page) {
6-
await page.goto('/');
7-
await goToDataSet(page);
8-
await goToSearch(page);
6+
console.log("Go to DataSet search page")
7+
await page.goto('/app/TA_dataset/search');
8+
await expect(page).toHaveTitle(/Search/);
9+
await expectWithoutErrors(page);
910
}
1011

11-
export async function goToDataSet(page: Page) {
12+
export async function goToDataSetPage(page: Page) {
1213
console.log("Go to DataSet page")
13-
await page.getByLabel('Navigate to Security Data Lake Add-On for Splunk app').click()
14+
await page.goto('/app/TA_dataset');
1415
await page.screenshot({ path: 'playwright-screenshots/page-home.png', fullPage: true });
1516
}
1617

17-
export async function goToInputs(page: Page) {
18-
console.log("Go to inputs page");
18+
export async function goToDataSetInputsPage(page: Page) {
19+
console.log("Go to DataSet inputs page");
1920

20-
await page.getByRole('link', { name: "Inputs" }).click();
21+
await page.goto('/app/TA_dataset/inputs');
2122
const respQueryPromise = page.waitForResponse('**/TA_dataset_dataset_query*');
2223
const respPowerqueryPromise = page.waitForResponse('**/TA_dataset_dataset_powerquery*');
2324
const respAlertsPromise = page.waitForResponse('**/TA_dataset_dataset_alerts*');
@@ -34,10 +35,10 @@ export async function goToInputs(page: Page) {
3435
await expectWithoutErrors(page);
3536
}
3637

37-
export async function goToConfiguration(page: Page) {
38-
console.log("Go to configuration page");
38+
export async function goToDataSetConfigurationPage(page: Page) {
39+
console.log("Go to DataSet configuration page");
3940

40-
await page.getByRole('link', { name: "Configuration" }).click();
41+
await page.goto('/app/TA_dataset/configuration');
4142
const respAccountPromise = page.waitForResponse('**/TA_dataset_account*');
4243

4344
await page.screenshot({ path: 'playwright-screenshots/page-configuration.png', fullPage: true });
@@ -52,36 +53,29 @@ export async function goToConfiguration(page: Page) {
5253
await expectWithoutErrors(page);
5354
}
5455

55-
export async function goToExamples(page: Page) {
56-
console.log("Go to example page");
56+
export async function goToDataSetExamplesPage(page: Page) {
57+
console.log("Go to DataSet example page");
58+
await page.goto('/app/TA_dataset/dataset_by_example');
5759
await page.getByRole('link', { name: "DataSet by Example" }).click();
5860

5961
await expect(page).toHaveTitle(/DataSet by Example/);
6062

6163
await expectWithoutErrors(page);
6264
}
6365

64-
export async function goToSearch(page: Page) {
65-
console.log("Go to search page");
66-
await page.getByRole('link', { name: 'Search' }).click();
67-
68-
await expect(page).toHaveTitle(/Search/);
69-
70-
await expectWithoutErrors(page);
71-
}
72-
73-
export async function dataSetSearch(page: Page, query: string) {
66+
export async function searchDataSet(page: Page, query: string) {
7467
await goToDataSetSearchPage(page);
75-
console.log(`Search for: ${query}`);
68+
console.log(`Search in DataSet for: ${query}`);
7669
await page.getByRole('textbox', {name: 'Search'}).fill(query);
7770
await page.getByLabel("Search Button").click();
7871

79-
await page.screenshot({path: `playwright-screenshots/page-search-query-${query2file(query)}.png`, fullPage: true});
80-
await setTimeout(3000);
72+
const queryScreenshotKey = query2file(query);
73+
await page.screenshot({path: `playwright-screenshots/page-search-query-${queryScreenshotKey}.png`, fullPage: true});
74+
await waitForSearchResults(page, queryScreenshotKey)
8175
await expect(page.getByText("sourcetype").first()).toBeVisible();
8276
}
8377

84-
export async function waitForData(page: Page, key: string) {
78+
export async function waitForSearchResults(page: Page, key: string) {
8579
await page.waitForTimeout(5000);
8680

8781
let pic = 0

0 commit comments

Comments
 (0)