use tork::testing::TestClient;
use tork::{api_model, get, App, Cache};
#[api_model]
struct Fetched {
value: Option<String>,
}
#[get("/set/{key}/{value}")]
async fn set_value(key: String, value: String, cache: Cache) -> tork::Result<Fetched> {
cache.set(&key, &value).await?;
Ok(Fetched { value: Some(value) })
}
#[get("/get/{key}")]
async fn get_value(key: String, cache: Cache) -> tork::Result<Fetched> {
let value: Option<String> = cache.get(&key).await?;
Ok(Fetched { value })
}
#[tokio::test]
async fn cache_persists_across_requests() {
let client = TestClient::new(
App::new()
.cache(Cache::in_memory())
.include(set_value)
.include(get_value)
.build_test()
.await
.unwrap(),
)
.await
.unwrap();
let before = client.get("/get/greeting").send().await.unwrap();
assert_eq!(before.status(), 200);
assert!(before.text().unwrap().contains("\"value\":null"));
let set = client.get("/set/greeting/hello").send().await.unwrap();
assert_eq!(set.status(), 200);
let after = client.get("/get/greeting").send().await.unwrap();
assert_eq!(after.status(), 200);
assert!(after.text().unwrap().contains("\"hello\""));
client.shutdown().await.unwrap();
}
#[tokio::test]
async fn injecting_cache_without_configuring_it_errors() {
let client = TestClient::new(App::new().include(get_value).build_test().await.unwrap())
.await
.unwrap();
let response = client.get("/get/x").send().await.unwrap();
assert_eq!(response.status(), 500);
client.shutdown().await.unwrap();
}