use std::sync::Arc; use domain::testing::{ InMemoryStore, InMemoryWrapUpRepository, InMemoryWrapUpStatsQuery, NoopFederationAdminQuery, }; use domain::{ ports::{ AuthService, DiaryExporter, DiaryQuery, DocumentParser, EventPublisher, GoalCommand, GoalQuery, ImportProfileRepository, ImportSessionRepository, MetadataClient, MovieCommand, MovieProfileRepository, MovieQuery, ObjectStorage, PasswordHasher, PersonCommand, PersonQuery, PosterFetcherClient, RefreshSessionRepository, ReviewRepository, SearchCommand, SearchPort, StatsRepository, UserProfileFieldsRepository, UserRepository, UserSettingsRepository, WatchEventCommand, WatchEventQuery, WatchlistRepository, WebhookTokenRepository, WrapUpRepository, WrapUpStatsQuery, }, testing::{ FakeAuthService, FakeDiaryQuery, FakeDocumentParser, FakeMetadataClient, FakePasswordHasher, FakePersonQuery, FakePosterFetcher, FakeSearchCommand, FakeSearchPort, FakeStatsRepository, NoopEventPublisher, NoopObjectStorage, PanicDiaryExporter, PanicPersonCommand, }, }; use async_trait::async_trait; use domain::errors::DomainError; use application::{config::AppSettings, diary::commands::LogReviewCommand, ports::ReviewLogger}; pub struct NoopReviewLogger; #[async_trait] impl ReviewLogger for NoopReviewLogger { async fn log_review(&self, _cmd: LogReviewCommand) -> Result<(), DomainError> { Ok(()) } } pub struct TestContextBuilder { pub movie_command: Arc, pub movie_query: Arc, pub review_repo: Arc, pub diary_repo: Arc, pub diary_exporter: Arc, pub document_parser: Arc, pub stats_repo: Arc, pub metadata_client: Arc, pub poster_fetcher: Arc, pub object_storage: Arc, pub event_publisher: Arc, pub auth_service: Arc, pub password_hasher: Arc, pub user_repo: Arc, pub import_session_repo: Arc, pub import_profile_repo: Arc, pub movie_profile_repo: Arc, pub watchlist_repo: Arc, pub watch_event_command: Arc, pub watch_event_query: Arc, pub webhook_token_repo: Arc, pub profile_fields_repo: Arc, pub person_command: Arc, pub person_query: Arc, pub search_port: Arc, pub search_command: Arc, pub wrapup_stats: Arc, pub wrapup_repo: Arc, pub goal_command: Arc, pub goal_query: Arc, pub user_settings_repo: Arc, pub review_logger: Arc, pub social_command: Arc, pub social_query_unified: Arc, pub block_query: Arc, pub federation_admin: Arc, pub refresh_session_repo: Arc, pub config: AppSettings, } impl Default for TestContextBuilder { fn default() -> Self { Self::new() } } impl TestContextBuilder { pub fn new() -> Self { let store = InMemoryStore::new(); Self { movie_command: Arc::clone(&store) as _, movie_query: Arc::clone(&store) as _, review_repo: Arc::clone(&store) as _, diary_repo: FakeDiaryQuery::new(), diary_exporter: Arc::new(PanicDiaryExporter), document_parser: Arc::new(FakeDocumentParser), stats_repo: FakeStatsRepository::new(), metadata_client: Arc::new(FakeMetadataClient), poster_fetcher: Arc::new(FakePosterFetcher), object_storage: Arc::new(NoopObjectStorage), event_publisher: NoopEventPublisher::new(), auth_service: Arc::new(FakeAuthService), password_hasher: Arc::new(FakePasswordHasher), user_repo: Arc::clone(&store) as _, import_session_repo: Arc::clone(&store) as _, import_profile_repo: Arc::clone(&store) as _, movie_profile_repo: Arc::clone(&store) as _, watchlist_repo: Arc::clone(&store) as _, watch_event_command: Arc::clone(&store) as _, watch_event_query: Arc::clone(&store) as _, webhook_token_repo: Arc::clone(&store) as _, profile_fields_repo: Arc::clone(&store) as _, person_command: Arc::new(PanicPersonCommand), person_query: Arc::new(FakePersonQuery), search_port: Arc::new(FakeSearchPort), search_command: Arc::new(FakeSearchCommand), wrapup_stats: InMemoryWrapUpStatsQuery::new(), wrapup_repo: InMemoryWrapUpRepository::new(), goal_command: Arc::clone(&store) as _, goal_query: Arc::clone(&store) as _, user_settings_repo: Arc::clone(&store) as _, review_logger: Arc::new(NoopReviewLogger), social_command: Arc::clone(&store) as _, social_query_unified: Arc::clone(&store) as _, block_query: Arc::clone(&store) as _, federation_admin: Arc::new(NoopFederationAdminQuery), refresh_session_repo: Arc::clone(&store) as _, config: AppSettings { allow_registration: true, base_url: "http://localhost:3000".into(), rate_limit: 20, refresh_ttl_seconds: 2_592_000, secure_cookies: false, cors_origins: String::new(), wrapup: application::config::WrapUpSettings { font_path: None, logo_path: None, bg_dir: None, }, }, } } pub fn with_movie_command(mut self, r: Arc) -> Self { self.movie_command = r; self } pub fn with_movie_query(mut self, r: Arc) -> Self { self.movie_query = r; self } pub fn with_reviews(mut self, r: Arc) -> Self { self.review_repo = r; self } pub fn with_users(mut self, r: Arc) -> Self { self.user_repo = r; self } pub fn with_watchlist(mut self, r: Arc) -> Self { self.watchlist_repo = r; self } pub fn with_diary(mut self, r: Arc) -> Self { self.diary_repo = r; self } pub fn with_event_publisher(mut self, p: Arc) -> Self { self.event_publisher = p; self } pub fn wrapup_stats(mut self, r: Arc) -> Self { self.wrapup_stats = r; self } pub fn with_goal_command(mut self, r: Arc) -> Self { self.goal_command = r; self } pub fn with_goal_query(mut self, r: Arc) -> Self { self.goal_query = r; self } pub fn with_webhook_tokens(mut self, r: Arc) -> Self { self.webhook_token_repo = r; self } pub fn with_watch_event_command(mut self, r: Arc) -> Self { self.watch_event_command = r; self } pub fn with_watch_event_query(mut self, r: Arc) -> Self { self.watch_event_query = r; self } pub fn with_import_sessions(mut self, r: Arc) -> Self { self.import_session_repo = r; self } pub fn with_import_profiles(mut self, r: Arc) -> Self { self.import_profile_repo = r; self } pub fn with_movie_profiles(mut self, r: Arc) -> Self { self.movie_profile_repo = r; self } pub fn with_user_settings(mut self, r: Arc) -> Self { self.user_settings_repo = r; self } pub fn with_profile_fields(mut self, r: Arc) -> Self { self.profile_fields_repo = r; self } pub fn with_review_logger(mut self, r: Arc) -> Self { self.review_logger = r; self } pub fn with_stats(mut self, r: Arc) -> Self { self.stats_repo = r; self } pub fn with_person_query(mut self, r: Arc) -> Self { self.person_query = r; self } pub fn with_search_port(mut self, r: Arc) -> Self { self.search_port = r; self } pub fn with_search_command(mut self, r: Arc) -> Self { self.search_command = r; self } pub fn with_document_parser(mut self, r: Arc) -> Self { self.document_parser = r; self } pub fn with_poster_fetcher(mut self, r: Arc) -> Self { self.poster_fetcher = r; self } pub fn with_metadata_client(mut self, r: Arc) -> Self { self.metadata_client = r; self } pub fn with_wrapup_repo(mut self, r: Arc) -> Self { self.wrapup_repo = r; self } pub fn with_config(mut self, config: AppSettings) -> Self { self.config = config; self } }