Skip to content

Commit

Permalink
feat: or-2521 prevent lidmaatschap referring to self
Browse files Browse the repository at this point in the history
  • Loading branch information
emalfroy authored and janlesage committed Oct 30, 2024
1 parent 6cfa651 commit 0009605
Show file tree
Hide file tree
Showing 11 changed files with 599 additions and 151 deletions.
545 changes: 399 additions & 146 deletions src/AssociationRegistry/Resources/ExceptionMessages.Designer.cs

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions src/AssociationRegistry/Resources/ExceptionMessages.resx
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,12 @@
<data name="VerenigingKanGeenLidWordenVanVerwijderdeVereniging">
<value>Een vereniging kan geen lid worden van een verwijderde vereniging.</value>
</data>
<data name="LidmaatschapIsOverlappend">
<value>Een lidmaatschap mag niet overlappen voor eenzelfde vereniging.</value>
</data>
<data name="LidmaatschapMagNietVerwijzenNaarEigenVereniging">
<value>Een lidmaatschap mag niet verwijzen naar de vereniging waarbij hij wordt toegevoegd.</value>
</data>
<data name="VerenigingWerdVerwijderd">
<value>Deze vereniging werd verwijderd.</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace AssociationRegistry.Vereniging.Exceptions;

using Be.Vlaanderen.Basisregisters.AggregateSource;
using Resources;
using System.Runtime.Serialization;

public class LidmaatschapIsOverlappend : DomainException
{
public LidmaatschapIsOverlappend() : base(ExceptionMessages.LidmaatschapIsOverlappend)
{
}

protected LidmaatschapIsOverlappend(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace AssociationRegistry.Vereniging.Exceptions;

using Be.Vlaanderen.Basisregisters.AggregateSource;
using Resources;
using System.Runtime.Serialization;

public class LidmaatschapMagNietVerwijzenNaarEigenVereniging : DomainException
{
public LidmaatschapMagNietVerwijzenNaarEigenVereniging() : base(ExceptionMessages.LidmaatschapMagNietVerwijzenNaarEigenVereniging)
{
}

protected LidmaatschapMagNietVerwijzenNaarEigenVereniging(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,24 @@ public Lidmaatschap[] VoegToe(params Lidmaatschap[] toeTeVoegenLidmaatschappen)

public Lidmaatschap VoegToe(Lidmaatschap toeTeVoegenLidmaatschap)
{
//ThrowIfCannotAppendOrUpdate(toeTeVoegenLidmaatschap);
ThrowIfCannotAppendOrUpdate(toeTeVoegenLidmaatschap);

return toeTeVoegenLidmaatschap with { LidmaatschapId = NextId };
}

private void ThrowIfCannotAppendOrUpdate(Lidmaatschap lidmaatschap)
{
MustNotOverlapForSameAndereVereniging(lidmaatschap);
}

private void MustNotOverlapForSameAndereVereniging(Lidmaatschap lidmaatschap)
{
Throw<LidmaatschapIsOverlappend>.If(
Items
.Where(x => lidmaatschap.AndereVereniging == x.AndereVereniging)
.Any(x => lidmaatschap.Geldigheidsperiode.OverlapsWith(x.Geldigheidsperiode)));
}

public new Lidmaatschap this[int lidmaatschapId]
=> this.Single(l => l.LidmaatschapId == lidmaatschapId);

Expand Down
2 changes: 2 additions & 0 deletions src/AssociationRegistry/Vereniging/VerenigingOfAnyKind.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ public void VerwijderLocatie(int locatieId)

public Lidmaatschap VoegLidmaatschapToe(Lidmaatschap toeTeVoegenLidmaatschap)
{
Throw<LidmaatschapMagNietVerwijzenNaarEigenVereniging>.If(VCode == toeTeVoegenLidmaatschap.AndereVereniging);

var toegevoegdLidmaatschap = State.Lidmaatschappen.VoegToe(toeTeVoegenLidmaatschap);

AddEvent(LidmaatschapWerdToegevoegd.With(toegevoegdLidmaatschap));
Expand Down
4 changes: 0 additions & 4 deletions test/AssociationRegistry.Test/AssociationRegistry.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,5 @@
<Content Include="appsettings.*.json" CopyToOutputDirectory="Always" />
</ItemGroup>

<ItemGroup>
<Folder Include="When_VoegLidmaatschapToe\" />
</ItemGroup>

<Import Project="..\..\.paket\Paket.Restore.targets" />
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
namespace AssociationRegistry.Test.LidmaatschappenTests.When_Adding_A_Lidmaatschap;

using AutoFixture;
using Common.AutoFixture;
using FluentAssertions;
using Vereniging;
using Xunit;

public class Given_An_Overlapping_Periode_For_Another_Andere_Vereniging
{
[Fact]
public void Then_It_Returns_With_Next_Id()
{
var fixture = new Fixture().CustomizeDomain();

var andereVereniging = fixture.Create<VCode>();
var bestaandLidmaatschap = fixture.Create<Lidmaatschap>() with
{
LidmaatschapId = 1,
AndereVereniging = andereVereniging,
Geldigheidsperiode = Geldigheidsperiode.Infinity,
};
var toeTeVoegenLidmaatschap = fixture.Create<Lidmaatschap>() with
{
AndereVereniging = fixture.Create<VCode>(),
};

var sut = Lidmaatschappen.Empty.Hydrate([
bestaandLidmaatschap,
]);

var actual = sut.VoegToe(toeTeVoegenLidmaatschap);

actual.Should().BeEquivalentTo(toeTeVoegenLidmaatschap with
{
LidmaatschapId = bestaandLidmaatschap.LidmaatschapId + 1,
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
namespace AssociationRegistry.Test.LidmaatschappenTests.When_Adding_A_Lidmaatschap;

using AutoFixture;
using Common.AutoFixture;
using FluentAssertions;
using Resources;
using Vereniging;
using Vereniging.Exceptions;
using Xunit;

public class Given_An_Overlapping_Periode_For_The_Same_Andere_Vereniging
{
[Fact]
public void Then_It_Throws()
{
var fixture = new Fixture().CustomizeDomain();

var andereVereniging = fixture.Create<VCode>();
var bestaandLidmaatschap = fixture.Create<Lidmaatschap>() with
{
AndereVereniging = andereVereniging,
Geldigheidsperiode = Geldigheidsperiode.Infinity,
};
var toeTeVoegenLidmaatschap = fixture.Create<Lidmaatschap>() with
{
AndereVereniging = andereVereniging,
};

var sut = Lidmaatschappen.Empty.Hydrate([
bestaandLidmaatschap,
]);

var exception = Assert.Throws<LidmaatschapIsOverlappend>(() => sut.VoegToe(toeTeVoegenLidmaatschap));
exception.Message.Should().Be(ExceptionMessages.LidmaatschapIsOverlappend);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
namespace AssociationRegistry.Test.LidmaatschappenTests.When_Adding_A_Lidmaatschap;

using AutoFixture;
using Common.AutoFixture;
using FluentAssertions;
using Vereniging;
using Xunit;

public class Given_No_Overlapping_Periode_For_The_Same_Andere_Vereniging
{
[Fact]
public void Then_It_Adds()
{
var fixture = new Fixture().CustomizeDomain();

var andereVereniging = fixture.Create<VCode>();

var bestaandLidmaatschap = fixture.Create<Lidmaatschap>() with
{
AndereVereniging = andereVereniging,
Geldigheidsperiode = new Geldigheidsperiode(new GeldigVan(1999, 10, 10), new GeldigTot(1999, 10, 10)),
};

var toeTeVoegenLidmaatschap = fixture.Create<Lidmaatschap>() with
{
AndereVereniging = andereVereniging,
Geldigheidsperiode = new Geldigheidsperiode(new GeldigVan(2020, 10, 10), new GeldigTot(2020, 10, 10)),
};

var sut = Lidmaatschappen.Empty.Hydrate([
bestaandLidmaatschap,
]);

var actual = sut.VoegToe(toeTeVoegenLidmaatschap);

actual.Should().BeEquivalentTo(toeTeVoegenLidmaatschap with
{
LidmaatschapId = bestaandLidmaatschap.LidmaatschapId + 1,
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
namespace AssociationRegistry.Test.When_VoegLidmaatschapToe;

using AutoFixture;
using Common.AutoFixture;
using Events;
using FluentAssertions;
using Resources;
using Vereniging;
using Vereniging.Exceptions;
using Xunit;

public class Given_AndereVerwijstNaamEigenVereniging
{
[Fact]
public void Then_Throws()
{
var fixture = new Fixture().CustomizeDomain();

var sut = new VerenigingOfAnyKind();
var feitelijkeVerenigingWerdGeregistreerd = fixture.Create<FeitelijkeVerenigingWerdGeregistreerd>();
sut.Hydrate(new VerenigingState().Apply(feitelijkeVerenigingWerdGeregistreerd));

var exception = Assert.Throws<LidmaatschapMagNietVerwijzenNaarEigenVereniging>(() => sut.VoegLidmaatschapToe(fixture.Create<Lidmaatschap>() with
{
AndereVereniging = VCode.Create(feitelijkeVerenigingWerdGeregistreerd.VCode),
}));

exception.Message.Should().Be(ExceptionMessages.LidmaatschapMagNietVerwijzenNaarEigenVereniging);
}
}

0 comments on commit 0009605

Please sign in to comment.