| 282 | |
| 283 | #[tokio::test] |
| 284 | async fn patch_request_invalidates_cache() -> Result<()> { |
| 285 | let mock_server = MockServer::start().await; |
| 286 | |
| 287 | let m_get = Mock::given(method("GET")) |
| 288 | .respond_with( |
| 289 | ResponseTemplate::new(200) |
| 290 | .insert_header("cache-control", CACHEABLE_PUBLIC) |
| 291 | .set_body_bytes(TEST_BODY), |
| 292 | ) |
| 293 | .expect(1); |
| 294 | |
| 295 | let m_patch = Mock::given(method("PATCH")) |
| 296 | .respond_with(ResponseTemplate::new(200)) |
| 297 | .expect(1); |
| 298 | |
| 299 | let mock_guard_get = mock_server.register_as_scoped(m_get).await; |
| 300 | let url = format!("{}/", mock_server.uri()); |
| 301 | let manager = QuickManager::default(); |
| 302 | |
| 303 | let client = ClientBuilder::new(Client::new()) |
| 304 | .with(Cache(HttpCache { |
| 305 | mode: CacheMode::Default, |
| 306 | manager: manager.clone(), |
| 307 | options: HttpCacheOptions::default(), |
| 308 | })) |
| 309 | .build(); |
| 310 | |
| 311 | // Cache a GET response |
| 312 | client.get(url.clone()).send().await?; |
| 313 | |
| 314 | // Verify it's cached |
| 315 | let data = http_cache::CacheManager::get( |
| 316 | &manager, |
| 317 | &format!("GET:{}", url_parse(&url)?), |
| 318 | ) |
| 319 | .await?; |
| 320 | assert!(data.is_some()); |
| 321 | |
| 322 | drop(mock_guard_get); |
| 323 | let _mock_guard_patch = mock_server.register_as_scoped(m_patch).await; |
| 324 | |
| 325 | // PATCH request should invalidate cache |
| 326 | let patch_res = client.patch(url.clone()).send().await?; |
| 327 | assert_eq!(patch_res.status(), 200); |
| 328 | |
| 329 | // Verify cache was invalidated |
| 330 | let data = http_cache::CacheManager::get( |
| 331 | &manager, |
| 332 | &format!("GET:{}", url_parse(&url)?), |
| 333 | ) |
| 334 | .await?; |
| 335 | assert!(data.is_none()); |
| 336 | |
| 337 | Ok(()) |
| 338 | } |
| 339 | |
| 340 | #[tokio::test] |
| 341 | async fn delete_request_invalidates_cache() -> Result<()> { |