mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-19 10:53:30 +00:00
test(core): cover when AND semantics and multiselect neq (#35182)
This commit is contained in:
parent
12d9f4b29b
commit
5fc4e18b82
1 changed files with 73 additions and 0 deletions
|
|
@ -92,6 +92,79 @@ describe("Form", () => {
|
|||
}),
|
||||
)
|
||||
|
||||
it.effect("requires every when condition to match and treats empty when as active", () =>
|
||||
Effect.gen(function* () {
|
||||
const service = yield* Form.Service
|
||||
const created = yield* service.create({
|
||||
sessionID: "global",
|
||||
mode: "form",
|
||||
fields: [
|
||||
{ key: "a", type: "boolean" },
|
||||
{ key: "b", type: "boolean" },
|
||||
{
|
||||
key: "x",
|
||||
type: "string",
|
||||
required: true,
|
||||
when: [
|
||||
{ key: "a", op: "eq", value: true },
|
||||
{ key: "b", op: "eq", value: true },
|
||||
],
|
||||
},
|
||||
{ key: "z", type: "string", required: true, when: [] },
|
||||
],
|
||||
})
|
||||
|
||||
const missingX = yield* service.reply({ id: created.id, answer: { a: true, b: true, z: "ok" } }).pipe(Effect.flip)
|
||||
expect(missingX).toEqual(new Form.InvalidAnswerError({ id: created.id, message: "Missing required form field: x" }))
|
||||
|
||||
const inactiveX = yield* service
|
||||
.reply({ id: created.id, answer: { a: true, b: false, x: "nope", z: "ok" } })
|
||||
.pipe(Effect.flip)
|
||||
expect(inactiveX).toEqual(new Form.InvalidAnswerError({ id: created.id, message: "Form field is not active: x" }))
|
||||
|
||||
const missingZ = yield* service.reply({ id: created.id, answer: { a: true, b: false } }).pipe(Effect.flip)
|
||||
expect(missingZ).toEqual(new Form.InvalidAnswerError({ id: created.id, message: "Missing required form field: z" }))
|
||||
|
||||
yield* service.reply({ id: created.id, answer: { a: true, b: false, z: "ok" } })
|
||||
expect(yield* service.state(created.id)).toEqual({ status: "answered", answer: { a: true, b: false, z: "ok" } })
|
||||
}),
|
||||
)
|
||||
|
||||
it.effect("evaluates neq against multiselect answers as non-inclusion", () =>
|
||||
Effect.gen(function* () {
|
||||
const service = yield* Form.Service
|
||||
const options = [
|
||||
{ value: "go", label: "Go" },
|
||||
{ value: "ts", label: "TypeScript" },
|
||||
]
|
||||
const created = yield* service.create({
|
||||
sessionID: "global",
|
||||
mode: "form",
|
||||
fields: [
|
||||
{ key: "langs", type: "multiselect", options },
|
||||
{ key: "note", type: "string", required: true, when: [{ key: "langs", op: "neq", value: "go" }] },
|
||||
],
|
||||
})
|
||||
|
||||
const missing = yield* service.reply({ id: created.id, answer: { langs: ["ts"] } }).pipe(Effect.flip)
|
||||
expect(missing).toEqual(
|
||||
new Form.InvalidAnswerError({ id: created.id, message: "Missing required form field: note" }),
|
||||
)
|
||||
|
||||
// an answered-but-empty multiselect also satisfies neq
|
||||
const missingEmpty = yield* service.reply({ id: created.id, answer: { langs: [] } }).pipe(Effect.flip)
|
||||
expect(missingEmpty).toEqual(
|
||||
new Form.InvalidAnswerError({ id: created.id, message: "Missing required form field: note" }),
|
||||
)
|
||||
|
||||
const inactive = yield* service.reply({ id: created.id, answer: { langs: ["go"], note: "x" } }).pipe(Effect.flip)
|
||||
expect(inactive).toEqual(new Form.InvalidAnswerError({ id: created.id, message: "Form field is not active: note" }))
|
||||
|
||||
yield* service.reply({ id: created.id, answer: { langs: ["go"] } })
|
||||
expect(yield* service.state(created.id)).toEqual({ status: "answered", answer: { langs: ["go"] } })
|
||||
}),
|
||||
)
|
||||
|
||||
it.effect("treats unanswered when references as false and cascades inactivity", () =>
|
||||
Effect.gen(function* () {
|
||||
const service = yield* Form.Service
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue