File size: 2,252 Bytes
3201ca6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import axios from "axios";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { AGENT_CANVAS_CLIENT_VERSION } from "#/api/client-source";
import {
_resetCanvasAuthReported,
authenticateWithMainAppCookie,
MAIN_APP_ANALYTICS_EVENTS_PATH,
MAIN_APP_AUTHENTICATE_PATH,
reportCanvasAuthenticated,
} from "#/api/main-app-auth";
vi.mock("axios", () => ({
default: {
post: vi.fn(),
isAxiosError: vi.fn(),
},
}));
const postMock = vi.mocked(axios.post);
const isAxiosErrorMock = vi.mocked(axios.isAxiosError);
describe("main app cookie authentication", () => {
beforeEach(() => {
vi.clearAllMocks();
_resetCanvasAuthReported();
});
it("reports the Canvas version after authentication succeeds", async () => {
postMock.mockResolvedValue({});
await expect(authenticateWithMainAppCookie()).resolves.toBe(true);
await vi.waitFor(() => expect(postMock).toHaveBeenCalledTimes(2));
expect(postMock).toHaveBeenNthCalledWith(
1,
MAIN_APP_AUTHENTICATE_PATH,
null,
{ withCredentials: true },
);
expect(postMock).toHaveBeenNthCalledWith(
2,
MAIN_APP_ANALYTICS_EVENTS_PATH,
{
event_type: "canvas_authenticated",
client_version: AGENT_CANVAS_CLIENT_VERSION,
},
{ withCredentials: true },
);
});
it("does not report unauthenticated arrivals", async () => {
const error = { response: { status: 401 } };
postMock.mockRejectedValue(error);
isAxiosErrorMock.mockReturnValue(true);
await expect(authenticateWithMainAppCookie()).resolves.toBe(false);
expect(postMock).toHaveBeenCalledOnce();
expect(postMock).toHaveBeenCalledWith(
MAIN_APP_AUTHENTICATE_PATH,
null,
{ withCredentials: true },
);
});
it("isolates analytics failures from application startup", async () => {
postMock.mockRejectedValue(new Error("analytics unavailable"));
await expect(reportCanvasAuthenticated()).resolves.toBeUndefined();
});
it("fires the analytics event at most once per page load", async () => {
postMock.mockResolvedValue({});
await reportCanvasAuthenticated();
await reportCanvasAuthenticated();
expect(postMock).toHaveBeenCalledOnce();
});
});
|