import { expect } from 'chai';
import * as actions from '../../../src/scripts/actions/choices';
import { cloneObject } from '../../../src/scripts/lib/utils';
import { ChoiceFull } from '../../../src/scripts/interfaces/choice-full';
import { ActionType } from '../../../src';
import { stringToHtmlClass } from '../../../src/scripts/lib/choice-input';

describe('actions/choices', () => {
  const choice: ChoiceFull = {
    highlighted: false,
    value: 'test',
    label: 'test',
    id: 1,
    groupId: 1,
    score: 0,
    rank: 0,
    disabled: false,
    elementId: '1',
    labelClass: stringToHtmlClass('test foo--bar'),
    labelDescription: 'test',
    customProperties: {
      test: true,
    },
    placeholder: true,
    active: false,
    selected: false,
  };

  describe('addChoice action', () => {
    it('returns ADD_CHOICE action', () => {
      const expectedAction: actions.AddChoiceAction = {
        type: ActionType.ADD_CHOICE,
        choice,
      };

      expect(actions.addChoice(cloneObject(choice))).to.deep.equal(expectedAction);
    });
  });

  describe('filterChoices action', () => {
    it('returns FILTER_CHOICES action', () => {
      const results = Array(10);
      const expectedAction: actions.FilterChoicesAction = {
        type: ActionType.FILTER_CHOICES,
        results,
      };

      expect(actions.filterChoices(results)).to.deep.equal(expectedAction);
    });
  });

  describe('activateChoices action', () => {
    describe('not passing active parameter', () => {
      it('returns ACTIVATE_CHOICES action', () => {
        const expectedAction: actions.ActivateChoicesAction = {
          type: ActionType.ACTIVATE_CHOICES,
          active: true,
        };

        expect(actions.activateChoices()).to.deep.equal(expectedAction);
      });
    });

    describe('passing active parameter', () => {
      it('returns ACTIVATE_CHOICES action', () => {
        const active = true;
        const expectedAction: actions.ActivateChoicesAction = {
          type: ActionType.ACTIVATE_CHOICES,
          active,
        };

        expect(actions.activateChoices(active)).to.deep.equal(expectedAction);
      });
    });
  });

  describe('removeChoice action', () => {
    it('returns REMOVE_CHOICE action', () => {
      const expectedAction: actions.RemoveChoiceAction = {
        type: ActionType.REMOVE_CHOICE,
        choice,
      };

      expect(actions.removeChoice(cloneObject(choice))).to.deep.equal(expectedAction);
    });
  });

  describe('clearChoices action', () => {
    it('returns CLEAR_CHOICES action', () => {
      const expectedAction: actions.ClearChoicesAction = {
        type: ActionType.CLEAR_CHOICES,
      };

      expect(actions.clearChoices()).to.deep.equal(expectedAction);
    });
  });
});
