1+ using VerticalSliceArchitectureTemplate . Common . Domain . Heroes ;
2+ using VerticalSliceArchitectureTemplate . Common . Domain . Teams ;
3+
4+ namespace VerticalSliceArchitectureTemplate . Unit . Tests . Features . Teams ;
5+
6+ public class TeamTests
7+ {
8+ [ Theory ]
9+ [ InlineData ( "c8ad9974-ca93-44a5-9215-2f4d9e866c7a" , "cc3431a8-4a31-4f76-af64-e8198279d7a4" , false ) ]
10+ [ InlineData ( "c8ad9974-ca93-44a5-9215-2f4d9e866c7a" , "c8ad9974-ca93-44a5-9215-2f4d9e866c7a" , true ) ]
11+ public void TeamId_ShouldBeComparable ( string stringGuid1 , string stringGuid2 , bool isEqual )
12+ {
13+ // Arrange
14+ Guid guid1 = Guid . Parse ( stringGuid1 ) ;
15+ Guid guid2 = Guid . Parse ( stringGuid2 ) ;
16+ TeamId id1 = TeamId . From ( guid1 ) ;
17+ TeamId id2 = TeamId . From ( guid2 ) ;
18+
19+ // Act
20+ var areEqual = id1 == id2 ;
21+
22+ // Assert
23+ areEqual . Should ( ) . Be ( isEqual ) ;
24+ id1 . Value . Should ( ) . Be ( guid1 ) ;
25+ id2 . Value . Should ( ) . Be ( guid2 ) ;
26+ }
27+
28+ [ Fact ]
29+ public void Create_WithValidNameAndAlias_ShouldSucceed ( )
30+ {
31+ // Arrange
32+ var name = "name" ;
33+
34+ // Act
35+ var team = Team . Create ( name ) ;
36+
37+ // Assert
38+ team . Should ( ) . NotBeNull ( ) ;
39+ team . Name . Should ( ) . Be ( name ) ;
40+ }
41+
42+ [ Fact ]
43+ public void Create_WithNullNameAndAlias_ShouldThrow ( )
44+ {
45+ // Arrange
46+ string ? name = null ;
47+
48+ // Act
49+ Action act = ( ) => Team . Create ( name ! ) ;
50+
51+ // Assert
52+ act . Should ( ) . Throw < ArgumentException > ( ) . WithMessage ( "Value cannot be null. (Parameter 'name')" ) ;
53+ }
54+
55+ [ Fact ]
56+ public void AddHero_ShouldUpdateTeamPowerLevel ( )
57+ {
58+ // Arrange
59+ var hero1 = Hero . Create ( "hero1" , "alias1" ) ;
60+ var hero2 = Hero . Create ( "hero2" , "alias2" ) ;
61+ var power1 = new Power ( "Foo" , 10 ) ;
62+ var power2 = new Power ( "Bar" , 4 ) ;
63+ hero1 . UpdatePowers ( [ power1 ] ) ;
64+ hero2 . UpdatePowers ( [ power2 ] ) ;
65+ var team = Team . Create ( "name" ) ;
66+
67+ // Act
68+ team . AddHero ( hero1 ) ;
69+ team . AddHero ( hero2 ) ;
70+
71+ // Assert
72+ team . TotalPowerLevel . Should ( ) . Be ( 14 ) ;
73+ }
74+
75+ [ Fact ]
76+ public void RemoveHero_ShouldUpdateTeamPowerLevel ( )
77+ {
78+ // Arrange
79+ var hero1 = Hero . Create ( "hero1" , "alias1" ) ;
80+ var hero2 = Hero . Create ( "hero2" , "alias2" ) ;
81+ var power1 = new Power ( "Foo" , 10 ) ;
82+ var power2 = new Power ( "Bar" , 4 ) ;
83+ hero1 . UpdatePowers ( [ power1 ] ) ;
84+ hero2 . UpdatePowers ( [ power2 ] ) ;
85+ var team = Team . Create ( "name" ) ;
86+ team . AddHero ( hero1 ) ;
87+ team . AddHero ( hero2 ) ;
88+
89+ // Act
90+ team . RemoveHero ( hero1 ) ;
91+
92+ // Assert
93+ team . TotalPowerLevel . Should ( ) . Be ( 4 ) ;
94+ }
95+
96+ [ Fact ]
97+ public void ExecuteMission_ShouldUpdateTeamStatus ( )
98+ {
99+ // Arrange
100+ var team = Team . Create ( "name" ) ;
101+ team . AddHero ( Hero . Create ( "hero1" , "alias1" ) ) ;
102+
103+ // Act
104+ team . ExecuteMission ( "Mission" ) ;
105+
106+ // Assert
107+ team . Status . Should ( ) . Be ( TeamStatus . OnMission ) ;
108+ team . Missions . Should ( ) . HaveCount ( 1 ) ;
109+ team . Missions . Should ( ) . ContainSingle ( x => x . Description == "Mission" ) ;
110+ }
111+
112+ [ Fact ]
113+ public void ExecuteMission_WhenTeamNotAvailable_ShouldError ( )
114+ {
115+ // Arrange
116+ var team = Team . Create ( "name" ) ;
117+ team . AddHero ( Hero . Create ( "hero1" , "alias1" ) ) ;
118+ team . ExecuteMission ( "Mission1" ) ;
119+
120+ // Act
121+ var result = team . ExecuteMission ( "Mission2" ) ;
122+
123+ // Assert
124+ result . IsError . Should ( ) . BeTrue ( ) ;
125+ result . FirstError . Should ( ) . Be ( TeamErrors . NotAvailable ) ;
126+ }
127+
128+ [ Fact ]
129+ public void CompleteCurrentMission_ShouldUpdateTeamStatus ( )
130+ {
131+ // Arrange
132+ var team = Team . Create ( "name" ) ;
133+ team . ExecuteMission ( "Mission" ) ;
134+
135+ // Act
136+ team . CompleteCurrentMission ( ) ;
137+
138+ // Assert
139+ team . Status . Should ( ) . Be ( TeamStatus . Available ) ;
140+ }
141+
142+ [ Fact ]
143+ public void CompleteCurrentMission_WhenNoMissionHasBeenExecuted_ShouldThrow ( )
144+ {
145+ // Arrange
146+ var team = Team . Create ( "name" ) ;
147+
148+ // Act
149+ var result = team . CompleteCurrentMission ( ) ;
150+
151+ // Assert
152+ result . IsError . Should ( ) . BeTrue ( ) ;
153+ result . FirstError . Should ( ) . Be ( TeamErrors . NotOnMission ) ;
154+ }
155+
156+ [ Fact ]
157+ public void CompleteCurrentMission_WhenNotOnMission_ShouldError ( )
158+ {
159+ // Arrange
160+ var team = Team . Create ( "name" ) ;
161+ team . ExecuteMission ( "Mission1" ) ;
162+ team . CompleteCurrentMission ( ) ;
163+
164+ // Act
165+ var result = team . CompleteCurrentMission ( ) ;
166+
167+ // Assert
168+ result . IsError . Should ( ) . BeTrue ( ) ;
169+ result . FirstError . Should ( ) . Be ( TeamErrors . NotOnMission ) ;
170+ }
171+
172+ [ Fact ]
173+ public void ExecuteMission_WhenNoHeroes_ShouldError ( )
174+ {
175+ // Arrange
176+ var team = Team . Create ( "name" ) ;
177+
178+ // Act
179+ var result = team . ExecuteMission ( "Mission" ) ;
180+
181+ // Assert
182+ result . IsError . Should ( ) . BeTrue ( ) ;
183+ result . FirstError . Should ( ) . Be ( TeamErrors . NoHeroes ) ;
184+ }
185+
186+ [ Fact ]
187+ public void ExecuteMission_AfterAddingHero_ShouldSucceed ( )
188+ {
189+ // Arrange
190+ var team = Team . Create ( "name" ) ;
191+ var hero = Hero . Create ( "hero1" , "alias1" ) ;
192+ var power1 = new Power ( "Foo" , 10 ) ;
193+ hero . UpdatePowers ( [ power1 ] ) ;
194+ team . AddHero ( hero ) ;
195+
196+ // Act
197+ var result = team . ExecuteMission ( "Mission" ) ;
198+
199+ // Assert
200+ result . IsError . Should ( ) . BeFalse ( ) ;
201+ }
202+ }
0 commit comments