1- using Azure ;
1+ using System . Dynamic ;
2+ using Azure ;
23using Azure . Messaging ;
34using Azure . Messaging . EventGrid ;
45using Microsoft . AspNetCore . Http ;
@@ -16,25 +17,33 @@ public class BSSelectFunctionsTests
1617 private readonly Mock < EventGridPublisherClient > _mockEventGridPublisherClient = new ( ) ;
1718 private readonly BSSelectFunctions _functions ;
1819 private readonly SetupRequest _setupRequest = new ( ) ;
20+ private readonly dynamic _episode = new ExpandoObject ( ) ;
21+ public static TheoryData < string > RequiredPropertyNames =>
22+ [
23+ "episode_id" ,
24+ "nhs_number" ,
25+ "date_of_birth" ,
26+ "first_given_name" ,
27+ "family_name"
28+ ] ;
1929
2030 public BSSelectFunctionsTests ( )
2131 {
2232 _functions = new BSSelectFunctions ( _logger . Object , _mockEventGridPublisherClient . Object ) ;
33+
34+ // Configuring a valid episode
35+ _episode . episode_id = "123" ;
36+ _episode . nhs_number = "9990000000" ;
37+ _episode . date_of_birth = "1970-01-01" ;
38+ _episode . first_given_name = "Test" ;
39+ _episode . family_name = "User" ;
2340 }
2441
2542 [ Fact ]
2643 public async Task CreateEpisodeEvent_ShouldSendEventAndReturnOk_WhenRequestIsValid ( )
2744 {
2845 // Arrange
29- var episode = new
30- {
31- episode_id = "123" ,
32- nhs_number = "9990000000" ,
33- date_of_birth = "1970-01-01" ,
34- first_given_name = "Test" ,
35- family_name = "User" ,
36- } ;
37- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
46+ var request = _setupRequest . CreateMockHttpRequest ( _episode ) ;
3847 var mockResponse = Mock . Of < Response > ( r => r . IsError == false ) ;
3948 _mockEventGridPublisherClient . Setup ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) ) . ReturnsAsync ( mockResponse ) ;
4049
@@ -61,99 +70,71 @@ public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenRequestBodyEmpty
6170 _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
6271 }
6372
64- [ Fact ]
65- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenEpisodeIdIsMissing ( )
73+ [ Theory ]
74+ [ MemberData ( nameof ( RequiredPropertyNames ) ) ]
75+ public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenRequiredPropertyIsMissing ( string propertyName )
6676 {
6777 // Arrange
68- var episode = new
69- {
70- nhs_number = "9990000000" ,
71- date_of_birth = "1970-01-01" ,
72- first_given_name = "Test" ,
73- family_name = "User" ,
74- } ;
75- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
78+ ( ( IDictionary < string , object ? > ) _episode ) . Remove ( propertyName ) ;
79+ var request = _setupRequest . CreateMockHttpRequest ( _episode ) ;
7680
7781 // Act
7882 var response = await _functions . IngressEpisode ( request ) ;
7983
8084 // Assert
8185 var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
82- Assert . Equal ( "episode_id is required", result . Value ) ;
86+ Assert . Equal ( $ " { propertyName } is required", result . Value ) ;
8387 _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
8488 }
8589
8690 [ Theory ]
87- [ InlineData ( null ) ]
88- [ InlineData ( "" ) ]
89- [ InlineData ( " " ) ]
90- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenEpisodeIdIsEmptyValue ( string ? episodeId )
91+ [ MemberData ( nameof ( RequiredPropertyNames ) ) ]
92+ public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenRequiredPropertyIsNull ( string propertyName )
9193 {
9294 // Arrange
93- var episode = new
94- {
95- episode_id = episodeId ,
96- nhs_number = "9990000000" ,
97- date_of_birth = "1970-01-01" ,
98- first_given_name = "Test" ,
99- family_name = "User" ,
100- } ;
101- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
95+ ( ( IDictionary < string , object ? > ) _episode ) [ propertyName ] = null ;
96+ var request = _setupRequest . CreateMockHttpRequest ( _episode ) ;
10297
10398 // Act
10499 var response = await _functions . IngressEpisode ( request ) ;
105100
106101 // Assert
107102 var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
108- Assert . Equal ( "episode_id is required", result . Value ) ;
103+ Assert . Equal ( $ " { propertyName } is required", result . Value ) ;
109104 _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
110105 }
111106
112- [ Fact ]
113- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenNhsNumberIsMissing ( )
107+ [ Theory ]
108+ [ MemberData ( nameof ( RequiredPropertyNames ) ) ]
109+ public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenRequiredPropertyIsEmptyString ( string propertyName )
114110 {
115111 // Arrange
116- var episode = new
117- {
118- episode_id = "123" ,
119- date_of_birth = "1970-01-01" ,
120- first_given_name = "Test" ,
121- family_name = "User" ,
122- } ;
123- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
112+ ( ( IDictionary < string , object ? > ) _episode ) [ propertyName ] = "" ;
113+ var request = _setupRequest . CreateMockHttpRequest ( _episode ) ;
124114
125115 // Act
126116 var response = await _functions . IngressEpisode ( request ) ;
127117
128118 // Assert
129119 var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
130- Assert . Equal ( "nhs_number is required", result . Value ) ;
120+ Assert . Equal ( $ " { propertyName } is required", result . Value ) ;
131121 _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
132122 }
133123
134124 [ Theory ]
135- [ InlineData ( null ) ]
136- [ InlineData ( "" ) ]
137- [ InlineData ( " " ) ]
138- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenNhsNumberIsEmptyValue ( string ? nhsNumber )
125+ [ MemberData ( nameof ( RequiredPropertyNames ) ) ]
126+ public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenRequiredPropertyIsWhitespace ( string propertyName )
139127 {
140128 // Arrange
141- var episode = new
142- {
143- episode_id = "123" ,
144- nhs_number = nhsNumber ,
145- date_of_birth = "1970-01-01" ,
146- first_given_name = "Test" ,
147- family_name = "User" ,
148- } ;
149- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
129+ ( ( IDictionary < string , object ? > ) _episode ) [ propertyName ] = " " ;
130+ var request = _setupRequest . CreateMockHttpRequest ( _episode ) ;
150131
151132 // Act
152133 var response = await _functions . IngressEpisode ( request ) ;
153134
154135 // Assert
155136 var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
156- Assert . Equal ( "nhs_number is required", result . Value ) ;
137+ Assert . Equal ( $ " { propertyName } is required", result . Value ) ;
157138 _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
158139 }
159140
@@ -183,54 +164,6 @@ public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenNhsNumberIsInval
183164 _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
184165 }
185166
186- [ Fact ]
187- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenDateOfBirthIsMissing ( )
188- {
189- // Arrange
190- var episode = new
191- {
192- episode_id = "123" ,
193- nhs_number = "9990000000" ,
194- first_given_name = "Test" ,
195- family_name = "User" ,
196- } ;
197- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
198-
199- // Act
200- var response = await _functions . IngressEpisode ( request ) ;
201-
202- // Assert
203- var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
204- Assert . Equal ( "date_of_birth is required" , result . Value ) ;
205- _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
206- }
207-
208- [ Theory ]
209- [ InlineData ( null ) ]
210- [ InlineData ( "" ) ]
211- [ InlineData ( " " ) ]
212- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenDateOfBirthIsEmptyValue ( string ? dateOfBirth )
213- {
214- // Arrange
215- var episode = new
216- {
217- episode_id = "123" ,
218- nhs_number = "9990000000" ,
219- date_of_birth = dateOfBirth ,
220- first_given_name = "Test" ,
221- family_name = "User" ,
222- } ;
223- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
224-
225- // Act
226- var response = await _functions . IngressEpisode ( request ) ;
227-
228- // Assert
229- var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
230- Assert . Equal ( "date_of_birth is required" , result . Value ) ;
231- _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
232- }
233-
234167 [ Theory ]
235168 [ InlineData ( "ABC" ) ]
236169 [ InlineData ( "123" ) ]
@@ -256,115 +189,11 @@ public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenDateOfBirthIsInv
256189 _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
257190 }
258191
259- [ Fact ]
260- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenFirstGivenNameIsMissing ( )
261- {
262- // Arrange
263- var episode = new
264- {
265- episode_id = "123" ,
266- nhs_number = "9990000000" ,
267- date_of_birth = "1970-01-01" ,
268- family_name = "User" ,
269- } ;
270- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
271-
272- // Act
273- var response = await _functions . IngressEpisode ( request ) ;
274-
275- // Assert
276- var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
277- Assert . Equal ( "first_given_name is required" , result . Value ) ;
278- _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
279- }
280-
281- [ Theory ]
282- [ InlineData ( null ) ]
283- [ InlineData ( "" ) ]
284- [ InlineData ( " " ) ]
285- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenFirstGivenNameIsEmptyValue ( string ? firstGivenName )
286- {
287- // Arrange
288- var episode = new
289- {
290- episode_id = "123" ,
291- nhs_number = "9990000000" ,
292- date_of_birth = "1970-01-01" ,
293- first_given_name = firstGivenName ,
294- family_name = "User" ,
295- } ;
296- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
297-
298- // Act
299- var response = await _functions . IngressEpisode ( request ) ;
300-
301- // Assert
302- var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
303- Assert . Equal ( "first_given_name is required" , result . Value ) ;
304- _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
305- }
306-
307- [ Fact ]
308- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenFamilyNameIsMissing ( )
309- {
310- // Arrange
311- var episode = new
312- {
313- episode_id = "123" ,
314- nhs_number = "9990000000" ,
315- date_of_birth = "1970-01-01" ,
316- first_given_name = "Test"
317- } ;
318- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
319-
320- // Act
321- var response = await _functions . IngressEpisode ( request ) ;
322-
323- // Assert
324- var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
325- Assert . Equal ( "family_name is required" , result . Value ) ;
326- _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
327- }
328-
329- [ Theory ]
330- [ InlineData ( null ) ]
331- [ InlineData ( "" ) ]
332- [ InlineData ( " " ) ]
333- public async Task CreateEpisodeEvent_ShouldReturnBadRequest_WhenFamilyNameIsEmptyValue ( string ? familyName )
334- {
335- // Arrange
336- var episode = new
337- {
338- episode_id = "123" ,
339- nhs_number = "9990000000" ,
340- date_of_birth = "1970-01-01" ,
341- first_given_name = "Test" ,
342- family_name = familyName ,
343- } ;
344- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
345-
346- // Act
347- var response = await _functions . IngressEpisode ( request ) ;
348-
349- // Assert
350- var result = Assert . IsType < BadRequestObjectResult > ( response ) ;
351- Assert . Equal ( "family_name is required" , result . Value ) ;
352- _mockEventGridPublisherClient . Verify ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
353- }
354-
355192 [ Fact ]
356193 public async Task CreateEpisodeEvent_ShouldReturnInternalServerError_WhenEventFailsToSend ( )
357194 {
358195 // Arrange
359- var episode = new
360- {
361- episode_id = "123" ,
362- nhs_number = "9990000000" ,
363- date_of_birth = "1970-01-01" ,
364- first_given_name = "Test" ,
365- family_name = "User" ,
366- } ;
367- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
196+ var request = _setupRequest . CreateMockHttpRequest ( _episode ) ;
368197 var mockResponse = Mock . Of < Response > ( r => r . IsError == true ) ;
369198 _mockEventGridPublisherClient . Setup ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) ) . ReturnsAsync ( mockResponse ) ;
370199
@@ -381,15 +210,7 @@ public async Task CreateEpisodeEvent_ShouldReturnInternalServerError_WhenEventFa
381210 public async Task CreateEpisodeEvent_ShouldReturnInternalServerError_WhenSendEventThrowsException ( )
382211 {
383212 // Arrange
384- var episode = new
385- {
386- episode_id = "123" ,
387- nhs_number = "9990000000" ,
388- date_of_birth = "1970-01-01" ,
389- first_given_name = "Test" ,
390- family_name = "User" ,
391- } ;
392- var request = _setupRequest . CreateMockHttpRequest ( episode ) ;
213+ var request = _setupRequest . CreateMockHttpRequest ( _episode ) ;
393214 var mockResponse = Mock . Of < Response > ( r => r . IsError == true ) ;
394215 _mockEventGridPublisherClient . Setup ( x => x . SendEventAsync ( It . IsAny < CloudEvent > ( ) , It . IsAny < CancellationToken > ( ) ) )
395216 . ThrowsAsync ( new RequestFailedException ( "Failed to send event to Event Grid" ) ) ;
0 commit comments