Testing
Test patterns, commands, and utilities for the Meteor codebase.
Test Commands
# 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
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
import { clickElement, simulateEvent, canonicalizeHtml, renderToDiv } from 'meteor/test-helpers';
clickElement(button);
simulateEvent(input, 'keydown', { keyCode: 13 });
const normalized = canonicalizeHtml(html);
Connection Testing
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.
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
# 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:
Package.onTest(function(api) {
api.use(['tinytest', 'test-helpers', 'my-package']);
api.addFiles('my-package-tests.js');
});
In my-package-tests.js:
import { MyPackage } from 'meteor/my-package';
Tinytest.add('MyPackage - basic functionality', function (test) {
const result = MyPackage.doSomething();
test.equal(result, expected);
});