fix(tests): don't wait arbitrary time
Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/2757>
This commit is contained in:
parent
2b1228e620
commit
6aa609970f
|
@ -79,7 +79,6 @@
|
||||||
"@vue/eslint-config-typescript": "12.0.0",
|
"@vue/eslint-config-typescript": "12.0.0",
|
||||||
"@vue/test-utils": "2.2.7",
|
"@vue/test-utils": "2.2.7",
|
||||||
"@vue/tsconfig": "0.1.3",
|
"@vue/tsconfig": "0.1.3",
|
||||||
"axios-mock-adapter": "1.21.4",
|
|
||||||
"cypress": "13.6.4",
|
"cypress": "13.6.4",
|
||||||
"eslint": "8.30.0",
|
"eslint": "8.30.0",
|
||||||
"eslint-config-standard": "17.0.0",
|
"eslint-config-standard": "17.0.0",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { LRUCache } from 'lru-cache'
|
import { LRUCache } from 'lru-cache'
|
||||||
import { currentIndex, useQueue } from '~/composables/audio/queue'
|
import { currentIndex, useQueue } from '~/composables/audio/queue'
|
||||||
import { useTracks } from '~/composables/audio/tracks'
|
import { useTracks } from '~/composables/audio/tracks'
|
||||||
import { sleep } from '?/utils'
|
import { isEqual } from 'lodash-es'
|
||||||
import type { Sound } from '~/api/player'
|
import type { Sound } from '~/api/player'
|
||||||
import type { Track } from '~/types'
|
import type { Track } from '~/types'
|
||||||
|
|
||||||
|
@ -20,6 +20,11 @@ const createTrack = <CreateTrackFn>(() => {
|
||||||
return { id: createTrack.id++, uploads: [] } as any as Track
|
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(() => {
|
beforeAll(() => {
|
||||||
const { initialize } = useTracks()
|
const { initialize } = useTracks()
|
||||||
initialize()
|
initialize()
|
||||||
|
@ -48,18 +53,18 @@ describe('cache', () => {
|
||||||
it('caches next track after 100ms', async () => {
|
it('caches next track after 100ms', async () => {
|
||||||
expect(cache.size).toBe(1)
|
expect(cache.size).toBe(1)
|
||||||
|
|
||||||
await sleep(110)
|
await waitUntilCacheUpdated()
|
||||||
expect(cache.size).toBe(2)
|
expect(cache.size).toBe(2)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('preserves previous track in cache, when next track is playing', async () => {
|
it('preserves previous track in cache, when next track is playing', async () => {
|
||||||
expect(cache.size).toBe(1)
|
expect(cache.size).toBe(1)
|
||||||
|
|
||||||
await sleep(110)
|
await waitUntilCacheUpdated()
|
||||||
expect(cache.size).toBe(2)
|
expect(cache.size).toBe(2)
|
||||||
currentIndex.value += 1
|
currentIndex.value += 1
|
||||||
|
|
||||||
await sleep(110)
|
await waitUntilCacheUpdated()
|
||||||
expect(cache.size).toBe(3)
|
expect(cache.size).toBe(3)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -67,35 +72,38 @@ describe('cache', () => {
|
||||||
expect(cache.size).toBe(1)
|
expect(cache.size).toBe(1)
|
||||||
const [[firstCachedId]] = cache.dump()
|
const [[firstCachedId]] = cache.dump()
|
||||||
|
|
||||||
await sleep(110)
|
await waitUntilCacheUpdated()
|
||||||
expect(cache.size).toBe(2)
|
expect(cache.size).toBe(2)
|
||||||
currentIndex.value += 1
|
currentIndex.value += 1
|
||||||
|
|
||||||
await sleep(110)
|
await waitUntilCacheUpdated()
|
||||||
expect(cache.size).toBe(3)
|
expect(cache.size).toBe(3)
|
||||||
currentIndex.value += 1
|
currentIndex.value += 1
|
||||||
|
|
||||||
await sleep(110)
|
await waitUntilCacheUpdated()
|
||||||
expect(cache.size).toBe(3)
|
expect(cache.size).toBe(3)
|
||||||
expect(cache.dump().map(([id]) => id)).not.toContain(firstCachedId)
|
expect(cache.dump().map(([id]) => id)).not.toContain(firstCachedId)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('jumping around behaves correctly', async () => {
|
it('jumping around behaves correctly', async () => {
|
||||||
currentIndex.value = 2
|
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])
|
expect([...cache.rkeys()]).toEqual([0, 2, 3])
|
||||||
|
|
||||||
currentIndex.value = 3
|
currentIndex.value = 3
|
||||||
await sleep(110)
|
await waitUntilCacheUpdated()
|
||||||
expect([...cache.rkeys()]).toEqual([2, 3, 4])
|
expect([...cache.rkeys()]).toEqual([2, 3, 4])
|
||||||
|
|
||||||
// We change to the first song
|
// We change to the first song
|
||||||
currentIndex.value = 0
|
currentIndex.value = 0
|
||||||
await sleep(0) // Wait until next macro task
|
await waitUntilCacheUpdated()
|
||||||
expect([...cache.rkeys()]).toEqual([3, 4, 0])
|
expect([...cache.rkeys()]).toEqual([3, 4, 0])
|
||||||
|
|
||||||
// Now the next song should be enqueued
|
// Now the next song should be enqueued
|
||||||
await sleep(110)
|
await waitUntilCacheUpdated()
|
||||||
expect([...cache.rkeys()]).toEqual([4, 0, 1])
|
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
|
// NOTE: We always want to have tracks 0, 1, 2 in the cache
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
currentIndex.value += 1
|
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)
|
expect(cache.size).toBe(3)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('enqueueing track as next adds it to the cache', async () => {
|
it('enqueueing track as next adds it to the cache', async () => {
|
||||||
enqueueAt(currentIndex.value + 1, createTrack()) // id: 5
|
enqueueAt(currentIndex.value + 1, createTrack()) // id: 5
|
||||||
await sleep(210)
|
await waitUntilCacheUpdated()
|
||||||
const newIds = [...cache.rkeys()]
|
const newIds = [...cache.rkeys()]
|
||||||
expect(newIds).toEqual([2, 1, 5])
|
expect(newIds).toEqual([2, 1, 5])
|
||||||
})
|
})
|
||||||
|
|
||||||
it('edge case: enqueueing track as next multiple times does not remove dispose current track', async () => {
|
it('edge case: enqueueing track as next multiple times does not remove dispose current track', async () => {
|
||||||
enqueueAt(currentIndex.value + 1, createTrack()) // id: 5
|
enqueueAt(currentIndex.value + 1, createTrack()) // id: 5
|
||||||
await sleep(210)
|
await waitUntilCacheUpdated()
|
||||||
enqueueAt(currentIndex.value + 1, createTrack()) // id: 6
|
enqueueAt(currentIndex.value + 1, createTrack()) // id: 6
|
||||||
await sleep(210)
|
await waitUntilCacheUpdated()
|
||||||
enqueueAt(currentIndex.value + 1, createTrack()) // id: 7
|
enqueueAt(currentIndex.value + 1, createTrack()) // id: 7
|
||||||
await sleep(210)
|
await waitUntilCacheUpdated()
|
||||||
const newIds = [...cache.rkeys()]
|
const newIds = [...cache.rkeys()]
|
||||||
expect(newIds).toEqual([6, 1, 7])
|
expect(newIds).toEqual([6, 1, 7])
|
||||||
})
|
})
|
||||||
|
|
|
@ -3,25 +3,15 @@ import AlbumDetail from '~/views/admin/library/AlbumDetail.vue'
|
||||||
import SanitizedHtml from '~/components/SanitizedHtml.vue'
|
import SanitizedHtml from '~/components/SanitizedHtml.vue'
|
||||||
import HumanDate from '~/components/common/HumanDate.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 { shallowMount } from '@vue/test-utils'
|
||||||
import { sleep } from '?/utils'
|
import { vi } from 'vitest'
|
||||||
|
|
||||||
import router from '~/router'
|
import router from '~/router'
|
||||||
import store from '~/store'
|
import store from '~/store'
|
||||||
|
|
||||||
const axiosMock = new MockAdapter(axios)
|
|
||||||
|
|
||||||
describe('views/admin/library', () => {
|
describe('views/admin/library', () => {
|
||||||
describe('Album details', () => {
|
describe('Album details', () => {
|
||||||
it('displays default cover', async () => {
|
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, {
|
const wrapper = shallowMount(AlbumDetail, {
|
||||||
props: { id: 1 },
|
props: { id: 1 },
|
||||||
directives: {
|
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')
|
expect(wrapper.find('img').attributes('src')).to.include('default-cover')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
export const sleep = (ms = 0) => new Promise<void>(resolve => setTimeout(resolve, ms))
|
|
|
@ -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"
|
resolved "https://registry.yarnpkg.com/axios-auth-refresh/-/axios-auth-refresh-3.3.6.tgz#a879f6296a889d6616e51069c2a8135b697966e7"
|
||||||
integrity sha512-2CeBUce/SxIfFxow5/n8vApJ97yYF6qoV4gh1UrswT7aEOnlOdBLxxyhOI4IaxGs6BY0l8YujU2jlc4aCmK17Q==
|
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:
|
axios@1.2.3:
|
||||||
version "1.2.3"
|
version "1.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.3.tgz#31a3d824c0ebf754a004b585e5f04a5f87e6c4ff"
|
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"
|
call-bind "^1.0.2"
|
||||||
has-tostringtag "^1.0.0"
|
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:
|
is-builtin-module@^3.2.1:
|
||||||
version "3.2.1"
|
version "3.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169"
|
resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169"
|
||||||
|
|
Loading…
Reference in New Issue