diff --git a/src/__tests__/TuitioClient.test.ts b/src/__tests__/TuitioClient.test.ts index d113ba4..c1acfd0 100644 --- a/src/__tests__/TuitioClient.test.ts +++ b/src/__tests__/TuitioClient.test.ts @@ -48,8 +48,8 @@ test("Tuitio client fake authentication", async () => { const loginResult = await client.login("user", "pass"); - expect(loginResult.result.token).toBe("mock-user-pass"); - expect(loginResult.result.expiresIn).toBe(600000); + expect(loginResult.result?.token).toBe("mock-user-pass"); + expect(loginResult.result?.expiresIn).toBe(600000); expect(loginResult.error).toBeNull; spy.mockRestore(); diff --git a/src/__tests__/TuitioLogin.test.ts b/src/__tests__/TuitioLogin.test.ts index 22a1ab7..f6b3456 100644 --- a/src/__tests__/TuitioLogin.test.ts +++ b/src/__tests__/TuitioLogin.test.ts @@ -23,8 +23,8 @@ test("Tuitio client: successfully account login", async () => { const client = new TuitioClient("https://test.com/api"); const loginResult = await client.login("user", "pass"); - expect(loginResult.result.token).toBe("token-mock"); - expect(loginResult.result.expiresIn).toBe(600000); + expect(loginResult.result?.token).toBe("token-mock"); + expect(loginResult.result?.expiresIn).toBe(600000); expect(loginResult.error).toBeNull(); const storage = fetch(); diff --git a/src/__tests__/TuitioLogout.test.ts b/src/__tests__/TuitioLogout.test.ts index 389b7ce..3ba8ee8 100644 --- a/src/__tests__/TuitioLogout.test.ts +++ b/src/__tests__/TuitioLogout.test.ts @@ -6,9 +6,27 @@ import axios from "axios"; import { TuitioClient, fetch } from "../client"; +import { localStorage } from "@flare/js-utils"; +import { storageKeys } from "../constants"; + +const { setItem } = localStorage; jest.mock("axios"); +test("Tuitio client: error if account logout is called before login", async () => { + (axios.request as jest.Mock).mockResolvedValue({ + data: { + result: { userId: 0, userName: "tuitio.user", logoutDate: new Date() }, + error: null + } + }); + + const client = new TuitioClient("https://test.com/api"); + const logoutResult = await client.logout(); + expect(logoutResult.result).toBeNull(); + expect(logoutResult.error).toBe("UNAUTHENTICATED"); +}); + test("Tuitio client: successfully account logout", async () => { (axios.request as jest.Mock).mockResolvedValue({ data: { @@ -18,10 +36,13 @@ test("Tuitio client: successfully account logout", async () => { }); const client = new TuitioClient("https://test.com/api"); - const logoutResult = await client.logout("token-mock"); + const authData = { token: "mocked-token", validUntil: new Date(), userName: "tuitio.user" }; + setItem(storageKeys.AUTH_DATA, authData); - expect(logoutResult.result.userId).toBe(0); - expect(logoutResult.result.userName).toBe("tuitio.user"); + const logoutResult = await client.logout(); + + expect(logoutResult.result?.userId).toBe(0); + expect(logoutResult.result?.userName).toBe("tuitio.user"); expect(logoutResult.error).toBeNull(); const storage = fetch(); diff --git a/src/client.ts b/src/client.ts index cce50c2..7865e9d 100644 --- a/src/client.ts +++ b/src/client.ts @@ -25,8 +25,8 @@ async function request(url: string, method: string) { } } -export type TuitioLoginResult = { result: { token: string; expiresIn: number }; error: string | null }; -export type TuitioLogoutResult = { result: { userId: number; userName: string; logoutDate: Date }; error: string }; +export type TuitioLoginResult = { result: { token: string; expiresIn: number } | null; error: string | null }; +export type TuitioLogoutResult = { result: { userId: number; userName: string; logoutDate: Date } | null; error: string }; class TuitioClient { tuitioUrl: string; @@ -56,8 +56,10 @@ class TuitioClient { return response; } - async logout(token: string): Promise { - const url = this.urlTemplates.logout.replace("{token}", token); + async logout(): Promise { + const authData = getItem(storageKeys.AUTH_DATA); + if (!authData) return { result: null, error: "UNAUTHENTICATED" } as TuitioLogoutResult; + const url = this.urlTemplates.logout.replace("{token}", authData.token); const response = await request(url, "post"); if (!response.error) { removeItem(storageKeys.AUTH_DATA);