Liking cljdoc? Tell your friends :D

Testing Strategy

Boundary uses Kaocha as the test runner with H2 in-memory database for all test suites.

Three test levels

TypeMetadataWhat it covers

Unit

^:unit

Pure core functions. No database, no mocks, no network. Fast.

Integration

^:integration

Shell services with mocked/in-memory adapters. Validates service orchestration.

Contract

^:contract

Adapters against real H2 in-memory database. Validates SQL, migrations, mappings.

Running tests

# All tests
clojure -M:test:db/h2

# Single library
clojure -M:test:db/h2 :core
clojure -M:test:db/h2 :user

# By metadata
clojure -M:test:db/h2 --focus-meta :unit
clojure -M:test:db/h2 --focus-meta :integration
clojure -M:test:db/h2 --focus-meta :contract

# Single namespace
clojure -M:test:db/h2 --focus user-property-test

# Watch mode
clojure -M:test:db/h2 --watch :core

# With JWT secret (required for auth tests)
JWT_SECRET="dev-secret-32-chars-minimum" clojure -M:test:db/h2 :user

Unit test example

Tests for core functions need no setup — just call the function and assert:

(ns myapp.user.core.user-test
  (:require [clojure.test :refer [deftest is testing]]
            [myapp.user.core.user :as user-core]))

(deftest ^:unit test-prepare-user
  (testing "adds UUID and timestamps"
    (let [result (user-core/prepare-user {:email "alice@example.com"
                                          :name "Alice"})]
      (is (uuid? (:id result)))
      (is (inst? (:created-at result)))
      (is (= "alice@example.com" (:email result))))))

Contract test example

Contract tests use a real H2 database with applied migrations:

(ns myapp.user.shell.persistence-test
  (:require [clojure.test :refer [deftest is use-fixtures]]
            [myapp.user.shell.persistence :as persistence]
            [myapp.test.fixtures :as fixtures]))

(use-fixtures :each fixtures/with-database)

(deftest ^:contract test-create-and-find-user
  (let [user {:id (random-uuid) :email "test@example.com" :name "Test"}
        _    (persistence/create-user! db user)
        found (persistence/find-user-by-email db "test@example.com")]
    (is (= (:email user) (:email found)))))

Test suite configuration

Test suites are defined in tests.edn. Each library has its own :id:

{:kaocha/tests
 [{:kaocha.testable/id :core
   :kaocha/source-paths ["libs/core/src"]
   :kaocha/test-paths   ["libs/core/test"]}
  {:kaocha.testable/id :user
   :kaocha/source-paths ["libs/user/src"]
   :kaocha/test-paths   ["libs/user/test"]}
  ;; ...
  ]}

Custom reporter

The test reporter shows green ✓ for passing and red ✗ for failing tests. It is configured automatically via tests.edn.

Validation snapshot tests

For complex validation schemas, snapshot tests capture expected error messages:

# Update snapshots when validation messages change intentionally
UPDATE_SNAPSHOTS=true clojure -M:test:db/h2 --focus user-validation-snapshot-test

Can you improve this documentation?Edit on GitHub

cljdoc builds & hosts documentation for Clojure/Script libraries

Keyboard shortcuts
Ctrl+kJump to recent docs
←Move to previous article
→Move to next article
Ctrl+/Jump to the search field
× close