How Monokulo is tested

Monokulo handles other people’s money, so it gets tested hard. Every change runs more than 2,600 automatic tests. Every night, two kinds of robot tester invent thousands of strange situations and check that no payment goes missing. This page rebuilds itself from those runs. Open any section to see the details.

All checks passed·Tests and coverage from 6b1dcda on 16 Oct 2026·Nightly properties 17 Oct 2026·Fuzzing 16 Oct 2026·Live network 16 Oct 2026
Tests2,6072,607 passed · 0 skipped
Engine and server90.6%of 87,305 Rust lines
Checkout and POS95.0%of 1,655 browser lines
WooCommerce95.6%of 502 PHP lines
Properties nightly211plus 9 fuzz targets · 26 live daily

What’s tested

Each test checks one thing Monokulo should do, and its name says what, so the list reads like a rulebook. They’re sorted by the part of Monokulo they protect. Pick an area to see every test in it.

Payment detection

699

Scanning blocks and the mempool, confirmations, reorgs, proof of work and the order statuses customers see.

  • Repeated multi order forks faults and restarts preserve money
  • Reorg collection of mined outputs crosses full queue pages without losing outputs
  • Each transaction visits each tenant independently
RustProperty (nightly)

Webhooks

94

Signed deliveries to the shop, retries and backoff, and the WooCommerce receiver checking them.

  • Each webhook says how it is doing; the deliveries of one that needs you are open
  • A delivery's details open as a dialog, with its attempts, request and last response
  • A webhook with many deliveries pages through them in place, 20 at a time
RustBrowserWooCommerce

Checkout and POS

217

The hosted payment page with and without JavaScript, the embed, and the point-of-sale screen on phones and tablets.

  • The engine page follows the engine live, scrubs, replays and moves its window
  • A POS session reads as one timeline, from opting in to the last event
  • A POS session reads as one timeline, from opting in to the last event
Browser

Dashboard and settings

868

Admin pages, stores, nodes, every setting and where its value comes from, and options-file handling.

  • The site, the POS and the hosted payment page share one theme, light and dark
  • Every tab, for the gallery
  • The Monero nodes tab is marked while the only node of a network stores use is down
RustBrowser

Key custody

121

Encrypting view keys at rest, routing between custody backends, and SEV-SNP attestation.

  • Sparse window histories match fresh scans without rebuilding kept keys
  • Lookup ranges match fresh scans and do not poison the live window
  • Concurrent wallet scans keep independent caches and matches
RustProperty (nightly)

Storage and recovery

131

SQLite schema, single-writer guarantees, crash recovery and resuming after restarts.

  • Killing the engine at random moments never loses a confirmed order or reuses an address
  • Historic upgrades recover from process death
  • Repeated saturation retains fifo fairness and cancellation
RustBrowserProperty (nightly)

Exchange rates

93

Fiat prices from each provider, currency handling and their settings.

  • A policys answer never depends on which policy asked first
  • Concurrent callers with different policies share one fetch and keep their own answers
  • Haveno prices from its book and a one sided book hands over to the next
Rust

Abuse protection

29

Rate limits, client challenges and the under-attack switch.

  • Real challenge continues inside a cross-site checkout frame with and without JavaScript
  • Real challenge offers a ten second no-JavaScript continuation
  • Real challenge solves in JavaScript and continues to the checkout
RustBrowser

Logs and tracing

60

Structured logs, the log viewer, trace context across engine, server and plugin.

  • The search box, Syntax and Search share one height; Syntax opens the help as a dialog
  • A line's properties load when it's first opened, and only then
  • A search that does not parse says where
RustBrowserWooCommerce

WooCommerce plugin

34

Connecting a store, taking payment, and mapping webhook statuses to WooCommerce orders.

  • A genuinely forced order expired webhook is delivered and verified
  • A full woocommerce checkout is created with the key opened and paid
  • Create order against a real engine yields a working checkout redirect
RustWooCommerce

Test tools

67

The stagenet test wallet and fixtures the other suites stand on. Tested too.

  • Background loops genuinely write a real expired order event
  • A held lock names its holder and lets the caller choose
  • One command runs and exits and existing wallets are never replaced
Rust

Everything else

405

Shared types, HTTP plumbing and helpers.

  • A store changes its wallet: the dropdown asks first, then the history shows both
  • A save says so on the card and in a toast; a refused one keeps what was typed
  • A change marks its card and shows the save bar, and Discard puts it back
RustBrowserProperty (nightly)