(*--------------------------------------------------------------------------- Copyright (c) 2025 Anil Madhavapeddy . All rights reserved. SPDX-License-Identifier: ISC ---------------------------------------------------------------------------*) (** Tests for Cache module - HTTP response caching per RFC 9111 *) module Headers = Requests.Headers (** Run a test inside the Eio event loop (needed for Eio.Mutex) *) let run f () = Eio_main.run @@ fun _env -> f () (** {1 Memory.create and Memory.size Tests} *) let test_create_size () = let c = Cache.Memory.create () in Alcotest.(check int) "fresh cache size is 0" 0 (Cache.Memory.size c) (** {1 Memory.stats Tests} *) let test_create_stats () = let c = Cache.Memory.create () in let hits, misses, stores = Cache.Memory.stats c in Alcotest.(check int) "hits" 0 hits; Alcotest.(check int) "misses" 0 misses; Alcotest.(check int) "stores" 0 stores (** {1 Memory.clear Tests} *) let test_clear_empty () = let c = Cache.Memory.create () in Cache.Memory.clear c; Alcotest.(check int) "size after clear" 0 (Cache.Memory.size c) (** {1 parse_vary Tests} *) let test_parse_vary () = let result = Cache.parse_vary "Accept, Accept-Language" in Alcotest.(check (list string)) "parsed vary" [ "accept"; "accept-language" ] result (** {1 is_not_modified Tests} *) let test_is_not_modified_304 () = Alcotest.(check bool) "304 is not modified" true (Cache.is_not_modified ~status:304) let test_is_not_modified_200 () = Alcotest.(check bool) "200 is modified" false (Cache.is_not_modified ~status:200) (** {1 vary_matches Tests} *) let test_vary_matches () = let request_headers = Headers.empty |> Headers.add_string "accept" "text/html" in let cached_vary = [ ("accept", "text/html") ] in Alcotest.(check bool) "matching vary" true (Cache.vary_matches ~cached_vary ~request_headers) let test_vary_no_match () = let request_headers = Headers.empty |> Headers.add_string "accept" "application/json" in let cached_vary = [ ("accept", "text/html") ] in Alcotest.(check bool) "non-matching vary" false (Cache.vary_matches ~cached_vary ~request_headers) (** {1 Test Suite} *) let suite = ( "cache", [ Alcotest.test_case "create size 0" `Quick (run test_create_size); Alcotest.test_case "create stats zeros" `Quick (run test_create_stats); Alcotest.test_case "clear empty" `Quick (run test_clear_empty); Alcotest.test_case "parse_vary" `Quick test_parse_vary; Alcotest.test_case "is_not_modified 304" `Quick test_is_not_modified_304; Alcotest.test_case "is_not_modified 200" `Quick test_is_not_modified_200; Alcotest.test_case "vary matches" `Quick test_vary_matches; Alcotest.test_case "vary no match" `Quick test_vary_no_match; ] )