diff --git a/e2e-tests/docker-compose.yml b/e2e-tests/docker-compose.yml index f34c71da7e..4b0992ca21 100644 --- a/e2e-tests/docker-compose.yml +++ b/e2e-tests/docker-compose.yml @@ -228,24 +228,24 @@ services: retries: 5 logging: *default-logging - # minio_e2e: - # image: minio/minio:latest - # restart: unless-stopped - # command: server /data --console-address ":9001" - # expose: - # - 9000 - # - 9001 - # environment: - # MINIO_ROOT_USER: minioadmin - # MINIO_ROOT_PASSWORD: minioadmin - # volumes: - # - minio_data:/data - # healthcheck: - # test: ["CMD", "mc", "ready", "local"] - # interval: 10s - # timeout: 5s - # retries: 5 - # logging: *default-logging + minio_e2e: + image: minio/minio:latest + restart: unless-stopped + command: server /data --console-address ":9001" + expose: + - 9000 + - 9001 + environment: + MINIO_ROOT_USER: minioadmin + MINIO_ROOT_PASSWORD: minioadmin + volumes: + - minio_data:/data + healthcheck: + test: ["CMD", "mc", "ready", "local"] + interval: 10s + timeout: 5s + retries: 5 + logging: *default-logging volumes: db_data: null @@ -256,4 +256,4 @@ volumes: mssql_data: null oracle_data: null postgres_e2e_data: null - # minio_data: null + minio_data: null diff --git a/frontend/e2e/resource-dbmanager.spec.ts b/frontend/e2e/db-manager.spec.ts similarity index 83% rename from frontend/e2e/resource-dbmanager.spec.ts rename to frontend/e2e/db-manager.spec.ts index e26a228b71..0d25dc2ff1 100644 --- a/frontend/e2e/resource-dbmanager.spec.ts +++ b/frontend/e2e/db-manager.spec.ts @@ -6,11 +6,11 @@ import { Toast, prettify } from './utils' test.describe('Database resources', () => { for (const dbType of ['postgresql', 'mysql', 'bigquery', 'ms_sql_server', 'snowflake'] as const) { test.describe(prettify(dbType), () => { - test(`setup a ${dbType} resource and test simple CRUD with DB Manager`, async ({ page }) => { + test(`simple CRUD with DB Manager`, async ({ page }) => { await setupNewResourceAndOpenDbManager(page, dbType) await runDbManagerSimpleCRUDTest(page, dbType) }) - test(`setup a ${dbType} resource and test Alter table with DB Manager`, async ({ page }) => { + test(`Alter table with DB Manager`, async ({ page }) => { await setupNewResourceAndOpenDbManager(page, dbType) await runDbManagerAlterTableTest(page, dbType) }) @@ -29,6 +29,30 @@ test.describe('Data tables', () => { }) }) +test.describe('Ducklake', () => { + test('simple CRUD with DB Manager', async ({ page }) => { + await openDucklakeDbManager(page) + await runDbManagerSimpleCRUDTest(page, 'ducklake') + }) + test('Alter table with DB Manager', async ({ page }) => { + await openDucklakeDbManager(page) + await runDbManagerAlterTableTest(page, 'ducklake') + }) +}) + +async function openDucklakeDbManager(page: Page) { + // await page.goto('/workspace_settings?tab=windmill_lfs')] + // // Check if ducklake already exists + // let table = page.locator('table') + // await table.waitFor({ state: 'visible' }) + // let rows = await table.locator('tr:has(input[id="name"])').all() + // for (const row of rows) { + // const val = await row.locator('input[id="name"]').inputValue() + // // Don't setup again if it already exists (saving the settings creates race condition) + // if (val === datatableId) return + // } +} + async function openDataTableDbManager(page: Page) { await page.goto('/workspace_settings?tab=windmill_data_tables') await setupNewDataTable(page, `datatable_${process.env.TEST_UNIQUE_ID}`) @@ -55,9 +79,7 @@ async function setupNewDataTable(page: Page, datatableId: string) { let rows = await table.locator('tr:has(input[id="name"])').all() for (const row of rows) { const val = await row.locator('input[id="name"]').inputValue() - // Don't setup again if it already exists. - // The reason we do not use a unique datatable per test is that saving - // the settings create a race condition when multiple tests run in parallel. + // Don't setup again if it already exists (saving the settings creates race condition) if (val === datatableId) return } @@ -161,13 +183,15 @@ async function setupNewResource( page: Page, resourceType: DbType ): Promise<{ resourceName: string }> { - // Generate unique ID with timestamp - const resourceName = `${resourceType}_${Date.now()}` + const resourceName = `${resourceType}_e2e}` await page.goto('/resources') + await page.locator('table').waitFor({ state: 'visible' }) + if (await page.locator(`table tr:has-text("${resourceName}")`).isVisible()) + return { resourceName } + const newDataTableButton = page.locator('button:text-is("Add resource")') - await newDataTableButton.waitFor({ state: 'visible' }) await newDataTableButton.click() const addResourceDrawer = page.locator('#add-resource-drawer')