Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
a84b8e1
test(components): add FieldCheckBox tests, apply fixes
kevinkosterr Sep 25, 2024
3a47073
test: scripts
kevinkosterr Sep 25, 2024
9c74d12
test(components): add password field tests
kevinkosterr Sep 25, 2024
ca74c32
test(components): add more tests for FieldCheckbox
kevinkosterr Sep 25, 2024
cc505e4
fix: fix validator getters and checks
kevinkosterr Sep 25, 2024
2936662
test(components): FieldSwitch
kevinkosterr Sep 25, 2024
6babf92
fix: label on checkbox showing twice
kevinkosterr Sep 26, 2024
8fa6d4c
test(refactor): rename tools.js -> utils.js
kevinkosterr Sep 26, 2024
a925a90
fix(field-buttons): fix FieldReset and FieldSubmit not using input
kevinkosterr Sep 26, 2024
565c86f
fix(field-reset): fix resetting values
kevinkosterr Sep 26, 2024
0529ddf
test(field-reset): add FieldReset tests
kevinkosterr Sep 26, 2024
b4d3cf7
fix: can't determine field when inputType == null
kevinkosterr Sep 26, 2024
09c7683
test: moved schema and prop generation to function
kevinkosterr Sep 26, 2024
fa862c0
test: add docs to util functions
kevinkosterr Sep 26, 2024
b3ea2c1
test: rename generatorWrapper -> formWrapper everywhere
kevinkosterr Sep 26, 2024
4474fbb
test(field-text): add FieldText tests
kevinkosterr Sep 26, 2024
3fd70c2
test(field-radio): add FieldRadio tests
kevinkosterr Sep 27, 2024
aaf0f0e
test(fields): remove await for nextTick
kevinkosterr Sep 27, 2024
a92d4fa
test(field-switch): fix model change test
kevinkosterr Sep 27, 2024
75badc3
test(field-color): add FieldColor test
kevinkosterr Sep 27, 2024
120ca89
test(field-number): add FieldNumber tests
kevinkosterr Sep 30, 2024
7c389e7
fix(field-number): error thrown when step is undefined
kevinkosterr Sep 30, 2024
118a484
test(field-select): add FieldSelect tests
kevinkosterr Sep 30, 2024
bb89a9b
feat(field-button): onClick field and model passing
kevinkosterr Sep 30, 2024
fd53a0c
test(field-button): add field button tests
kevinkosterr Sep 30, 2024
2c6f083
test(field-submit): add FieldSubmit tests
kevinkosterr Sep 30, 2024
10eea8a
Merge branch 'main' into 8-tests
kevinkosterr Sep 30, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions __tests__/_resources/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { mount } from '@vue/test-utils'

import FormGenerator from '@/FormGenerator.vue'

/**
* Mount the form generator component
* @param schema - schema object to pass as prop
* @param {Object} model - model object to pass as prop
* @returns {VueWrapper<FormGenerator>}
*/
export function mountFormGenerator (schema, model) {
return mount(FormGenerator, { props: { schema, model } })
}

/**
* Generate a form schema for a single field component
* @param {String} name - name of the field
* @param {String} model - model key of the field
* @param {String} type - field type
* @param {String} inputType - field input type, required if `type === 'input'`
* @param {String} label - field label
* @param {any} initialValue - initial model value
* @param {Object} extraFieldProperties - extra field properties to add
* @returns {{schema: {fields: [{name, model, inputType, label, type}]}, model: {}}}
*/
export function generateSchemaSingleField (
name,
model,
type,
inputType,
label,
initialValue,
extraFieldProperties
) {
return {
model: {
[model]: initialValue
},
schema: {
fields: [
{
name, model, type, inputType, label, ...extraFieldProperties
}
]
}
}
}

/**
* Generate props for a single field component
* @param {Object} formSchema - entire form schema object
* @returns {{field: *, model, id: string, formGenerator: {}}}
*/
export function generatePropsSingleField (formSchema) {
return {
id: formSchema.name + '_test_id',
formGenerator: {},
field: { ...formSchema.schema.fields[0] },
model: { ...formSchema.model }
}
}
78 changes: 78 additions & 0 deletions __tests__/components/fields/FieldButton.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { mountFormGenerator, generatePropsSingleField } from '@test/_resources/utils.js'
import { describe, it, expect } from 'vitest'
import { mount, config } from '@vue/test-utils'

import FieldButton from '@/fields/buttons/FieldButton.vue'
import FieldPassword from '@/fields/input/FieldPassword.vue'
import FieldCheckbox from '@/fields/input/FieldCheckbox.vue'

const form = {
model: {
password: '',
checkboxTestModel: false
},
schema: {
fields: [
{
type: 'button',
buttonText: 'Reset password field',
onClick: (model, _field) => {
model.password = ''
}
},
{
name: 'checkboxTestName',
model: 'checkboxTestModel',
label: 'Checkbox Test',
type: 'checkbox'
},
{
name: 'passwordTest',
model: 'password',
label: 'Password',
type: 'input',
inputType: 'password'
}
]
}
}

const props = generatePropsSingleField(form)


describe('Test FieldButton', () => {

it('Should render correctly', () => {
const wrapper = mount(FieldButton, { props })
expect(wrapper.find('button').exists()).toBe(true)
expect(wrapper.find('button').element.innerHTML).toContain(props.field.buttonText)
})

it('Should render correctly inside form generator', async () => {
config.global.components = { FieldButton }

const formWrapper = mountFormGenerator(form.schema, form.model)
const buttonField = formWrapper.findComponent(FieldButton)
expect(buttonField.exists()).toBeTruthy()
expect(buttonField.find('button').element.innerHTML).toContain(props.field.buttonText)
})

it('Should update model values', async () => {
config.global.components = { FieldPassword, FieldButton, FieldCheckbox }

const formWrapper = mountFormGenerator(form.schema, form.model)
expect(formWrapper.find('input[type=password]').exists()).toBe(true)
expect(formWrapper.find('input[type=checkbox]').exists()).toBe(true)
expect(formWrapper.find('button').exists()).toBe(true)

await formWrapper.find('input[type=password]').setValue('password')
expect(formWrapper.vm.model.password).toBe('password')

const buttonField = formWrapper.findComponent(FieldButton)
expect(buttonField.exists()).toBe(true)

await buttonField.find('button').trigger('click.prevent')
expect(formWrapper.vm.model.password).toBe('')
})

})
107 changes: 107 additions & 0 deletions __tests__/components/fields/FieldCheckbox.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import { generatePropsSingleField, generateSchemaSingleField, mountFormGenerator } from '@test/_resources/utils.js'
import { describe, it, expect } from 'vitest'
import { mount, config } from '@vue/test-utils'

import FieldCheckbox from '@/fields/input/FieldCheckbox.vue'

const form = generateSchemaSingleField(
'checkboxTestName',
'checkboxTestModel',
'input',
'checkbox',
'Checkbox Test',
false
)

const props = generatePropsSingleField(form)

describe('Test FieldCheckbox', () => {

it('Should render correctly', async () => {
const wrapper = mount(FieldCheckbox, { props })
// Checkbox should be rendered.
expect(wrapper.find('input[type=checkbox]').exists()).toBe(true)
// Label should be rendered and have the correct text.
expect(wrapper.find('label').text()).toContain(props.field.label)
await wrapper.vm.$nextTick()
// Checked attribute should be false, since the default value is set to false inside the model.
expect(wrapper.find('input[type=checkbox]').element.checked).toBe(false)
})

it('Should render correctly inside form generator', async() => {
config.global.components = { FieldCheckbox }
const formWrapper = mountFormGenerator(form.schema, form.model)

expect(formWrapper.findComponent(FieldCheckbox).exists()).toBe(true)
expect(formWrapper.find('input[type=checkbox]').exists()).toBe(true)
})

it('Should be disabled, when specified with a conditional function', async () => {
const model = { ...form.model, otherTestProperty: false }
const disabled = (model, _field) => model.otherTestProperty === false
const field = { ...form.schema.fields[0], disabled }

expect(disabled(model)).toBe(true)

const wrapper = mount(FieldCheckbox, { props: { ...props, model, field } })
expect(wrapper.find('input[type=checkbox]').exists()).toBe(true)
await wrapper.vm.$nextTick()

expect(wrapper.vm.isDisabled).toBe(true)
expect(wrapper.find('input[type=checkbox]').element.disabled).toBe(true)
})

it('Should be disabled, when specified with boolean', async () => {
const field = { ...props.field, disabled: true }
const wrapper = mount(FieldCheckbox, { props: { ...props, field } })

const checkbox = wrapper.find('input[type=checkbox]')

expect(checkbox.exists()).toBe(true)
expect(wrapper.vm.isDisabled).toBe(true)

await wrapper.vm.$nextTick()

expect(wrapper.find('input[type=checkbox]').element.disabled).toBe(true)
})

it('Checked state should be the same as default value', async () => {
const model = { checkboxTestModel: true }
const wrapper = mount(FieldCheckbox, { props: { ...props, model } })

await wrapper.vm.$nextTick()

expect(wrapper.find('input[type=checkbox]').element.checked).toBe(model.checkboxTestModel)
})

it('Should emit onInput event', async () => {
const wrapper = mount(FieldCheckbox, { props })
await wrapper.find('input[type=checkbox]').trigger('change' )
expect(wrapper.emitted()).toHaveProperty('onInput')
})

it('Should update model value', async () => {
config.global.components = { FieldCheckbox }

const formWrapper = mountFormGenerator(form.schema, form.model)


const wrapper = formWrapper.findComponent(FieldCheckbox)
expect(wrapper.exists()).toBe(true)

await wrapper.vm.$nextTick()
expect(wrapper.find('input').element.checked).toBe(false)

await wrapper.find('input').trigger('click')
expect(wrapper.find('input').element.checked).toBe(true)

await wrapper.find('input').trigger('change')
expect(wrapper.emitted()).toHaveProperty('onInput', [ [ true ] ])
await wrapper.vm.$nextTick()

expect(formWrapper.vm.model.checkboxTestModel).toBe(true)
// Model value of wrapper should be updated as well, since this gets passed down from the Form Generator.
expect(wrapper.vm.model.checkboxTestModel).toBe(true)
})

})
50 changes: 50 additions & 0 deletions __tests__/components/fields/FieldColor.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { mountFormGenerator, generatePropsSingleField, generateSchemaSingleField } from '@test/_resources/utils.js'
import { mount, config } from '@vue/test-utils'
import { describe, it, expect } from 'vitest'

import FieldColor from '@/fields/input/FieldColor.vue'

const form = generateSchemaSingleField(
'testColor',
'colorModel',
'input',
'color',
'Pick a color',
''
)

const props = generatePropsSingleField(form)

describe('Test FieldColor', () => {

it('Should render correctly', async () => {
const wrapper = mount(FieldColor, { props })
expect(wrapper.find('input[type=color]').exists()).toBe(true)
})

it('Should render correctly inside form generator', async () => {
config.global.components = { FieldColor }

const formWrapper = mountFormGenerator(form.schema, form.model)
expect(formWrapper.findComponent(FieldColor).exists()).toBe(true)
expect(formWrapper.find('input[type=color]').exists()).toBe(true)
})

it('Should emit onInput event', async () => {
const wrapper = mount(FieldColor, { props })
await wrapper.find('input[type=color]').trigger('change')
expect(wrapper.emitted()).toHaveProperty('onInput')
})

it('Should update model value', async () => {
config.global.components = { FieldColor }

const formWrapper = mountFormGenerator(form.schema, form.model)

const wrapper = formWrapper.findComponent(FieldColor)
await wrapper.find('input[type=color]').setValue('#efefef')
expect(wrapper.emitted()).toHaveProperty('onInput', [ [ '#efefef' ] ])
expect(formWrapper.vm.model.colorModel).toBe('#efefef')
})

})
56 changes: 56 additions & 0 deletions __tests__/components/fields/FieldNumber.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { describe, it, expect } from 'vitest'
import { mountFormGenerator, generatePropsSingleField, generateSchemaSingleField } from '@test/_resources/utils.js'
import { mount, config } from '@vue/test-utils'

import FieldNumber from '@/fields/input/FieldNumber.vue'

const form = generateSchemaSingleField(
'testNumber',
'numberModel',
'input',
'number',
'Number input',
0,
{
max: 5,
min: 2
}
)

const props = generatePropsSingleField(form)

describe('Test FieldNumber', () => {

it('Should render correctly', async () => {
const wrapper = mount(FieldNumber, { props })
expect(wrapper.find('input[type=number]').exists()).toBeTruthy()
})

it('Should render correctly inside form generator', async () => {
config.global.components = { FieldNumber }
const formWrapper = mountFormGenerator(form.schema, form.model)
expect(formWrapper.find('input[type=number]').exists()).toBeTruthy()

const wrapper = formWrapper.findComponent(FieldNumber)
expect(wrapper.exists()).toBeTruthy()
expect(wrapper.attributes().min).toBe('2')
expect(wrapper.attributes().max).toBe('5')
})

it('Should emit onInput event', async () => {
const wrapper = mount(FieldNumber, { props })
await wrapper.find('input').trigger('input')
expect(wrapper.emitted()).toHaveProperty('onInput')
})

it('Should update model value', async () => {
config.global.components = { FieldNumber }

const formWrapper = mountFormGenerator(form.schema, form.model)
const numberField = formWrapper.findComponent(FieldNumber)
expect(numberField.exists()).toBeTruthy()

await numberField.find('input').setValue(4)
expect(formWrapper.vm.model.numberModel).toBe(4)
})
})
Loading