diff --git a/resources/assets/js/__tests__/factory/index.ts b/resources/assets/js/__tests__/factory/index.ts index 2b4d9d24..2d9f3160 100644 --- a/resources/assets/js/__tests__/factory/index.ts +++ b/resources/assets/js/__tests__/factory/index.ts @@ -5,7 +5,7 @@ import album from './album' import song from './song' import video from './video' import playlist from './playlist' -import user from './user' +import user, { states as userStates } from './user' factory .define('artist', (faker: Faker): Artist => artist(faker)) @@ -13,6 +13,6 @@ factory .define('song', (faker: Faker): Song => song(faker)) .define('video', (faker: Faker): YouTubeVideo => video(faker)) .define('playlist', (faker: Faker): Playlist => playlist(faker)) - .define('user', (faker: Faker): User => user(faker)) + .define('user', (faker: Faker): User => user(faker), userStates) export default factory diff --git a/resources/assets/js/__tests__/factory/user.ts b/resources/assets/js/__tests__/factory/user.ts index 76b4da6b..52d8134b 100644 --- a/resources/assets/js/__tests__/factory/user.ts +++ b/resources/assets/js/__tests__/factory/user.ts @@ -9,3 +9,9 @@ export default (faker: Faker): User => ({ avatar: 'https://gravatar.com/foo', preferences: {} }) + +export const states = { + admin: { + is_admin: true + } +} diff --git a/resources/assets/js/components/layout/AppHeader.spec.ts b/resources/assets/js/components/layout/AppHeader.spec.ts new file mode 100644 index 00000000..aeb9b68a --- /dev/null +++ b/resources/assets/js/components/layout/AppHeader.spec.ts @@ -0,0 +1,61 @@ +import { beforeEach, expect, it } from 'vitest' +import { mockHelper, render } from '@/__tests__/__helpers__' +import { cleanup, fireEvent, queryAllByTestId } from '@testing-library/vue' +import { eventBus } from '@/utils' +import { nextTick } from 'vue' +import isMobile from 'ismobilejs' +import AppHeader from './AppHeader.vue' +import SearchForm from '@/components/ui/SearchForm.vue' +import compareVersions from 'compare-versions' +import { userStore } from '@/stores' +import factory from '@/__tests__/factory' + +beforeEach(() => { + cleanup() + mockHelper.restoreAllMocks() + isMobile.any = false +}) + +it('toggles sidebar (mobile only)', async () => { + isMobile.any = true + const { getByTitle } = render(AppHeader) + const mock = mockHelper.mock(eventBus, 'emit') + + await fireEvent.click(getByTitle('Show or hide the sidebar')) + + expect(mock).toHaveBeenCalledWith('TOGGLE_SIDEBAR') +}) + +it('toggles search form (mobile only)', async () => { + isMobile.any = true + + const { getByTitle, getByTestId, queryByTestId } = render(AppHeader, { + global: { + stubs: { + SearchForm + } + } + }) + + expect(await queryByTestId('search-form')).toBe(null) + + await fireEvent.click(getByTitle('Show or hide the search form')) + await nextTick() + + getByTestId('search-form') +}) + +it.each([[true, true, true], [false, true, false], [true, false, false], [false, false, false]])( + 'announces a new version if applicable', + async (hasNewVersion, isAdmin, announcing) => { + mockHelper.mock(compareVersions, 'compare', hasNewVersion) + + userStore.state.current = factory('user', { + is_admin: isAdmin + }) + + const { queryAllByTestId } = render(AppHeader) + + expect(await queryAllByTestId('new-version')).toHaveLength(announcing ? 1 : 0) + } +) diff --git a/resources/assets/js/components/layout/AppHeader.vue b/resources/assets/js/components/layout/AppHeader.vue index 81c9e0d4..11083982 100644 --- a/resources/assets/js/components/layout/AppHeader.vue +++ b/resources/assets/js/components/layout/AppHeader.vue @@ -1,15 +1,15 @@ @@ -89,7 +85,7 @@ const showAboutDialog = () => eventBus.emit('MODAL_SHOW_ABOUT_KOEL') @media only screen and (max-width: 667px) { display: flex; align-content: stretch; - justify-content: flext-start; + justify-content: flex-start; .hamburger, .magnifier { display: inline-block; diff --git a/resources/assets/js/components/ui/SearchForm.vue b/resources/assets/js/components/ui/SearchForm.vue index ab2ff429..9bc4b67a 100644 --- a/resources/assets/js/components/ui/SearchForm.vue +++ b/resources/assets/js/components/ui/SearchForm.vue @@ -1,5 +1,5 @@