plushie/testing

Test facade for plushie applications.

Provides a unified test API that works across all backends: mock (pure Gleam), pooled_mock (shared renderer), headless (software rendering), and windowed (GPU + display).

Backend selection

Set PLUSHIE_TEST_BACKEND to choose the backend:

PLUSHIE_TEST_BACKEND=pooled_mock gleam test
PLUSHIE_TEST_BACKEND=headless gleam test

Default: mock (pure Gleam, no renderer binary needed).

Usage

let session = testing.start(my_app())
let session = testing.click(session, "increment")
let assert option.Some(el) = testing.find(session, "count")
should.equal(element.text(el), option.Some("Count: 1"))
testing.stop(session)

Values

pub fn click(
  session: session.TestSession(model, event.Event),
  id: String,
) -> session.TestSession(model, event.Event)

Simulate a click on a widget by ID.

pub fn element_children(
  el: element.Element,
) -> List(element.Element)

Get an element’s children.

pub fn element_prop(
  el: element.Element,
  key: String,
) -> option.Option(node.PropValue)

Get a prop value from an element.

pub fn element_text(el: element.Element) -> option.Option(String)

Extract text content from an element.

pub fn find(
  session: session.TestSession(model, event.Event),
  id: String,
) -> option.Option(element.Element)

Find an element by ID in the session’s current tree.

pub fn model(
  session: session.TestSession(model, event.Event),
) -> model

Return the current model from the session.

pub fn select(
  session: session.TestSession(model, event.Event),
  id: String,
  value: String,
) -> session.TestSession(model, event.Event)

Simulate selection on a widget by ID.

pub fn send_event(
  session: session.TestSession(model, event.Event),
  event: event.Event,
) -> session.TestSession(model, event.Event)

Dispatch a raw event through the update cycle.

pub fn slide(
  session: session.TestSession(model, event.Event),
  id: String,
  value: Float,
) -> session.TestSession(model, event.Event)

Simulate a slider change by ID.

pub fn start(
  app: app.App(model, event.Event),
) -> session.TestSession(model, event.Event)

Start a test session for a simple app (msg = Event).

The backend is selected via PLUSHIE_TEST_BACKEND:

  • (unset/mock): pure Gleam, no renderer binary
  • pooled_mock: shared plushie --mock process
  • headless: plushie --headless with software rendering
pub fn stop(
  session: session.TestSession(model, event.Event),
) -> Nil

Stop the test session and release resources.

No-op for mock backend. Releases the renderer session for pooled and headless backends.

pub fn submit(
  session: session.TestSession(model, event.Event),
  id: String,
) -> session.TestSession(model, event.Event)

Simulate form submission on a widget by ID.

pub fn toggle(
  session: session.TestSession(model, event.Event),
  id: String,
) -> session.TestSession(model, event.Event)

Simulate a checkbox/toggler toggle by ID.

pub fn tree(
  session: session.TestSession(model, event.Event),
) -> node.Node

Return the current normalized tree from the session.

pub fn type_text(
  session: session.TestSession(model, event.Event),
  id: String,
  text: String,
) -> session.TestSession(model, event.Event)

Simulate text input on a widget by ID.

Search Document