using BigRegister.Api.Data; using BigRegister.Domain.Applications; using BigRegister.Domain.Beoordeling; using BigRegister.Tests.Builders; namespace BigRegister.Tests.Domain; public class BeoordelingRuleTests { [Theory] [InlineData(AanvraagStatusTag.Ingediend, true)] [InlineData(AanvraagStatusTag.InBehandeling, true)] [InlineData(AanvraagStatusTag.MeerInfoGevraagd, true)] [InlineData(AanvraagStatusTag.Goedgekeurd, false)] [InlineData(AanvraagStatusTag.Afgewezen, false)] public void Only_open_statuses_are_decidable(AanvraagStatusTag tag, bool expected) => Assert.Equal(expected, BeoordelingRules.CanDecide(tag)); // The toelichting rule, moved here from an inline endpoint check. [Theory] [InlineData(Besluit.Goedkeuren, false)] [InlineData(Besluit.Afwijzen, true)] [InlineData(Besluit.MeerInfoOpvragen, true)] public void Only_a_non_approval_requires_a_toelichting(Besluit besluit, bool expected) => Assert.Equal(expected, BeoordelingRules.RequiresToelichting(besluit)); // The transition table at the AGGREGATE level, not just against a bare tag — // an Aanvraag whose BesluitStatus already records a terminal decision computes a terminal // StatusAt, and CanDecide refuses a further besluit regardless of which one. Pins the // domain statement "Afgewezen/Goedgekeurd → no further besluit" independent of the // endpoint's own (integration-level) Already_decided_case_rejects_a_further_besluit. // Built via Given, not a hand-rolled Aanvraag literal — Decided(Besluit.Afwijzen) with // no toelichting simply couldn't compile as a fixture here. [Theory] [InlineData(Besluit.Goedkeuren)] [InlineData(Besluit.Afwijzen)] public void A_terminal_decision_refuses_any_further_besluit(Besluit recorded) { var now = DateTimeOffset.UtcNow; var toelichting = recorded == Besluit.Goedkeuren ? null : "toelichting"; var aanvraag = Given.Concept(owner: "test").Submitted().Decided(recorded, toelichting).Build(); Assert.False(BeoordelingRules.CanDecide(aanvraag.StatusAt(now).Tag!.Value)); } [Fact] public void MeerInfoOpvragen_is_not_terminal_a_further_besluit_is_still_legal() { var now = DateTimeOffset.UtcNow; var aanvraag = Given.Concept(owner: "test").Submitted().Decided(Besluit.MeerInfoOpvragen, "toelichting").Build(); Assert.True(BeoordelingRules.CanDecide(aanvraag.StatusAt(now).Tag!.Value)); } }