ETS-backed store for captured inbound API requests during tests.
The request spy supports end-to-end assertions on what was sent to PaperTiger, including method, path, parsed params, and selected headers.
Summary
Functions
Returns a specification to start this module under a supervisor.
Clears all requests from the store (all namespaces).
Clears all requests for a specific namespace.
Counts total requests in current namespace.
Deletes a request from the store.
Returns captured requests filtered by method/path and optional param match.
Retrieves a request by ID.
Retrieves a request only when it belongs to the given owner.
Inserts a request into the store.
Lists all requests with optional pagination.
Returns all captured requests for the current namespace.
Returns all items in a specific namespace.
Validates and applies child-resource mutations in one serialized store call.
Returns the ID prefix for this resource.
Records an inbound request for later inspection.
Starts the request store GenServer.
Returns the ETS table name for this store.
Updates a request in the store.
Types
Functions
Returns a specification to start this module under a supervisor.
See Supervisor.
@spec clear() :: :ok
Clears all requests from the store (all namespaces).
Serialized write - goes through GenServer.
Useful for test cleanup. Note: This clears ALL data, not just
the current namespace. For namespace-specific cleanup, use
clear_namespace/1.
Clears all requests for a specific namespace.
Used by PaperTiger.Test to clean up after each test.
@spec count() :: non_neg_integer()
Counts total requests in current namespace.
Direct ETS access - does not go through GenServer.
@spec delete(String.t()) :: :ok
Deletes a request from the store.
Serialized write - goes through GenServer. Data is scoped to the current test namespace.
Returns captured requests filtered by method/path and optional param match.
Retrieves a request by ID.
Direct ETS access - does not go through GenServer. Data is scoped to the current test namespace.
Retrieves a request only when it belongs to the given owner.
Missing resources and resources owned by a different parent both return
{:error, :not_found} so nested endpoints do not disclose foreign IDs.
Inserts a request into the store.
Serialized write - goes through GenServer to prevent race conditions. Data is scoped to the current test namespace.
@spec list(keyword() | map()) :: PaperTiger.List.t()
Lists all requests with optional pagination.
Direct ETS access - does not go through GenServer. Data is scoped to the current test namespace.
Options
:limit- Number of items (default: 10, max: 100):starting_after- Cursor for pagination:ending_before- Reverse cursor
@spec list_all() :: [map()]
Returns all captured requests for the current namespace.
Returns all items in a specific namespace.
Useful for debugging test isolation.
@spec mutate_owned(atom(), term(), [ {:insert | :update, map()} | {:delete, String.t()} ]) :: :ok | {:error, {:already_exists | :duplicate_operation | :not_found | :not_owned, String.t()}}
Validates and applies child-resource mutations in one serialized store call.
Every operation is checked before any write occurs. Inserts must use new
IDs, updates and deletes must target existing resources owned by
owner_id, and an ID may appear only once in the batch.
@spec prefix() :: String.t() | nil
Returns the ID prefix for this resource.
@spec record(Plug.Conn.t()) :: map()
Records an inbound request for later inspection.
@spec start_link(keyword()) :: GenServer.on_start()
Starts the request store GenServer.
@spec table_name() :: atom()
Returns the ETS table name for this store.
Updates a request in the store.
Serialized write - goes through GenServer. Data is scoped to the current test namespace.