syntaxai/tdd.md · main · src / a31_edit_validation.test.ts

a31_edit_validation.test.ts 40 lines · 1396 bytes raw
import { test, expect } from "bun:test";
import {
  validateEditBody,
  isNoOpEdit,
  EditValidationError,
  MAX_EDIT_BODY_BYTES,
} from "./a31_edit_validation.ts";

test("validateEditBody returns the body when valid", () => {
  expect(validateEditBody("# title\n\nsome body")).toBe("# title\n\nsome body");
});

test("validateEditBody rejects non-string input", () => {
  expect(() => validateEditBody(42)).toThrow(EditValidationError);
  expect(() => validateEditBody(null)).toThrow(EditValidationError);
  expect(() => validateEditBody(undefined)).toThrow(EditValidationError);
});

test("validateEditBody rejects empty / whitespace-only", () => {
  expect(() => validateEditBody("")).toThrow(EditValidationError);
  expect(() => validateEditBody("   \n\t  ")).toThrow(EditValidationError);
});

test("validateEditBody rejects bodies over the byte cap", () => {
  const tooBig = "x".repeat(MAX_EDIT_BODY_BYTES + 1);
  expect(() => validateEditBody(tooBig)).toThrow(/exceeds/);
});

test("validateEditBody accepts a body right at the cap", () => {
  const exact = "x".repeat(MAX_EDIT_BODY_BYTES);
  expect(validateEditBody(exact)).toBe(exact);
});

test("isNoOpEdit is byte-equal, not whitespace-tolerant", () => {
  expect(isNoOpEdit("a", "a")).toBe(true);
  expect(isNoOpEdit("a", "a ")).toBe(false);
  expect(isNoOpEdit("a\n", "a")).toBe(false);
  expect(isNoOpEdit("", "")).toBe(true);
});