From 9950766b329838021d6fe59488f66480c86abb78 Mon Sep 17 00:00:00 2001 From: Martin Dimitrov Date: Tue, 3 Jun 2025 15:43:43 -0700 Subject: [PATCH] add integ test step in github actions --- .gitea/workflows/deploy-twilio.yaml | 3 ++ bun.lockb | Bin 429456 -> 429832 bytes package.json | 1 + packages/doorman-api/.env.example | 5 +++- packages/doorman-api/package.json | 5 ++-- packages/doorman-api/tst/info.test.ts | 40 ++++++++++++++++++++++++++ 6 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 packages/doorman-api/tst/info.test.ts 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 6b99f57a067089bdb649689a2e98a33a3c69731d..c0387b923db5f651c88a90182d1abf9ccface3ce 100755 GIT binary patch delta 6403 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 bzu0V3Rum9rE*A%c2b~nNicO=}11|j&O~s{+ 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); + }); +});