From c59d2407ed72bfce0d9208c3a6734dd818d34da3 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 2 Jun 2026 22:48:03 +1000 Subject: [PATCH] feat(speedtest): results table + repo --- lib/db/migrations/013_speedtest.sql | 9 +++++++++ lib/db/repos/speedtest.js | 12 ++++++++++++ tests/repos/speedtest.test.js | 15 +++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 lib/db/migrations/013_speedtest.sql create mode 100644 lib/db/repos/speedtest.js create mode 100644 tests/repos/speedtest.test.js diff --git a/lib/db/migrations/013_speedtest.sql b/lib/db/migrations/013_speedtest.sql new file mode 100644 index 0000000..cdee6c6 --- /dev/null +++ b/lib/db/migrations/013_speedtest.sql @@ -0,0 +1,9 @@ +-- 013_speedtest.sql +CREATE TABLE speedtest_results ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + down_mbps numeric NOT NULL, + up_mbps numeric NOT NULL, + ping_ms numeric, + ran_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX idx_speedtest_ran_at ON speedtest_results (ran_at DESC); diff --git a/lib/db/repos/speedtest.js b/lib/db/repos/speedtest.js new file mode 100644 index 0000000..1170028 --- /dev/null +++ b/lib/db/repos/speedtest.js @@ -0,0 +1,12 @@ +import { pool } from '../pool.js'; +export async function record({ down_mbps, up_mbps, ping_ms = null }) { + const { rows } = await pool.query( + `INSERT INTO speedtest_results (down_mbps, up_mbps, ping_ms) VALUES ($1,$2,$3) RETURNING *`, + [down_mbps, up_mbps, ping_ms]); + return rows[0]; +} +export async function history(limit = 30) { + const { rows } = await pool.query( + `SELECT * FROM speedtest_results ORDER BY ran_at DESC LIMIT $1`, [limit]); + return rows; +} diff --git a/tests/repos/speedtest.test.js b/tests/repos/speedtest.test.js new file mode 100644 index 0000000..f06e95a --- /dev/null +++ b/tests/repos/speedtest.test.js @@ -0,0 +1,15 @@ +import { describe, it, expect, beforeAll } from 'vitest'; +import { resetDb } from '../helpers/db.js'; +import { migrateUp } from '../../lib/db/migrate.js'; +import * as repo from '../../lib/db/repos/speedtest.js'; + +beforeAll(async () => { await resetDb(); await migrateUp(); }); +describe('speedtest repo', () => { + it('records and lists newest-first', async () => { + await repo.record({ down_mbps: 100, up_mbps: 20, ping_ms: 8 }); + await repo.record({ down_mbps: 110, up_mbps: 22, ping_ms: 7 }); + const hist = await repo.history(30); + expect(hist.length).toBe(2); + expect(Number(hist[0].down_mbps)).toBe(110); // newest first + }); +});