---
title: Testing
canonical: 'https://www.dealmobile.co.uk/writing/tag/testing'
url: 'https://www.dealmobile.co.uk/writing/tag/testing'
type: Tags
---

# Testing

## [A 30-minute test suite in five minutes](https://www.dealmobile.co.uk/writing/a-30-minute-test-suite-in-five.md)

Published 2026-10-25

Cutting every test off from the real world let Mullet’s tests (about 17,700 when I wrote this) run in parallel, and flushed out a real Kimi call and a fixture deleting a real file.

## [Gates, not a model’s word](https://www.dealmobile.co.uk/writing/gates-not-a-models-word.md)

Published 2026-10-25

How Mullet 2 decides a coding step is done: eight gates that read the diff and the test results, and a reviewer that can block a step but never pass one.

## [Mullet 2, coding jobs you can leave running](https://www.dealmobile.co.uk/writing/mullet-2-coding-jobs-you-can-leave-running.md)

Published 2026-10-25

Mullet 2 plans a coding job, runs it unattended in a sandboxed clone, and passes each step only on evidence. Why I rebuilt it, and how to try it.

## [Testing an API client without the network](https://www.dealmobile.co.uk/writing/testing-an-api-client-without-the-network.md)

Published 2026-10-21

How the Puzzler PHP SDK signs its requests and turns HTTP errors into exceptions, and how one protected method lets the tests check both with no credentials and no connection.

## [Taxing a household one earner at a time](https://www.dealmobile.co.uk/writing/taxing-a-household-one-earner-at-a-time.md)

Published 2026-10-21

How Where Should I Live taxes each earner alone, lays a country’s joint and family rules on top, and proves that one person’s figures haven’t moved at all.

## [One JSON shape for RSS, Atom and RDF feeds](https://www.dealmobile.co.uk/writing/one-json-shape-for-rss-atom-and-rdf.md)

Published 2026-10-21

How RSS to JSON turns three feed formats into one predictable array, and the namespace cases that took two attempts to get right.

## [Finding the dull parts of a screen recording](https://www.dealmobile.co.uk/writing/finding-the-dull-parts-of-a-screen-recording.md)

Published 2026-10-21

How Reelify scores each frame of a screen recording by how much it changed, turns the scores into cuts with a margin around them, works out a speed to fit a target length and cuts out each segment, checked against a test clip with known content.

## [Writing down an upload protocol and testing servers against it](https://www.dealmobile.co.uk/writing/testing-servers-against-an-upload-protocol.md)

Published 2026-10-20

How TurboPush’s chunked upload protocol is written down in PROTOCOL.md, how a small Node suite checks any server against it over HTTP, and the two bugs it found in my own PHP endpoint.

## [Fetching a feed from a URL you don’t trust](https://www.dealmobile.co.uk/writing/fetching-feeds-from-untrusted-urls.md)

Published 2026-10-20

How RSS to JSON stops a feed URL from reaching private addresses on the server’s own network, by checking every address a host resolves to, pinning the connection to the one it checked, and checking every redirect again.

## [A live calendar feed and badge from a Cloudflare Worker](https://www.dealmobile.co.uk/writing/calendar-feed-and-badge-from-a-worker.md)

Published 2026-10-20

How the Solar Calendar serves a feed people can subscribe to in their calendar app, and a badge with today’s date, from a small Cloudflare Worker that runs the same date code as the app.

## [One source of truth behind a static app](https://www.dealmobile.co.uk/writing/one-source-of-truth-behind-a-static-app.md)

Published 2026-10-19

How the second version of Where Should I Live keeps its data in a headless CMS, ships it as static JSON, and refuses to build if the data has drifted.

---

Index of this site: [llms.txt](https://www.dealmobile.co.uk/llms.txt)
