dashboard/shell/composables/useLabeledFormElement.test.ts

136 lines
3.5 KiB
TypeScript

import { ref } from 'vue';
import { useLabeledFormElement } from './useLabeledFormElement';
describe('useLabeledFormElement', () => {
it('should set raised to true when focused', () => {
const props = {
mode: 'edit',
value: '',
required: true,
disabled: false,
rules: [],
};
const emit = jest.fn();
const { onFocusLabeled, onBlurLabeled, raised } = useLabeledFormElement(props, emit);
onFocusLabeled();
expect(raised.value).toBe(true);
onBlurLabeled();
expect(raised.value).toBe(false);
});
it('should set focused to true when focused', () => {
const props = {
mode: 'edit',
value: '',
required: true,
disabled: false,
rules: [],
};
const emit = jest.fn();
const { onFocusLabeled, onBlurLabeled, focused } = useLabeledFormElement(props, emit);
onFocusLabeled();
expect(focused.value).toBe(true);
onBlurLabeled();
expect(focused.value).toBe(false);
});
it('should set blurred to current timestamp when blurred', () => {
const props = {
mode: 'edit',
value: '',
required: true,
disabled: false,
rules: [],
};
const emit = jest.fn();
const { onBlurLabeled, blurred } = useLabeledFormElement(props, emit);
onBlurLabeled();
expect(blurred.value).toBeTruthy();
});
it('should compute isDisabled correctly', () => {
const props = ref({
mode: 'edit',
value: '',
required: true,
disabled: false,
rules: [],
});
const emit = jest.fn();
const { isDisabled } = useLabeledFormElement(props.value, emit);
expect(isDisabled.value).toBe(false);
props.value.disabled = true;
expect(isDisabled.value).toBe(true);
props.value.mode = 'view';
expect(isDisabled.value).toBe(true);
});
it('should compute validationMessage correctly for required field', () => {
const props = ref({
mode: 'edit',
value: '',
required: true,
disabled: false,
rules: [
(value: string[]) => (value.length < 5 ? 'This field is required' : undefined),
],
});
const emit = jest.fn();
const { validationMessage, onBlurLabeled } = useLabeledFormElement(props.value, emit);
onBlurLabeled();
expect(validationMessage.value).toBe('This field is required');
});
it('should compute validationMessage correctly for custom rules', () => {
const props = ref({
mode: 'edit',
value: 'test',
required: false,
disabled: false,
rules: [
(value: string[]) => (value.length < 5 ? 'Value must be at least 5 characters long' : undefined),
(value: string[]) => (value.includes('test') ? 'Value cannot contain the word "test"' : undefined),
],
});
const emit = jest.fn();
const { validationMessage, onBlurLabeled } = useLabeledFormElement(props.value, emit);
onBlurLabeled();
expect(validationMessage.value).toBe('Value must be at least 5 characters long, Value cannot contain the word "test"');
});
it('should compute requiredField correctly', () => {
const props = ref({
mode: 'edit',
value: '',
required: true,
disabled: false,
rules: [],
});
const emit = jest.fn();
const { requiredField } = useLabeledFormElement(props.value, emit);
expect(requiredField.value).toBe(true);
// When the field is not required, requiredField should be false
props.value.required = false;
expect(requiredField.value).toBe(false);
});
});