# Testing

> Use when writing tests, debugging test failures, running the test suite, or setting up test infrastructure. Covers self-test, package tests, and modern E2E tests.

- Skill: `meteor/testing` (Agent Skill)
- Install (CLI): `npx skillmds@latest add meteor/testing`
- Raw SKILL.md: https://api.skillmd.com/api/skills/meteor/testing/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: meteor (https://skillmd.com/u/meteor)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/meteor/testing

---


# Testing

Test patterns, commands, and utilities for the Meteor codebase.

## Test Commands

```bash
# CLI self-tests
./meteor self-test                           # Run all CLI tests
./meteor self-test "test name"               # Run specific test
./meteor self-test --list                    # List available tests
./meteor self-test --exclude "^[a-b]"        # Exclude tests by regex
./meteor self-test --retries 0               # Skip retries in development

# Package tests (TinyTest — view results at http://localhost:3000)
./meteor test-packages                       # Test all core packages
./meteor test-packages mongo                 # Test specific package
TINYTEST_FILTER="collection" ./meteor test-packages  # Filter specific tests

# Package tests in console (headless via Puppeteer — prints results to terminal)
# Use this for automation or when you need terminal output without a browser.
PUPPETEER_DOWNLOAD_PATH=~/.npm/chromium ./packages/test-in-console/run.sh
./packages/test-in-console/run.sh            # Test all core packages
./packages/test-in-console/run.sh "mongo"    # Test specific package

# E2E tests (Jest + Playwright)
npm run install:e2e                          # Install dependencies
npm run test:e2e                             # Run all E2E tests
npm run test:e2e -- -t="React"               # Run specific test

# Native mobile smoke tests (Maestro)
npm run install:native                       # Install deps, verify Maestro CLI on PATH
npm run test:native:android                  # Run Android smoke flow
npm run test:native:ios                       # Run iOS smoke flow
```

## E2E Tests (`tools/e2e-tests/`)

Jest + Playwright suite for verifying bundler integrations (rspack). Tests cover framework skeletons, command modes, routing, top-level await, and build/watch regressions.

**Test apps:** `tools/e2e-tests/apps/`. Use
`dev/modern-tools/rspack/E2E_COVERAGE.md` as the authoritative app-to-feature
coverage map instead of inferring coverage from fixture names.

## Native mobile smoke tests (`tools/native-tests/`)

Plain Node orchestrator + Maestro YAML flows. Builds a minimal Meteor app for
Cordova, installs it on an iOS Simulator or Android emulator, and checks the
initial runtime plus a live hot-code-push update. Coverage includes rendering,
styles, Cordova APIs and asset paths, DDP, route reloads, and HCP. Runs nightly
in CI plus on PRs labeled `mobile`.

**Local prerequisites:** Maestro CLI (`curl -fsSL https://get.maestro.mobile.dev | bash`),
Xcode (iOS), Android SDK + emulator (Android). See
`tools/native-tests/README.md` for current Node and Android SDK minimums.

**Tests:** `flows/launch.yaml` and `flows/hcp-updated.yaml` against `apps/smoke/`.

## Test Helpers Package (`packages/test-helpers`)

Comprehensive testing utilities for Meteor applications.

### Async Testing

```javascript
import { testAsyncMulti, simplePoll, waitUntil } from 'meteor/test-helpers';

// Wait for condition
await waitUntil(() => someCondition, { timeout: 5000, interval: 100 });

// Poll until ready
simplePoll(() => isReady(), successCallback, failCallback);
```

### DOM/UI Testing

```javascript
import { clickElement, simulateEvent, canonicalizeHtml, renderToDiv } from 'meteor/test-helpers';

clickElement(button);
simulateEvent(input, 'keydown', { keyCode: 13 });
const normalized = canonicalizeHtml(html);
```

### Connection Testing

```javascript
import { makeTestConnection, captureConnectionMessages } from 'meteor/test-helpers';

const conn = makeTestConnection(clientId);
const messages = captureConnectionMessages(server);
```

### Utilities

| Function | Description |
|----------|-------------|
| `SeededRandom` | Predictable random for deterministic tests |
| `try_all_permutations()` | Test all permutations of inputs |
| `withCallbackLogger()` | Track callback invocations |
| `mockBehaviours()` | Behavior mocking |

## Tinytest (`packages/tinytest`)

Meteor's built-in test framework.

```javascript
Tinytest.add('my test', function (test) {
  test.equal(1 + 1, 2);
  test.isTrue(true);
  test.throws(function () { throw new Error(); });
});

Tinytest.addAsync('async test', async function (test) {
  const result = await asyncOperation();
  test.equal(result, expected);
});
```

## Environment Variables

| Variable | Description |
|----------|-------------|
| `TEST_METADATA` | Test configuration JSON |
| `METEOR_TEST_PACKAGES` | Packages to test |

## Debug Commands

```bash
# Verbose build output
METEOR_DEBUG_BUILD=1 ./meteor run

# Profile build performance
METEOR_PROFILE=1 ./meteor build

# Force rebuild
./meteor reset && ./meteor run

# Debug Meteor tool with Chrome inspector
TOOL_NODE_FLAGS="--inspect-brk" ./meteor
```

## Writing Package Tests

In `package.js`:

```javascript
Package.onTest(function(api) {
  api.use(['tinytest', 'test-helpers', 'my-package']);
  api.addFiles('my-package-tests.js');
});
```

In `my-package-tests.js`:

```javascript
import { MyPackage } from 'meteor/my-package';

Tinytest.add('MyPackage - basic functionality', function (test) {
  const result = MyPackage.doSomething();
  test.equal(result, expected);
});
```

