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

Commit 001fad1

Browse files
feat: FileParser uses test files instead of string literals
1 parent 96c68a5 commit 001fad1

13 files changed

Lines changed: 123 additions & 52 deletions

tests/ServiceLayer.Mesh.Tests/FileTypes/NbssAppointmentEvents/FileParserTests.cs

Lines changed: 77 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,10 @@ namespace ServiceLayer.Mesh.Tests.FileTypes.NbssAppointmentEvents;
1010

1111
public class FileParserTests
1212
{
13-
private readonly string _validFileContent;
14-
private readonly string _completeDatasetContent;
1513
private readonly FileParser _fileParser;
1614

1715
public FileParserTests()
1816
{
19-
_validFileContent =
20-
"\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000002\"" +
21-
"\n\"NBSSAPPT_FLDS\"|\"Sequence\"|\"BSO\"|\"Action\"|\"Clinic Code\"|\"Status\"" +
22-
"\n\"NBSSAPPT_DATA\"|\"000001\"|\"KMK\"|\"U\"|\"BU003\"|\"A\"" +
23-
"\n\"NBSSAPPT_DATA\"|\"000002\"|\"KMK\"|\"U\"|\"BU004\"|\"A\"" +
24-
"\n\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000002\"";
25-
26-
_completeDatasetContent =
27-
"\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"" +
28-
"\n\"NBSSAPPT_FLDS\"|\"Sequence\"|\"BSO\"|\"Action\"|\"Clinic Code\"|\"Holding Clinic\"|\"Status\"|\"Attended Not Scr\"|\"Appointment ID\"|\"NHS Num\"|\"Epsiode Type\"|\"Episode Start\"|\"BatchID\"|\"Screen or Asses\"|\"Screen Appt num\"|\"Booked By\"|\"Cancelled By\"|\"Appt Date\"|\"Appt Time\"|\"Location\"|\"Clinic Name\"|\"Clinic Name (Let)\"|\"Clinic Address 1\"|\"Clinic Address 2\"|\"Clinic Address 3\"|\"Clinic Address 4\"|\"Clinic Address 5\"|\"Postcode\"|\"Action Timestamp\"" +
29-
"\n\"NBSSAPPT_DATA\"|\"000001\"|\"KMK\"|\"U\"|\"BU003\"|\"N\"|\"A\"|\"N\"|\"BU003-67235-RA1-DN-T1330-1\"|\"9277757620\"|\"G\"|\"2025-01-30\"|\"KMKG00581\"|\"S\"|\"1\"|\"H\"|\"\"|\"\"20250130\"|\"1330\"|\"BU\"|\"BREAST CARE UNIT\"|\"BREAST CARE UNIT\"|\"BREAST CARE UNIT\"|\"MILTON KEYNES HOSPITAL\"|\"STANDING WAY\"|\"MILTON KEYNES\"|\"MK6 5LD\"|\"MK6 5LD\"|\"20250204-161420\"" +
30-
"\n\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"";
31-
3217
_fileParser = new FileParser();
3318
}
3419

@@ -64,17 +49,23 @@ public void Parse_EmptyStream_ReturnsEmptyParsedFile()
6449
public void Parse_ValidFile_ReturnsParsedFileWithCorrectStructure()
6550
{
6651
// Arrange
67-
using var stream = CreateStreamFromString(_validFileContent);
52+
53+
var testFile = Path.Combine(
54+
AppContext.BaseDirectory,
55+
"TestData",
56+
"TestFile1.csv");
57+
58+
using var fileStream = File.OpenRead(testFile);
6859

6960
// Act
70-
var result = _fileParser.Parse(stream);
61+
var result = _fileParser.Parse(fileStream);
7162

7263
// Assert
7364
Assert.NotNull(result.FileHeader);
74-
VerifyFileHeaderRecord(result.FileHeader, "NBSSAPPT_HDR", "00000054", "20250204", "161846", "000002");
65+
VerifyFileHeaderRecord(result.FileHeader, "NBSSAPPT_HDR", "00000107", "20250317", "133128", "000002");
7566
Assert.Equal(2, result.DataRecords.Count);
7667
Assert.NotNull(result.FileTrailer);
77-
VerifyFileTrailerRecord(result.FileTrailer, "NBSSAPPT_END", "00000054", "20250204", "161846", "000002");
68+
VerifyFileTrailerRecord(result.FileTrailer, "NBSSAPPT_END", "00000107", "20250317", "133129", "000002");
7869

7970
Assert.Equal(1, result.DataRecords[0].RowNumber);
8071
Assert.Equal(2, result.DataRecords[1].RowNumber);
@@ -83,18 +74,18 @@ public void Parse_ValidFile_ReturnsParsedFileWithCorrectStructure()
8374
{
8475
["Sequence"] = "000001",
8576
["BSO"] = "KMK",
86-
["Action"] = "U",
77+
["Action"] = "B",
8778
["Clinic Code"] = "BU003",
88-
["Status"] = "A"
79+
["Status"] = "B"
8980
};
9081

9182
var expectedSecondRecord = new Dictionary<string, string>
9283
{
9384
["Sequence"] = "000002",
9485
["BSO"] = "KMK",
95-
["Action"] = "U",
86+
["Action"] = "B",
9687
["Clinic Code"] = "BU004",
97-
["Status"] = "A"
88+
["Status"] = "B"
9889
};
9990

10091
VerifyDataRecordFields(result.DataRecords[0], expectedFirstRecord);
@@ -105,10 +96,15 @@ public void Parse_ValidFile_ReturnsParsedFileWithCorrectStructure()
10596
public void Parse_CompleteDataset_ParsesAllFieldsCorrectly()
10697
{
10798
// Arrange
108-
using var stream = CreateStreamFromString(_completeDatasetContent);
99+
var completeDatasetPath = Path.Combine(
100+
AppContext.BaseDirectory,
101+
"TestData",
102+
"CompleteDataset.csv");
103+
104+
using var fileStream = File.OpenRead(completeDatasetPath);
109105

110106
// Act
111-
var result = _fileParser.Parse(stream);
107+
var result = _fileParser.Parse(fileStream);
112108

113109
// Assert
114110
Assert.NotNull(result);
@@ -154,12 +150,15 @@ public void Parse_CompleteDataset_ParsesAllFieldsCorrectly()
154150
public void Parse_MissingFieldsRecord_ThrowsInvalidOperationException()
155151
{
156152
// Arrange
157-
string fileContent = "\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000002\"\n\"NBSSAPPT_DATA\"|\"000001\"|\"KMK\"|\"U\"|\"BU003\"|\"N\"|\"A\"|\"N\"\n\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000002\"";
153+
var missingFieldsPath = Path.Combine(
154+
AppContext.BaseDirectory,
155+
"TestData",
156+
"MissingFields.csv");
158157

159-
using var stream = CreateStreamFromString(fileContent);
158+
using var fileStream = File.OpenRead(missingFieldsPath);
160159

161160
// Act & Assert
162-
var exception = Assert.Throws<InvalidOperationException>(() => _fileParser.Parse(stream));
161+
var exception = Assert.Throws<InvalidOperationException>(() => _fileParser.Parse(fileStream));
163162

164163
Assert.Equal("Field headers (NBSSAPPT_FLDS) must appear before data records.", exception.Message);
165164
}
@@ -168,13 +167,16 @@ public void Parse_MissingFieldsRecord_ThrowsInvalidOperationException()
168167
public void Parse_UnknownRecordType_ThrowsInvalidOperationException()
169168
{
170169
// Arrange
171-
string fileContent = "\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"\n\"NBSSAPPT_FLDS\"|\"Sequence\"|\"BSO\"|\"Action\"\n\"UNKNOWN_TYPE\"|\"000001\"|\"KMK\"|\"U\"\n\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"";
170+
var unknownRecordPath = Path.Combine(
171+
AppContext.BaseDirectory,
172+
"TestData",
173+
"UnknownRecord.csv");
172174

173-
using var stream = CreateStreamFromString(fileContent);
175+
using var fileStream = File.OpenRead(unknownRecordPath);
174176

175177
// Act & Assert
176178
var exception = Assert.Throws<InvalidOperationException>(
177-
() => _fileParser.Parse(stream));
179+
() => _fileParser.Parse(fileStream));
178180

179181
Assert.Equal("Unknown record identifier: UNKNOWN_TYPE", exception.Message);
180182
}
@@ -183,12 +185,15 @@ public void Parse_UnknownRecordType_ThrowsInvalidOperationException()
183185
public void Parse_EmptyLine_SkipsEmptyLines()
184186
{
185187
// Arrange
186-
string fileContent = "\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"\n\n\"NBSSAPPT_FLDS\"|\"Sequence\"|\"BSO\"|\"Action\"\n\n\"NBSSAPPT_DATA\"|\"000001\"|\"KMK\"|\"U\"\n\n\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"";
188+
var emptyLinesPath = Path.Combine(
189+
AppContext.BaseDirectory,
190+
"TestData",
191+
"EmptyLines.csv");
187192

188-
using var stream = CreateStreamFromString(fileContent);
193+
using var fileStream = File.OpenRead(emptyLinesPath);
189194

190195
// Act
191-
var result = _fileParser.Parse(stream);
196+
var result = _fileParser.Parse(fileStream);
192197

193198
// Assert
194199
Assert.NotNull(result);
@@ -200,12 +205,15 @@ public void Parse_EmptyLine_SkipsEmptyLines()
200205
public void Parse_FewerColumnsInDataRecord_OnlyProcessesAvailableColumns()
201206
{
202207
// Arrange
203-
string fileContent = "\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"\n\"NBSSAPPT_FLDS\"|\"Sequence\"|\"BSO\"|\"Action\"|\"Clinic Code\"|\"Status\"\n\"NBSSAPPT_DATA\"|\"000001\"|\"KMK\"|\"U\"\n\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"";
208+
var fewerColumnsPath = Path.Combine(
209+
AppContext.BaseDirectory,
210+
"TestData",
211+
"FewerColumns.csv");
204212

205-
using var stream = CreateStreamFromString(fileContent);
213+
using var fileStream = File.OpenRead(fewerColumnsPath);
206214

207215
// Act
208-
var result = _fileParser.Parse(stream);
216+
var result = _fileParser.Parse(fileStream);
209217

210218
// Assert
211219
Assert.NotNull(result);
@@ -228,12 +236,15 @@ public void Parse_FewerColumnsInDataRecord_OnlyProcessesAvailableColumns()
228236
public void Parse_ExtraColumnsInDataRecord_IgnoresExtraColumns()
229237
{
230238
// Arrange
231-
string fileContent = "\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"\n\"NBSSAPPT_FLDS\"|\"Sequence\"|\"BSO\"|\"Action\"\n\"NBSSAPPT_DATA\"|\"000001\"|\"KMK\"|\"U\"|\"ExtraValue1\"|\"ExtraValue2\"\n\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"";
239+
var extraColumnsPath = Path.Combine(
240+
AppContext.BaseDirectory,
241+
"TestData",
242+
"ExtraColumns.csv");
232243

233-
using var stream = CreateStreamFromString(fileContent);
244+
using var fileStream = File.OpenRead(extraColumnsPath);
234245

235246
// Act
236-
var result = _fileParser.Parse(stream);
247+
var result = _fileParser.Parse(fileStream);
237248

238249
// Assert
239250
Assert.NotNull(result);
@@ -255,12 +266,15 @@ public void Parse_ExtraColumnsInDataRecord_IgnoresExtraColumns()
255266
public void Parse_QuotedValues_TrimsQuotes()
256267
{
257268
// Arrange
258-
string fileContent = "\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"\n\"NBSSAPPT_FLDS\"|\"Field1\"|\"Field2\"|\"Field3\"\n\"NBSSAPPT_DATA\"|\"Value1\"|\"Value2\"|\"Value3\"\n\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"";
269+
var quotedValuesPath = Path.Combine(
270+
AppContext.BaseDirectory,
271+
"TestData",
272+
"QuotedValues.csv");
259273

260-
using var stream = CreateStreamFromString(fileContent);
274+
using var fileStream = File.OpenRead(quotedValuesPath);
261275

262276
// Act
263-
var result = _fileParser.Parse(stream);
277+
var result = _fileParser.Parse(fileStream);
264278

265279
// Assert
266280
Assert.NotNull(result);
@@ -281,12 +295,15 @@ public void Parse_QuotedValues_TrimsQuotes()
281295
public void Parse_WithEscapedCharacters_HandlesCorrectly()
282296
{
283297
// Arrange
284-
string fileContent = "\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"\n\"NBSSAPPT_FLDS\"|\"Field With\\\"Quote\"|\"Normal Field\"|\"Field With\\\\Backslash\"\n\"NBSSAPPT_DATA\"|\"Value With\\\"Quote\"|\"Normal Value\"|\"Value With\\\\Backslash\"\n\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000001\"";
298+
var escapedCharsPath = Path.Combine(
299+
AppContext.BaseDirectory,
300+
"TestData",
301+
"EscapedChars.csv");
285302

286-
using var stream = CreateStreamFromString(fileContent);
303+
using var fileStream = File.OpenRead(escapedCharsPath);
287304

288305
// Act
289-
var result = _fileParser.Parse(stream);
306+
var result = _fileParser.Parse(fileStream);
290307

291308
// Assert
292309
Assert.NotNull(result);
@@ -307,11 +324,15 @@ public void Parse_WithEscapedCharacters_HandlesCorrectly()
307324
public void VerifyFileHeaderRecordMap_MapsCorrectly()
308325
{
309326
// Arrange
310-
string headerLine = "\"NBSSAPPT_HDR\"|\"00000054\"|\"20250204\"|\"161846\"|\"000002\"";
311-
using var stream = CreateStreamFromString(headerLine);
327+
var headerMappingPath = Path.Combine(
328+
AppContext.BaseDirectory,
329+
"TestData",
330+
"HeaderMapping.csv");
331+
332+
using var fileStream = File.OpenRead(headerMappingPath);
312333

313334
// Act & Assert - setup a CSV reader with proper configuration to verify the class map works
314-
using var reader = new StreamReader(stream);
335+
using var reader = new StreamReader(fileStream);
315336
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
316337
{
317338
Delimiter = "|",
@@ -338,11 +359,15 @@ public void VerifyFileHeaderRecordMap_MapsCorrectly()
338359
public void VerifyFileTrailerRecordMap_MapsCorrectly()
339360
{
340361
// Arrange
341-
string trailerLine = "\"NBSSAPPT_END\"|\"00000054\"|\"20250204\"|\"161846\"|\"000002\"";
342-
using var stream = CreateStreamFromString(trailerLine);
362+
var trailerMappingPath = Path.Combine(
363+
AppContext.BaseDirectory,
364+
"TestData",
365+
"TrailerMapping.csv");
366+
367+
using var fileStream = File.OpenRead(trailerMappingPath);
343368

344369
// Act & Assert - setup a CSV reader with proper configuration to verify the class map works
345-
using var reader = new StreamReader(stream);
370+
using var reader = new StreamReader(fileStream);
346371
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
347372
{
348373
Delimiter = "|",

tests/ServiceLayer.Mesh.Tests/ServiceLayer.Mesh.Tests.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,10 @@
2323
<ItemGroup>
2424
<Using Include="Xunit" />
2525
</ItemGroup>
26+
<ItemGroup>
27+
<None Update="TestData\**\*.*">
28+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
29+
</None>
30+
</ItemGroup>
2631

2732
</Project>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"NBSSAPPT_HDR"|"00000054"|"20250204"|"161846"|"000001"
2+
"NBSSAPPT_FLDS"|"Sequence"|"BSO"|"Action"|"Clinic Code"|"Holding Clinic"|"Status"|"Attended Not Scr"|"Appointment ID"|"NHS Num"|"Epsiode Type"|"Episode Start"|"BatchID"|"Screen or Asses"|"Screen Appt num"|"Booked By"|"Cancelled By"|"Appt Date"|"Appt Time"|"Location"|"Clinic Name"|"Clinic Name (Let)"|"Clinic Address 1"|"Clinic Address 2"|"Clinic Address 3"|"Clinic Address 4"|"Clinic Address 5"|"Postcode"|"Action Timestamp"
3+
"NBSSAPPT_DATA"|"000001"|"KMK"|"U"|"BU003"|"N"|"A"|"N"|"BU003-67235-RA1-DN-T1330-1"|"9277757620"|"G"|"2025-01-30"|"KMKG00581"|"S"|"1"|"H"|""|"20250130"|"1330"|"BU"|"BREAST CARE UNIT"|"BREAST CARE UNIT"|"BREAST CARE UNIT"|"MILTON KEYNES HOSPITAL"|"STANDING WAY"|"MILTON KEYNES"|"MK6 5LD"|"MK6 5LD"|"20250204-161420"
4+
"NBSSAPPT_END"|"00000054"|"20250204"|"161846"|"000001"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"NBSSAPPT_HDR"|"00000054"|"20250204"|"161846"|"000001"
2+
3+
"NBSSAPPT_FLDS"|"Sequence"|"BSO"|"Action"
4+
5+
"NBSSAPPT_DATA"|"000001"|"KMK"|"U"
6+
7+
"NBSSAPPT_END"|"00000054"|"20250204"|"161846"|"000001"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"NBSSAPPT_HDR"|"00000054"|"20250204"|"161846"|"000001"
2+
"NBSSAPPT_FLDS"|"Field With\"Quote"|"Normal Field"|"Field With\\Backslash"
3+
"NBSSAPPT_DATA"|"Value With\"Quote"|"Normal Value"|"Value With\\Backslash"
4+
"NBSSAPPT_END"|"00000054"|"20250204"|"161846"|"000001"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"NBSSAPPT_HDR"|"00000054"|"20250204"|"161846"|"000001"
2+
"NBSSAPPT_FLDS"|"Sequence"|"BSO"|"Action"
3+
"NBSSAPPT_DATA"|"000001"|"KMK"|"U"|"ExtraValue1"|"ExtraValue2"
4+
"NBSSAPPT_END"|"00000054"|"20250204"|"161846"|"000001"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"NBSSAPPT_HDR"|"00000054"|"20250204"|"161846"|"000001"
2+
"NBSSAPPT_FLDS"|"Sequence"|"BSO"|"Action"|"Clinic Code"|"Status"
3+
"NBSSAPPT_DATA"|"000001"|"KMK"|"U"
4+
"NBSSAPPT_END"|"00000054"|"20250204"|"161846"|"000001"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"NBSSAPPT_HDR"|"00000054"|"20250204"|"161846"|"000002"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
"NBSSAPPT_HDR"|"00000054"|"20250204"|"161846"|"000002"
2+
"NBSSAPPT_DATA"|"000001"|"KMK"|"U"|"BU003"|"N"|"A"|"N"
3+
"NBSSAPPT_END"|"00000054"|"20250204"|"161846"|"000002"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"NBSSAPPT_HDR"|"00000054"|"20250204"|"161846"|"000001"
2+
"NBSSAPPT_FLDS"|"Field1"|"Field2"|"Field3"
3+
"NBSSAPPT_DATA"|"Value1"|"Value2"|"Value3"
4+
"NBSSAPPT_END"|"00000054"|"20250204"|"161846"|"000001"

0 commit comments

Comments
 (0)