@@ -10,25 +10,10 @@ namespace ServiceLayer.Mesh.Tests.FileTypes.NbssAppointmentEvents;
1010
1111public 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 = "|" ,
0 commit comments