123 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| import $ from 'jquery';
 | |
| import htmlGroupsEdit from 'test_fixtures/groups/edit.html';
 | |
| import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
 | |
| import initSettingsPanels, { isExpanded, toggleSection } from '~/settings_panels';
 | |
| 
 | |
| const pushStateSpy = jest.fn();
 | |
| 
 | |
| describe('Settings Panels', () => {
 | |
|   beforeEach(() => {
 | |
|     setHTMLFixture(htmlGroupsEdit);
 | |
| 
 | |
|     // Mock history and location APIs
 | |
|     window.history.pushState = pushStateSpy;
 | |
|     Object.defineProperty(window, 'location', {
 | |
|       value: {
 | |
|         hash: '',
 | |
|         pathname: '/settings',
 | |
|         search: '?param=1',
 | |
|       },
 | |
|       writable: true,
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   afterEach(() => {
 | |
|     resetHTMLFixture();
 | |
|   });
 | |
| 
 | |
|   describe('initSettingsPane', () => {
 | |
|     afterEach(() => {
 | |
|       window.location.hash = '';
 | |
|     });
 | |
| 
 | |
|     it('should expand linked hash fragment panel', () => {
 | |
|       window.location.hash = '#js-general-settings';
 | |
| 
 | |
|       const panel = document.querySelector('#js-general-settings');
 | |
|       // Our test environment automatically expands everything so we need to clear that out first
 | |
|       panel.classList.remove('expanded');
 | |
| 
 | |
|       expect(isExpanded(panel)).toBe(false);
 | |
| 
 | |
|       initSettingsPanels();
 | |
| 
 | |
|       expect(isExpanded(panel)).toBe(true);
 | |
|     });
 | |
| 
 | |
|     it('should expand panel containing linked hash', () => {
 | |
|       window.location.hash = '#group_description';
 | |
| 
 | |
|       const panel = document.querySelector('#js-general-settings');
 | |
|       // Our test environment automatically expands everything so we need to clear that out first
 | |
|       panel.classList.remove('expanded');
 | |
| 
 | |
|       expect(isExpanded(panel)).toBe(false);
 | |
| 
 | |
|       initSettingsPanels();
 | |
| 
 | |
|       expect(isExpanded(panel)).toBe(true);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('does not change the text content of triggers', () => {
 | |
|     const panel = document.querySelector('#js-general-settings');
 | |
|     const trigger = panel.querySelector('.js-settings-toggle-trigger-only');
 | |
|     const originalText = trigger.textContent;
 | |
| 
 | |
|     initSettingsPanels();
 | |
| 
 | |
|     expect(isExpanded(panel)).toBe(true);
 | |
| 
 | |
|     $(trigger).click();
 | |
| 
 | |
|     expect(isExpanded(panel)).toBe(false);
 | |
|     expect(trigger.textContent).toEqual(originalText);
 | |
|   });
 | |
| 
 | |
|   describe('toggleSection', () => {
 | |
|     let $section;
 | |
| 
 | |
|     beforeEach(() => {
 | |
|       $section = $('#js-general-settings');
 | |
|     });
 | |
| 
 | |
|     it('removes no-animate class when toggling', () => {
 | |
|       $section.addClass('no-animate');
 | |
|       toggleSection($section);
 | |
|       expect($section.hasClass('no-animate')).toBe(false);
 | |
|     });
 | |
| 
 | |
|     describe('when section is not expanded', () => {
 | |
|       beforeEach(() => {
 | |
|         $section.removeClass('expanded');
 | |
|       });
 | |
| 
 | |
|       it('expands the section', () => {
 | |
|         toggleSection($section);
 | |
|         expect(isExpanded($section[0])).toBe(true);
 | |
|       });
 | |
| 
 | |
|       it('adds section ID to URL hash', () => {
 | |
|         toggleSection($section);
 | |
|         expect(window.location.hash).toBe('js-general-settings');
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     describe('when section is expanded', () => {
 | |
|       beforeEach(() => {
 | |
|         $section.addClass('expanded');
 | |
|       });
 | |
| 
 | |
|       it('closes the section', () => {
 | |
|         toggleSection($section);
 | |
|         expect(isExpanded($section[0])).toBe(false);
 | |
|       });
 | |
| 
 | |
|       it('removes hash from URL', () => {
 | |
|         toggleSection($section);
 | |
|         expect(pushStateSpy).toHaveBeenCalledWith('', document.title, '/settings?param=1');
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| });
 |