gitlab-org--gitlab-foss/spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js

171 lines
4.5 KiB
JavaScript
Raw Normal View History

import { useLocalStorageSpy } from 'helpers/local_storage_helper';
2017-05-05 17:59:41 +00:00
import AccessorUtilities from '~/lib/utils/accessor';
2018-01-10 18:56:15 +00:00
import SigninTabsMemoizer from '~/pages/sessions/new/signin_tabs_memoizer';
useLocalStorageSpy();
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
describe('SigninTabsMemoizer', () => {
const fixtureTemplate = 'static/signin_tabs.html';
2018-10-17 07:16:21 +00:00
const tabSelector = 'ul.new-session-tabs';
const currentTabKey = 'current_signin_tab';
let memo;
function createMemoizer() {
memo = new SigninTabsMemoizer({
currentTabKey,
tabSelector,
});
return memo;
}
2018-10-17 07:16:21 +00:00
beforeEach(() => {
loadFixtures(fixtureTemplate);
2017-05-05 17:59:41 +00:00
jest.spyOn(AccessorUtilities, 'isLocalStorageAccessSafe').mockReturnValue(true);
2018-10-17 07:16:21 +00:00
});
2018-10-17 07:16:21 +00:00
it('does nothing if no tab was previously selected', () => {
createMemoizer();
2018-10-17 07:16:21 +00:00
expect(document.querySelector(`${tabSelector} > li.active a`).getAttribute('href')).toEqual(
'#ldap',
);
});
2018-10-17 07:16:21 +00:00
it('shows last selected tab on boot', () => {
createMemoizer().saveData('#ldap');
const fakeTab = {
click: () => {},
};
jest.spyOn(document, 'querySelector').mockReturnValue(fakeTab);
jest.spyOn(fakeTab, 'click').mockImplementation(() => {});
2018-10-17 07:16:21 +00:00
memo.bootstrap();
2018-10-17 07:16:21 +00:00
// verify that triggers click on the last selected tab
expect(document.querySelector).toHaveBeenCalledWith(`${tabSelector} a[href="#ldap"]`);
expect(fakeTab.click).toHaveBeenCalled();
});
2018-10-17 07:16:21 +00:00
it('clicks the first tab if value in local storage is bad', () => {
createMemoizer().saveData('#bogus');
const fakeTab = {
click: jest.fn().mockName('fakeTab_click'),
2018-10-17 07:16:21 +00:00
};
jest
.spyOn(document, 'querySelector')
.mockImplementation((selector) =>
selector === `${tabSelector} a[href="#bogus"]` ? null : fakeTab,
);
2018-10-17 07:16:21 +00:00
memo.bootstrap();
// verify that triggers click on stored selector and fallback
expect(document.querySelector.mock.calls).toEqual([
2018-10-17 07:16:21 +00:00
['ul.new-session-tabs a[href="#bogus"]'],
['ul.new-session-tabs a'],
]);
2018-10-17 07:21:28 +00:00
2018-10-17 07:16:21 +00:00
expect(fakeTab.click).toHaveBeenCalled();
});
2018-10-17 07:16:21 +00:00
it('saves last selected tab on change', () => {
createMemoizer();
2018-10-17 07:16:21 +00:00
document.querySelector('a[href="#login-pane"]').click();
2018-10-17 07:16:21 +00:00
expect(memo.readData()).toEqual('#login-pane');
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
it('overrides last selected tab with hash tag when given', () => {
window.location.hash = '#ldap';
createMemoizer();
2018-10-17 07:16:21 +00:00
expect(memo.readData()).toEqual('#ldap');
});
2018-10-17 07:16:21 +00:00
describe('class constructor', () => {
beforeEach(() => {
memo = createMemoizer();
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
it('should set .isLocalStorageAvailable', () => {
expect(AccessorUtilities.isLocalStorageAccessSafe).toHaveBeenCalled();
expect(memo.isLocalStorageAvailable).toBe(true);
2017-05-05 17:59:41 +00:00
});
2018-10-17 07:16:21 +00:00
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
describe('saveData', () => {
beforeEach(() => {
memo = {
currentTabKey,
};
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
describe('if .isLocalStorageAvailable is `false`', () => {
beforeEach(() => {
2018-10-17 07:16:21 +00:00
memo.isLocalStorageAvailable = false;
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
SigninTabsMemoizer.prototype.saveData.call(memo);
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
it('should not call .setItem', () => {
expect(localStorage.setItem).not.toHaveBeenCalled();
2017-05-05 17:59:41 +00:00
});
2018-10-17 07:16:21 +00:00
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
describe('if .isLocalStorageAvailable is `true`', () => {
const value = 'value';
2017-05-05 17:59:41 +00:00
beforeEach(() => {
2018-10-17 07:16:21 +00:00
memo.isLocalStorageAvailable = true;
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
SigninTabsMemoizer.prototype.saveData.call(memo, value);
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
it('should call .setItem', () => {
expect(localStorage.setItem).toHaveBeenCalledWith(currentTabKey, value);
2017-05-05 17:59:41 +00:00
});
});
2018-10-17 07:16:21 +00:00
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
describe('readData', () => {
const itemValue = 'itemValue';
let readData;
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
beforeEach(() => {
memo = {
currentTabKey,
};
2017-05-05 17:59:41 +00:00
localStorage.getItem.mockReturnValue(itemValue);
2018-10-17 07:16:21 +00:00
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
describe('if .isLocalStorageAvailable is `false`', () => {
beforeEach(() => {
2018-10-17 07:16:21 +00:00
memo.isLocalStorageAvailable = false;
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
readData = SigninTabsMemoizer.prototype.readData.call(memo);
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
it('should not call .getItem and should return `null`', () => {
expect(localStorage.getItem).not.toHaveBeenCalled();
expect(readData).toBe(null);
2017-05-05 17:59:41 +00:00
});
2018-10-17 07:16:21 +00:00
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
describe('if .isLocalStorageAvailable is `true`', () => {
beforeEach(() => {
2018-10-17 07:16:21 +00:00
memo.isLocalStorageAvailable = true;
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
readData = SigninTabsMemoizer.prototype.readData.call(memo);
});
2017-05-05 17:59:41 +00:00
2018-10-17 07:16:21 +00:00
it('should call .getItem and return the localStorage value', () => {
expect(window.localStorage.getItem).toHaveBeenCalledWith(currentTabKey);
expect(readData).toBe(itemValue);
2017-05-05 17:59:41 +00:00
});
});
});
2018-10-17 07:16:21 +00:00
});