mirror of
https://github.com/s-frick/effigenix.git
synced 2026-03-28 13:59:36 +01:00
feat(production): Rezept aktivieren (#29)
Rezepte können vom DRAFT- in den ACTIVE-Status überführt werden.
Voraussetzung: mindestens eine Zutat muss vorhanden sein.
Inkl. Use Case, REST-Endpoint POST /recipes/{id}/activate,
Domain-Tests und Error Handling.
This commit is contained in:
parent
cf93b847e5
commit
a132211a74
11 changed files with 229 additions and 3 deletions
|
|
@ -468,6 +468,78 @@ class RecipeTest {
|
|||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("activate()")
|
||||
class Activate {
|
||||
|
||||
@Test
|
||||
@DisplayName("should activate DRAFT recipe with ingredients")
|
||||
void should_Activate_When_DraftWithIngredients() {
|
||||
var recipe = Recipe.create(validDraft()).unsafeGetValue();
|
||||
recipe.addIngredient(validIngredientDraft(1));
|
||||
var updatedBefore = recipe.updatedAt();
|
||||
|
||||
var result = recipe.activate();
|
||||
|
||||
assertThat(result.isSuccess()).isTrue();
|
||||
assertThat(recipe.status()).isEqualTo(RecipeStatus.ACTIVE);
|
||||
assertThat(recipe.updatedAt()).isAfter(updatedBefore);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("should fail when DRAFT recipe has no ingredients")
|
||||
void should_Fail_When_NoIngredients() {
|
||||
var recipe = Recipe.create(validDraft()).unsafeGetValue();
|
||||
|
||||
var result = recipe.activate();
|
||||
|
||||
assertThat(result.isFailure()).isTrue();
|
||||
assertThat(result.unsafeGetError()).isInstanceOf(RecipeError.NoIngredients.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("should fail when recipe is already ACTIVE")
|
||||
void should_Fail_When_AlreadyActive() {
|
||||
var recipe = Recipe.reconstitute(
|
||||
RecipeId.generate(), new RecipeName("Test"), 1, RecipeType.FINISHED_PRODUCT,
|
||||
null, new YieldPercentage(85), 14,
|
||||
Quantity.of(new java.math.BigDecimal("100"), UnitOfMeasure.KILOGRAM).unsafeGetValue(),
|
||||
RecipeStatus.ACTIVE, List.of(), List.of(),
|
||||
java.time.LocalDateTime.now(), java.time.LocalDateTime.now()
|
||||
);
|
||||
|
||||
var result = recipe.activate();
|
||||
|
||||
assertThat(result.isFailure()).isTrue();
|
||||
var error = result.unsafeGetError();
|
||||
assertThat(error).isInstanceOf(RecipeError.InvalidStatusTransition.class);
|
||||
var transition = (RecipeError.InvalidStatusTransition) error;
|
||||
assertThat(transition.current()).isEqualTo(RecipeStatus.ACTIVE);
|
||||
assertThat(transition.target()).isEqualTo(RecipeStatus.ACTIVE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("should fail when recipe is ARCHIVED")
|
||||
void should_Fail_When_Archived() {
|
||||
var recipe = Recipe.reconstitute(
|
||||
RecipeId.generate(), new RecipeName("Test"), 1, RecipeType.FINISHED_PRODUCT,
|
||||
null, new YieldPercentage(85), 14,
|
||||
Quantity.of(new java.math.BigDecimal("100"), UnitOfMeasure.KILOGRAM).unsafeGetValue(),
|
||||
RecipeStatus.ARCHIVED, List.of(), List.of(),
|
||||
java.time.LocalDateTime.now(), java.time.LocalDateTime.now()
|
||||
);
|
||||
|
||||
var result = recipe.activate();
|
||||
|
||||
assertThat(result.isFailure()).isTrue();
|
||||
var error = result.unsafeGetError();
|
||||
assertThat(error).isInstanceOf(RecipeError.InvalidStatusTransition.class);
|
||||
var transition = (RecipeError.InvalidStatusTransition) error;
|
||||
assertThat(transition.current()).isEqualTo(RecipeStatus.ARCHIVED);
|
||||
assertThat(transition.target()).isEqualTo(RecipeStatus.ACTIVE);
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@DisplayName("Equality")
|
||||
class Equality {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue