| 339 | |
| 340 | #[tokio::test] |
| 341 | async fn delete_request_invalidates_cache() -> Result<()> { |
| 342 | let mock_server = MockServer::start().await; |
| 343 | |
| 344 | let m_get = Mock::given(method("GET")) |
| 345 | .respond_with( |
| 346 | ResponseTemplate::new(200) |
| 347 | .insert_header("cache-control", CACHEABLE_PUBLIC) |
| 348 | .set_body_bytes(TEST_BODY), |
| 349 | ) |
| 350 | .expect(1); |
| 351 | |
| 352 | let m_delete = Mock::given(method("DELETE")) |
| 353 | .respond_with(ResponseTemplate::new(204)) |
| 354 | .expect(1); |
| 355 | |
| 356 | let mock_guard_get = mock_server.register_as_scoped(m_get).await; |
| 357 | let url = format!("{}/", mock_server.uri()); |
| 358 | let manager = QuickManager::default(); |
| 359 | |
| 360 | let client = ClientBuilder::new(Client::new()) |
| 361 | .with(Cache(HttpCache { |
| 362 | mode: CacheMode::Default, |
| 363 | manager: manager.clone(), |
| 364 | options: HttpCacheOptions::default(), |
| 365 | })) |
| 366 | .build(); |
| 367 | |
| 368 | // Cache a GET response |
| 369 | client.get(url.clone()).send().await?; |
| 370 | |
| 371 | // Verify it's cached |
| 372 | let data = http_cache::CacheManager::get( |
| 373 | &manager, |
| 374 | &format!("GET:{}", url_parse(&url)?), |
| 375 | ) |
| 376 | .await?; |
| 377 | assert!(data.is_some()); |
| 378 | |
| 379 | drop(mock_guard_get); |
| 380 | let _mock_guard_delete = mock_server.register_as_scoped(m_delete).await; |
| 381 | |
| 382 | // DELETE request should invalidate cache |
| 383 | let delete_res = client.delete(url.clone()).send().await?; |
| 384 | assert_eq!(delete_res.status(), 204); |
| 385 | |
| 386 | // Verify cache was invalidated |
| 387 | let data = http_cache::CacheManager::get( |
| 388 | &manager, |
| 389 | &format!("GET:{}", url_parse(&url)?), |
| 390 | ) |
| 391 | .await?; |
| 392 | assert!(data.is_none()); |
| 393 | |
| 394 | Ok(()) |
| 395 | } |
| 396 | |
| 397 | #[tokio::test] |
| 398 | async fn options_request_not_cached() -> Result<()> { |