Skip to main content

Formatting and linting

Use these commands for routine checks. The check variant is a mode argument, not a separate recipe:
Go formatting uses gofumpt and goimports. Go linting is configured in .golangci.yaml. Biome handles the UI, and Buf handles protobuf formatting and linting. Refer to those configuration files when you need the exact enabled rules. CI runs the granular recipes (just go-lint check, just go-format check, just ui-lint check, just ui-format check) plus buf lint and a proto-check that fails if regenerating stubs would change checked-in files.

Testing

There are three layers of tests. just test runs unit tests in every Go module except tests/. It does not need a container engine. The suite covers planning, batching and integrity, checkpoints, event delivery, connectors, storage, secrets, the runner, and the server. just test-integration recursively runs service-level contracts under tests/integration/, carrying //go:build integration. just test-e2e recursively runs cross-process, data-lake, and Kubernetes workflows under tests/e2e/, carrying //go:build e2e. Kubernetes tests additionally carry //go:build privileged because their nested cluster needs a privileged engine. Both use Testcontainers with Docker or Podman. The e2e suite also needs duckdb on your PATH for TPC-H seeding.
Running go test ./... in tests/ without a test tier tag can pass while testing nothing. Use just test-integration or just test-e2e. Each supplies the appropriate tag.
The selected CONTAINER_ENGINE applies to both suites. See local development for engine selection. The default just test-e2e invocation includes the privileged tag. To exercise every compatible e2e package without it, run just test-e2e e2e.

What the suites prove

The integration suite checks behavior across real dependencies:
  • Recovery tests stop runs during extraction and write new source rows before resume. Missing rows fail the test. Duplicate rows are allowed by the at-least-once contract.
  • PostgreSQL and MySQL connector tests cover snapshot, incremental, and CDC behavior, including physical-scan resume after table changes.
  • The NATS durable-consumer tests verify consumers survive restarts.
  • The S3 sink tests verify committed objects, manifests, and multipart aborts.
  • PostgreSQL persistence and seed tests exercise their contracts against an ephemeral server, including seed snapshot/restore.
The e2e layer groups full workflows by deployment boundary. Data-lake tests write PostgreSQL data to Iceberg and verify it independently through Trino. Pipeline tests exercise the server API and separately run compiled server and control-plane processes through PostgreSQL and NATS. Kubernetes tests verify dispatch, idempotency, and stale-run reaping against a real k3s API server.