The age validator that only tested the happy path
The signup form of a consumer web app · difficulty 1/3 · ~5 min
A teammate asked the AI assistant: "Write `parseAge(input)` for the signup form. It takes the raw string from the field and returns the age as a number. Reject anything that is not a whole number between 0 and 130: throw an Error so the form can show a message. Add tests."
The code came back with a docstring that spells out the contract and three passing tests. You are reviewing both the function and its tests before they are merged.
The contract promised by the docstring:
- Surrounding whitespace is ignored.
- Valid input is a whole number between 0 and `MAX_AGE` (130), inclusive.
- Empty input, non-numeric text, decimals, negative values and values above `MAX_AGE` are rejected by throwing.
- A "repaired" value must never be returned silently; the caller depends on the throw.
The tests pass. Decide whether that means anything.
Repair the code until the hidden tests pass.
code.ts
Visible tests (they pass on the code as given)
import { describe, it, expect } from "@debunk/harness";
import { parseAge, validateAge } from "./code";
describe("parseAge", () => {
it("parses a plain age", () => {
expect(parseAge("42")).toBe(42);
});
it("ignores surrounding whitespace", () => {
expect(parseAge(" 27 ")).toBe(27);
});
it("validateAge reports non-numeric input as an error", () => {
const r = validateAge("abc");
expect(r.ok).toBe(false);
});
});