Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/vue_shared/directives/validation_spec.js')
-rw-r--r--spec/frontend/vue_shared/directives/validation_spec.js132
1 files changed, 132 insertions, 0 deletions
diff --git a/spec/frontend/vue_shared/directives/validation_spec.js b/spec/frontend/vue_shared/directives/validation_spec.js
new file mode 100644
index 00000000000..814d6f43589
--- /dev/null
+++ b/spec/frontend/vue_shared/directives/validation_spec.js
@@ -0,0 +1,132 @@
+import { shallowMount } from '@vue/test-utils';
+import validation from '~/vue_shared/directives/validation';
+
+describe('validation directive', () => {
+ let wrapper;
+
+ const createComponent = ({ inputAttributes, showValidation } = {}) => {
+ const defaultInputAttributes = {
+ type: 'text',
+ required: true,
+ };
+
+ const component = {
+ directives: {
+ validation: validation(),
+ },
+ data() {
+ return {
+ attributes: inputAttributes || defaultInputAttributes,
+ showValidation,
+ form: {
+ state: null,
+ fields: {
+ exampleField: {
+ state: null,
+ feedback: '',
+ },
+ },
+ },
+ };
+ },
+ template: `
+ <form>
+ <input v-validation:[showValidation] name="exampleField" v-bind="attributes" />
+ </form>
+ `,
+ };
+
+ wrapper = shallowMount(component, { attachToDocument: true });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const getFormData = () => wrapper.vm.form;
+ const findForm = () => wrapper.find('form');
+ const findInput = () => wrapper.find('input');
+
+ describe.each([true, false])(
+ 'with fields untouched and "showValidation" set to "%s"',
+ showValidation => {
+ beforeEach(() => {
+ createComponent({ showValidation });
+ });
+
+ it('sets the fields validity correctly', () => {
+ expect(getFormData().fields.exampleField).toEqual({
+ state: showValidation ? false : null,
+ feedback: showValidation ? expect.any(String) : '',
+ });
+ });
+
+ it('sets the form validity correctly', () => {
+ expect(getFormData().state).toBe(false);
+ });
+ },
+ );
+
+ describe.each`
+ inputAttributes | validValue | invalidValue
+ ${{ required: true }} | ${'foo'} | ${''}
+ ${{ type: 'url' }} | ${'http://foo.com'} | ${'foo'}
+ ${{ type: 'number', min: 1, max: 5 }} | ${3} | ${0}
+ ${{ type: 'number', min: 1, max: 5 }} | ${3} | ${6}
+ ${{ pattern: 'foo|bar' }} | ${'bar'} | ${'quz'}
+ `(
+ 'with input-attributes set to $inputAttributes',
+ ({ inputAttributes, validValue, invalidValue }) => {
+ const setValueAndTriggerValidation = value => {
+ const input = findInput();
+ input.setValue(value);
+ input.trigger('blur');
+ };
+
+ beforeEach(() => {
+ createComponent({ inputAttributes });
+ });
+
+ describe('with valid value', () => {
+ beforeEach(() => {
+ setValueAndTriggerValidation(validValue);
+ });
+
+ it('sets the field to be valid', () => {
+ expect(getFormData().fields.exampleField).toEqual({
+ state: true,
+ feedback: '',
+ });
+ });
+
+ it('sets the form to be valid', () => {
+ expect(getFormData().state).toBe(true);
+ });
+ });
+
+ describe('with invalid value', () => {
+ beforeEach(() => {
+ setValueAndTriggerValidation(invalidValue);
+ });
+
+ it('sets the field to be invalid', () => {
+ expect(getFormData().fields.exampleField).toEqual({
+ state: false,
+ feedback: expect.any(String),
+ });
+ expect(getFormData().fields.exampleField.feedback.length).toBeGreaterThan(0);
+ });
+
+ it('sets the form to be invalid', () => {
+ expect(getFormData().state).toBe(false);
+ });
+
+ it('sets focus on the first invalid input when the form is submitted', () => {
+ findForm().trigger('submit');
+ expect(findInput().element).toBe(document.activeElement);
+ });
+ });
+ },
+ );
+});