Skip to content

Commit 5ac3b77

Browse files
committed
refactor: tests
1 parent a9c1252 commit 5ac3b77

File tree

3 files changed

+234
-44
lines changed

3 files changed

+234
-44
lines changed

test/useFormKitSchema.test.ts

Lines changed: 63 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,78 @@
1-
import { expect, it } from 'vitest'
1+
import { describe, expect, it } from 'vitest'
22
import { useFormKitSchema } from '../src/composables'
33

4-
function renderToBoolean(element: any): boolean {
5-
return element.if === 'true'
6-
}
4+
it('add list group', () => {
5+
const { addListGroup } = useFormKitSchema()
76

8-
it('add element', () => {
9-
const { addElement } = useFormKitSchema()
7+
const listGroup = addListGroup()
8+
expect(listGroup.$formkit).toBe('group')
9+
expect(listGroup.if).toBe('true')
10+
expect(listGroup.for).toEqual(['item', 'index', '$items'])
11+
expect(listGroup.key).toBe('$item')
12+
expect(listGroup.index).toBe('$index')
13+
})
1014

11-
const element = addElement()
12-
expect(element.$el).toBe('div')
13-
expect(renderToBoolean(element)).toBe(true)
14-
expect(element.children?.length).toBe(0)
15-
16-
const e2 = addElement('span', [element], { name: 'test' }, false)
17-
expect(e2.$el).toBe('span')
18-
expect(renderToBoolean(e2)).toBe(false)
19-
expect(e2.children?.length).toBe(1)
20-
// @ts-expect-error: name is not in the type`
21-
expect(e2.attrs?.name).toBe('test')
15+
it('add element with non-boolean render value', () => {
16+
const { addElement } = useFormKitSchema()
17+
const element = addElement('div', [], {}, '$context.visible')
18+
expect(element.if).toBe('$context.visible')
2219
})
2320

24-
it('add component', () => {
21+
it('add component with props', () => {
2522
const { addComponent } = useFormKitSchema()
26-
27-
const component = addComponent()
28-
// @ts-expect-error: $cmp is not in the type
29-
expect(component.$cmp).toBe('Button')
30-
expect(renderToBoolean(component)).toBe(true)
23+
const props = { label: 'Save', severity: 'primary' }
24+
const component = addComponent('Button', props)
25+
expect(component.props).toEqual(props)
3126
})
3227

33-
it('add group', () => {
34-
const { addGroup } = useFormKitSchema()
28+
describe('addElementsInOuterDiv', () => {
29+
it('creates default structure with minimal params', () => {
30+
const { addElementsInOuterDiv } = useFormKitSchema()
31+
const outerDiv = addElementsInOuterDiv()
32+
33+
expect(outerDiv.$el).toBe('div')
34+
expect(outerDiv.attrs.class).toBe('formkit-outer ')
35+
36+
const wrapperDiv = outerDiv.children[0]
37+
expect(wrapperDiv.$el).toBe('div')
38+
expect(wrapperDiv.attrs.class).toBe('formkit-wrapper')
39+
40+
const labelDiv = wrapperDiv.children[0]
41+
expect(labelDiv.$el).toBe('label')
42+
expect(labelDiv.children).toEqual([''])
3543

36-
const group = addGroup('name')
37-
expect(group.$formkit).toBe('group')
38-
expect(renderToBoolean(group)).toBe(true)
39-
expect(group.name).toBe('name')
44+
const innerDiv = wrapperDiv.children[1]
45+
expect(innerDiv.$el).toBe('div')
46+
expect(innerDiv.attrs.class).toBe('formkit-inner ')
47+
})
4048

41-
const hiddenGroup = addGroup('name', [], false)
42-
expect(renderToBoolean(hiddenGroup)).toBe(false)
49+
it('applies custom classes', () => {
50+
const { addElementsInOuterDiv } = useFormKitSchema()
51+
const outerDiv = addElementsInOuterDiv([], 'custom-inner', 'custom-outer')
52+
53+
expect(outerDiv.attrs.class).toBe('formkit-outer custom-outer')
54+
55+
const innerDiv = outerDiv.children[0].children[1]
56+
expect(innerDiv.attrs.class).toBe('formkit-inner custom-inner')
57+
})
4358
})
4459

45-
it('add list', () => {
46-
const { addList } = useFormKitSchema()
60+
it('combines formKitAttrs with element properties', () => {
61+
const { addElement } = useFormKitSchema()
62+
const formKitAttrs = { validation: 'required', validationVisibility: 'dirty' }
63+
const element = addElement('div', [], {}, true, formKitAttrs)
4764

48-
const list = addList('name')
49-
expect(list.$formkit).toBe('list')
50-
expect(renderToBoolean(list)).toBe(true)
51-
expect(list.name).toBe('name')
65+
expect(element.$el).toBe('div')
66+
expect(element.validation).toBe('required')
67+
expect(element.validationVisibility).toBe('dirty')
68+
})
69+
70+
it('combines formKitAttrs with component properties', () => {
71+
const { addComponent } = useFormKitSchema()
72+
const formKitAttrs = { validation: 'required', validationLabel: 'Button' }
73+
const component = addComponent('Button', {}, true, formKitAttrs)
74+
75+
expect(component.$cmp).toBe('Button')
76+
expect(component.validation).toBe('required')
77+
expect(component.validationLabel).toBe('Button')
5278
})

test/useFormKitSection.test.ts

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import { expect, it } from 'vitest'
2+
import { useFormKitSection } from '../src/composables/useFormKitSection'
3+
4+
it('returns true for hasPrefix when context has a non-empty prefix', () => {
5+
const context = { prefix: 'test-prefix' }
6+
const { hasPrefix } = useFormKitSection(context)
7+
expect(hasPrefix.value).toBe(true)
8+
})
9+
10+
it('returns false for hasPrefix when context has an empty prefix', () => {
11+
const context = { prefix: '' }
12+
const { hasPrefix } = useFormKitSection(context)
13+
expect(hasPrefix.value).toBe(false)
14+
})
15+
16+
it('returns false for hasPrefix when context is null', () => {
17+
const context = null
18+
const { hasPrefix } = useFormKitSection(context)
19+
expect(hasPrefix.value).toBe(false)
20+
})
21+
22+
it('returns false for hasPrefix when context.prefix is null', () => {
23+
const context = { prefix: null }
24+
const { hasPrefix } = useFormKitSection(context)
25+
expect(hasPrefix.value).toBe(false)
26+
})
27+
28+
it('returns true for hasPrefixIcon when context has a non-empty iconPrefix', () => {
29+
const context = { iconPrefix: 'test-icon' }
30+
const { hasPrefixIcon } = useFormKitSection(context)
31+
expect(hasPrefixIcon.value).toBe(true)
32+
})
33+
34+
it('returns false for hasPrefixIcon when context has an empty iconPrefix', () => {
35+
const context = { iconPrefix: '' }
36+
const { hasPrefixIcon } = useFormKitSection(context)
37+
expect(hasPrefixIcon.value).toBe(false)
38+
})
39+
40+
it('returns false for hasPrefixIcon when context is null', () => {
41+
const context = null
42+
const { hasPrefixIcon } = useFormKitSection(context)
43+
expect(hasPrefixIcon.value).toBe(false)
44+
})
45+
46+
it('returns false for hasPrefixIcon when context.iconPrefix is null', () => {
47+
const context = { iconPrefix: null }
48+
const { hasPrefixIcon } = useFormKitSection(context)
49+
expect(hasPrefixIcon.value).toBe(false)
50+
})
51+
52+
it('returns true for hasSuffixIcon when context has a non-empty iconSuffix', () => {
53+
const context = { iconSuffix: 'test-icon' }
54+
const { hasSuffixIcon } = useFormKitSection(context)
55+
expect(hasSuffixIcon.value).toBe(true)
56+
})
57+
58+
it('returns false for hasSuffixIcon when context has an empty iconSuffix', () => {
59+
const context = { iconSuffix: '' }
60+
const { hasSuffixIcon } = useFormKitSection(context)
61+
expect(hasSuffixIcon.value).toBe(false)
62+
})
63+
64+
it('returns false for hasSuffixIcon when context is null', () => {
65+
const context = null
66+
const { hasSuffixIcon } = useFormKitSection(context)
67+
expect(hasSuffixIcon.value).toBe(false)
68+
})
69+
70+
it('returns false for hasSuffixIcon when context.iconSuffix is null', () => {
71+
const context = { iconSuffix: null }
72+
const { hasSuffixIcon } = useFormKitSection(context)
73+
expect(hasSuffixIcon.value).toBe(false)
74+
})
75+
76+
it('returns true for hasSuffix when context has a non-empty suffix', () => {
77+
const context = { suffix: 'test-suffix' }
78+
const { hasSuffix } = useFormKitSection(context)
79+
expect(hasSuffix.value).toBe(true)
80+
})
81+
82+
it('returns false for hasSuffix when context has an empty suffix', () => {
83+
const context = { suffix: '' }
84+
const { hasSuffix } = useFormKitSection(context)
85+
expect(hasSuffix.value).toBe(false)
86+
})
87+
88+
it('returns false for hasSuffix when context is null', () => {
89+
const context = null
90+
const { hasSuffix } = useFormKitSection(context)
91+
expect(hasSuffix.value).toBe(false)
92+
})
93+
94+
it('returns false for hasSuffix when context.suffix is null', () => {
95+
const context = { suffix: null }
96+
const { hasSuffix } = useFormKitSection(context)
97+
expect(hasSuffix.value).toBe(false)
98+
})
99+
100+
it('generates a unique id using generateId', () => {
101+
const { generateId } = useFormKitSection({})
102+
const id1 = generateId()
103+
const id2 = generateId()
104+
expect(id1).not.toBe(id2)
105+
expect(id1).toMatch(/^[0-9a-f-]{36}$/i)
106+
expect(id2).toMatch(/^[0-9a-f-]{36}$/i)
107+
})
108+
109+
it('works with empty context when generating id', () => {
110+
const { generateId } = useFormKitSection(null)
111+
const id = generateId()
112+
expect(id).toMatch(/^[0-9a-f-]{36}$/i)
113+
})

test/useOutputDuration.test.ts

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,66 @@ import { useOutputDuration } from '../src/composables'
33

44
it('durationToMinutes', () => {
55
const { durationToMinutes } = useOutputDuration()
6-
expect(durationToMinutes('2h')).eq(120)
7-
expect(durationToMinutes('40m')).eq(40)
8-
expect(durationToMinutes('2h20m')).eq(140)
9-
expect(durationToMinutes('2:40')).eq(160)
6+
expect(durationToMinutes('2h')).toBe(120)
7+
expect(durationToMinutes('40m')).toBe(40)
8+
expect(durationToMinutes('2h20m')).toBe(140)
9+
expect(durationToMinutes('2:40')).toBe(160)
1010
})
1111

1212
it('formattedDuration', () => {
1313
const { formattedDuration } = useOutputDuration()
14-
expect(formattedDuration('120m')).eq('2h')
15-
expect(formattedDuration('40m')).eq('40m')
16-
expect(formattedDuration('140m')).eq('2h 20m')
14+
expect(formattedDuration('120m')).toBe('2h')
15+
expect(formattedDuration('40m')).toBe('40m')
16+
expect(formattedDuration('140m')).toBe('2h 20m')
17+
})
18+
19+
it('handles empty duration string', () => {
20+
const { durationToMinutes } = useOutputDuration()
21+
expect(durationToMinutes('')).toBe(0)
22+
})
23+
24+
it('handles hours-only duration', () => {
25+
const { durationToMinutes } = useOutputDuration()
26+
expect(durationToMinutes('3h')).toBe(180)
27+
})
28+
29+
it('handles minutes-only duration', () => {
30+
const { durationToMinutes } = useOutputDuration()
31+
expect(durationToMinutes('45m')).toBe(45)
32+
})
33+
34+
it('handles colon-separated hours and minutes', () => {
35+
const { durationToMinutes } = useOutputDuration()
36+
expect(durationToMinutes('1:30')).toBe(90)
37+
})
38+
39+
it('handles text format hours and minutes', () => {
40+
const { durationToMinutes } = useOutputDuration()
41+
expect(durationToMinutes('2h15m')).toBe(135)
42+
})
43+
44+
it('returns original string for invalid input', () => {
45+
const { formattedDuration } = useOutputDuration()
46+
expect(formattedDuration('invalid')).toBe('0')
47+
})
48+
49+
it('formats minutes-only duration', () => {
50+
const { formattedDuration } = useOutputDuration()
51+
expect(formattedDuration('45m')).toBe('45m')
52+
})
53+
54+
it('formats hours-only duration', () => {
55+
const { formattedDuration } = useOutputDuration()
56+
expect(formattedDuration('120m')).toBe('2h')
57+
})
58+
59+
it('formats hours and minutes duration', () => {
60+
const { formattedDuration } = useOutputDuration()
61+
expect(formattedDuration('135M')).toBe('2h 15m')
62+
})
63+
64+
it('handles non-numeric duration values', () => {
65+
const { durationToMinutes } = useOutputDuration()
66+
expect(durationToMinutes('h')).toBe(0)
67+
expect(durationToMinutes('m')).toBe(0)
1768
})

0 commit comments

Comments
 (0)