a database layer insipred by caqti and ecto
1open Repodb
2open Common
3
4let test_empty_multi () =
5 let m = Multi.empty in
6 Alcotest.(check int) "empty has no entries" 0 (List.length (Multi.to_list m))
7
8let test_insert () =
9 let m =
10 Multi.empty
11 |> Multi.insert "user" ~table:users_table ~columns:[ "name" ]
12 ~values:[ Driver.Value.text "Alice" ]
13 in
14 let names = Multi.names m in
15 Alcotest.(check bool) "has user" true (List.mem "user" names)
16
17let test_delete () =
18 let m =
19 Multi.empty
20 |> Multi.delete "user" ~table:users_table ~where_column:"id"
21 ~where_value:(Driver.Value.int 1)
22 in
23 Alcotest.(check int) "one entry" 1 (List.length (Multi.to_list m))
24
25let test_merge () =
26 let m1 =
27 Multi.empty
28 |> Multi.insert "first" ~table:users_table ~columns:[ "name" ]
29 ~values:[ Driver.Value.text "Alice" ]
30 in
31 let m2 =
32 Multi.empty
33 |> Multi.insert "second" ~table:users_table ~columns:[ "name" ]
34 ~values:[ Driver.Value.text "Bob" ]
35 in
36 let merged = Multi.merge m1 m2 in
37 Alcotest.(check int) "two entries" 2 (List.length (Multi.to_list merged))
38
39let test_has_name () =
40 let m =
41 Multi.empty
42 |> Multi.insert "test" ~table:users_table ~columns:[ "name" ]
43 ~values:[ Driver.Value.text "Test" ]
44 in
45 Alcotest.(check bool) "has test" true (Multi.has_name "test" m);
46 Alcotest.(check bool) "no other" false (Multi.has_name "other" m)
47
48let test_validate_multi_duplicate_names () =
49 let m =
50 Multi.empty
51 |> Multi.insert "same" ~table:users_table ~columns:[ "name" ]
52 ~values:[ Driver.Value.text "A" ]
53 |> Multi.insert "same" ~table:users_table ~columns:[ "name" ]
54 ~values:[ Driver.Value.text "B" ]
55 in
56 match Multi.validate_multi m with
57 | Ok () -> Alcotest.fail "should fail with duplicates"
58 | Error _ -> Alcotest.(check pass) "detected duplicates" () ()
59
60let test_run_no_result () =
61 let executed = ref false in
62 let m =
63 Multi.empty
64 |> Multi.run_no_result "custom" ~f:(fun _conn _results ->
65 executed := true;
66 Ok ())
67 in
68 Alcotest.(check int) "one entry" 1 (List.length (Multi.to_list m));
69 Alcotest.(check bool) "not executed yet" false !executed
70
71let test_insert_fn () =
72 let m =
73 Multi.empty
74 |> Multi.insert_fn "user" ~f:(fun _results ->
75 (users_table, [ "name" ], [ Driver.Value.text "Dynamic" ]))
76 in
77 Alcotest.(check int) "one entry" 1 (List.length (Multi.to_list m))
78
79let test_results_get_put () =
80 let results = Multi.empty_results in
81 let results = Multi.put "count" 42 results in
82 let results = Multi.put "name" "test" results in
83 let count : int option = Multi.get results "count" in
84 let name : string option = Multi.get results "name" in
85 let missing : int option = Multi.get results "missing" in
86 Alcotest.(check (option int)) "got count" (Some 42) count;
87 Alcotest.(check (option string)) "got name" (Some "test") name;
88 Alcotest.(check (option int)) "missing is none" None missing
89
90let tests =
91 [
92 ("empty multi", `Quick, test_empty_multi);
93 ("insert", `Quick, test_insert);
94 ("delete", `Quick, test_delete);
95 ("merge", `Quick, test_merge);
96 ("has_name", `Quick, test_has_name);
97 ("validate_multi duplicates", `Quick, test_validate_multi_duplicate_names);
98 ("run_no_result", `Quick, test_run_no_result);
99 ("insert_fn", `Quick, test_insert_fn);
100 ("results get/put", `Quick, test_results_get_put);
101 ]