import VisualTokenValue from '~/filtered_search/visual_token_value'; import _ from 'underscore'; import AjaxCache from '~/lib/utils/ajax_cache'; import UsersCache from '~/lib/utils/users_cache'; import DropdownUtils from '~/filtered_search//dropdown_utils'; import FilteredSearchSpecHelper from '../helpers/filtered_search_spec_helper'; 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 tokenType = tokenNameElement.innerText.toLowerCase(); const tokenValue = tokenValueElement.innerText; const subject = new VisualTokenValue(tokenValue, tokenType); return { subject, tokenValueContainer, tokenValueElement }; }; let tokensContainer; let authorToken; let bugLabelToken; beforeEach(() => { setFixtures(` `); tokensContainer = document.querySelector('.tokens-container'); authorToken = FilteredSearchSpecHelper.createFilterVisualToken('author', '@user'); bugLabelToken = FilteredSearchSpecHelper.createFilterVisualToken('label', '~bug'); }); describe('updateUserTokenAppearance', () => { let usersCacheSpy; beforeEach(() => { spyOn(UsersCache, 'retrieve').and.callFake(username => usersCacheSpy(username)); }); it('ignores error if UsersCache throws', done => { spyOn(window, 'Flash'); 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); }; subject .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue) .then(() => { expect(window.Flash.calls.count()).toBe(0); }) .then(done) .catch(done.fail); }); it('does nothing if user cannot be found', done => { const { subject, tokenValueContainer, tokenValueElement } = findElements(authorToken); const tokenValue = tokenValueElement.innerText; usersCacheSpy = username => { expect(`@${username}`).toBe(tokenValue); return Promise.resolve(undefined); }; subject .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue) .then(() => { expect(tokenValueElement.innerText).toBe(tokenValue); }) .then(done) .catch(done.fail); }); it('replaces author token with avatar and display name', done => { const dummyUser = { name: 'Important Person', avatar_url: 'https://host.invalid/mypics/avatar.png', }; const { subject, tokenValueContainer, tokenValueElement } = findElements(authorToken); const tokenValue = tokenValueElement.innerText; usersCacheSpy = username => { expect(`@${username}`).toBe(tokenValue); return Promise.resolve(dummyUser); }; subject .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue) .then(() => { expect(tokenValueContainer.dataset.originalValue).toBe(tokenValue); expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name); const avatar = tokenValueElement.querySelector('img.avatar'); expect(avatar.src).toBe(dummyUser.avatar_url); expect(avatar.alt).toBe(''); }) .then(done) .catch(done.fail); }); it('escapes user name when creating token', done => { const dummyUser = { name: '