NobGit
public anord read

Ledger

Why work hard when you can work easier?

Languages

Repository composition by tracked source files.

TypeScript
TypeScript 86% CSS 10% SQL 3% Shell 1% HTML 0%
Create file Wiki Documentation
Clone
https://nobgit.com/orgs/anord/ledger.git
ssh://[email protected]:2222/orgs/anord/ledger.git
http.test.ts
import request from "supertest";
import { beforeEach, describe, expect, it, vi } from "vitest";

const queryMock = vi.fn();
const enqueueWebhookEvent = vi.fn();
const verifyPassword = vi.fn();
const getUserForSession = vi.fn();
const createSessionToken = vi.fn(() => "token");

vi.mock("../db/pool.js", () => ({
  pool: {
    query: queryMock
  }
}));

vi.mock("../services/webhooks.js", () => ({
  enqueueWebhookEvent
}));

vi.mock("../services/auth.js", () => ({
  verifyPassword,
  getUserForSession,
  createSessionToken,
  verifySessionToken: vi.fn(),
  hashPassword: vi.fn()
}));

describe("http flows", () => {
  beforeEach(() => {
    queryMock.mockReset();
    enqueueWebhookEvent.mockReset();
    verifyPassword.mockReset();
    getUserForSession.mockReset();
    createSessionToken.mockClear();
  });

  it("logs in with valid credentials", async () => {
    queryMock
      .mockResolvedValueOnce({
        rowCount: 1,
        rows: [{ id: "user-1", password_hash: "hash" }]
      })
      .mockResolvedValueOnce({ rowCount: 1, rows: [] });
    verifyPassword.mockResolvedValueOnce(true);
    getUserForSession.mockResolvedValueOnce({
      id: "user-1",
      email: "[email protected]",
      displayName: "Owner",
      role: "owner",
      groupIds: []
    });

    const { createApp } = await import("../app.js");
    const response = await request(createApp()).post("/api/auth/login").send({
      email: "[email protected]",
      password: "Password123!"
    });

    expect(response.status).toBe(200);
    expect(response.body.user.email).toBe("[email protected]");
    expect(response.headers["set-cookie"]).toBeTruthy();
  });

  it("blocks register before initial setup is completed", async () => {
    queryMock.mockResolvedValueOnce({
      rowCount: 1,
      rows: [{ count: 0 }]
    });

    const { createApp } = await import("../app.js");
    const response = await request(createApp()).post("/api/auth/register").send({
      email: "[email protected]",
      password: "Password123!",
      displayName: "First User"
    });

    expect(response.status).toBe(403);
    expect(response.body.error).toContain("initial Ledger setup");
  });

  it("creates feedback records", async () => {
    queryMock
      .mockResolvedValueOnce({ rowCount: 1, rows: [{ id: "feedback-1" }] })
      .mockResolvedValueOnce({ rowCount: 1, rows: [] });

    const { createApp } = await import("../app.js");
    const response = await request(createApp()).post("/api/feedback").send({
      pageId: "27ef6842-a7e5-41ab-a18a-f2d0ca9d1d85",
      revisionId: "8f8381fd-e2d3-4093-a2c6-59c59f119abc",
      helpful: true,
      comment: "Solved it"
    });

    expect(response.status).toBe(201);
    expect(response.body.feedbackId).toBe("feedback-1");
    expect(enqueueWebhookEvent).toHaveBeenCalledWith(
      "feedback.created",
      expect.objectContaining({ feedbackId: "feedback-1" })
    );
  });
});