From 5b8fecc6ef5709608529518d0ff42f50d5753b1d Mon Sep 17 00:00:00 2001 From: mattwr18 Date: Fri, 20 Mar 2020 17:26:53 +0100 Subject: [PATCH] refactor: Extract LanguagesFilter to its own spec --- .../FilterMenu/LanguagesFilter.spec.js | 72 +++++++++++++++++++ ...LanguageFilter.vue => LanguagesFilter.vue} | 16 +++-- 2 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 webapp/components/FilterMenu/LanguagesFilter.spec.js rename webapp/components/FilterMenu/{LanguageFilter.vue => LanguagesFilter.vue} (92%) diff --git a/webapp/components/FilterMenu/LanguagesFilter.spec.js b/webapp/components/FilterMenu/LanguagesFilter.spec.js new file mode 100644 index 000000000..89bf47b2e --- /dev/null +++ b/webapp/components/FilterMenu/LanguagesFilter.spec.js @@ -0,0 +1,72 @@ +import { mount } from '@vue/test-utils' +import Vuex from 'vuex' +import locales from '~/locales' +import orderBy from 'lodash/orderBy' +import LanguagesFilter from './LanguagesFilter' +const localVue = global.localVue + +let wrapper, englishButton, spanishButton + +const languages = orderBy(locales, 'name') + +describe('LanguagesFilter.vue', () => { + const mutations = { + 'posts/TOGGLE_LANGUAGE': jest.fn(), + 'posts/RESET_LANGUAGES': jest.fn(), + } + const getters = { + 'posts/filteredLanguageCodes': jest.fn(() => []), + } + + const mocks = { + $t: jest.fn(string => string), + } + + const Wrapper = () => { + const store = new Vuex.Store({ mutations, getters }) + return mount(LanguagesFilter, { mocks, localVue, store }) + } + + beforeEach(() => { + wrapper = Wrapper() + }) + + describe('mount', () => { + it('starts with all categories button active', () => { + const allLanguagesButton = wrapper.find('.languages-filter > .labeled-button > .base-button') + expect(allLanguagesButton.attributes().class).toContain('--filled') + }) + + it('sets language button attribute `filled` when corresponding language is filtered', () => { + getters['posts/filteredLanguageCodes'] = jest.fn(() => ['es']) + const wrapper = Wrapper() + spanishButton = wrapper + .findAll('.languages-filter > .languages-list .base-button') + .at(languages.findIndex(l => l.code === 'es')) + expect(spanishButton.attributes().class).toContain('--filled') + }) + + describe('click on an "language-button" button', () => { + it('calls TOGGLE_LANGUAGE when clicked', () => { + const wrapper = Wrapper() + englishButton = wrapper + .findAll('.languages-filter > .languages-list .base-button') + .at(languages.findIndex(l => l.code === 'en')) + englishButton.trigger('click') + expect(mutations['posts/TOGGLE_LANGUAGE']).toHaveBeenCalledWith({}, 'en') + }) + }) + + describe('clears filter', () => { + it('when all button is clicked', async () => { + getters['posts/filteredLanguageCodes'] = jest.fn(() => ['en']) + wrapper = await Wrapper() + const allLanguagesButton = wrapper.find( + '.languages-filter > .labeled-button > .base-button', + ) + allLanguagesButton.trigger('click') + expect(mutations['posts/RESET_LANGUAGES']).toHaveBeenCalledTimes(1) + }) + }) + }) +}) diff --git a/webapp/components/FilterMenu/LanguageFilter.vue b/webapp/components/FilterMenu/LanguagesFilter.vue similarity index 92% rename from webapp/components/FilterMenu/LanguageFilter.vue rename to webapp/components/FilterMenu/LanguagesFilter.vue index f8662a42a..28d374800 100644 --- a/webapp/components/FilterMenu/LanguageFilter.vue +++ b/webapp/components/FilterMenu/LanguagesFilter.vue @@ -1,5 +1,5 @@