Labsco
cloudflare logo

testing

✓ Official1,100

by cloudflare · part of cloudflare/sandbox-sdk

Use when writing or running tests for this project. Covers unit vs E2E test decisions, test file locations, mock patterns, and project-specific testing…

🔥🔥✓ VerifiedFreeQuick setup
🔒 Repo-maintenance skill. It exists to help maintain cloudflare/sandbox-sdk itself — it's only useful if you contribute code to that project.

Use when writing or running tests for this project. Covers unit vs E2E test decisions, test file locations, mock patterns, and project-specific testing…

Inspect the full instructions your agent will receiveExpand

This is the exact playbook injected into your agent when the skill activates — shown here so you can audit it before installing. You don't need to read it to use the skill.


name: testing description: Use when writing or running tests for this project. Covers unit vs E2E test decisions, test file locations, mock patterns, and project-specific testing conventions. (project)

Testing in Sandbox SDK

This skill covers project-specific testing conventions. For TDD methodology, use the superpowers:test-driven-development skill.

Two Test Suites

Unit Tests

When to use: Testing isolated logic, client behavior, service methods, utilities.

Location:

  • SDK: packages/sandbox/tests/
  • Container: packages/sandbox-container/tests/

Runtime:

  • SDK tests run in Workers runtime via @cloudflare/vitest-pool-workers
  • Container tests run in Bun runtime

Commands:

Copy & paste — that's it
npm test                              # All unit tests
npm test -w @cloudflare/sandbox       # SDK tests only
npm test -w @repo/sandbox-container   # Container tests only

Mock patterns:

  • SDK tests use a mock container (no Docker needed)
  • Container tests mock external dependencies (filesystem, processes)
  • Use createNoOpLogger() from @repo/shared for logger mocks

Known issue: SDK unit tests may hang on exit due to vitest-pool-workers workerd shutdown. Tests still pass/fail correctly - the hang is cosmetic.

E2E Tests

When to use: Testing full request flow, container integration, real Docker behavior.

Location: tests/e2e/

Runtime: Real Cloudflare Workers + Docker containers

Commands:

Copy & paste — that's it
npm run test:e2e                                                           # All E2E tests (vitest + browser)
npm run test:e2e:vitest -- -- tests/e2e/process-lifecycle-workflow.test.ts # Single vitest file
npm run test:e2e:vitest -- -- tests/e2e/git-clone-workflow.test.ts -t 'test name'  # Single vitest test
npm run test:e2e:browser                                                   # Browser tests only (Playwright)

Note: Use test:e2e:vitest when filtering tests. The test:e2e wrapper doesn't support argument passthrough.

Key patterns:

  • All tests share ONE container for performance
  • Use unique sessions for test isolation
  • Tests run in parallel via thread pool
  • Config: vitest.e2e.config.ts (root level)

Writing E2E tests:

Copy & paste — that's it
import { createTestSession } from './helpers';

describe('Feature X', () => {
  let session: TestSession;

  beforeEach(async () => {
    session = await createTestSession(); // Gets unique session
  });

  it('should do something', async () => {
    const result = await session.sandbox.exec('echo hello');
    expect(result.stdout).toBe('hello\n');
  });
});

When to Use Which

ScenarioTest Type
Client method logicUnit
Service business logicUnit
Request/response handlingUnit
Full command execution flowE2E
File operations with real filesystemE2E
Process lifecycle (start, stop, signal)E2E
Port exposure and preview URLsE2E
Git operationsE2E

Test-Specific Conventions

File naming: *.test.ts for both unit and E2E tests

Test structure:

Copy & paste — that's it
describe('ComponentName', () => {
  describe('methodName', () => {
    it('should do X when Y', async () => {
      // Arrange
      // Act
      // Assert
    });
  });
});

Assertions: Use vitest's expect() with clear, specific assertions