Skip to main content
The Typescript SDK has a companion library which makes it easy to test against a Restate container: @restatedev/restate-sdk-testcontainers. This uses Testcontainers to run a Restate Server in a Docker container and let you test your Restate handlers.

Setup

RestateTestEnvironment.start creates a Restate container and executes a user-provided closure to register services. An optional second argument allows you to specify a custom Testcontainer for Restate.
describe("ExampleObject", () => {
  // import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers";
  let restateTestEnvironment: RestateTestEnvironment;
  // import * as clients from "@restatedev/restate-sdk-clients";
  let restateIngress: clients.Ingress;

  beforeAll(async () => {
    restateTestEnvironment = await RestateTestEnvironment.start(
      (restateServer) => restateServer.bind(router)
    );
    restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() });
  }, 20_000);

  afterAll(async () => {
    if (restateTestEnvironment !== undefined) {
      await restateTestEnvironment.stop();
    }
  });

Calling services

The Restate ingress client can be used as usual (see the clients documentation)
it("Can call methods", async () => {
  const client = restateIngress.objectClient(router, "myKey");

  await client.greet("Test!");
});

Checking and mutating state

The stateOf method on the RestateTestEnvironment class can be used to obtain a handle on the Virtual Object / Workflow state for a particular key.
it("Can read state", async () => {
  const state = restateTestEnvironment.stateOf(router, "myKey");

  expect(await state.getAll()).toStrictEqual({});
  expect(await state.get("count")).toBeNull();
});

it("Can write state", async () => {
  const state = restateTestEnvironment.stateOf(router, "myKey");

  await state.setAll({
    count: 123,
  });
  await state.set("count", 321);
});

Typed state

stateOf can be provided with a type for the services state, to allow for type-safe state operations.
type ServiceState = { count: number };

it("Can operate on typed state", async () => {
  const state = restateTestEnvironment.stateOf<ServiceState>(router, "myKey");

  await state.setAll({ count: 1 });
  await state.set("count", 2);
});
I