Files
k-photos/crates/application/tests/catalog/queries/get_timeline.rs

63 lines
1.9 KiB
Rust

use application::catalog::{GetTimelineHandler, GetTimelineQuery};
use application::testing::{InMemoryAssetMetadataRepository, InMemoryAssetRepository};
use domain::catalog::entities::{Asset, AssetType, SourceReference};
use domain::ports::AssetRepository;
use domain::value_objects::{Checksum, SystemId};
use std::sync::Arc;
async fn seed_assets(repo: &InMemoryAssetRepository, owner: SystemId, count: usize) {
for i in 0..count {
let hex = format!("{:0>64x}", i + 1);
let source = SourceReference {
volume_id: SystemId::new(),
relative_path: format!("photos/img{i}.jpg"),
checksum: Checksum::new(hex).unwrap(),
};
let asset = Asset::new(source, AssetType::Image, "image/jpeg", 1024, owner);
repo.save(&asset).await.unwrap();
}
}
#[tokio::test]
async fn returns_paginated_assets() {
let asset_repo = Arc::new(InMemoryAssetRepository::new());
let meta_repo = Arc::new(InMemoryAssetMetadataRepository::new());
let owner = SystemId::new();
seed_assets(&asset_repo, owner, 5).await;
let handler = GetTimelineHandler::new(asset_repo, meta_repo);
let page = handler
.execute(GetTimelineQuery {
owner_id: owner,
caller_id: None,
limit: 3,
offset: 0,
})
.await
.unwrap();
assert_eq!(page.len(), 3);
}
#[tokio::test]
async fn returns_empty_for_no_assets() {
let asset_repo = Arc::new(InMemoryAssetRepository::new());
let meta_repo = Arc::new(InMemoryAssetMetadataRepository::new());
let handler = GetTimelineHandler::new(asset_repo, meta_repo);
let page = handler
.execute(GetTimelineQuery {
owner_id: SystemId::new(),
caller_id: None,
limit: 10,
offset: 0,
})
.await
.unwrap();
assert!(page.is_empty());
}