1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 19:00:23 +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:
Sebastian Frick 2026-02-19 21:24:39 +01:00
parent cf93b847e5
commit a132211a74
11 changed files with 229 additions and 3 deletions

View file

@ -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 {