chickadee » orm » make-mock-backend

make-mock-backendprocedure

Returns two values: a backend alist (compatible with db/backend) and a spy procedure for inspecting and controlling the mock.

(import orm-db orm-test)

(receive (backend spy) (make-mock-backend)
  (db/backend backend)
  (db/path "ignored")
  (db/connect)

  ;; Configure responses
  (spy 'on-query (list (vector '((id . 1) (name . "Alice")))))

  (q/run (users/q))  ; => #(((id . 1) (name . "Alice")))
  (spy 'queries))    ; => ((<ssql form> ()))

The spy procedure responds to these messages:

  • (spy 'queries) — list of (sql params) pairs from all queries
  • (spy 'executions) — list of (sql params out-key) from all executions
  • (spy 'batches): list of statement lists, one per db/batch call (each statement is (sql . params)). Batched statements are also answered by the query handler and recorded in queries, so a test can assert "3 reads, 1 batch"
  • (spy 'on-query responses-or-proc) — set query responses: a list (consumed in order, last item repeats) or a (lambda (sql params) ...)
  • (spy 'on-execute responses-or-proc) — set execute responses: a list or a (lambda (sql params out-key) ...)
  • (spy 'reset!): clear recorded queries, executions and batches
;; Static list of responses (last item repeats forever)
(spy 'on-query (list
  (vector '((id . 1) (name . "Alice")))   ; first query
  (vector)))                               ; all subsequent queries

;; Dynamic responses
(spy 'on-query (lambda (sql params)
  (if (string-contains sql "users")
      (vector '((id . 1) (name . "Alice")))
      (vector))))