fix: #721 Datetime args not being rendered

This commit is contained in:
jamesread 2025-11-22 08:34:53 +00:00
parent d4c80c65c2
commit 15390f7b80
3 changed files with 143 additions and 0 deletions

View File

@ -160,6 +160,10 @@ function getInputType(arg) {
return 'text'
}
if (arg.type === 'datetime') {
return 'datetime-local'
}
return arg.type
}

View File

@ -0,0 +1,17 @@
---
listenAddressSingleHTTPFrontend: 0.0.0.0:1337
logLevel: "DEBUG"
checkForUpdates: false
actions:
- title: Test datetime argument
shell: "echo 'Selected datetime: {{ datetime }}'"
icon: ping
arguments:
- name: datetime
title: Select a date and time
type: datetime
required: true
description: Choose a date and time for the action

View File

@ -0,0 +1,122 @@
import { describe, it, before, after } from 'mocha'
import { expect } from 'chai'
import { By, Condition } from 'selenium-webdriver'
import {
getRootAndWait,
getActionButton,
takeScreenshotOnFailure,
} from '../lib/elements.js'
describe('config: datetime', function () {
before(async function () {
await runner.start('datetime')
})
after(async () => {
await runner.stop()
})
afterEach(function () {
takeScreenshotOnFailure(this.currentTest, webdriver)
})
it('Datetime argument uses datetime-local input type', async function () {
await getRootAndWait()
const btn = await getActionButton(webdriver, 'Test datetime argument')
await btn.click()
// Wait for navigation to argument form page
await webdriver.wait(
new Condition('wait for argument form page', async () => {
const url = await webdriver.getCurrentUrl()
return url.includes('/actionBinding/') && url.includes('/argumentForm')
}),
8000
)
// Find the datetime input field
const datetimeInput = await webdriver.findElement(By.id('datetime'))
// Verify it's a datetime-local input type
const inputType = await datetimeInput.getAttribute('type')
expect(inputType).to.equal('datetime-local', 'Input type should be datetime-local')
// Verify it has the step attribute set to 1 (for seconds precision)
const step = await datetimeInput.getAttribute('step')
expect(step).to.equal('1', 'Step attribute should be 1')
// Verify it's required
const required = await datetimeInput.getAttribute('required')
expect(required).to.not.be.null
// Verify the label is present
const label = await webdriver.findElement(By.css('label[for="datetime"]'))
expect(await label.getText()).to.contain('Select a date and time')
})
it('Datetime argument can be filled and submitted', async function () {
await getRootAndWait()
const btn = await getActionButton(webdriver, 'Test datetime argument')
await btn.click()
// Wait for navigation to argument form page
await webdriver.wait(
new Condition('wait for argument form page', async () => {
const url = await webdriver.getCurrentUrl()
return url.includes('/actionBinding/') && url.includes('/argumentForm')
}),
8000
)
// Find the datetime input field
const datetimeInput = await webdriver.findElement(By.id('datetime'))
// Set a datetime value (format: YYYY-MM-DDTHH:mm)
// datetime-local returns values without seconds, backend will add :00
const testDateTime = '2023-12-25T15:30'
// Use JavaScript to set the value directly (more reliable for datetime-local inputs)
await webdriver.executeScript(
'arguments[0].value = arguments[1]',
datetimeInput,
testDateTime
)
// Trigger input event to ensure Vue reactivity
await webdriver.executeScript(
'arguments[0].dispatchEvent(new Event("input", { bubbles: true }))',
datetimeInput
)
// Small wait for Vue to process the change
await webdriver.sleep(100)
// Verify the value was set
const value = await datetimeInput.getAttribute('value')
expect(value).to.equal(testDateTime)
// Find and click the submit button
const submitButton = await webdriver.findElement(
By.css('button[name="start"]')
)
await submitButton.click()
// Wait for navigation to logs page
await webdriver.wait(
new Condition('wait for logs page', async () => {
const url = await webdriver.getCurrentUrl()
return url.includes('/logs/')
}),
8000
)
// Verify we're on the logs page (action was executed)
const url = await webdriver.getCurrentUrl()
expect(url).to.include('/logs/')
})
})