0.1.2 • Published 5 months ago

@magicsandbox.ai/test v0.1.2

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

@magicsandbox.ai/test

@magicsandbox.ai/test makes it easy to run Playwright tests for Magic Sandbox Apps.

Getting Started

npm install "@magicsandbox.ai/test"

See the Magic Sandbox docs to learn more about Magic Sandbox.

Cost Warning

Because there are costs associated with loading Apps on Magic Sandbox, there are costs associated with running tests. See the Tests Cost Warning and Configuration Cost Warning sections below for more details.

Usage

Set up a folder structured like so:

.env
MyApp/
├── magic.json5
├── index.js
└── tests/
    ├── test1.spec.js
    └── test2.spec.js

@magicsandbox.ai/test requires the MAGICSANDBOX_API_KEY environment variable to be set, which you can set in a .env file in your project root. You can get an API key here.

See Writing Tests for details on creating the test files like test1.spec.js.

@magicsandbox.ai/test depends on @magicsandbox.ai/dev, so you should already be able to successfully run npx magicsandbox dev MyApp.

Then run:

npx magicsandbox test MyApp

This command will:

  • Run npx playwright install to ensure the Playwright browsers used for testing are installed
  • Start the @magicsandbox.ai/dev development server for MyApp if it's not already running
  • If you haven't already, create a playwright.config.js file in MyApp/tests for you. See Configuration for details.
  • Run the tests in MyApp/tests

Any additional arguments are passed to the Playwright CLI:

npx magicsandbox test MyApp --ui

Writing Tests

See the Playwright docs for details on writing tests.

@magicsandbox.ai/test extends Playwright's test function by adding an app fixture. When you use the app fixture, @magicsandbox.ai/test handles:

  • Authentication using your API key
  • Loading the correct URL and waiting for the dev server to build the app
  • Selecting the correct nested iframe to use as the app fixture

app is a Playwright Frame object.

Here's an example test:

import { test, expect } from "@magicsandbox.ai/test";

test("example test", async ({ app }) => {
  await expect(app.getByText("Hello, world!")).toBeVisible();
  await app.getByRole("button", { name: "Click me" }).click();
  await expect(app.getByText("Button clicked!")).toBeVisible();
  const context = await app.evaluate(() => app.context()); //https://playwright.dev/docs/api/class-frame#frame-evaluate
  expect(context).toEqual("This is the context");
  await app.evaluate(() => {
    const text = app.api.text;
    app.api.setText(text + " Goodbye!");
  });
  await expect(app.getByText("Button clicked! Goodbye!")).toBeVisible();
});

By default, app.init is automatically called. If you want to test init, disable this behavior like so:

test.describe("run tests with autoInit disabled", () => {
  test.use({ appOptions: { autoInit: false } });
  test("test init", async ({ app }) => {
    await expect(app.getByText("Hello, world!")).not.toBeVisible();
    const init = await app.evaluate(() => app.init());
    expect(init).toEqual("This is the init");
    await expect(app.getByText("Hello, world!")).toBeVisible();
  });
});

To disable magicsandbox.Assistant user confirmation prompts (for example, when spending money with requestFunction), set autoConfirm to true:

test.use({ appOptions: { autoConfirm: true } });

See the ExampleApp folder for an App that passes the above tests.

Tests Cost Warning

Each Playwright test runs in a new browser instance. That means each test has to load the Apps magicsandbox.Assistant and magicsandbox.DevLocal at a cost of $0.002. Be sure not to run thousands of tests!

Use extra caution when setting autoConfirm to true.

Configuration

You can create or edit the playwright.config.js file in your App's tests folder and magicsandbox.ai/test won't override your changes. See the Playwright docs for details.

When the dev server first starts, the initial build can be slow (rebuilds are much faster). To guard against slow builds causing tests to fail, magicsandbox.ai/test configures a timeout of 60 seconds rather than Playwright's default of 30 seconds.

Configuration Cost Warning

Because each test has a cost, consider carefully the impact of using projects to configure Playwright to run tests across many browsers or configurations.

0.1.2

5 months ago

0.1.1

5 months ago

0.1.0

6 months ago