-
Notifications
You must be signed in to change notification settings - Fork 996
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MINOR: supported all_index in search index configuration form (#16571)
* supported all_index in search index configuration form * allow clear in select widget * supported tree select for the entities * playwright test * added env for the run application status test * fix beta badge color, color of checkbox and changes as per comments * minor fix * fix sonar issue
- Loading branch information
1 parent
27f4d97
commit 15ae2d3
Showing
12 changed files
with
616 additions
and
64 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
217 changes: 217 additions & 0 deletions
217
openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/SearchIndexApplication.spec.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,217 @@ | ||
/* | ||
* Copyright 2024 Collate. | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
import test, { expect, Page } from '@playwright/test'; | ||
import { GlobalSettingOptions } from '../../constant/settings'; | ||
import { getApiContext, redirectToHomePage } from '../../utils/common'; | ||
import { settingClick } from '../../utils/sidebar'; | ||
|
||
// use the admin user to login | ||
test.use({ storageState: 'playwright/.auth/admin.json' }); | ||
|
||
const verifyApplicationTriggerToastData = async (page: Page) => { | ||
await expect(page.getByRole('alert').first()).toHaveText( | ||
/Application triggered successfully/ | ||
); | ||
|
||
await page.getByLabel('close').first().click(); | ||
}; | ||
|
||
const verifyLastExecutionStatus = async (page: Page) => { | ||
const { apiContext } = await getApiContext(page); | ||
|
||
await expect | ||
.poll( | ||
async () => { | ||
const response = await apiContext | ||
.get( | ||
'/api/v1/apps/name/SearchIndexingApplication/status?offset=0&limit=1' | ||
) | ||
.then((res) => res.json()); | ||
|
||
return response.data[0]?.status; | ||
}, | ||
{ | ||
// Custom expect message for reporting, optional. | ||
message: 'To get the last run execution status as success', | ||
intervals: [30_000], | ||
timeout: 300_000, | ||
} | ||
) | ||
.toBe('success'); | ||
|
||
await page.reload(); | ||
|
||
await page.waitForSelector('[data-testid="app-run-history-table"]'); | ||
|
||
await expect(page.getByTestId('pipeline-status')).toContainText('Success'); | ||
}; | ||
|
||
const verifyLastExecutionRun = async (page: Page) => { | ||
const response = await page.waitForResponse( | ||
'/api/v1/apps/name/SearchIndexingApplication/status?offset=0&limit=1' | ||
); | ||
|
||
expect(response.status()).toBe(200); | ||
|
||
const responseData = await response.json(); | ||
if (responseData.data.length > 0) { | ||
expect(responseData.data).toHaveLength(1); | ||
|
||
if (responseData.data[0].status === 'running') { | ||
// wait for success status | ||
await verifyLastExecutionStatus(page); | ||
} else { | ||
expect(responseData.data[0].status).toBe('success'); | ||
} | ||
} | ||
}; | ||
|
||
test('Search Index Application', async ({ page }) => { | ||
await test.step('Visit Application page', async () => { | ||
await redirectToHomePage(page); | ||
await settingClick(page, GlobalSettingOptions.APPLICATIONS); | ||
}); | ||
|
||
await test.step('Verify last execution run', async () => { | ||
await page | ||
.locator( | ||
'[data-testid="search-indexing-application-card"] [data-testid="config-btn"]' | ||
) | ||
.click(); | ||
await verifyLastExecutionRun(page); | ||
}); | ||
|
||
await test.step('Edit application', async () => { | ||
await page.click('[data-testid="edit-button"]'); | ||
await page.click('[data-testid="cron-type"]'); | ||
await page.click('.rc-virtual-list [title="None"]'); | ||
|
||
const deployResponse = page.waitForResponse('/api/v1/apps/*'); | ||
await page.click('.ant-modal-body [data-testid="deploy-button"]'); | ||
await deployResponse; | ||
|
||
await expect(page.getByRole('alert').first()).toHaveText( | ||
/Schedule saved successfully/ | ||
); | ||
|
||
await page.getByLabel('close').first().click(); | ||
|
||
expect(await page.innerText('[data-testid="schedule-type"]')).toContain( | ||
'None' | ||
); | ||
|
||
await page.click('[data-testid="configuration"]'); | ||
await page.fill('#root\\/batchSize', '0'); | ||
|
||
await page.getByTitle('chart').getByLabel('close').click(); | ||
|
||
await page.click( | ||
'[data-testid="select-widget"] > .ant-select-selector > .ant-select-selection-item' | ||
); | ||
await page.click('[data-testid="select-option-JP"]'); | ||
|
||
const responseAfterSubmit = page.waitForResponse('/api/v1/apps/*'); | ||
await page.click('[data-testid="submit-btn"]'); | ||
await responseAfterSubmit; | ||
|
||
await expect(page.getByRole('alert').first()).toHaveText( | ||
/Configuration saved successfully/ | ||
); | ||
|
||
await page.getByLabel('close').first().click(); | ||
}); | ||
|
||
await test.step('Uninstall application', async () => { | ||
await page.click('[data-testid="manage-button"]'); | ||
await page.click('[data-testid="uninstall-button-title"]'); | ||
|
||
const deleteRequest = page.waitForResponse( | ||
'/api/v1/apps/name/SearchIndexingApplication?hardDelete=true' | ||
); | ||
await page.click('[data-testid="save-button"]'); | ||
await deleteRequest; | ||
|
||
await expect(page.getByRole('alert').first()).toHaveText( | ||
/Application uninstalled/ | ||
); | ||
|
||
await page.getByLabel('close').first().click(); | ||
|
||
const card1 = page.locator( | ||
'[data-testid="search-indexing-application-card"]' | ||
); | ||
|
||
expect(await card1.isVisible()).toBe(false); | ||
}); | ||
|
||
await test.step('Install application', async () => { | ||
await page.click('[data-testid="add-application"]'); | ||
|
||
// Verify response status code | ||
const getMarketPlaceResponse = await page.waitForResponse( | ||
'/api/v1/apps/marketplace?limit=*' | ||
); | ||
|
||
expect(getMarketPlaceResponse.status()).toBe(200); | ||
|
||
await page.click( | ||
'[data-testid="search-indexing-application-card"] [data-testid="config-btn"]' | ||
); | ||
await page.click('[data-testid="install-application"]'); | ||
await page.click('[data-testid="save-button"]'); | ||
await page.click('[data-testid="submit-btn"]'); | ||
await page.click('[data-testid="cron-type"]'); | ||
await page.click('.rc-virtual-list [title="None"]'); | ||
|
||
expect(await page.innerText('[data-testid="cron-type"]')).toContain('None'); | ||
|
||
const installApplicationResponse = page.waitForResponse('api/v1/apps'); | ||
await page.click('[data-testid="deploy-button"]'); | ||
await installApplicationResponse; | ||
|
||
await expect(page.getByRole('alert').first()).toHaveText( | ||
/Application installed successfully/ | ||
); | ||
|
||
await page.getByLabel('close').first().click(); | ||
|
||
const card = page.locator( | ||
'[data-testid="search-indexing-application-card"]' | ||
); | ||
|
||
expect(await card.isVisible()).toBe(true); | ||
}); | ||
|
||
if (process.env.isOss) { | ||
await test.step('Run application', async () => { | ||
test.slow(true); // Test time shouldn't exceed while re-fetching the history API. | ||
|
||
await page.click( | ||
'[data-testid="search-indexing-application-card"] [data-testid="config-btn"]' | ||
); | ||
|
||
const triggerPipelineResponse = page.waitForResponse( | ||
'/api/v1/apps/trigger/SearchIndexingApplication' | ||
); | ||
await page.click('[data-testid="run-now-button"]'); | ||
|
||
await triggerPipelineResponse; | ||
|
||
await verifyApplicationTriggerToastData(page); | ||
|
||
await page.reload(); | ||
|
||
await verifyLastExecutionRun(page); | ||
}); | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.