-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRecruitCreatureRequiresResourcesTest.java
More file actions
136 lines (116 loc) · 5.32 KB
/
RecruitCreatureRequiresResourcesTest.java
File metadata and controls
136 lines (116 loc) · 5.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package com.dddheroes.heroesofddd.creaturerecruitment.write.recruitcreature;
import com.dddheroes.heroesofddd.TestcontainersConfiguration;
import com.dddheroes.heroesofddd.creaturerecruitment.events.CreatureRecruited;
import com.dddheroes.heroesofddd.creaturerecruitment.write.DwellingId;
import com.dddheroes.heroesofddd.creaturerecruitment.write.builddwelling.BuildDwelling;
import com.dddheroes.heroesofddd.creaturerecruitment.write.changeavailablecreatures.IncreaseAvailableCreatures;
import com.dddheroes.heroesofddd.resourcespool.events.ResourcesWithdrawn;
import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolId;
import com.dddheroes.heroesofddd.resourcespool.write.deposit.DepositResources;
import com.dddheroes.heroesofddd.shared.CreatureIds;
import com.dddheroes.heroesofddd.shared.domain.identifiers.ArmyId;
import com.dddheroes.heroesofddd.shared.domain.identifiers.GameId;
import com.dddheroes.heroesofddd.shared.domain.identifiers.PlayerId;
import com.dddheroes.heroesofddd.shared.domain.valueobjects.Resources;
import com.dddheroes.heroesofddd.shared.slices.write.Command;
import com.dddheroes.heroesofddd.utils.EventStoreAssertions;
import org.axonframework.commandhandling.gateway.CommandGateway;
import org.axonframework.messaging.MetaData;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import java.util.Map;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
@Import(TestcontainersConfiguration.class)
@SpringBootTest(properties = {
"application.interceptors.paid-commands.enabled=true"
})
class RecruitCreatureRequiresResourcesTest {
private static final String GAME_ID = GameId.random().raw();
private static final String PLAYER_ID = PlayerId.random().raw();
private static final Map<String, Integer> PHOENIX_COST = Map.of(
"GOLD", 2000,
"MERCURY", 1
);
@Autowired
private CommandGateway commandGateway;
@Autowired
private EventStoreAssertions eventStoreAssertions;
@Test
void whenRecruitingCreature_thenProcessPaymentAndRecruitSuccessfully() {
// given
var resourcesPoolId = playerResourcesPoolId();
var dwellingId = DwellingId.random().raw();
var armyId = ArmyId.random().raw();
var creatureId = CreatureIds.phoenix().raw();
// initialize resources pool with sufficient resources
executePlayerCommand(
DepositResources.command(resourcesPoolId, "GOLD", 3000)
);
executePlayerCommand(
DepositResources.command(resourcesPoolId, "MERCURY", 2)
);
// build dwelling and make creatures available
executePlayerCommand(
BuildDwelling.command(dwellingId, creatureId, PHOENIX_COST)
);
executePlayerCommand(
IncreaseAvailableCreatures.command(dwellingId, creatureId, 5)
);
// when
var recruitCommand = RecruitCreature.command(
dwellingId,
creatureId,
armyId,
1,
Resources.from(PHOENIX_COST).raw()
);
// then
assertDoesNotThrow(() -> executePlayerCommand(recruitCommand));
eventStoreAssertions.assertEventStored(dwellingId, CreatureRecruited.class);
eventStoreAssertions.assertEventNotStored(dwellingId, ResourcesWithdrawn.class);
}
@Test
void givenInsufficientResources_whenRecruitingCreature_thenNoCreatureRecruitedEventStored() {
// given
var resourcesPoolId = playerResourcesPoolId();
var dwellingId = DwellingId.random().raw();
var armyId = ArmyId.random().raw();
var creatureId = CreatureIds.phoenix().raw();
// initialize resources pool with insufficient resources
executePlayerCommand(DepositResources.command(resourcesPoolId, "GOLD", 1000));
executePlayerCommand(DepositResources.command(resourcesPoolId, "MERCURY", 2));
// build dwelling and make creatures available
executePlayerCommand(
BuildDwelling.command(dwellingId, creatureId, PHOENIX_COST)
);
executePlayerCommand(
IncreaseAvailableCreatures.command(dwellingId, creatureId, 5)
);
// when
var recruitCommand = RecruitCreature.command(
dwellingId,
creatureId,
armyId,
1,
Resources.from(PHOENIX_COST).raw()
);
// then
assertThatThrownBy(() -> executePlayerCommand(recruitCommand))
.satisfies(e -> assertThat(e).hasMessageContaining("Cannot withdraw more than deposited resources"));
eventStoreAssertions.assertEventNotStored(dwellingId, CreatureRecruited.class);
eventStoreAssertions.assertEventNotStored(dwellingId, ResourcesWithdrawn.class);
}
private void executePlayerCommand(Command command) {
commandGateway.sendAndWait(command, gameMetaData());
}
private static MetaData gameMetaData() {
return MetaData.with("gameId", GAME_ID)
.and("playerId", PLAYER_ID);
}
private static String playerResourcesPoolId() {
return ResourcesPoolId.of(PLAYER_ID).raw();
}
}