fix(tests): don't wait arbitrary time

Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/2757>
environments/review-docs-v2-ov-8q6uyo/deployments/19325
wvffle 2024-02-20 20:52:29 +00:00
rodzic 2b1228e620
commit 6aa609970f
5 zmienionych plików z 29 dodań i 43 usunięć

Wyświetl plik

@ -79,7 +79,6 @@
"@vue/eslint-config-typescript": "12.0.0",
"@vue/test-utils": "2.2.7",
"@vue/tsconfig": "0.1.3",
"axios-mock-adapter": "1.21.4",
"cypress": "13.6.4",
"eslint": "8.30.0",
"eslint-config-standard": "17.0.0",

Wyświetl plik

@ -1,7 +1,7 @@
import { LRUCache } from 'lru-cache'
import { currentIndex, useQueue } from '~/composables/audio/queue'
import { useTracks } from '~/composables/audio/tracks'
import { sleep } from '?/utils'
import { isEqual } from 'lodash-es'
import type { Sound } from '~/api/player'
import type { Track } from '~/types'
@ -20,6 +20,11 @@ const createTrack = <CreateTrackFn>(() => {
return { id: createTrack.id++, uploads: [] } as any as Track
})
const waitUntilCacheUpdated = async () => {
const keys = [...cache.rkeys()]
return vi.waitUntil(() => !isEqual(keys, [...cache.rkeys()]), { interval: 5 })
}
beforeAll(() => {
const { initialize } = useTracks()
initialize()
@ -48,18 +53,18 @@ describe('cache', () => {
it('caches next track after 100ms', async () => {
expect(cache.size).toBe(1)
await sleep(110)
await waitUntilCacheUpdated()
expect(cache.size).toBe(2)
})
it('preserves previous track in cache, when next track is playing', async () => {
expect(cache.size).toBe(1)
await sleep(110)
await waitUntilCacheUpdated()
expect(cache.size).toBe(2)
currentIndex.value += 1
await sleep(110)
await waitUntilCacheUpdated()
expect(cache.size).toBe(3)
})
@ -67,35 +72,38 @@ describe('cache', () => {
expect(cache.size).toBe(1)
const [[firstCachedId]] = cache.dump()
await sleep(110)
await waitUntilCacheUpdated()
expect(cache.size).toBe(2)
currentIndex.value += 1
await sleep(110)
await waitUntilCacheUpdated()
expect(cache.size).toBe(3)
currentIndex.value += 1
await sleep(110)
await waitUntilCacheUpdated()
expect(cache.size).toBe(3)
expect(cache.dump().map(([id]) => id)).not.toContain(firstCachedId)
})
it('jumping around behaves correctly', async () => {
currentIndex.value = 2
await sleep(110)
// NOTE: waitUntilCacheUpdated() returns when first cache update is found
// That's why we need to call it twice after skipping the track
await waitUntilCacheUpdated()
await waitUntilCacheUpdated()
expect([...cache.rkeys()]).toEqual([0, 2, 3])
currentIndex.value = 3
await sleep(110)
await waitUntilCacheUpdated()
expect([...cache.rkeys()]).toEqual([2, 3, 4])
// We change to the first song
currentIndex.value = 0
await sleep(0) // Wait until next macro task
await waitUntilCacheUpdated()
expect([...cache.rkeys()]).toEqual([3, 4, 0])
// Now the next song should be enqueued
await sleep(110)
await waitUntilCacheUpdated()
expect([...cache.rkeys()]).toEqual([4, 0, 1])
})
@ -103,24 +111,27 @@ describe('cache', () => {
// NOTE: We always want to have tracks 0, 1, 2 in the cache
beforeEach(async () => {
currentIndex.value += 1
await sleep(110)
// NOTE: waitUntilCacheUpdated() returns when first cache update is found
// That's why we need to call it twice after skipping the track
await waitUntilCacheUpdated()
await waitUntilCacheUpdated()
expect(cache.size).toBe(3)
})
it('enqueueing track as next adds it to the cache', async () => {
enqueueAt(currentIndex.value + 1, createTrack()) // id: 5
await sleep(210)
await waitUntilCacheUpdated()
const newIds = [...cache.rkeys()]
expect(newIds).toEqual([2, 1, 5])
})
it('edge case: enqueueing track as next multiple times does not remove dispose current track', async () => {
enqueueAt(currentIndex.value + 1, createTrack()) // id: 5
await sleep(210)
await waitUntilCacheUpdated()
enqueueAt(currentIndex.value + 1, createTrack()) // id: 6
await sleep(210)
await waitUntilCacheUpdated()
enqueueAt(currentIndex.value + 1, createTrack()) // id: 7
await sleep(210)
await waitUntilCacheUpdated()
const newIds = [...cache.rkeys()]
expect(newIds).toEqual([6, 1, 7])
})

Wyświetl plik

@ -3,25 +3,15 @@ import AlbumDetail from '~/views/admin/library/AlbumDetail.vue'
import SanitizedHtml from '~/components/SanitizedHtml.vue'
import HumanDate from '~/components/common/HumanDate.vue'
import MockAdapter from 'axios-mock-adapter'
import axios from 'axios'
import { shallowMount } from '@vue/test-utils'
import { sleep } from '?/utils'
import { vi } from 'vitest'
import router from '~/router'
import store from '~/store'
const axiosMock = new MockAdapter(axios)
describe('views/admin/library', () => {
describe('Album details', () => {
it('displays default cover', async () => {
const album = { cover: null, artist: { id: 1 }, title: 'dummy', id: 1, creation_date: '2020-01-01' }
axiosMock.onGet('manage/library/albums/1/').reply(200, album)
axiosMock.onGet('manage/library/albums/1/stats/').reply(200, {})
const wrapper = shallowMount(AlbumDetail, {
props: { id: 1 },
directives: {
@ -35,7 +25,7 @@ describe('views/admin/library', () => {
}
})
await sleep()
await vi.waitUntil(() => wrapper.find('img').exists())
expect(wrapper.find('img').attributes('src')).to.include('default-cover')
})
})

Wyświetl plik

@ -1 +0,0 @@
export const sleep = (ms = 0) => new Promise<void>(resolve => setTimeout(resolve, ms))

Wyświetl plik

@ -3200,14 +3200,6 @@ axios-auth-refresh@3.3.6:
resolved "https://registry.yarnpkg.com/axios-auth-refresh/-/axios-auth-refresh-3.3.6.tgz#a879f6296a889d6616e51069c2a8135b697966e7"
integrity sha512-2CeBUce/SxIfFxow5/n8vApJ97yYF6qoV4gh1UrswT7aEOnlOdBLxxyhOI4IaxGs6BY0l8YujU2jlc4aCmK17Q==
axios-mock-adapter@1.21.4:
version "1.21.4"
resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.21.4.tgz#ced09b54b245b338422e3af425ae529bfa26e051"
integrity sha512-ztnENm28ONAKeRXC/6SUW6pcsaXbThKq93MRDRAA47LYTzrGSDoO/DCr1NHz7jApEl95DrBoGPvZ0r9xtSbjqw==
dependencies:
fast-deep-equal "^3.1.3"
is-buffer "^2.0.5"
axios@1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.3.tgz#31a3d824c0ebf754a004b585e5f04a5f87e6c4ff"
@ -5078,11 +5070,6 @@ is-boolean-object@^1.1.0:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
is-buffer@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
is-builtin-module@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169"