Skip to content
This repository was archived by the owner on Jul 28, 2025. It is now read-only.

Commit f9f0e50

Browse files
tests: Refactored tests to improve maintainability
1 parent 67b9fd0 commit f9f0e50

1 file changed

Lines changed: 43 additions & 222 deletions

File tree

tests/ServiceLayer.API.Tests/Functions/BSSelectFunctionsTests.cs

Lines changed: 43 additions & 222 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Azure;
1+
using System.Dynamic;
2+
using Azure;
23
using Azure.Messaging;
34
using Azure.Messaging.EventGrid;
45
using 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

Comments
 (0)