[Racket] Ferti hydroponic nutrient solver, redux.
Move tests to concerned modules.
Changed files
models/nutrient-measurement.rkt
@@ -174,3 +174,67 @@
174
174
(define (delete-nutrient-measurement! nutrient-measurement)
175
175
(define id (nutrient-measurement-id nutrient-measurement))
176
176
(query-exec (current-conn) (delete #:from nutrient_measurements #:where (= id ,id))))
177
Added:
178
Added:
(module+ test
179
Added:
(require rackunit
180
Added:
rackunit/text-ui
181
Added:
"../db/conn.rkt"
182
Added:
"../db/migrations.rkt"
183
Added:
"../models/nutrient.rkt")
184
Added:
185
Added:
(define measurement-date "2025-09-01")
186
Added:
187
Added:
(run-tests
188
Added:
(test-suite "Nutrient measurement model"
189
Added:
#:before (λ ()
190
Added:
(connect! #:path 'memory)
191
Added:
;; (connect! #:path "test.sqlite3")
192
Added:
(migrate-all!)
193
Added:
(create-nutrient! "Nitrogen" "" "N")
194
Added:
(create-nutrient! "Phosphorus" "" "P")
195
Added:
(create-nutrient! "Potassium" "" "K"))
196
Added:
#:after (λ () (disconnect!))
197
Added:
198
Added:
(test-case "Create measurement with date and values"
199
Added:
(define nitrogen (get-nutrient #:name "Nitrogen"))
200
Added:
(define phosphorus (get-nutrient #:name "Phosphorus"))
201
Added:
(create-nutrient-measurement! measurement-date (hash nitrogen 12.3 phosphorus 4.5))
202
Added:
(check-equal? (length (get-nutrient-measurements)) 1)
203
Added:
(define nm (get-nutrient-measurement #:measured-on measurement-date))
204
Added:
(check-true (nutrient-measurement? nm))
205
Added:
(check-equal? (nutrient-measurement-measured-on nm) measurement-date))
206
Added:
207
Added:
(test-case "Check all measurement values"
208
Added:
(define nitrogen (get-nutrient #:name "Nitrogen"))
209
Added:
(define phosphorus (get-nutrient #:name "Phosphorus"))
210
Added:
211
Added:
(define nm (get-nutrient-measurement #:measured-on measurement-date))
212
Added:
(check-equal? (get-nutrient-measurement-value nm nitrogen) 12.3)
213
Added:
(check-equal? (get-nutrient-measurement-value nm phosphorus) 4.5)
214
Added:
215
Added:
(define nmv (nutrient-measurement-nutrient-values nm))
216
Added:
(check-equal?
217
Added:
(get-nutrient-measurement-values nm)
218
Added:
nmv
219
Added:
"return value of get-nutrient-measurement-values ≠ nutrient-measurement-values struct accessor")
220
Added:
(check-equal? (hash-count nmv) 2)
221
Added:
(check-equal? (hash-ref nmv nitrogen) 12.3)
222
Added:
(check-equal? (hash-ref nmv phosphorus) 4.5))
223
Added:
224
Added:
(test-case "Retrieve latest measurement values"
225
Added:
(define nitrogen (get-nutrient #:name "Nitrogen"))
226
Added:
(define phosphorus (get-nutrient #:name "Phosphorus"))
227
Added:
(define second-measurement-date "2025-09-02")
228
Added:
(create-nutrient-measurement! second-measurement-date (hash nitrogen 6.7 phosphorus 8.9))
229
Added:
230
Added:
(check-equal? (get-latest-nutrient-measurement-value nitrogen) 6.7)
231
Added:
(check-equal? (get-latest-nutrient-measurement-value phosphorus) 8.9))
232
Added:
233
Added:
(test-case "Delete measurement and cascade to measurement values"
234
Added:
(define nm (get-nutrient-measurement #:measured-on measurement-date))
235
Added:
(delete-nutrient-measurement! nm)
236
Added:
(check-false (get-nutrient-measurement #:id (nutrient-measurement-id nm)))
237
Added:
(check-equal? (length (get-nutrient-measurements))
238
Added:
1
239
Added:
"wrong number of nutrient measurements were deleted")
240
Added:
(check-true (hash-empty? (get-nutrient-measurement-values nm)))))))
models/nutrient.rkt
@@ -47,13 +47,12 @@
47
47
48
48
(define (create-nutrient! canonical-name french-name formula)
49
49
(or (get-nutrient #:name canonical-name #:formula formula)
50
Removed:
(with-tx
51
Removed:
(query-exec (current-conn)
52
Removed:
(insert #:into nutrients
53
Removed:
#:set [canonical_name ,canonical-name]
54
Removed:
[french_name ,french-name]
55
Removed:
[formula ,formula]))
56
Removed:
(get-nutrient #:name canonical-name))))
50
Added:
(with-tx (query-exec (current-conn)
51
Added:
(insert #:into nutrients
52
Added:
#:set [canonical_name ,canonical-name]
53
Added:
[french_name ,french-name]
54
Added:
[formula ,formula]))
55
Added:
(get-nutrient #:name canonical-name))))
57
56
58
57
;; READ
59
58
@@ -110,3 +109,70 @@
110
109
111
110
(define (delete-nutrient! nutrient)
112
111
(query-exec (current-conn) (delete #:from nutrients #:where (= id ,(nutrient-id nutrient)))))
112
Added:
113
Added:
(module+ test
114
Added:
(require rackunit
115
Added:
rackunit/text-ui
116
Added:
"../db/conn.rkt"
117
Added:
"../db/migrations.rkt")
118
Added:
119
Added:
(run-tests (test-suite "Nutrient model"
120
Added:
#:before (λ ()
121
Added:
(connect! #:path 'memory)
122
Added:
(migrate-all!))
123
Added:
#:after (λ () (disconnect!))
124
Added:
125
Added:
(test-case "Create nutrients"
126
Added:
(check-equal? (length (get-nutrients)) 0)
127
Added:
(create-nutrient! "Examplium" "" "Ex")
128
Added:
(check-equal? (length (get-nutrients)) 1)
129
Added:
(create-nutrient! "Ignorium" "" "Ig")
130
Added:
(check-equal? (length (get-nutrients)) 2))
131
Added:
132
Added:
(test-case "Read nutrient"
133
Added:
(define examplium (get-nutrient #:id 1))
134
Added:
(check-true (nutrient? examplium))
135
Added:
(check-equal? (nutrient-id examplium) 1))
136
Added:
137
Added:
(test-case "Read nutrient by name"
138
Added:
(define examplium (get-nutrient #:name "Examplium"))
139
Added:
(check-true (nutrient? examplium))
140
Added:
(check-equal? (nutrient-canonical-name examplium) "Examplium"))
141
Added:
142
Added:
(test-case "Read nutrient by formula"
143
Added:
(define examplium (get-nutrient #:formula "Ex"))
144
Added:
(check-true (nutrient? examplium))
145
Added:
(check-equal? (nutrient-formula examplium) "Ex"))
146
Added:
147
Added:
(test-case "Read inexisting nutrient"
148
Added:
(check-false (get-nutrient #:name "Inexistium")))
149
Added:
150
Added:
(test-case "Update nutrient name"
151
Added:
(define examplium (get-nutrient #:name "Examplium"))
152
Added:
(define examplium-nitrate (update-nutrient! examplium #:name "Examplium Nitrate"))
153
Added:
(check-equal? (length (get-nutrients)) 2)
154
Added:
(check-equal? (nutrient-canonical-name examplium-nitrate) "Examplium Nitrate")
155
Added:
(check-equal? (nutrient-formula examplium-nitrate) "Ex"))
156
Added:
157
Added:
(test-case "Update nutrient formula"
158
Added:
(define examplium-nitrate (get-nutrient #:name "Examplium Nitrate"))
159
Added:
(define examplium-sulfate (update-nutrient! examplium-nitrate #:formula "ExSO4"))
160
Added:
(check-equal? (length (get-nutrients)) 2)
161
Added:
(check-equal? (nutrient-canonical-name examplium-sulfate) "Examplium Nitrate")
162
Added:
(check-equal? (nutrient-formula examplium-sulfate) "ExSO4"))
163
Added:
164
Added:
(test-case "Update nutrient name and formula"
165
Added:
(define examplium-nitrate (get-nutrient #:name "Examplium Nitrate"))
166
Added:
(define examplium-sulfate
167
Added:
(update-nutrient! examplium-nitrate #:name "Examplium Sulfate" #:formula "ExNO3"))
168
Added:
(check-equal? (length (get-nutrients)) 2)
169
Added:
(check-equal? (nutrient-canonical-name examplium-sulfate) "Examplium Sulfate")
170
Added:
(check-equal? (nutrient-formula examplium-sulfate) "ExNO3"))
171
Added:
172
Added:
(test-case "Delete nutrient"
173
Added:
(define examplium-sulfate (get-nutrient #:name "Examplium Sulfate"))
174
Added:
(delete-nutrient! examplium-sulfate)
175
Added:
(check-equal? (length (get-nutrients)) 1)
176
Added:
(define ignorium (get-nutrient #:name "Ignorium"))
177
Added:
(delete-nutrient! ignorium)
178
Added:
(check-equal? (length (get-nutrients)) 0)))))
tests/models/nutrient-measurement.rkt
@@ -1,66 +0,0 @@
1
Removed:
#lang racket
2
Removed:
3
Removed:
(module+ test
4
Removed:
(require rackunit
5
Removed:
rackunit/text-ui
6
Removed:
"../../db/conn.rkt"
7
Removed:
"../../db/migrations.rkt"
8
Removed:
"../../models/nutrient.rkt"
9
Removed:
"../../models/nutrient-measurement.rkt")
10
Removed:
11
Removed:
(define measurement-date "2025-09-01")
12
Removed:
13
Removed:
(run-tests
14
Removed:
(test-suite "Nutrient measurement model"
15
Removed:
#:before (λ ()
16
Removed:
(connect! #:path 'memory)
17
Removed:
;; (connect! #:path "test.sqlite3")
18
Removed:
(migrate-all!)
19
Removed:
(create-nutrient! "Nitrogen" "" "N")
20
Removed:
(create-nutrient! "Phosphorus" "" "P")
21
Removed:
(create-nutrient! "Potassium" "" "K"))
22
Removed:
#:after (λ () (disconnect!))
23
Removed:
24
Removed:
(test-case "Create measurement with date and values"
25
Removed:
(define nitrogen (get-nutrient #:name "Nitrogen"))
26
Removed:
(define phosphorus (get-nutrient #:name "Phosphorus"))
27
Removed:
(create-nutrient-measurement! measurement-date (hash nitrogen 12.3 phosphorus 4.5))
28
Removed:
(check-equal? (length (get-nutrient-measurements)) 1)
29
Removed:
(define nm (get-nutrient-measurement #:measured-on measurement-date))
30
Removed:
(check-true (nutrient-measurement? nm))
31
Removed:
(check-equal? (nutrient-measurement-date nm) measurement-date))
32
Removed:
33
Removed:
(test-case "Check all measurement values"
34
Removed:
(define nitrogen (get-nutrient #:name "Nitrogen"))
35
Removed:
(define phosphorus (get-nutrient #:name "Phosphorus"))
36
Removed:
37
Removed:
(define nm (get-nutrient-measurement #:measured-on measurement-date))
38
Removed:
(check-equal? (get-nutrient-measurement-value nm nitrogen) 12.3)
39
Removed:
(check-equal? (get-nutrient-measurement-value nm phosphorus) 4.5)
40
Removed:
41
Removed:
(define nmv (nutrient-measurement-values nm))
42
Removed:
(check-equal?
43
Removed:
(get-nutrient-measurement-values nm)
44
Removed:
nmv
45
Removed:
"return value of get-nutrient-measurement-values ≠ nutrient-measurement-values struct accessor")
46
Removed:
(check-equal? (hash-count nmv) 2)
47
Removed:
(check-equal? (hash-ref nmv nitrogen) 12.3)
48
Removed:
(check-equal? (hash-ref nmv phosphorus) 4.5))
49
Removed:
50
Removed:
(test-case "Retrieve latest measurement values"
51
Removed:
(define nitrogen (get-nutrient #:name "Nitrogen"))
52
Removed:
(define phosphorus (get-nutrient #:name "Phosphorus"))
53
Removed:
(define second-measurement-date "2025-09-02")
54
Removed:
(create-nutrient-measurement! second-measurement-date (hash nitrogen 6.7 phosphorus 8.9))
55
Removed:
56
Removed:
(check-equal? (get-latest-nutrient-measurement-value nitrogen) 6.7)
57
Removed:
(check-equal? (get-latest-nutrient-measurement-value phosphorus) 8.9))
58
Removed:
59
Removed:
(test-case "Delete measurement and cascade to measurement values"
60
Removed:
(define nm (get-nutrient-measurement #:measured-on measurement-date))
61
Removed:
(delete-nutrient-measurement! nm)
62
Removed:
(check-false (get-nutrient-measurement #:id (nutrient-measurement-id nm)))
63
Removed:
(check-equal? (length (get-nutrient-measurements))
64
Removed:
1
65
Removed:
"wrong number of nutrient measurements were deleted")
66
Removed:
(check-true (hash-empty? (get-nutrient-measurement-values nm)))))))
tests/models/nutrient.rkt
@@ -1,69 +0,0 @@
1
Removed:
#lang racket
2
Removed:
3
Removed:
(module+ test
4
Removed:
(require rackunit
5
Removed:
rackunit/text-ui
6
Removed:
"../../db/conn.rkt"
7
Removed:
"../../db/migrations.rkt"
8
Removed:
"../../models/nutrient.rkt")
9
Removed:
10
Removed:
(run-tests (test-suite "Nutrient model"
11
Removed:
#:before (λ ()
12
Removed:
(connect! #:path 'memory)
13
Removed:
(migrate-all!))
14
Removed:
#:after (λ () (disconnect!))
15
Removed:
16
Removed:
(test-case "Create nutrients"
17
Removed:
(check-equal? (length (get-nutrients)) 0)
18
Removed:
(create-nutrient! "Examplium" "" "Ex")
19
Removed:
(check-equal? (length (get-nutrients)) 1)
20
Removed:
(create-nutrient! "Ignorium" "" "Ig")
21
Removed:
(check-equal? (length (get-nutrients)) 2))
22
Removed:
23
Removed:
(test-case "Read nutrient"
24
Removed:
(define examplium (get-nutrient #:id 1))
25
Removed:
(check-true (nutrient? examplium))
26
Removed:
(check-equal? (nutrient-id examplium) 1))
27
Removed:
28
Removed:
(test-case "Read nutrient by name"
29
Removed:
(define examplium (get-nutrient #:name "Examplium"))
30
Removed:
(check-true (nutrient? examplium))
31
Removed:
(check-equal? (nutrient-canonical-name examplium) "Examplium"))
32
Removed:
33
Removed:
(test-case "Read nutrient by formula"
34
Removed:
(define examplium (get-nutrient #:formula "Ex"))
35
Removed:
(check-true (nutrient? examplium))
36
Removed:
(check-equal? (nutrient-formula examplium) "Ex"))
37
Removed:
38
Removed:
(test-case "Read inexisting nutrient"
39
Removed:
(check-false (get-nutrient #:name "Inexistium")))
40
Removed:
41
Removed:
(test-case "Update nutrient name"
42
Removed:
(define examplium (get-nutrient #:name "Examplium"))
43
Removed:
(define examplium-nitrate (update-nutrient! examplium #:name "Examplium Nitrate"))
44
Removed:
(check-equal? (length (get-nutrients)) 2)
45
Removed:
(check-equal? (nutrient-canonical-name examplium-nitrate) "Examplium Nitrate")
46
Removed:
(check-equal? (nutrient-formula examplium-nitrate) "Ex"))
47
Removed:
48
Removed:
(test-case "Update nutrient formula"
49
Removed:
(define examplium-nitrate (get-nutrient #:name "Examplium Nitrate"))
50
Removed:
(define examplium-sulfate (update-nutrient! examplium-nitrate #:formula "ExSO4"))
51
Removed:
(check-equal? (length (get-nutrients)) 2)
52
Removed:
(check-equal? (nutrient-canonical-name examplium-sulfate) "Examplium Nitrate")
53
Removed:
(check-equal? (nutrient-formula examplium-sulfate) "ExSO4"))
54
Removed:
55
Removed:
(test-case "Update nutrient name and formula"
56
Removed:
(define examplium-nitrate (get-nutrient #:name "Examplium Nitrate"))
57
Removed:
(define examplium-sulfate
58
Removed:
(update-nutrient! examplium-nitrate #:name "Examplium Sulfate" #:formula "ExNO3"))
59
Removed:
(check-equal? (length (get-nutrients)) 2)
60
Removed:
(check-equal? (nutrient-canonical-name examplium-sulfate) "Examplium Sulfate")
61
Removed:
(check-equal? (nutrient-formula examplium-sulfate) "ExNO3"))
62
Removed:
63
Removed:
(test-case "Delete nutrient"
64
Removed:
(define examplium-sulfate (get-nutrient #:name "Examplium Sulfate"))
65
Removed:
(delete-nutrient! examplium-sulfate)
66
Removed:
(check-equal? (length (get-nutrients)) 1)
67
Removed:
(define ignorium (get-nutrient #:name "Ignorium"))
68
Removed:
(delete-nutrient! ignorium)
69
Removed:
(check-equal? (length (get-nutrients)) 0)))))