diff --git a/.gitea/workflows/deploy-twilio.yaml b/.gitea/workflows/deploy-twilio.yaml index 5a25c6a..1f91267 100644 --- a/.gitea/workflows/deploy-twilio.yaml +++ b/.gitea/workflows/deploy-twilio.yaml @@ -17,6 +17,9 @@ jobs: - name: install dependencies run: bun install + + - name: run api integ test + run: bun integ-test-api - name: Deploy Doorman UI and API run: bun run deploy-serverless diff --git a/bun.lockb b/bun.lockb index 6b99f57..c0387b9 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 7a59e67..5f0e6ca 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "bun-types": "latest" }, "scripts": { + "integ-test-api": "bun --filter 'doorman-api' integ-test", "prepare-ui": "bun --filter 'doorman-ui' build && rm -rf packages/doorman-api/assets/* && mkdir -p packages/doorman-api/assets/assets && cp -fr packages/doorman-ui/dist/* packages/doorman-api/assets/ && cp -f packages/doorman-api/assets/index.html packages/doorman-api/assets/assets/index.html", "deploy-serverless": "bun run prepare-ui && bun run build-twilio-api && bun --filter 'doorman-api' deploy", "build-twilio-client": "bun --filter 'doorman-client' build", diff --git a/packages/doorman-api/.env.example b/packages/doorman-api/.env.example index a2f056a..0037b5c 100644 --- a/packages/doorman-api/.env.example +++ b/packages/doorman-api/.env.example @@ -8,6 +8,8 @@ AWS_SECRET_ACCESS_KEY= # discord notifs DISCORD_BOT_TOKEN= +DISCORD_CLIENT_ID= +DISCORD_CLIENT_SECRET= # metrics PUSHGATEWAY_URL=https://metrics.chromart.cc @@ -22,4 +24,5 @@ LOKI_PW=doormanlogs NOTIFY_SECRET_KEY=discordnotifyme -DOORMAN_URL=https://doorman.chromart.cc \ No newline at end of file +DOORMAN_URL=https://doorman.chromart.cc +DISCORD_GUILD_ID=1299812960553795655 diff --git a/packages/doorman-api/package.json b/packages/doorman-api/package.json index 0857d07..eacaea9 100644 --- a/packages/doorman-api/package.json +++ b/packages/doorman-api/package.json @@ -3,8 +3,8 @@ "version": "0.0.0", "private": true, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start-twilio": "twilio-run --live --port 8080", + "integ-test": "export $(grep -v '^#' .env.example | grep -v '=$' | xargs) && concurrently --success first --kill-others \"bun run start\" \"bun test\"", + "start-twilio": "twilio-run --load-local-env --live --port 8080", "watch-build": "bun run --watch src/index.ts", "start": "concurrently \"bun run watch-build\" \"bun run start-twilio\"", "build": "bun run src/index.ts", @@ -14,6 +14,7 @@ "@aws-sdk/client-dynamodb": "^3.821.0", "@twilio-labs/serverless-runtime-types": "^4.0.1", "@twilio/runtime-handler": "1.3.0", + "discord-oauth2": "^2.12.1", "discord.js": "^14.19.3", "dynabridge": "^0.3.8", "prom-client": "^15.1.3", diff --git a/packages/doorman-api/tst/info.test.ts b/packages/doorman-api/tst/info.test.ts new file mode 100644 index 0000000..ab2c698 --- /dev/null +++ b/packages/doorman-api/tst/info.test.ts @@ -0,0 +1,40 @@ +import { describe, test, expect, beforeAll } from "bun:test"; + +const baseUrl = "http://localhost:8080"; +const doorName = "test"; +const buzzerNumber = "6133163433"; + +const waitForService = async (url: string, timeout = 30000) => { + const start = Date.now(); + + while (Date.now() - start < timeout) { + try { + await fetch(url); + return true; + } catch (err) { + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } + throw new Error(`Service at ${url} did not start within ${timeout}ms`); +}; + +beforeAll(async () => { + await waitForService(baseUrl); +}); + +describe("info route 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); + }); +});