|
|
@@ -0,0 +1,154 @@
|
|
|
+import { describe, it, before, after } from 'mocha'
|
|
|
+import { expect } from 'chai'
|
|
|
+import { By, Condition } from 'selenium-webdriver'
|
|
|
+import {
|
|
|
+ DEFAULT_UI_WAIT_MS,
|
|
|
+ argumentFieldId,
|
|
|
+ getRootAndWait,
|
|
|
+ getActionButton,
|
|
|
+ takeScreenshotOnFailure,
|
|
|
+ waitForArgumentFormPage,
|
|
|
+ waitForArgumentFormReady,
|
|
|
+ waitForLogsPage,
|
|
|
+ waitForExecutionComplete,
|
|
|
+ getTerminalBuffer,
|
|
|
+} from '../../lib/elements.js'
|
|
|
+
|
|
|
+async function openArgumentForm (actionTitle) {
|
|
|
+ await getRootAndWait()
|
|
|
+ const btn = await getActionButton(webdriver, actionTitle)
|
|
|
+ await btn.click()
|
|
|
+ await waitForArgumentFormPage()
|
|
|
+ await waitForArgumentFormReady()
|
|
|
+}
|
|
|
+
|
|
|
+async function waitForStartButtonEnabled () {
|
|
|
+ await webdriver.wait(
|
|
|
+ new Condition('wait for Start button to be enabled', async () => {
|
|
|
+ const submitButton = await webdriver.findElement(By.css('button[name="start"]'))
|
|
|
+ return await submitButton.isEnabled()
|
|
|
+ }),
|
|
|
+ DEFAULT_UI_WAIT_MS
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+async function waitForTerminalOutput (expectedSubstring) {
|
|
|
+ await webdriver.wait(
|
|
|
+ new Condition(`wait for terminal output containing ${expectedSubstring}`, async () => {
|
|
|
+ try {
|
|
|
+ const terminalReady = await webdriver.executeScript(`
|
|
|
+ return !!(window.terminal && window.terminal.getBufferAsString);
|
|
|
+ `)
|
|
|
+ if (!terminalReady) {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ const output = await getTerminalBuffer()
|
|
|
+ return output && output.includes(expectedSubstring)
|
|
|
+ } catch (e) {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ DEFAULT_UI_WAIT_MS
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+describe('config: argumentIdCollision', function () {
|
|
|
+ this.timeout(10000)
|
|
|
+
|
|
|
+ before(async function () {
|
|
|
+ await runner.start('argumentIdCollision')
|
|
|
+ })
|
|
|
+
|
|
|
+ after(async () => {
|
|
|
+ await runner.stop()
|
|
|
+ })
|
|
|
+
|
|
|
+ afterEach(function () {
|
|
|
+ takeScreenshotOnFailure(this.currentTest, webdriver)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('Argument named content validates and submits (#1071)', async function () {
|
|
|
+ await openArgumentForm('Test content argument collision')
|
|
|
+
|
|
|
+ const contentWrapper = await webdriver.findElement(By.id('content'))
|
|
|
+ expect(await contentWrapper.getTagName()).to.equal('div')
|
|
|
+
|
|
|
+ const textarea = await webdriver.findElement(By.id(argumentFieldId('content')))
|
|
|
+ expect(await textarea.getTagName()).to.equal('textarea')
|
|
|
+ expect(await textarea.getAttribute('id')).to.not.equal('content')
|
|
|
+
|
|
|
+ const label = await webdriver.findElement(By.css(`label[for="${argumentFieldId('content')}"]`))
|
|
|
+ expect(await label.getText()).to.contain('Cmd input')
|
|
|
+
|
|
|
+ await textarea.sendKeys('hello from collision test')
|
|
|
+
|
|
|
+ const submitButton = await webdriver.findElement(By.css('button[name="start"]'))
|
|
|
+ await waitForStartButtonEnabled()
|
|
|
+ await submitButton.click()
|
|
|
+ await waitForLogsPage()
|
|
|
+ await waitForExecutionComplete()
|
|
|
+ await waitForTerminalOutput('Cmd input: hello from collision test')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('Argument named layout validates and submits (#1071)', async function () {
|
|
|
+ await openArgumentForm('Test layout argument collision')
|
|
|
+
|
|
|
+ const layoutWrapper = await webdriver.findElement(By.id('layout'))
|
|
|
+ expect(await layoutWrapper.getTagName()).to.equal('div')
|
|
|
+
|
|
|
+ const input = await webdriver.findElement(By.id(argumentFieldId('layout')))
|
|
|
+ expect(await input.getAttribute('type')).to.equal('text')
|
|
|
+ expect(await input.getAttribute('id')).to.not.equal('layout')
|
|
|
+
|
|
|
+ await input.sendKeys('testlayoutvalue')
|
|
|
+
|
|
|
+ const submitButton = await webdriver.findElement(By.css('button[name="start"]'))
|
|
|
+ await waitForStartButtonEnabled()
|
|
|
+ await submitButton.click()
|
|
|
+ await waitForLogsPage()
|
|
|
+ await waitForExecutionComplete()
|
|
|
+ await waitForTerminalOutput('Layout value: testlayoutvalue')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('Namespaced argument ids do not match app-shell ids', async function () {
|
|
|
+ await openArgumentForm('Test content argument collision')
|
|
|
+
|
|
|
+ const namespacedIds = await webdriver.executeScript(`
|
|
|
+ const requiredShellIds = ['content', 'layout'];
|
|
|
+ const optionalShellIds = ['banner', 'app', 'mainnav', 'big-error'];
|
|
|
+ const fieldId = arguments[0];
|
|
|
+ const fieldElement = document.getElementById(fieldId);
|
|
|
+
|
|
|
+ return {
|
|
|
+ fieldTag: fieldElement?.tagName?.toLowerCase() ?? null,
|
|
|
+ required: requiredShellIds.map((shellId) => {
|
|
|
+ const shellElement = document.getElementById(shellId);
|
|
|
+ return {
|
|
|
+ shellId,
|
|
|
+ shellTag: shellElement?.tagName?.toLowerCase() ?? null,
|
|
|
+ sameElement: shellElement != null && shellElement === fieldElement
|
|
|
+ };
|
|
|
+ }),
|
|
|
+ optional: optionalShellIds.map((shellId) => {
|
|
|
+ const shellElement = document.getElementById(shellId);
|
|
|
+ return {
|
|
|
+ shellId,
|
|
|
+ sameElement: shellElement != null && shellElement === fieldElement
|
|
|
+ };
|
|
|
+ })
|
|
|
+ };
|
|
|
+ `, argumentFieldId('content'))
|
|
|
+
|
|
|
+ expect(namespacedIds.fieldTag, `argument field ${argumentFieldId('content')} should exist`).to.equal('textarea')
|
|
|
+
|
|
|
+ for (const entry of namespacedIds.required) {
|
|
|
+ expect(entry.shellTag, `app-shell #${entry.shellId} should exist`).to.not.equal(null)
|
|
|
+ expect(entry.sameElement, `arg field must not resolve to #${entry.shellId}`).to.be.false
|
|
|
+ }
|
|
|
+
|
|
|
+ for (const entry of namespacedIds.optional) {
|
|
|
+ expect(entry.sameElement, `arg field must not resolve to #${entry.shellId}`).to.be.false
|
|
|
+ }
|
|
|
+ })
|
|
|
+})
|