From 09c60c7bcb9a482b2992bf3ad1b7dadf1e4669a3 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Fri, 14 Jun 2024 14:59:23 -0400 Subject: [PATCH] test(e2e): Add test for worker (#2320) * test(e2e): Add test for worker * CR: Fix selector * test(e2e): Skip test on safari * test(e2e): Check create config --- .../form/worker/create-worker-led/index.hbs | 2 + ui/admin/tests/e2e/tests/worker-ent.spec.js | 94 +++++++++++++++++++ ui/admin/tests/e2e/tests/worker.spec.js | 85 +++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 ui/admin/tests/e2e/tests/worker-ent.spec.js create mode 100644 ui/admin/tests/e2e/tests/worker.spec.js diff --git a/ui/admin/app/components/form/worker/create-worker-led/index.hbs b/ui/admin/app/components/form/worker/create-worker-led/index.hbs index 171b64b37..662bf4707 100644 --- a/ui/admin/app/components/form/worker/create-worker-led/index.hbs +++ b/ui/admin/app/components/form/worker/create-worker-led/index.hbs @@ -159,6 +159,7 @@ @value={{this.createConfigText}} @hasCopyButton={{true}} @hasLineNumbers={{false}} + data-test-worker-directory />

@@ -170,6 +171,7 @@ @value={{this.workerConfigText}} @hasCopyButton={{true}} @hasLineNumbers={{false}} + data-test-worker-config />

diff --git a/ui/admin/tests/e2e/tests/worker-ent.spec.js b/ui/admin/tests/e2e/tests/worker-ent.spec.js new file mode 100644 index 000000000..a3ed8d131 --- /dev/null +++ b/ui/admin/tests/e2e/tests/worker-ent.spec.js @@ -0,0 +1,94 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: MPL-2.0 + */ + +/* eslint-disable no-undef */ +const { expect } = require('@playwright/test'); +const { test } = require('@playwright/test'); +const { authenticatedState } = require('../helpers/general'); + +test.use({ storageState: authenticatedState }); + +test('Create a worker (enterprise) @ent @docker @aws', async ({ + page, + browserName, +}) => { + test.skip(browserName === 'webkit', 'Bug in worker form on Safari'); + + await page.goto('/'); + await page + .getByRole('navigation', { name: 'General' }) + .getByRole('link', { name: 'Workers' }) + .click(); + await page.getByRole('link', { name: 'New', exact: true }).click(); + + // Populate config fields + await page.getByLabel('Worker public address').fill('worker1.example.com'); + await page.getByLabel('Config file path').fill('/home/ubuntu/boundary'); + await page.getByLabel('Initial upstreams').fill('10.0.0.1, 10.0.0.2'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByLabel('Key') + .fill('type'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByLabel('Value') + .fill('downstream, pki'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByRole('button', { name: 'Add' }) + .click(); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByLabel('Key') + .last() + .fill('test'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByLabel('Value') + .last() + .fill('example'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByRole('button', { name: 'Add' }) + .click(); + + await page.getByRole('switch', { name: 'Enable Recording Storage' }).click(); + await page.getByLabel('Recording Storage Path').fill('/tmp/recordings'); + + // Check auto-populated config + const dirLocator = '[data-test-worker-directory]'; + await expect(page.locator(dirLocator)).toContainText( + 'mkdir /home/ubuntu/boundary/ ;', + ); + await expect(page.locator(dirLocator)).toContainText( + 'touch /home/ubuntu/boundary/pki-worker.hcl', + ); + + const configLocator = '[data-test-worker-config]'; + await expect(page.locator(configLocator)).toContainText( + 'public_addr = "worker1.example.com"', + ); + await expect(page.locator(configLocator)).toContainText( + 'auth_storage_path = "/home/ubuntu/boundary/worker1"', + ); + await expect(page.locator(configLocator)).toContainText( + 'initial_upstreams = ["10.0.0.1", "10.0.0.2"]', + ); + await expect(page.locator(configLocator)).toContainText( + 'type = ["downstream", "pki"]', + ); + await expect(page.locator(configLocator)).toContainText('test = ["example"]'); + await expect(page.locator(configLocator)).toContainText( + 'recording_storage_path = "/tmp/recordings"', + ); + + // Try using an invalid worker token. Expect an error + await page.getByLabel('Worker Auth Registration Request').fill('test'); + await page.getByRole('button', { name: 'Register' }).click(); + await expect( + page.getByRole('alert').getByText('Error', { exact: true }), + ).toBeVisible(); + await page.getByRole('button', { name: 'Dismiss' }).click(); +}); diff --git a/ui/admin/tests/e2e/tests/worker.spec.js b/ui/admin/tests/e2e/tests/worker.spec.js new file mode 100644 index 000000000..76e2237fc --- /dev/null +++ b/ui/admin/tests/e2e/tests/worker.spec.js @@ -0,0 +1,85 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: MPL-2.0 + */ + +/* eslint-disable no-undef */ +const { expect } = require('@playwright/test'); +const { test } = require('@playwright/test'); +const { authenticatedState } = require('../helpers/general'); + +test.use({ storageState: authenticatedState }); + +test('Create a worker @ce @docker @aws', async ({ page, browserName }) => { + test.skip(browserName === 'webkit', 'Bug in worker form on Safari'); + + await page.goto('/'); + await page + .getByRole('navigation', { name: 'General' }) + .getByRole('link', { name: 'Workers' }) + .click(); + await page.getByRole('link', { name: 'New', exact: true }).click(); + + // Populate config fields + await page.getByLabel('Worker public address').fill('worker1.example.com'); + await page.getByLabel('Config file path').fill('/home/ubuntu/boundary'); + await page.getByLabel('Initial upstreams').fill('10.0.0.1, 10.0.0.2'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByLabel('Key') + .fill('type'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByLabel('Value') + .fill('downstream, pki'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByRole('button', { name: 'Add' }) + .click(); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByLabel('Key') + .last() + .fill('test'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByLabel('Value') + .last() + .fill('example'); + await page + .getByRole('group', { name: 'Worker Tags' }) + .getByRole('button', { name: 'Add' }) + .click(); + + // Check auto-populated configs + const dirLocator = '[data-test-worker-directory]'; + await expect(page.locator(dirLocator)).toContainText( + 'mkdir /home/ubuntu/boundary/ ;', + ); + await expect(page.locator(dirLocator)).toContainText( + 'touch /home/ubuntu/boundary/pki-worker.hcl', + ); + + const configLocator = '[data-test-worker-config]'; + await expect(page.locator(configLocator)).toContainText( + 'public_addr = "worker1.example.com"', + ); + await expect(page.locator(configLocator)).toContainText( + 'auth_storage_path = "/home/ubuntu/boundary/worker1"', + ); + await expect(page.locator(configLocator)).toContainText( + 'initial_upstreams = ["10.0.0.1", "10.0.0.2"]', + ); + await expect(page.locator(configLocator)).toContainText( + 'type = ["downstream", "pki"]', + ); + await expect(page.locator(configLocator)).toContainText('test = ["example"]'); + + // Try using an invalid worker token. Expect an error + await page.getByLabel('Worker Auth Registration Request').fill('test'); + await page.getByRole('button', { name: 'Register' }).click(); + await expect( + page.getByRole('alert').getByText('Error', { exact: true }), + ).toBeVisible(); + await page.getByRole('button', { name: 'Dismiss' }).click(); +});