#![cfg(feature = "macros")]
use oxcache::cached;
use oxcache::Cache;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
struct User {
id: u64,
name: String,
}
#[cached(service = "macros_sync_test_svc", sync)]
fn get_user_sync(id: u64) -> Result<User, String> {
Ok(User {
id,
name: format!("User {}", id),
})
}
#[tokio::test(flavor = "multi_thread")]
async fn sync_mode_generates_sync_fn() {
let cache: Cache<String, Vec<u8>> = Cache::builder().sync_mode(true).build().await.unwrap();
cache.register_for_macro("macros_sync_test_svc").await.unwrap();
let result1 = get_user_sync(1).unwrap();
assert_eq!(result1.id, 1);
assert_eq!(result1.name, "User 1");
let result2 = get_user_sync(1).unwrap();
assert_eq!(result2.id, 1);
assert_eq!(result2.name, "User 1");
assert_eq!(result1, result2, "second call should return cached value");
}
#[cached(service = "macros_async_test_svc")]
async fn get_user_async(id: u64) -> Result<User, String> {
Ok(User {
id,
name: format!("Async User {}", id),
})
}
#[tokio::test(flavor = "multi_thread")]
async fn no_sync_keeps_async_behavior() {
let cache: Cache<String, Vec<u8>> = Cache::builder().build().await.unwrap();
cache.register_for_macro("macros_async_test_svc").await.unwrap();
let result1 = get_user_async(1).await.unwrap();
assert_eq!(result1.id, 1);
assert_eq!(result1.name, "Async User 1");
let result2 = get_user_async(1).await.unwrap();
assert_eq!(result2.id, 1);
assert_eq!(result2.name, "Async User 1");
assert_eq!(result1, result2, "second call should return cached value");
}
#[test]
fn sync_flag_with_async_fn_compile_error() {
let t = trybuild::TestCases::new();
t.compile_fail("tests/macros_sync_compile_fail/*.rs");
}