269 lines
10 KiB
TypeScript
269 lines
10 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
import type {
|
|
FormElementDto,
|
|
FormElementSectionDto,
|
|
FormElementSubSectionDto,
|
|
FormOptionDto
|
|
} from '../../../.api-client'
|
|
import { useFormElementValueClearing } from '../../../app/composables/useFormElementValueClearing'
|
|
|
|
describe('useFormElementValueClearing', () => {
|
|
const { clearHiddenFormElementValues } = useFormElementValueClearing()
|
|
|
|
// Visibility state constants
|
|
const VISIBLE = true
|
|
const HIDDEN = false
|
|
|
|
// Helper functions for creating test data
|
|
function createFormOption(overrides: Partial<FormOptionDto> = {}): FormOptionDto {
|
|
return {
|
|
value: '',
|
|
label: 'Option',
|
|
...overrides
|
|
} as FormOptionDto
|
|
}
|
|
|
|
function createFormElement(type: string, overrides: Partial<FormElementDto> = {}): FormElementDto {
|
|
return {
|
|
id: 'element1',
|
|
reference: 'ref_element1',
|
|
title: 'Element',
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
type: type as any,
|
|
options: [createFormOption()],
|
|
...overrides
|
|
}
|
|
}
|
|
|
|
function createSubSection(formElements: FormElementDto[] = []): FormElementSubSectionDto {
|
|
return {
|
|
id: 'subsection1',
|
|
title: 'SubSection',
|
|
formElements: formElements.length > 0 ? formElements : [createFormElement('TEXTFIELD')]
|
|
}
|
|
}
|
|
|
|
function createSection(subsections: FormElementSubSectionDto[] = []): FormElementSectionDto {
|
|
return {
|
|
id: 'section1',
|
|
title: 'Section',
|
|
formElementSubSections: subsections.length > 0 ? subsections : [createSubSection()]
|
|
}
|
|
}
|
|
|
|
describe('clearHiddenFormElementValues', () => {
|
|
it('should return sections unchanged when no elements become newly hidden', () => {
|
|
const sections = [createSection()]
|
|
const previousMap = new Map([['element1', VISIBLE]])
|
|
const currentMap = new Map([['element1', VISIBLE]])
|
|
|
|
const result = clearHiddenFormElementValues(sections, previousMap, currentMap)
|
|
|
|
expect(result).toEqual(sections)
|
|
})
|
|
|
|
it('should clear value of newly hidden TEXTFIELD element', () => {
|
|
const element = createFormElement('TEXTFIELD', {
|
|
id: 'element1',
|
|
options: [createFormOption({ value: 'some text' })]
|
|
})
|
|
const subsection = createSubSection([element])
|
|
const section = createSection([subsection])
|
|
|
|
const previousMap = new Map([['element1', VISIBLE]])
|
|
const currentMap = new Map([['element1', HIDDEN]])
|
|
|
|
const result = clearHiddenFormElementValues([section], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe('')
|
|
})
|
|
|
|
it('should clear value of newly hidden SELECT element', () => {
|
|
const element = createFormElement('SELECT', {
|
|
id: 'element1',
|
|
options: [createFormOption({ value: 'option1' }), createFormOption({ value: 'option2' })]
|
|
})
|
|
const subsection = createSubSection([element])
|
|
const section = createSection([subsection])
|
|
|
|
const previousMap = new Map([['element1', VISIBLE]])
|
|
const currentMap = new Map([['element1', HIDDEN]])
|
|
|
|
const result = clearHiddenFormElementValues([section], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe('false')
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[1]!.value).toBe('false')
|
|
})
|
|
|
|
it('should clear value of newly hidden CHECKBOX element', () => {
|
|
const element = createFormElement('CHECKBOX', {
|
|
id: 'element1',
|
|
options: [createFormOption({ value: 'true' }), createFormOption({ value: 'true' })]
|
|
})
|
|
const subsection = createSubSection([element])
|
|
const section = createSection([subsection])
|
|
|
|
const previousMap = new Map([['element1', VISIBLE]])
|
|
const currentMap = new Map([['element1', HIDDEN]])
|
|
|
|
const result = clearHiddenFormElementValues([section], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe('false')
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[1]!.value).toBe('false')
|
|
})
|
|
|
|
it('should clear value of newly hidden RADIOBUTTON element', () => {
|
|
const element = createFormElement('RADIOBUTTON', {
|
|
id: 'element1',
|
|
options: [createFormOption({ value: 'option1' }), createFormOption({ value: 'option2' })]
|
|
})
|
|
const subsection = createSubSection([element])
|
|
const section = createSection([subsection])
|
|
|
|
const previousMap = new Map([['element1', VISIBLE]])
|
|
const currentMap = new Map([['element1', HIDDEN]])
|
|
|
|
const result = clearHiddenFormElementValues([section], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe('false')
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[1]!.value).toBe('false')
|
|
})
|
|
|
|
it('should not clear visible elements', () => {
|
|
const originalValue = 'original value'
|
|
const element = createFormElement('TEXTFIELD', {
|
|
id: 'element1',
|
|
options: [createFormOption({ value: originalValue })]
|
|
})
|
|
const subsection = createSubSection([element])
|
|
const section = createSection([subsection])
|
|
|
|
const previousMap = new Map([['element1', VISIBLE]])
|
|
const currentMap = new Map([['element1', VISIBLE]])
|
|
|
|
const result = clearHiddenFormElementValues([section], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe(originalValue)
|
|
})
|
|
|
|
it('should not clear elements that were already hidden (previousMap false, currentMap false)', () => {
|
|
const originalValue = 'original value'
|
|
const element = createFormElement('TEXTFIELD', {
|
|
id: 'element1',
|
|
options: [createFormOption({ value: originalValue })]
|
|
})
|
|
const subsection = createSubSection([element])
|
|
const section = createSection([subsection])
|
|
|
|
const previousMap = new Map([['element1', HIDDEN]])
|
|
const currentMap = new Map([['element1', HIDDEN]])
|
|
|
|
const result = clearHiddenFormElementValues([section], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe(originalValue)
|
|
})
|
|
|
|
it('should handle elements identified by id', () => {
|
|
const element = createFormElement('TEXTFIELD', {
|
|
id: 'element1',
|
|
reference: undefined,
|
|
options: [createFormOption({ value: 'text' })]
|
|
})
|
|
const subsection = createSubSection([element])
|
|
const section = createSection([subsection])
|
|
|
|
const previousMap = new Map([['element1', VISIBLE]])
|
|
const currentMap = new Map([['element1', HIDDEN]])
|
|
|
|
const result = clearHiddenFormElementValues([section], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe('')
|
|
})
|
|
|
|
it('should handle elements identified by reference (when id is undefined)', () => {
|
|
const element = createFormElement('TEXTFIELD', {
|
|
id: undefined,
|
|
reference: 'ref_element1',
|
|
options: [createFormOption({ value: 'text' })]
|
|
})
|
|
const subsection = createSubSection([element])
|
|
const section = createSection([subsection])
|
|
|
|
const previousMap = new Map([['ref_element1', VISIBLE]])
|
|
const currentMap = new Map([['ref_element1', HIDDEN]])
|
|
|
|
const result = clearHiddenFormElementValues([section], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe('')
|
|
})
|
|
|
|
it('should handle multiple sections with multiple subsections', () => {
|
|
const element1 = createFormElement('TEXTFIELD', {
|
|
id: 'element1',
|
|
options: [createFormOption({ value: 'text1' })]
|
|
})
|
|
const element2 = createFormElement('SELECT', {
|
|
id: 'element2',
|
|
options: [createFormOption({ value: 'option' })]
|
|
})
|
|
|
|
const subsection1 = createSubSection([element1])
|
|
const subsection2 = createSubSection([element2])
|
|
const section1 = createSection([subsection1, subsection2])
|
|
|
|
const element3 = createFormElement('CHECKBOX', {
|
|
id: 'element3',
|
|
options: [createFormOption({ value: 'true' })]
|
|
})
|
|
const subsection3 = createSubSection([element3])
|
|
const section2 = createSection([subsection3])
|
|
|
|
const previousMap = new Map([
|
|
['element1', VISIBLE],
|
|
['element2', VISIBLE],
|
|
['element3', VISIBLE]
|
|
])
|
|
const currentMap = new Map([
|
|
['element1', HIDDEN],
|
|
['element2', VISIBLE],
|
|
['element3', HIDDEN]
|
|
])
|
|
|
|
const result = clearHiddenFormElementValues([section1, section2], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe('')
|
|
expect(result[0]!.formElementSubSections[1]!.formElements[0]!.options[0]!.value).toBe('option')
|
|
expect(result[1]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe('false')
|
|
})
|
|
|
|
it('should handle mixed TEXTFIELD and SELECT in same section', () => {
|
|
const textElement = createFormElement('TEXTFIELD', {
|
|
id: 'text1',
|
|
options: [createFormOption({ value: 'text content' })]
|
|
})
|
|
const selectElement = createFormElement('SELECT', {
|
|
id: 'select1',
|
|
options: [createFormOption({ value: 'val1' }), createFormOption({ value: 'val2' })]
|
|
})
|
|
|
|
const subsection = createSubSection([textElement, selectElement])
|
|
const section = createSection([subsection])
|
|
|
|
const previousMap = new Map([
|
|
['text1', VISIBLE],
|
|
['select1', VISIBLE]
|
|
])
|
|
const currentMap = new Map([
|
|
['text1', HIDDEN],
|
|
['select1', HIDDEN]
|
|
])
|
|
|
|
const result = clearHiddenFormElementValues([section], previousMap, currentMap)
|
|
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[0]!.options[0]!.value).toBe('')
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[1]!.options[0]!.value).toBe('false')
|
|
expect(result[0]!.formElementSubSections[0]!.formElements[1]!.options[1]!.value).toBe('false')
|
|
})
|
|
})
|
|
})
|