Skip to content

Commit 311f7a4

Browse files
✨ feat: Creature Recruitment | compensate with IncreaseAvailableCreatures if army is full after CreatureRecruited (#18)
1 parent 0feabce commit 311f7a4

3 files changed

Lines changed: 101 additions & 2 deletions

File tree

src/main/java/com/dddheroes/heroesofddd/creaturerecruitment/automation/WhenCreatureRecruitedThenAddToArmyProcessor.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.dddheroes.heroesofddd.creaturerecruitment.automation;
22

33
import com.dddheroes.heroesofddd.armies.write.addcreature.AddCreatureToArmy;
4+
import com.dddheroes.heroesofddd.creaturerecruitment.write.changeavailablecreatures.IncreaseAvailableCreatures;
45
import com.dddheroes.heroesofddd.creaturerecruitment.write.recruitcreature.CreatureRecruited;
56
import com.dddheroes.heroesofddd.shared.GameMetaData;
67
import org.axonframework.commandhandling.gateway.CommandGateway;
@@ -33,6 +34,15 @@ void react(
3334
event.quantity()
3435
);
3536

36-
commandGateway.sendAndWait(command, GameMetaData.with(gameId, playerId));
37+
try {
38+
commandGateway.sendAndWait(command, GameMetaData.with(gameId, playerId));
39+
} catch (Exception e) {
40+
var compensatingAction = IncreaseAvailableCreatures.command(
41+
event.dwellingId(),
42+
event.creatureId(),
43+
event.quantity()
44+
);
45+
commandGateway.sendAndWait(compensatingAction, GameMetaData.with(gameId, playerId));
46+
}
3747
}
3848
}

src/test/java/com/dddheroes/heroesofddd/creaturerecruitment/automation/WhenCreatureRecruitedThenAddToArmyTest.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.dddheroes.heroesofddd.creaturerecruitment.automation;
22

33
import com.dddheroes.heroesofddd.TestcontainersConfiguration;
4+
import com.dddheroes.heroesofddd.armies.write.ArmyEvent;
45
import com.dddheroes.heroesofddd.armies.write.addcreature.AddCreatureToArmy;
6+
import com.dddheroes.heroesofddd.armies.write.addcreature.CreatureAddedToArmy;
57
import com.dddheroes.heroesofddd.creaturerecruitment.write.DwellingEvent;
68
import com.dddheroes.heroesofddd.creaturerecruitment.write.DwellingId;
79
import com.dddheroes.heroesofddd.creaturerecruitment.write.builddwelling.DwellingBuilt;
810
import com.dddheroes.heroesofddd.creaturerecruitment.write.changeavailablecreatures.AvailableCreaturesChanged;
11+
import com.dddheroes.heroesofddd.creaturerecruitment.write.changeavailablecreatures.IncreaseAvailableCreatures;
912
import com.dddheroes.heroesofddd.creaturerecruitment.write.recruitcreature.CreatureRecruited;
1013
import com.dddheroes.heroesofddd.shared.ArmyId;
1114
import 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
}

src/test/java/com/dddheroes/heroesofddd/creaturerecruitment/read/getalldwellings/GetAllDwellingsTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ void projectingDwellingReadModel_TestCase2() {
8181
}
8282

8383
private GetAllDwellings getAllDwellings() {
84-
System.out.println("GET ALL DWELLINGS: " + GAME_ID);
8584
return GetAllDwellings.query(GAME_ID);
8685
}
8786

0 commit comments

Comments
 (0)