summaryrefslogtreecommitdiff
path: root/spec/frontend/create_item_dropdown_spec.js
blob: 143ccb9b930e5648ef95e37196b79b3cc87446d9 (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import $ from 'jquery';
import CreateItemDropdown from '~/create_item_dropdown';

const DROPDOWN_ITEM_DATA = [
  {
    title: 'one',
    id: 'one',
    text: 'one',
  },
  {
    title: 'two',
    id: 'two',
    text: 'two',
  },
  {
    title: 'three',
    id: 'three',
    text: 'three',
  },
  {
    title: '<b>four</b>title',
    id: '<b>four</b>id',
    text: '<b>four</b>text',
  },
];

describe('CreateItemDropdown', () => {
  let $wrapperEl;
  let createItemDropdown;

  function createItemAndClearInput(text) {
    // Filter for the new item
    $wrapperEl.find('.dropdown-input-field').val(text).trigger('input');

    // Create the new item
    const $createButton = $wrapperEl.find('.js-dropdown-create-new-item');
    $createButton.click();

    // Clear out the filter
    $wrapperEl.find('.dropdown-input-field').val('').trigger('input');
  }

  beforeEach(() => {
    loadFixtures('static/create_item_dropdown.html');
    $wrapperEl = $('.js-create-item-dropdown-fixture-root');
  });

  afterEach(() => {
    $wrapperEl.remove();
  });

  describe('items', () => {
    beforeEach(() => {
      createItemDropdown = new CreateItemDropdown({
        $dropdown: $wrapperEl.find('.js-dropdown-menu-toggle'),
        defaultToggleLabel: 'All variables',
        fieldName: 'variable[environment]',
        getData: (term, callback) => {
          callback(DROPDOWN_ITEM_DATA);
        },
      });
    });

    it('should have a dropdown item for each piece of data', () => {
      // Get the data in the dropdown
      $('.js-dropdown-menu-toggle').click();

      const $itemEls = $wrapperEl.find('.js-dropdown-content a');

      expect($itemEls.length).toEqual(DROPDOWN_ITEM_DATA.length);

      DROPDOWN_ITEM_DATA.forEach((dataItem, i) => {
        expect($($itemEls[i]).text()).toEqual(dataItem.text);
      });
    });
  });

  describe('created items', () => {
    const NEW_ITEM_TEXT = 'foobarbaz';

    beforeEach(() => {
      createItemDropdown = new CreateItemDropdown({
        $dropdown: $wrapperEl.find('.js-dropdown-menu-toggle'),
        defaultToggleLabel: 'All variables',
        fieldName: 'variable[environment]',
        getData: (term, callback) => {
          callback(DROPDOWN_ITEM_DATA);
        },
      });

      // Open the dropdown
      $('.js-dropdown-menu-toggle').click();

      // Filter for the new item
      $wrapperEl.find('.dropdown-input-field').val(NEW_ITEM_TEXT).trigger('input');
    });

    it('create new item button should include the filter text', () => {
      expect($wrapperEl.find('.js-dropdown-create-new-item code').text()).toEqual(NEW_ITEM_TEXT);
    });

    it('should update the dropdown with the newly created item', () => {
      // Create the new item
      const $createButton = $wrapperEl.find('.js-dropdown-create-new-item');
      $createButton.click();

      expect($wrapperEl.find('.dropdown-toggle-text').text()).toEqual(NEW_ITEM_TEXT);
      expect($wrapperEl.find('input[name="variable[environment]"]').val()).toEqual(NEW_ITEM_TEXT);
    });

    it('should include newly created item in dropdown list', () => {
      createItemAndClearInput(NEW_ITEM_TEXT);

      const $itemEls = $wrapperEl.find('.js-dropdown-content a');

      expect($itemEls.length).toEqual(1 + DROPDOWN_ITEM_DATA.length);
      expect($($itemEls.get(DROPDOWN_ITEM_DATA.length)).text()).toEqual(NEW_ITEM_TEXT);
    });

    it('should not duplicate an item when trying to create an existing item', () => {
      createItemAndClearInput(DROPDOWN_ITEM_DATA[0].text);

      const $itemEls = $wrapperEl.find('.js-dropdown-content a');

      expect($itemEls.length).toEqual(DROPDOWN_ITEM_DATA.length);
    });
  });

  describe('clearDropdown()', () => {
    beforeEach(() => {
      createItemDropdown = new CreateItemDropdown({
        $dropdown: $wrapperEl.find('.js-dropdown-menu-toggle'),
        defaultToggleLabel: 'All variables',
        fieldName: 'variable[environment]',
        getData: (term, callback) => {
          callback(DROPDOWN_ITEM_DATA);
        },
      });
    });

    it('should clear all data and filter input', () => {
      const filterInput = $wrapperEl.find('.dropdown-input-field');

      // Get the data in the dropdown
      $('.js-dropdown-menu-toggle').click();

      // Filter for an item
      filterInput.val('one').trigger('input');

      const $itemElsAfterFilter = $wrapperEl.find('.js-dropdown-content a');

      expect($itemElsAfterFilter.length).toEqual(1);

      createItemDropdown.clearDropdown();

      const $itemElsAfterClear = $wrapperEl.find('.js-dropdown-content a');

      expect($itemElsAfterClear.length).toEqual(0);
      expect(filterInput.val()).toEqual('');
    });
  });

  describe('createNewItemFromValue option', () => {
    beforeEach(() => {
      createItemDropdown = new CreateItemDropdown({
        $dropdown: $wrapperEl.find('.js-dropdown-menu-toggle'),
        defaultToggleLabel: 'All variables',
        fieldName: 'variable[environment]',
        getData: (term, callback) => {
          callback(DROPDOWN_ITEM_DATA);
        },
        createNewItemFromValue: (newValue) => ({
          title: `${newValue}-title`,
          id: `${newValue}-id`,
          text: `${newValue}-text`,
        }),
      });
    });

    it('all items go through createNewItemFromValue', () => {
      // Get the data in the dropdown
      $('.js-dropdown-menu-toggle').click();

      createItemAndClearInput('new-item');

      const $itemEls = $wrapperEl.find('.js-dropdown-content a');

      expect($itemEls.length).toEqual(1 + DROPDOWN_ITEM_DATA.length);
      expect($($itemEls[DROPDOWN_ITEM_DATA.length]).text()).toEqual('new-item-text');
      expect($wrapperEl.find('.dropdown-toggle-text').text()).toEqual('new-item-title');
    });
  });
});