fix: NewRemoteReview param struct, atomic review+orphan movie delete
This commit is contained in:
@@ -3,7 +3,7 @@ use std::sync::Arc;
|
||||
|
||||
use domain::{
|
||||
ports::{MovieCommand, MovieQuery, ReviewRepository},
|
||||
testing::{FakeDiaryQuery, InMemoryStore, RefusingMovieCommand},
|
||||
testing::{FakeDiaryQuery, InMemoryStore},
|
||||
value_objects::{MovieId, UserId},
|
||||
};
|
||||
|
||||
@@ -28,7 +28,6 @@ async fn deleting_a_review_removes_it() {
|
||||
let deps = DeleteReviewDeps {
|
||||
review: Arc::clone(&reviews) as _,
|
||||
diary: diary.clone() as _,
|
||||
movie_command: Arc::clone(&movies) as _,
|
||||
};
|
||||
|
||||
delete_review::execute(
|
||||
@@ -52,7 +51,6 @@ async fn deleting_a_review_removes_it() {
|
||||
async fn deleting_another_users_review_is_unauthorized() {
|
||||
let reviews = InMemoryStore::new();
|
||||
let diary = FakeDiaryQuery::new();
|
||||
let movies = Arc::clone(&reviews);
|
||||
|
||||
let movie_id = MovieId::from_uuid(uuid::Uuid::new_v4());
|
||||
let owner_id = UserId::from_uuid(uuid::Uuid::new_v4());
|
||||
@@ -64,7 +62,6 @@ async fn deleting_another_users_review_is_unauthorized() {
|
||||
let deps = DeleteReviewDeps {
|
||||
review: Arc::clone(&reviews) as _,
|
||||
diary: diary as _,
|
||||
movie_command: movies as _,
|
||||
};
|
||||
|
||||
let result = delete_review::execute(
|
||||
@@ -89,11 +86,12 @@ async fn deleting_a_review_removes_it_and_records_its_event_together() {
|
||||
let review = test_review(movie.id(), &user_id, 4);
|
||||
movies.upsert_movie(&movie, &[]).await.unwrap();
|
||||
movies.save_review(&review, &[]).await.unwrap();
|
||||
let other = test_review(movie.id(), &UserId::from_uuid(uuid::Uuid::new_v4()), 3);
|
||||
movies.save_review(&other, &[]).await.unwrap();
|
||||
diary.seed_history(movie.clone(), vec![review.clone()]);
|
||||
let deps = DeleteReviewDeps {
|
||||
review: Arc::clone(&movies) as _,
|
||||
diary: diary.clone() as _,
|
||||
movie_command: Arc::clone(&movies) as _,
|
||||
};
|
||||
|
||||
delete_review::execute(
|
||||
@@ -106,7 +104,7 @@ async fn deleting_a_review_removes_it_and_records_its_event_together() {
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(movies.review_count(), 0);
|
||||
assert_eq!(movies.review_count(), 1);
|
||||
let recorded = movies.recorded_events();
|
||||
assert_eq!(recorded.len(), 1);
|
||||
assert!(matches!(
|
||||
@@ -122,12 +120,12 @@ async fn a_refused_delete_propagates_and_records_nothing() {
|
||||
let user_id = UserId::from_uuid(uuid::Uuid::new_v4());
|
||||
let review = test_review(&MovieId::generate(), &user_id, 4);
|
||||
movies.save_review(&review, &[]).await.unwrap();
|
||||
diary.seed_history(test_movie_with_year("Terminator", 1984), vec![]);
|
||||
let deps = DeleteReviewDeps {
|
||||
review: Arc::new(crate::edit_review_test::WriteRefusingReviews(Arc::clone(
|
||||
&movies,
|
||||
))),
|
||||
diary: diary as _,
|
||||
movie_command: Arc::clone(&movies) as _,
|
||||
};
|
||||
|
||||
let result = delete_review::execute(
|
||||
@@ -157,7 +155,6 @@ async fn deleting_the_last_review_records_movie_deleted_with_the_movie_delete()
|
||||
let deps = DeleteReviewDeps {
|
||||
review: Arc::clone(&movies) as _,
|
||||
diary: diary as _,
|
||||
movie_command: Arc::clone(&movies) as _,
|
||||
};
|
||||
|
||||
delete_review::execute(
|
||||
@@ -198,7 +195,6 @@ async fn deleting_a_review_while_viewings_remain_keeps_the_movie_and_records_no_
|
||||
let deps = DeleteReviewDeps {
|
||||
review: Arc::clone(&movies) as _,
|
||||
diary: diary as _,
|
||||
movie_command: Arc::clone(&movies) as _,
|
||||
};
|
||||
|
||||
delete_review::execute(
|
||||
@@ -221,7 +217,7 @@ async fn deleting_a_review_while_viewings_remain_keeps_the_movie_and_records_no_
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn a_refused_movie_delete_propagates_and_records_no_movie_deleted() {
|
||||
async fn a_refused_review_and_movie_delete_leaves_review_and_movie_and_records_nothing() {
|
||||
let movies = InMemoryStore::new();
|
||||
let diary = FakeDiaryQuery::new();
|
||||
let movie = test_movie_with_year("Terminator", 1984);
|
||||
@@ -231,9 +227,10 @@ async fn a_refused_movie_delete_propagates_and_records_no_movie_deleted() {
|
||||
movies.save_review(&review, &[]).await.unwrap();
|
||||
diary.seed_history(movie.clone(), vec![]);
|
||||
let deps = DeleteReviewDeps {
|
||||
review: Arc::clone(&movies) as _,
|
||||
review: Arc::new(crate::edit_review_test::WriteRefusingReviews(Arc::clone(
|
||||
&movies,
|
||||
))),
|
||||
diary: diary as _,
|
||||
movie_command: Arc::new(RefusingMovieCommand),
|
||||
};
|
||||
|
||||
let result = delete_review::execute(
|
||||
@@ -246,11 +243,7 @@ async fn a_refused_movie_delete_propagates_and_records_no_movie_deleted() {
|
||||
.await;
|
||||
|
||||
assert!(result.is_err());
|
||||
assert_eq!(movies.review_count(), 1);
|
||||
assert!(movies.get_movie_by_id(movie.id()).await.unwrap().is_some());
|
||||
assert!(
|
||||
!movies
|
||||
.recorded_events()
|
||||
.iter()
|
||||
.any(|e| matches!(e, domain::events::DomainEvent::MovieDeleted { .. }))
|
||||
);
|
||||
assert!(movies.recorded_events().is_empty());
|
||||
}
|
||||
|
||||
@@ -107,9 +107,11 @@ impl ReviewRepository for WriteRefusingReviews {
|
||||
"refused".into(),
|
||||
))
|
||||
}
|
||||
async fn delete_review(
|
||||
async fn delete_review_and_orphaned_movie(
|
||||
&self,
|
||||
_: &ReviewId,
|
||||
_: &domain::value_objects::MovieId,
|
||||
_: &[domain::events::DomainEvent],
|
||||
_: &[domain::events::DomainEvent],
|
||||
) -> Result<(), domain::errors::DomainError> {
|
||||
Err(domain::errors::DomainError::InfrastructureError(
|
||||
|
||||
Reference in New Issue
Block a user