Martin Dimitrov 16f1e96f83
All checks were successful
Build and push image for doorman-homeassistant / docker (push) Successful in 31s
Build and push Doorman UI / API / docker (push) Successful in 1m37s
Build and push image for doorman-homeassistant / deploy-gitainer (push) Successful in 5s
add auth integration tests
2025-06-03 17:13:28 -07:00

74 lines
3.1 KiB
TypeScript

import { describe, test, expect, beforeAll } from "bun:test";
import { waitForService, baseUrl, doorName, buzzerNumber, key } from "./testCommon";
import { DoorStatus } from "../src/types/DoorStatus";
import { StatusResponse } from "../src/functions/api/door/status";
import { sleep } from "bun";
beforeAll(async () => {
await waitForService(baseUrl);
});
describe("info path works", () => {
test("info works from UI", async () => {
const resp = await fetch(baseUrl + `/api/door/info?door=${doorName}`).then(res => res.json()) as any;
expect(resp.id as string).toBe(doorName);
expect(resp.buzzer).toBe(buzzerNumber);
});
test("info works from client", async () => {
const resp = await fetch(baseUrl + `/api/door/info?buzzer=${buzzerNumber}`).then(res => res.json()) as any;
// TODO: why is this different?
expect(resp.door as string).toBe(doorName);
expect(resp.buzzer).toBe(buzzerNumber);
});
});
describe("unlock path works", () => {
test("auth updates info and status relocks auth", async () => {
// run status first, to make sure we are closed
const statusReset = await fetch(baseUrl + `/api/door/status?door=${doorName}`).then(res => res.json()) as StatusResponse;
const resp = await fetch(baseUrl + `/api/door/info?door=${doorName}`).then(res => res.json()) as any;
expect(resp.id).toBe(doorName);
expect(resp.status).toBe(DoorStatus.CLOSED);
// unlock door with wrong code should be 401
const badAuthResp = await fetch(baseUrl + `/api/door/auth?door=${doorName}&key=thisisthewrongkey`);
expect(badAuthResp.status).toBe(401);
// unlock door with correct code should be 200
const authResp = await fetch(baseUrl + `/api/door/auth?door=${doorName}&key=${key}`);
expect(authResp.status).toBe(200);
// door should be unlocked on info route
const infoOpen = await fetch(baseUrl + `/api/door/info?door=${doorName}`).then(res => res.json()) as any;
expect(infoOpen.status).toBe(DoorStatus.OPEN);
// calling status should unlock and close the door
const statusOpen = await fetch(baseUrl + `/api/door/status?door=${doorName}`).then(res => res.json()) as StatusResponse;
expect(statusOpen.status).toBe(DoorStatus.OPEN);
const infoClosed = await fetch(baseUrl + `/api/door/info?door=${doorName}`).then(res => res.json()) as any;
expect(infoClosed.status).toBe(DoorStatus.CLOSED);
});
test("auth works for timeout", async () => {
// run status first, to make sure we are closed
const statusReset = await fetch(baseUrl + `/api/door/status?door=${doorName}`).then(res => res.json()) as StatusResponse;
// run auth with timeout specified
const authResp = await fetch(baseUrl + `/api/door/auth?door=${doorName}&key=${key}&timeout=1`);
// sleep 1s
await sleep(1_000);
// we should be closed, because we passed the timeout
const infoClosed = await fetch(baseUrl + `/api/door/info?door=${doorName}`).then(res => res.json()) as any;
expect(infoClosed.status).toBe(DoorStatus.CLOSED);
});
});
// TODO: add tests for edit / onboard. Not sure how I can automated receive info needed for discord DMs