11package com .dddheroes .heroesofddd .creaturerecruitment .automation ;
22
33import com .dddheroes .heroesofddd .TestcontainersConfiguration ;
4+ import com .dddheroes .heroesofddd .armies .write .ArmyEvent ;
45import com .dddheroes .heroesofddd .armies .write .addcreature .AddCreatureToArmy ;
6+ import com .dddheroes .heroesofddd .armies .write .addcreature .CreatureAddedToArmy ;
57import com .dddheroes .heroesofddd .creaturerecruitment .write .DwellingEvent ;
68import com .dddheroes .heroesofddd .creaturerecruitment .write .DwellingId ;
79import com .dddheroes .heroesofddd .creaturerecruitment .write .builddwelling .DwellingBuilt ;
810import com .dddheroes .heroesofddd .creaturerecruitment .write .changeavailablecreatures .AvailableCreaturesChanged ;
11+ import com .dddheroes .heroesofddd .creaturerecruitment .write .changeavailablecreatures .IncreaseAvailableCreatures ;
912import com .dddheroes .heroesofddd .creaturerecruitment .write .recruitcreature .CreatureRecruited ;
1013import com .dddheroes .heroesofddd .shared .ArmyId ;
1114import com .dddheroes .heroesofddd .shared .CreatureIds ;
@@ -68,6 +71,77 @@ void whenCreatureRecruited_ThenAddCreatureToArmy() {
6871 );
6972 }
7073
74+ @ Test
75+ void givenArmyIsNotFull_whenCreatureRecruited_ThenAddToTheArmyAndDoNotCompensate () {
76+ // given
77+ var armyId = ArmyId .random ().raw ();
78+ givenArmyEvents (
79+ armyId ,
80+ new CreatureAddedToArmy (armyId , CreatureIds .angel ().raw (), 1 ),
81+ new CreatureAddedToArmy (armyId , CreatureIds .behemoth ().raw (), 1 ),
82+ new CreatureAddedToArmy (armyId , CreatureIds .bowman ().raw (), 1 ),
83+ new CreatureAddedToArmy (armyId , CreatureIds .redDragon ().raw (), 1 ),
84+ new CreatureAddedToArmy (armyId , CreatureIds .blackDragon ().raw (), 1 ),
85+ new CreatureAddedToArmy (armyId , CreatureIds .archAngel ().raw (), 1 )
86+ );
87+ // when
88+ var dwellingId = DwellingId .random ().raw ();
89+ var creatureId = CreatureIds .phoenix ().raw ();
90+ givenDwellingEvents (
91+ dwellingId ,
92+ new DwellingBuilt (dwellingId , creatureId , PHOENIX_COST ),
93+ new AvailableCreaturesChanged (dwellingId , creatureId , 3 ),
94+ new CreatureRecruited (dwellingId , creatureId , armyId , 1 , PHOENIX_COST )
95+ );
96+
97+ // and
98+ // processed by the automation
99+
100+ // then
101+ awaitUntilAsserted (() -> verify (commandGateway , times (1 ))
102+ .sendAndWait (AddCreatureToArmy .command (armyId , creatureId , 1 ), gameMetaData ())
103+ );
104+ awaitUntilAsserted (() -> verify (commandGateway , never ())
105+ .sendAndWait (IncreaseAvailableCreatures .command (dwellingId , creatureId , 2 ), gameMetaData ())
106+ );
107+ }
108+
109+ @ Test
110+ void givenArmyIsFull_whenCreatureRecruited_ThenDoNotAddToTheArmyAndCompensateRecruitment () {
111+ // given
112+ var armyId = ArmyId .random ().raw ();
113+ givenArmyEvents (
114+ armyId ,
115+ new CreatureAddedToArmy (armyId , CreatureIds .angel ().raw (), 1 ),
116+ new CreatureAddedToArmy (armyId , CreatureIds .behemoth ().raw (), 1 ),
117+ new CreatureAddedToArmy (armyId , CreatureIds .bowman ().raw (), 1 ),
118+ new CreatureAddedToArmy (armyId , CreatureIds .redDragon ().raw (), 1 ),
119+ new CreatureAddedToArmy (armyId , CreatureIds .blackDragon ().raw (), 1 ),
120+ new CreatureAddedToArmy (armyId , CreatureIds .archAngel ().raw (), 1 ),
121+ new CreatureAddedToArmy (armyId , CreatureIds .centaur ().raw (), 1 )
122+ );
123+ // when
124+ var dwellingId = DwellingId .random ().raw ();
125+ var creatureId = CreatureIds .phoenix ().raw ();
126+ givenDwellingEvents (
127+ dwellingId ,
128+ new DwellingBuilt (dwellingId , creatureId , PHOENIX_COST ),
129+ new AvailableCreaturesChanged (dwellingId , creatureId , 3 ),
130+ new CreatureRecruited (dwellingId , creatureId , armyId , 2 , PHOENIX_COST )
131+ );
132+
133+ // and
134+ // processed by the automation
135+
136+ // then
137+ awaitUntilAsserted (() -> verify (commandGateway , never ())
138+ .sendAndWait (AddCreatureToArmy .command (armyId , creatureId , 1 ), gameMetaData ())
139+ );
140+ awaitUntilAsserted (() -> verify (commandGateway , times (1 ))
141+ .sendAndWait (IncreaseAvailableCreatures .command (dwellingId , creatureId , 2 ), gameMetaData ())
142+ );
143+ }
144+
71145 private void givenDwellingEvents (String dwellingId , DwellingEvent ... events ) {
72146 for (int i = 0 ; i < events .length ; i ++) {
73147 eventGateway .publish (dwellingDomainEvent (dwellingId , i , events [i ]));
@@ -83,6 +157,22 @@ private DomainEventMessage<?> dwellingDomainEvent(String dwellingId, int sequenc
83157 ).andMetaData (gameMetaData ());
84158 }
85159
160+ private void givenArmyEvents (String armyId , ArmyEvent ... events ) {
161+ for (int i = 0 ; i < events .length ; i ++) {
162+ eventGateway .publish (armyDomainEvent (armyId , i , events [i ]));
163+ }
164+ }
165+
166+
167+ private DomainEventMessage <?> armyDomainEvent (String armyId , int sequenceNumber , ArmyEvent payload ) {
168+ return new GenericDomainEventMessage <>(
169+ "Army" ,
170+ armyId ,
171+ sequenceNumber ,
172+ payload
173+ ).andMetaData (gameMetaData ());
174+ }
175+
86176 private static MetaData gameMetaData () {
87177 return GameMetaData .with (GAME_ID , PLAYER_ID );
88178 }
0 commit comments