import { escape } from 'lodash'; import labelData from 'test_fixtures/labels/project_labels.json'; import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures'; import FilteredSearchSpecHelper from 'helpers/filtered_search_spec_helper'; import { TEST_HOST } from 'helpers/test_constants'; import DropdownUtils from '~/filtered_search/dropdown_utils'; import VisualTokenValue from '~/filtered_search/visual_token_value'; import { createAlert } from '~/alert'; import AjaxCache from '~/lib/utils/ajax_cache'; import UsersCache from '~/lib/utils/users_cache'; jest.mock('~/alert'); describe('Filtered Search Visual Tokens', () => { const findElements = (tokenElement) => { const tokenNameElement = tokenElement.querySelector('.name'); const tokenValueContainer = tokenElement.querySelector('.value-container'); const tokenValueElement = tokenValueContainer.querySelector('.value'); const tokenOperatorElement = tokenElement.querySelector('.operator'); const tokenType = tokenNameElement.innerText.toLowerCase(); const tokenValue = tokenValueElement.innerText; const tokenOperator = tokenOperatorElement.innerText; const subject = new VisualTokenValue(tokenValue, tokenType, tokenOperator); return { subject, tokenValueContainer, tokenValueElement }; }; let tokensContainer; let authorToken; let bugLabelToken; beforeEach(() => { setHTMLFixture(` `); tokensContainer = document.querySelector('.tokens-container'); authorToken = FilteredSearchSpecHelper.createFilterVisualToken('author', '=', '@user'); bugLabelToken = FilteredSearchSpecHelper.createFilterVisualToken('label', '=', '~bug'); }); afterEach(() => { resetHTMLFixture(); }); describe('updateUserTokenAppearance', () => { let usersCacheSpy; beforeEach(() => { jest.spyOn(UsersCache, 'retrieve').mockImplementation((username) => usersCacheSpy(username)); }); it('ignores error if UsersCache throws', async () => { const dummyError = new Error('Earth rotated backwards'); const { subject, tokenValueContainer, tokenValueElement } = findElements(authorToken); const tokenValue = tokenValueElement.innerText; usersCacheSpy = (username) => { expect(`@${username}`).toBe(tokenValue); return Promise.reject(dummyError); }; await subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue); expect(createAlert).toHaveBeenCalledTimes(0); }); it('does nothing if user cannot be found', async () => { const { subject, tokenValueContainer, tokenValueElement } = findElements(authorToken); const tokenValue = tokenValueElement.innerText; usersCacheSpy = (username) => { expect(`@${username}`).toBe(tokenValue); return Promise.resolve(undefined); }; await subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue); expect(tokenValueElement.innerText).toBe(tokenValue); }); it('replaces author token with avatar and display name', async () => { const dummyUser = { name: 'Important Person', avatar_url: `${TEST_HOST}/mypics/avatar.png`, }; const { subject, tokenValueContainer, tokenValueElement } = findElements(authorToken); const tokenValue = tokenValueElement.innerText; usersCacheSpy = (username) => { expect(`@${username}`).toBe(tokenValue); return Promise.resolve(dummyUser); }; await subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue); expect(tokenValueContainer.dataset.originalValue).toBe(tokenValue); expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name); const avatar = tokenValueElement.querySelector('img.avatar'); expect(avatar.getAttribute('src')).toBe(dummyUser.avatar_url); expect(avatar.getAttribute('alt')).toBe(''); }); it('escapes user name when creating token', async () => { const dummyUser = { name: '