Skip to content
Snippets Groups Projects
form.service.spec.ts 5.68 KiB
Newer Older
Giuseppe Digilio's avatar
Giuseppe Digilio committed
import { Store, StoreModule } from '@ngrx/store';
import { async, inject, TestBed } from '@angular/core/testing';
Giuseppe Digilio's avatar
Giuseppe Digilio committed
import { FormGroup } from '@angular/forms';

import {
Giuseppe Digilio's avatar
Giuseppe Digilio committed
  DynamicFormControlModel, DynamicFormGroupModel,
Giuseppe Digilio's avatar
Giuseppe Digilio committed
  DynamicFormService,
  DynamicFormValidationService,
  DynamicInputModel
} from '@ng-dynamic-forms/core';

Giuseppe Digilio's avatar
Giuseppe Digilio committed
import { FormService } from './form.service';
import { FormBuilderService } from './builder/form-builder.service';
import { AppState } from '../../app.reducer';
import { formReducer } from './form.reducers';

Giuseppe Digilio's avatar
Giuseppe Digilio committed
describe('FormService test suite', () => {
Giuseppe Digilio's avatar
Giuseppe Digilio committed
  const formId = 'testForm';
  let service: FormService;
Giuseppe Digilio's avatar
Giuseppe Digilio committed
  let builderService: FormBuilderService;
  let formGroup: FormGroup;

  const formModel: DynamicFormControlModel[] = [
    new DynamicInputModel({id: 'author', value: 'test'}),
    new DynamicInputModel({
      id: 'title',
      validators: {
        required: null
      },
      errorMessages: {
        required: 'Title is required'
      }
    }),
    new DynamicInputModel({id: 'date'}),
    new DynamicInputModel({id: 'description'}),
Giuseppe Digilio's avatar
Giuseppe Digilio committed
    new DynamicFormGroupModel({

      id: 'addressLocation',
      group: [
        new DynamicInputModel({

          id: 'zipCode',
          label: 'Zip Code',
          placeholder: 'ZIP'
        }),
        new DynamicInputModel({

          id: 'state',
          label: 'State',
          placeholder: 'State'
        }),
        new DynamicInputModel({

          id: 'city',
          label: 'City',
          placeholder: 'City'
        })
      ]
    }),
Giuseppe Digilio's avatar
Giuseppe Digilio committed
  const formData = {
Giuseppe Digilio's avatar
Giuseppe Digilio committed
    author: ['test'],
    title: null,
    date: null,
Giuseppe Digilio's avatar
Giuseppe Digilio committed
    description: null,
    addressLocation: {
      zipCode: null,
      state: null,
      city: null
    }
Giuseppe Digilio's avatar
Giuseppe Digilio committed
  };
  const formState = {
    testForm: {
      data: formData,
Giuseppe Digilio's avatar
Giuseppe Digilio committed
      valid: false,
Giuseppe Digilio's avatar
Giuseppe Digilio committed
      errors: []
    }
  };

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        StoreModule.forRoot({formReducer})
      ],
      providers: [
Giuseppe Digilio's avatar
Giuseppe Digilio committed
        DynamicFormService,
        DynamicFormValidationService,
        FormBuilderService,
Giuseppe Digilio's avatar
Giuseppe Digilio committed
      ]
    }).compileComponents();
  }));

Giuseppe Digilio's avatar
Giuseppe Digilio committed
  beforeEach(inject([Store, FormBuilderService], (store: Store<AppState>, formBuilderService: FormBuilderService) => {
Giuseppe Digilio's avatar
Giuseppe Digilio committed
    store
      .subscribe((state) => {
        state.forms = formState;
      });
Giuseppe Digilio's avatar
Giuseppe Digilio committed
    builderService = formBuilderService;
    formGroup = builderService.createFormGroup(formModel);
    service = new FormService(formBuilderService, store);
Giuseppe Digilio's avatar
Giuseppe Digilio committed
  }));

  it('should check whether form state is init', () => {
    service.isFormInitialized(formId).subscribe((init) => {
      expect(init).toBe(true);
    });
  });

  it('should return form status when isValid is called', () => {
    service.isValid(formId).subscribe((status) => {
Giuseppe Digilio's avatar
Giuseppe Digilio committed
      expect(status).toBe(false);
Giuseppe Digilio's avatar
Giuseppe Digilio committed
    });
  });

  it('should return form data when getFormData is called', () => {
    service.getFormData(formId).subscribe((data) => {
      expect(data).toBe(formData);
    });
  });

Giuseppe Digilio's avatar
Giuseppe Digilio committed
  it('should return form unique id', () => {
    const formId1 = service.getUniqueId(formId);
    const formId2 = service.getUniqueId(formId);

    expect(formId1).not.toEqual(formId2);
  });

  it('should validate all form fields', () => {
    service.validateAllFormFields(formGroup);

    expect(formGroup.controls.author.touched).toBe(true);
    expect(formGroup.controls.author.status).toBe('VALID');

    expect(formGroup.controls.title.touched).toBe(true);
    expect(formGroup.controls.title.status).toBe('INVALID');

    expect(formGroup.controls.date.touched).toBe(true);

    expect(formGroup.controls.description.touched).toBe(true);
  });

  it('should add error to field', () => {
    let control = builderService.getFormControlById('description', formGroup, formModel);
    let model = builderService.findById('description', formModel);
    let errorKeys: string[];
Giuseppe Digilio's avatar
Giuseppe Digilio committed

    service.addErrorToField(control, model, 'Test error message');
    errorKeys = Object.keys(control.errors);

    expect(errorKeys.length).toBe(1);

    expect(control.hasError(errorKeys[0])).toBe(true);

    expect(formGroup.controls.description.touched).toBe(true);

    control = builderService.getFormControlById('title', formGroup, formModel);
    model = builderService.findById('title', formModel);
    service.addErrorToField(control, model, 'error.required');
    errorKeys = Object.keys(control.errors);
Giuseppe Digilio's avatar
Giuseppe Digilio committed

    expect(errorKeys.length).toBe(1);

    expect(control.hasError(errorKeys[0])).toBe(true);

    expect(formGroup.controls.description.touched).toBe(true);
  });

  it('should remove error from field', () => {
    let control = builderService.getFormControlById('description', formGroup, formModel);
    let model = builderService.findById('description', formModel);
    let errorKeys: string[];
Giuseppe Digilio's avatar
Giuseppe Digilio committed

    service.addErrorToField(control, model, 'Test error message');
    errorKeys = Object.keys(control.errors);

    service.removeErrorFromField(control, model, errorKeys[0]);

    expect(errorKeys.length).toBe(1);

    expect(control.hasError(errorKeys[0])).toBe(false);

    expect(formGroup.controls.description.touched).toBe(false);

    control = builderService.getFormControlById('title', formGroup, formModel);
    model = builderService.findById('title', formModel);

    service.addErrorToField(control, model, 'error.required');
Giuseppe Digilio's avatar
Giuseppe Digilio committed
    service.removeErrorFromField(control, model, 'error.required');
Giuseppe Digilio's avatar
Giuseppe Digilio committed

    expect(errorKeys.length).toBe(1);

    expect(control.hasError(errorKeys[0])).toBe(false);

    expect(formGroup.controls.description.touched).toBe(false);
  });
Giuseppe Digilio's avatar
Giuseppe Digilio committed

  it('should reset form group', () => {
    const control = builderService.getFormControlById('author', formGroup, formModel);

    service.resetForm(formGroup, formModel, formId);

    expect(control.value).toBeNull();
  });
Giuseppe Digilio's avatar
Giuseppe Digilio committed
});