| 877 | |
| 878 | #[tokio::test] |
| 879 | async fn put_request_invalidates_cache() -> Result<()> { |
| 880 | let mock_server = MockServer::start().await; |
| 881 | |
| 882 | // Mock GET request for caching |
| 883 | let m_get = Mock::given(method("GET")) |
| 884 | .respond_with( |
| 885 | ResponseTemplate::new(200) |
| 886 | .insert_header("cache-control", CACHEABLE_PUBLIC) |
| 887 | .set_body_bytes(TEST_BODY), |
| 888 | ) |
| 889 | .expect(1); |
| 890 | |
| 891 | // Mock PUT request that should invalidate cache |
| 892 | let m_put = Mock::given(method("PUT")) |
| 893 | .respond_with(ResponseTemplate::new(204)) |
| 894 | .expect(1); |
| 895 | |
| 896 | let mock_guard_get = mock_server.register_as_scoped(m_get).await; |
| 897 | let url = format!("{}/", mock_server.uri()); |
| 898 | let manager = MokaManager::default(); |
| 899 | |
| 900 | let client = Client::new().with(Cache(HttpCache { |
| 901 | mode: CacheMode::Default, |
| 902 | manager: manager.clone(), |
| 903 | options: Default::default(), |
| 904 | })); |
| 905 | |
| 906 | // First, cache a GET response |
| 907 | let get_req = Request::new(Method::Get, url_parse(&url)?); |
| 908 | client.send(get_req).await?; |
| 909 | |
| 910 | // Verify it's cached |
| 911 | let data = manager.get(&format!("GET:{}", url_parse(&url)?)).await?; |
| 912 | assert!(data.is_some()); |
| 913 | |
| 914 | drop(mock_guard_get); |
| 915 | let _mock_guard_put = mock_server.register_as_scoped(m_put).await; |
| 916 | |
| 917 | // PUT request should invalidate the cached GET response |
| 918 | let put_req = Request::new(Method::Put, url_parse(&url)?); |
| 919 | let put_res = client.send(put_req).await?; |
| 920 | assert_eq!(put_res.status(), 204); |
| 921 | |
| 922 | // Verify cache was invalidated |
| 923 | let data = manager.get(&format!("GET:{}", url_parse(&url)?)).await?; |
| 924 | assert!(data.is_none()); |
| 925 | |
| 926 | Ok(()) |
| 927 | } |
| 928 | |
| 929 | #[tokio::test] |
| 930 | async fn patch_request_invalidates_cache() -> Result<()> { |