summaryrefslogtreecommitdiff
path: root/spec/javascripts/ide/components/shared/tokened_input_spec.js
blob: 09940fe8c6a580b2af3291685e85c74e8fa7d805 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import Vue from 'vue';
import TokenedInput from '~/ide/components/shared/tokened_input.vue';
import mountComponent from 'spec/helpers/vue_mount_component_helper';

const TEST_PLACEHOLDER = 'Searching in test';
const TEST_TOKENS = [
  { label: 'lorem', id: 1 },
  { label: 'ipsum', id: 2 },
  { label: 'dolar', id: 3 },
];
const TEST_VALUE = 'lorem';

function getTokenElements(vm) {
  return Array.from(vm.$el.querySelectorAll('.filtered-search-token button'));
}

function createBackspaceEvent() {
  const e = new Event('keyup');
  e.keyCode = 8;
  e.which = e.keyCode;
  e.altKey = false;
  e.ctrlKey = true;
  e.shiftKey = false;
  e.metaKey = false;
  return e;
}

describe('IDE shared/TokenedInput', () => {
  const Component = Vue.extend(TokenedInput);
  let vm;

  beforeEach(() => {
    vm = mountComponent(Component, {
      tokens: TEST_TOKENS,
      placeholder: TEST_PLACEHOLDER,
      value: TEST_VALUE,
    });

    spyOn(vm, '$emit');
  });

  afterEach(() => {
    vm.$destroy();
  });

  it('renders tokens', () => {
    const renderedTokens = getTokenElements(vm)
      .map(x => x.textContent.trim());

    expect(renderedTokens).toEqual(TEST_TOKENS.map(x => x.label));
  });

  it('renders input', () => {
    expect(vm.$refs.input).toBeTruthy();
    expect(vm.$refs.input).toHaveValue(TEST_VALUE);
  });

  it('renders placeholder, when tokens are empty', done => {
    vm.tokens = [];

    vm.$nextTick()
      .then(() => {
        expect(vm.$refs.input).toHaveAttr('placeholder', TEST_PLACEHOLDER);
      })
      .then(done)
      .catch(done.fail);
  });

  it('triggers "removeToken" on token click', () => {
    getTokenElements(vm)[0].click();

    expect(vm.$emit).toHaveBeenCalledWith('removeToken', TEST_TOKENS[0]);
  });

  it('when input triggers backspace event, it calls "onBackspace"', () => {
    spyOn(vm, 'onBackspace');

    vm.$refs.input.dispatchEvent(createBackspaceEvent());
    vm.$refs.input.dispatchEvent(createBackspaceEvent());

    expect(vm.onBackspace).toHaveBeenCalledTimes(2);
  });

  it('triggers "removeToken" on backspaces when value is empty', () => {
    vm.value = '';

    vm.onBackspace();
    expect(vm.$emit).not.toHaveBeenCalled();
    expect(vm.backspaceCount).toEqual(1);

    vm.onBackspace();
    expect(vm.$emit).toHaveBeenCalledWith('removeToken', TEST_TOKENS[TEST_TOKENS.length - 1]);
    expect(vm.backspaceCount).toEqual(0);
  });

  it('does not trigger "removeToken" on backspaces when value is not empty', () => {
    vm.onBackspace();
    vm.onBackspace();

    expect(vm.backspaceCount).toEqual(0);
    expect(vm.$emit).not.toHaveBeenCalled();
  });

  it('does not trigger "removeToken" on backspaces when tokens are empty', () => {
    vm.tokens = [];

    vm.onBackspace();
    vm.onBackspace();

    expect(vm.backspaceCount).toEqual(0);
    expect(vm.$emit).not.toHaveBeenCalled();
  });

  it('triggers "focus" on input focus', () => {
    vm.$refs.input.dispatchEvent(new Event('focus'));

    expect(vm.$emit).toHaveBeenCalledWith('focus');
  });

  it('triggers "blur" on input blur', () => {
    vm.$refs.input.dispatchEvent(new Event('blur'));

    expect(vm.$emit).toHaveBeenCalledWith('blur');
  });

  it('triggers "input" with value on input change', () => {
    vm.$refs.input.value = 'something-else';
    vm.$refs.input.dispatchEvent(new Event('input'));

    expect(vm.$emit).toHaveBeenCalledWith('input', 'something-else');
  });
});