197 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| import $ from 'jquery';
 | |
| import htmlCreateItemDropdown from 'test_fixtures_static/create_item_dropdown.html';
 | |
| import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
 | |
| 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(() => {
 | |
|     setHTMLFixture(htmlCreateItemDropdown);
 | |
|     $wrapperEl = $('.js-create-item-dropdown-fixture-root');
 | |
|   });
 | |
| 
 | |
|   afterEach(() => {
 | |
|     $wrapperEl.remove();
 | |
|     resetHTMLFixture();
 | |
|   });
 | |
| 
 | |
|   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).toHaveLength(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).toHaveLength(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).toHaveLength(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).toHaveLength(1);
 | |
| 
 | |
|       createItemDropdown.clearDropdown();
 | |
| 
 | |
|       const $itemElsAfterClear = $wrapperEl.find('.js-dropdown-content a');
 | |
| 
 | |
|       expect($itemElsAfterClear).toHaveLength(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).toHaveLength(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');
 | |
|     });
 | |
|   });
 | |
| });
 |