← back to AbramsOS

tests/smoke.test.js

59 lines

const test = require('node:test');
const assert = require('node:assert');
const http = require('node:http');

require('dotenv').config();
const app = require('../server');
const { pool } = require('../lib/db');

let server;

test.before(() => new Promise((resolve) => {
  server = app.listen(0, resolve);
}));

test.after(async () => {
  await new Promise((resolve) => server.close(resolve));
  await pool.end();
});

function get(p) {
  return new Promise((resolve, reject) => {
    const port = server.address().port;
    http.get(`http://127.0.0.1:${port}${p}`, (res) => {
      let body = '';
      res.on('data', (c) => (body += c));
      res.on('end', () => resolve({ status: res.statusCode, body, headers: res.headers }));
    }).on('error', reject);
  });
}

test('healthz returns 200', async () => {
  const r = await get('/healthz');
  assert.strictEqual(r.status, 200);
  const j = JSON.parse(r.body);
  assert.strictEqual(j.ok, true);
});

test('home is auth-gated', async () => {
  const r = await get('/');
  assert.strictEqual(r.status, 302);
  assert.match(r.headers.location, /\/sign(in|up)/);
});

test('connectors is auth-gated', async () => {
  const r = await get('/connectors');
  assert.strictEqual(r.status, 302);
});

test('purchases is auth-gated', async () => {
  const r = await get('/purchases');
  assert.strictEqual(r.status, 302);
});

test('signup is public when no user exists, locked otherwise', async () => {
  const r = await get('/signup');
  // Either 200 (no user) or 302→/signin (user exists). Both are correct behavior.
  assert.ok([200, 302].includes(r.status));
});