From 9ce6dbf34154e92e37ee173d3434111952c972c9 Mon Sep 17 00:00:00 2001 From: Olga Bulat Date: Tue, 18 Jul 2023 08:10:40 +0300 Subject: [PATCH] Add unit tests --- frontend/src/stores/media/index.ts | 2 +- frontend/src/stores/provider.ts | 7 +- .../unit/specs/stores/media-store.spec.js | 107 +++++++++++++++--- 3 files changed, 94 insertions(+), 22 deletions(-) diff --git a/frontend/src/stores/media/index.ts b/frontend/src/stores/media/index.ts index e66186c4627..fb398e81312 100644 --- a/frontend/src/stores/media/index.ts +++ b/frontend/src/stores/media/index.ts @@ -515,7 +515,7 @@ export const useMediaStore = defineStore("media", { }, }) -const getNuxtErrorData = ( +export const getNuxtErrorData = ( error: unknown, mediaType: SupportedMediaType ): NuxtError => { diff --git a/frontend/src/stores/provider.ts b/frontend/src/stores/provider.ts index 31aacd8035b..4ae5b30bb99 100644 --- a/frontend/src/stores/provider.ts +++ b/frontend/src/stores/provider.ts @@ -136,10 +136,9 @@ export const useProviderStore = defineStore("provider", { } catch (error: unknown) { let errorMessage = `There was an error fetching media providers for ${mediaType}` if (error instanceof Error) { - errorMessage = - axios.isAxiosError(error) && "response" in error - ? `${errorMessage}: ${error.code}` - : `${errorMessage}: ${error?.message}` + errorMessage = axios.isAxiosError(error) + ? `${errorMessage}: ${error.code}` + : `${errorMessage}: ${error.message}` } warn(errorMessage) // Fallback on existing providers if there was an error diff --git a/frontend/test/unit/specs/stores/media-store.spec.js b/frontend/test/unit/specs/stores/media-store.spec.js index a959bf99835..e3575a7f6a2 100644 --- a/frontend/test/unit/specs/stores/media-store.spec.js +++ b/frontend/test/unit/specs/stores/media-store.spec.js @@ -1,8 +1,10 @@ +import { AxiosError } from "axios" + import { setActivePinia, createPinia } from "~~/test/unit/test-utils/pinia" import { deepClone } from "~/utils/clone" -import { initialResults, useMediaStore } from "~/stores/media" +import { initialResults, useMediaStore, getNuxtErrorData } from "~/stores/media" import { useSearchStore } from "~/stores/search" import { ALL_MEDIA, AUDIO, IMAGE, supportedMediaTypes } from "~/constants/media" @@ -312,6 +314,32 @@ describe("Media Store", () => { expect(actualResult).toEqual(expectedResult) } ) + it("fetchSingleMediaType on no results", async () => { + const mediaStore = useMediaStore() + + searchStore = useSearchStore() + searchStore.setSearchTerm("cat") + const params = { + shouldPersistMedia: true, + mediaType: IMAGE, + } + const emptyResult = { result_count: 0, page_count: 0, results: [] } + mockSearchImage.mockResolvedValueOnce(emptyResult) + await mediaStore.fetchSingleMediaType(params) + + const actualResult = mediaStore.results[IMAGE] + expect(actualResult).toEqual({ + items: {}, + count: 0, + page: 0, + pageCount: 0, + }) + + expect(mediaStore.mediaFetchState["image"].fetchingError).toEqual({ + message: "No image results found", + statusCode: 404, + }) + }) it("fetchSingleMediaType resets images if shouldPersistMedia is false", async () => { const mediaStore = useMediaStore() @@ -377,24 +405,69 @@ describe("Media Store", () => { }) }) - describe("setMediaProperties", () => { - it("merges the existing media item together with the properties passed in allowing overwriting", () => { - const mediaStore = useMediaStore() - mediaStore.results.audio = testResult(AUDIO) + it("setMediaProperties merges the existing media item together with the properties passed in allowing overwriting", () => { + const mediaStore = useMediaStore() + mediaStore.results.audio = testResult(AUDIO) - const existingMediaItem = deepClone( - mediaStore.getItemById(AUDIO, uuids[0]) - ) - const hasLoaded = Symbol() - mediaStore.setMediaProperties(AUDIO, uuids[0], { - hasLoaded, - }) - - expect(mediaStore.getItemById(AUDIO, uuids[0])).toMatchObject({ - ...existingMediaItem, - hasLoaded, - }) + const existingMediaItem = deepClone( + mediaStore.getItemById(AUDIO, uuids[0]) + ) + const hasLoaded = Symbol() + mediaStore.setMediaProperties(AUDIO, uuids[0], { + hasLoaded, + }) + + expect(mediaStore.getItemById(AUDIO, uuids[0])).toMatchObject({ + ...existingMediaItem, + hasLoaded, }) }) }) + + // Add a test for getNuxtErrorData + describe("getNuxtErrorData", () => { + it.each` + status | message + ${500} | ${"Internal server error"} + ${429} | ${"Too many requests"} + `( + "returns the correct error data for axios errors", + ({ status, message }) => { + const error = new AxiosError( + "", + "ERR_BAD_RESPONSE", + {}, + {}, + { + status, + data: { detail: message }, + } + ) + const expectedErrorData = { + statusCode: status, + message: `Error fetching image results. Request failed with status code: ${status}`, + } + const actualErrorData = getNuxtErrorData(error, IMAGE) + expect(actualErrorData).toEqual(expectedErrorData) + } + ) + + it("returns the correct error data for Axios error without a response", () => { + const error = new AxiosError("", "ERR_BAD_REQUEST", {}, {}) + const expectedErrorData = { + message: + "Error fetching image results. No response received from the server", + } + const actualErrorData = getNuxtErrorData(error, IMAGE) + expect(actualErrorData).toEqual(expectedErrorData) + }) + it("returns the correct error data for non-Axios errors", () => { + const error = new Error("Some error") + const expectedErrorData = { + message: "Error fetching image results. Unknown error", + } + const actualErrorData = getNuxtErrorData(error, IMAGE) + expect(actualErrorData).toEqual(expectedErrorData) + }) + }) })