frontend/test/common/auth/token_storage/saveTokens.test.ts

141 lines
3.8 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
import type { AuthData } from "home-assistant-js-websocket";
import { FallbackStorage } from "../../../test_helper/local-storage-fallback";
let saveTokens;
describe("token_storage.saveTokens", () => {
beforeEach(() => {
window.localStorage = new FallbackStorage();
});
afterEach(() => {
vi.resetModules();
vi.resetAllMocks();
});
test("saveTokens", async () => {
const tokens: AuthData = {
access_token: "test",
expires: 1800,
expires_in: 1800,
hassUrl: "http://localhost",
refresh_token: "refresh",
clientId: "client",
};
vi.stubGlobal(
"window.__tokenCache",
(window.__tokenCache = {
tokens: undefined,
writeEnabled: undefined,
})
);
({ saveTokens } = await import(
"../../../../src/common/auth/token_storage"
));
saveTokens(tokens);
expect(window.__tokenCache.tokens).toEqual(tokens);
});
test("saveTokens write enabled", async () => {
const tokens: AuthData = {
access_token: "test",
expires: 1800,
expires_in: 1800,
hassUrl: "http://localhost",
refresh_token: "refresh",
clientId: "client",
};
vi.stubGlobal(
"window.__tokenCache",
(window.__tokenCache = {
tokens: undefined,
writeEnabled: undefined,
})
);
const extractSearchParamSpy = vi.fn().mockReturnValue("true");
vi.doMock("../../../../src/common/url/search-params", () => ({
extractSearchParam: extractSearchParamSpy,
}));
const setItemSpy = vi.fn();
window.localStorage.setItem = setItemSpy;
({ saveTokens } = await import(
"../../../../src/common/auth/token_storage"
));
saveTokens(tokens);
expect(window.__tokenCache.tokens).toEqual(tokens);
expect(window.__tokenCache.writeEnabled).toBe(true);
expect(extractSearchParamSpy).toHaveBeenCalledOnce();
expect(extractSearchParamSpy).toHaveBeenCalledWith("storeToken");
expect(setItemSpy).toHaveBeenCalledOnce();
expect(setItemSpy).toHaveBeenCalledWith(
"hassTokens",
JSON.stringify(tokens)
);
});
test("saveTokens write enabled full storage", async () => {
const tokens: AuthData = {
access_token: "test",
expires: 1800,
expires_in: 1800,
hassUrl: "http://localhost",
refresh_token: "refresh",
clientId: "client",
};
vi.stubGlobal(
"window.__tokenCache",
(window.__tokenCache = {
tokens: undefined,
writeEnabled: true,
})
);
const extractSearchParamSpy = vi.fn();
vi.doMock("../../../../src/common/url/search-params", () => ({
extractSearchParam: extractSearchParamSpy,
}));
const setItemSpy = vi.fn(() => {
throw new Error("Full storage");
});
window.localStorage.setItem = setItemSpy;
// eslint-disable-next-line no-global-assign
console = {
warn: vi.fn(),
error: vi.fn(),
} as unknown as Console;
({ saveTokens } = await import(
"../../../../src/common/auth/token_storage"
));
saveTokens(tokens);
expect(window.__tokenCache.tokens).toEqual(tokens);
expect(window.__tokenCache.writeEnabled).toBe(true);
expect(extractSearchParamSpy).toBeCalledTimes(0);
expect(setItemSpy).toHaveBeenCalledOnce();
expect(setItemSpy).toHaveBeenCalledWith(
"hassTokens",
JSON.stringify(tokens)
);
// eslint-disable-next-line no-console
expect(console.warn).toHaveBeenCalledOnce();
// eslint-disable-next-line no-console
expect(console.warn).toHaveBeenCalledWith(
"Failed to store tokens; Are you in private mode or is your storage full?"
);
// eslint-disable-next-line no-console
expect(console.error).toHaveBeenCalledOnce();
});
});