#lang racket (module+ test (require rackunit rackunit/text-ui "../db/conn.rkt" "../db/migrations.rkt" "../models/nutrient.rkt" "../models/nutrient-measurement.rkt") (define measured-on "2025-09-01") (run-tests (test-suite "Nutrient measurement model" #:before (λ () (connect! #:path 'memory) ;; (connect! #:path "test.sqlite3") (migrate-all!) (create-nutrient! "Nitrogen" "N") (create-nutrient! "Phosphorus" "P") (create-nutrient! "Potassium" "K")) #:after (λ () (disconnect!)) (test-case "Create measurement with values" (define nitrogen (get-nutrient #:name "Nitrogen")) (define phosphorus (get-nutrient #:name "Phosphorus")) (create-nutrient-measurement! measured-on (list (cons nitrogen 12.3) (cons phosphorus 4.5))) (check-equal? (length (get-nutrient-measurements)) 1) (define nm (get-nutrient-measurement #:measured-on measured-on)) (check-true (nutrient-measurement? nm)) (check-equal? (nutrient-measurement-measured-on nm) measured-on) (define mvs (get-nutrient-measurement-values nm)) (check-equal? (length mvs) 2) (check-equal? (cdr (assoc nitrogen mvs)) 12.3) (check-equal? (cdr (assoc phosphorus mvs)) 4.5) ) #;(test-case "Update a single measurement value" (define nitrogen (get-nutrient #:name "Nitrogen")) (define nm (get-nutrient-measurement #:measured-on measured-on)) (update-nutrient-measurement! nm #:nutrient-values (list (cons nitrogen 1.1))) (define mvs (get-nutrient-measurement-values nm)) (check-equal? (length mvs) 2) (check-equal? (cdr (assoc nitrogen mvs)) 1.1)) #;(test-case "Upsert measurement values" (define nitrogen (get-nutrient #:name "Nitrogen")) (define phosphorus (get-nutrient #:name "Phosphorus")) (define potassium (get-nutrient #:name "Potassium")) (define nm (get-nutrient-measurement #:measured-on measured-on)) ;; Upsert: set K=8.8 and change N to 10.0, keep P as-is (update-nutrient-measurement! nm #:nutrient-values (list (cons nitrogen 10.0) (cons potassium 8.8))) (define mvs (get-nutrient-measurement-values nm)) (check-equal? (length mvs) 3) (check-equal? (cdr (assoc nitrogen mvs)) 10.0) (check-equal? (cdr (assoc potassium mvs)) 8.8) ;; P should still be present at 4.5 (check-equal? (cdr (assoc phosphorus mvs)) 4.5)) (test-case "Delete measurement cascades its values" (define nm (get-nutrient-measurement #:measured-on measured-on)) (delete-nutrient-measurement! nm) (check-false (get-nutrient-measurement #:id (nutrient-measurement-id nm))) (check-equal? (length (get-nutrient-measurements)) 0) (check-true (null? (get-nutrient-measurement-values nm)))))))