a database layer insipred by caqti and ecto
at main 3.4 kB view raw
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 ]