olivetin/frontend/resources/vue/utils/rerunArguments.test.mjs

155 lines
4.2 KiB
JavaScript

import test from 'node:test'
import assert from 'node:assert/strict'
import {
buildRerunPrefilledArguments,
buildRerunStartActionArgs,
hasMissingRerunArguments,
logEntryArgumentsToStartActionArgs,
rerunNeedsArgumentForm
} from '../utils/rerunArguments.js'
test('logEntryArgumentsToStartActionArgs maps proto arguments for StartAction', () => {
assert.deepEqual(
logEntryArgumentsToStartActionArgs({
arguments: [
{ name: 'host', value: 'example.com' },
{ name: 'port', value: '443' }
]
}),
[
{ name: 'host', value: 'example.com' },
{ name: 'port', value: '443' }
]
)
})
test('hasMissingRerunArguments requires password fields to be re-entered', () => {
const action = {
arguments: [
{ name: 'user', type: 'ascii_identifier' },
{ name: 'pass', type: 'password' }
]
}
assert.equal(
hasMissingRerunArguments(action, [{ name: 'user', value: 'alice' }]),
true
)
})
test('hasMissingRerunArguments requires very_dangerous_raw_string fields to be re-entered', () => {
const action = {
arguments: [
{ name: 'host', type: 'ascii_identifier' },
{ name: 'payload', type: 'very_dangerous_raw_string' }
]
}
assert.equal(
hasMissingRerunArguments(action, [{ name: 'host', value: 'db-1' }]),
true
)
})
test('hasMissingRerunArguments detects missing stored args without relying on required flag', () => {
// Proto ActionArgument has no `required` field — only defaultValue.
const action = {
arguments: [{ name: 'host', type: 'ascii_identifier' }]
}
assert.equal(hasMissingRerunArguments(action, []), true)
assert.equal(
hasMissingRerunArguments(action, [{ name: 'host', value: 'db-1' }]),
false
)
})
test('hasMissingRerunArguments treats empty defaultValue as required', () => {
const action = {
arguments: [{ name: 'host', type: 'ascii_identifier', defaultValue: '' }]
}
assert.equal(hasMissingRerunArguments(action, []), true)
})
test('hasMissingRerunArguments allows args that have a defaultValue', () => {
const action = {
arguments: [{ name: 'host', type: 'ascii_identifier', defaultValue: 'example.com' }]
}
assert.equal(hasMissingRerunArguments(action, []), false)
})
test('hasMissingRerunArguments ignores confirmation and html args', () => {
const action = {
arguments: [
{ name: 'confirm', type: 'confirmation' },
{ name: 'help', type: 'html' },
{ name: 'host', type: 'ascii_identifier' }
]
}
assert.equal(
hasMissingRerunArguments(action, [{ name: 'host', value: 'db-1' }]),
false
)
})
test('rerunNeedsArgumentForm can start directly when stored args are complete', () => {
const action = {
arguments: [{ name: 'host', type: 'ascii_identifier' }]
}
const logEntry = {
arguments: [{ name: 'host', value: 'db-1' }]
}
assert.equal(rerunNeedsArgumentForm(action, logEntry), false)
})
test('rerunNeedsArgumentForm always opens the form when justification is required', () => {
const action = {
justification: ' ',
arguments: [{ name: 'host', type: 'ascii_identifier' }]
}
const logEntry = {
arguments: [{ name: 'host', value: 'db-1' }],
justification: 'approved change'
}
assert.equal(rerunNeedsArgumentForm(action, logEntry), true)
assert.equal(rerunNeedsArgumentForm(action, {}), true)
})
test('buildRerunStartActionArgs uses stored arguments without justification', () => {
assert.deepEqual(
buildRerunStartActionArgs('binding-1', {
arguments: [{ name: 'host', value: 'db-1' }],
justification: 'maintenance window'
}),
{
bindingId: 'binding-1',
arguments: [{ name: 'host', value: 'db-1' }]
}
)
})
test('buildRerunPrefilledArguments maps stored args for history.state', () => {
assert.deepEqual(
buildRerunPrefilledArguments({
arguments: [
{ name: 'host', value: 'db-1' },
{ name: 'port', value: '5432' }
]
}),
{
host: 'db-1',
port: '5432'
}
)
})
test('buildRerunPrefilledArguments returns empty object when nothing was stored', () => {
assert.deepEqual(buildRerunPrefilledArguments({}), {})
assert.deepEqual(buildRerunPrefilledArguments(undefined), {})
})