@@ -354,9 +354,9 @@ public async Task StartAsync_WithNullValues_ShouldStoreBsonNull()
354354 {
355355 // Arrange
356356 var testDate = new DateOnly ( 2024 , 12 , 15 ) ;
357- var csvContent = "CPH, FarmName, Owner, Address, CHANGE_TYPE\n " +
358- "CPH001, Farm One,,, I\n " +
359- "CPH002,, Owner B, Address 2, I\n " ;
357+ var csvContent = "CPH| FarmName| Owner| Address| CHANGE_TYPE\n " +
358+ "CPH001| Farm One||| I\n " +
359+ "CPH002|| Owner B| Address 2| I\n " ;
360360
361361 var fileName = $ "LITP_SAMCPHHOLDING_{ testDate : yyyyMMdd} 120000.csv";
362362 await UploadCsvToS3 ( $ "{ DestinationFolder } /{ fileName } ", csvContent ) ;
@@ -389,7 +389,7 @@ public async Task StartAsync_WithEmptyFile_ShouldNotFail()
389389 {
390390 // Arrange
391391 var testDate = new DateOnly ( 2024 , 12 , 15 ) ;
392- var csvContent = "CPH, FarmName, Owner, Address, CHANGE_TYPE\n " ; // Headers only
392+ var csvContent = "CPH| FarmName| Owner| Address| CHANGE_TYPE\n " ; // Headers only
393393
394394 var fileName = $ "LITP_SAMCPHHOLDING_{ testDate : yyyyMMdd} 120000.csv";
395395 await UploadCsvToS3 ( $ "{ DestinationFolder } /{ fileName } ", csvContent ) ;
@@ -415,8 +415,8 @@ public async Task StartAsync_WithMissingPrimaryKey_ShouldThrowException()
415415 {
416416 // Arrange
417417 var testDate = new DateOnly ( 2024 , 12 , 15 ) ;
418- var csvContent = "FarmName, Owner, Address, CHANGE_TYPE\n " + // Missing CPH column
419- "Farm One, Owner A, Address 1, I\n " ;
418+ var csvContent = "FarmName| Owner| Address| CHANGE_TYPE\n " + // Missing CPH column
419+ "Farm One| Owner A| Address 1| I\n " ;
420420
421421 var fileName = $ "LITP_SAMCPHHOLDING_{ testDate : yyyyMMdd} 120000.csv";
422422 await UploadCsvToS3 ( $ "{ DestinationFolder } /{ fileName } ", csvContent ) ;
@@ -439,9 +439,9 @@ public async Task StartAsync_WithQuotedHeaders_ShouldProcessCorrectly()
439439 // Arrange
440440 var testDate = new DateOnly ( 2024 , 12 , 15 ) ;
441441 // CSV with quoted headers (common in some CSV exports)
442- var csvContent = "\" CPH\" , \" FarmName\" , \" Owner\" , \" Address\" , \" CHANGE_TYPE\" \n "
443- + "CPH001, Farm One, Owner A, Address 1, I\n "
444- + "CPH002, Farm Two, Owner B, Address 2, I\n " ;
442+ var csvContent = "\" CPH\" | \" FarmName\" | \" Owner\" | \" Address\" | \" CHANGE_TYPE\" \n "
443+ + "CPH001| Farm One| Owner A| Address 1| I\n "
444+ + "CPH002| Farm Two| Owner B| Address 2| I\n " ;
445445
446446 var fileName = $ "LITP_SAMCPHHOLDING_{ testDate : yyyyMMdd} 120000.csv";
447447 await UploadCsvToS3 ( $ "{ DestinationFolder } /{ fileName } ", csvContent ) ;
@@ -474,8 +474,8 @@ public async Task StartAsync_WithMixedQuotedAndUnquotedHeaders_ShouldProcessCorr
474474 // Arrange
475475 var testDate = new DateOnly ( 2024 , 12 , 15 ) ;
476476 // CSV with some headers quoted and some not (edge case but should be handled)
477- var csvContent = "\" CPH\" , FarmName, \" Owner\" , Address, \" CHANGE_TYPE\" \n "
478- + "CPH001, Farm One, Owner A, Address 1, I\n " ;
477+ var csvContent = "\" CPH\" | FarmName| \" Owner\" | Address| \" CHANGE_TYPE\" \n "
478+ + "CPH001| Farm One| Owner A| Address 1| I\n " ;
479479
480480 var fileName = $ "LITP_SAMCPHHOLDING_{ testDate : yyyyMMdd} 120000.csv";
481481 await UploadCsvToS3 ( $ "{ DestinationFolder } /{ fileName } ", csvContent ) ;
@@ -741,8 +741,8 @@ public async Task StartAsync_WithNullAccumulatorValues_ShouldNotAddToArray()
741741 _createdTestFileKeys . Remove ( $ "{ DestinationFolder } /{ fileName1 } ") ;
742742
743743 // Second import with null/empty accumulator values
744- var csvContent2 = "CPH, FarmName, ADDRESS_PK, DISEASE_TYPE, ANIMAL_SPECIES_CODE, CHANGE_TYPE\n " +
745- "CPH001, Farm One Updated,,, CAPRINE, U\n " ;
744+ var csvContent2 = "CPH| FarmName| ADDRESS_PK| DISEASE_TYPE| ANIMAL_SPECIES_CODE| CHANGE_TYPE\n "
745+ + "CPH001| Farm One Updated||| CAPRINE| U\n " ;
746746 var testDate2 = testDate . AddDays ( - 1 ) ;
747747 var fileName2 = $ "LITP_SAMCPHHOLDING_{ testDate2 : yyyyMMdd} 120000.csv";
748748 await UploadCsvToS3 ( $ "{ DestinationFolder } /{ fileName2 } ", csvContent2 ) ;
@@ -776,8 +776,8 @@ public async Task StartAsync_WithEmptyAccumulatorFieldsOnFirstImport_ShouldCreat
776776 {
777777 // Arrange
778778 var testDate = new DateOnly ( 2024 , 12 , 15 ) ;
779- var csvContent = "CPH, FarmName, ADDRESS_PK, DISEASE_TYPE, ANIMAL_SPECIES_CODE, CHANGE_TYPE\n "
780- + "CPH001, Farm One,,,, I\n " ;
779+ var csvContent = "CPH| FarmName| ADDRESS_PK| DISEASE_TYPE| ANIMAL_SPECIES_CODE| CHANGE_TYPE\n "
780+ + "CPH001| Farm One|||| I\n " ;
781781 var fileName = $ "LITP_SAMCPHHOLDING_{ testDate : yyyyMMdd} 120000.csv";
782782 await UploadCsvToS3 ( $ "{ DestinationFolder } /{ fileName } ", csvContent ) ;
783783
@@ -806,62 +806,6 @@ public async Task StartAsync_WithEmptyAccumulatorFieldsOnFirstImport_ShouldCreat
806806 _testOutputHelper . WriteLine ( "Successfully created empty arrays for null accumulator fields on first import" ) ;
807807 }
808808
809- [ Fact ]
810- public async Task StartAsync_WithMixedAccumulatorAndNonAccumulatorUpdates_ShouldHandleCorrectly ( )
811- {
812- // Arrange
813- var testDate = new DateOnly ( 2024 , 12 , 15 ) ;
814-
815- // First import
816- var csvContent1 = GenerateSampleCsvContentWithAccumulators ( new [ ]
817- {
818- ( "CPH001" , "Farm One" , "ADDR001" , "BVD" , "BOVINE" , "I" ) ,
819- ( "CPH002" , "Farm Two" , "ADDR002" , "IBR" , "OVINE" , "I" )
820- } ) ;
821- var fileName1 = $ "LITP_SAMCPHHOLDING_{ testDate : yyyyMMdd} 120000.csv";
822- await UploadCsvToS3 ( $ "{ DestinationFolder } /{ fileName1 } ", csvContent1 ) ;
823- await _ingestionPipeline . StartAsync ( Guid . NewGuid ( ) , CancellationToken . None ) ;
824- await _localStackFixture . S3Client . DeleteObjectAsync ( new DeleteObjectRequest { BucketName = LocalStackFixture . TestBucket , Key = $ "{ DestinationFolder } /{ fileName1 } " } ) ;
825- _createdTestFileKeys . Remove ( $ "{ DestinationFolder } /{ fileName1 } ") ;
826-
827- // Second import - update one, create new
828- var csvContent2 = GenerateSampleCsvContentWithAccumulators ( new [ ]
829- {
830- ( "CPH001" , "Farm One Updated" , "ADDR003" , "FMD" , "PORCINE" , "U" ) ,
831- ( "CPH003" , "Farm Three" , "ADDR004" , "BSE" , "CAPRINE" , "I" )
832- } ) ;
833- var testDate2 = testDate . AddDays ( - 1 ) ;
834- var fileName2 = $ "LITP_SAMCPHHOLDING_{ testDate2 : yyyyMMdd} 120000.csv";
835- await UploadCsvToS3 ( $ "{ DestinationFolder } /{ fileName2 } ", csvContent2 ) ;
836-
837- // Act
838- await _ingestionPipeline . StartAsync ( Guid . NewGuid ( ) , CancellationToken . None ) ;
839-
840- // Assert
841- var database = _mongoClient . GetDatabase ( _testDatabaseName ) ;
842- var collection = database . GetCollection < BsonDocument > ( "sam_cph_holdings" ) ;
843-
844- // CPH001: Updated - should have accumulated values and overwritten FarmName
845- var doc1 = await collection . Find ( d => d [ "_id" ] == "CPH001" ) . FirstOrDefaultAsync ( ) ;
846- doc1 [ "FarmName" ] . AsString . Should ( ) . Be ( "Farm One Updated" ) ;
847- doc1 [ "ADDRESS_PK" ] . AsBsonArray . Should ( ) . HaveCount ( 2 ) ;
848- doc1 [ "ADDRESS_PK" ] . AsBsonArray . Select ( v => v . AsString ) . Should ( ) . BeEquivalentTo ( new [ ] { "ADDR001" , "ADDR003" } ) ;
849-
850- // CPH002: Unchanged - should still have original values
851- var doc2 = await collection . Find ( d => d [ "_id" ] == "CPH002" ) . FirstOrDefaultAsync ( ) ;
852- doc2 [ "FarmName" ] . AsString . Should ( ) . Be ( "Farm Two" ) ;
853- doc2 [ "ADDRESS_PK" ] . AsBsonArray . Should ( ) . HaveCount ( 1 ) ;
854- doc2 [ "ADDRESS_PK" ] . AsBsonArray [ 0 ] . AsString . Should ( ) . Be ( "ADDR002" ) ;
855-
856- // CPH003: New - should have initial values as arrays
857- var doc3 = await collection . Find ( d => d [ "_id" ] == "CPH003" ) . FirstOrDefaultAsync ( ) ;
858- doc3 [ "FarmName" ] . AsString . Should ( ) . Be ( "Farm Three" ) ;
859- doc3 [ "ADDRESS_PK" ] . AsBsonArray . Should ( ) . HaveCount ( 1 ) ;
860- doc3 [ "ADDRESS_PK" ] . AsBsonArray [ 0 ] . AsString . Should ( ) . Be ( "ADDR004" ) ;
861-
862- _testOutputHelper . WriteLine ( "Successfully handled mixed accumulator and non-accumulator updates" ) ;
863- }
864-
865809 #endregion
866810
867811 private IBlobStorageServiceFactory CreateBlobStorageFactory ( )
@@ -926,11 +870,11 @@ private IExternalCatalogueServiceFactory CreateExternalCatalogueServiceFactory(I
926870 private string GenerateSampleCsvContent ( ( string cph , string farmName , string owner , string address ) [ ] records )
927871 {
928872 var sb = new StringBuilder ( ) ;
929- sb . AppendLine ( "CPH, FarmName, Owner, Address, CHANGE_TYPE" ) ;
873+ sb . AppendLine ( "CPH| FarmName| Owner| Address| CHANGE_TYPE" ) ;
930874
931875 foreach ( var ( cph , farmName , owner , address ) in records )
932876 {
933- sb . AppendLine ( $ "{ cph } , { farmName } , { owner } , { address } , { ChangeType . Insert } ") ;
877+ sb . AppendLine ( $ "{ cph } | { farmName } | { owner } | { address } | { ChangeType . Insert } ") ;
934878 }
935879
936880 return sb . ToString ( ) ;
@@ -939,11 +883,11 @@ private string GenerateSampleCsvContent((string cph, string farmName, string own
939883 private string GenerateSampleCsvContentWithAccumulators ( ( string cph , string farmName , string addressPk , string diseaseType , string animalSpeciesCode , string changeType ) [ ] records )
940884 {
941885 var sb = new StringBuilder ( ) ;
942- sb . AppendLine ( "CPH, FarmName, ADDRESS_PK, DISEASE_TYPE, ANIMAL_SPECIES_CODE, CHANGE_TYPE" ) ;
886+ sb . AppendLine ( "CPH| FarmName| ADDRESS_PK| DISEASE_TYPE| ANIMAL_SPECIES_CODE| CHANGE_TYPE" ) ;
943887
944888 foreach ( var ( cph , farmName , addressPk , diseaseType , animalSpeciesCode , changeType ) in records )
945889 {
946- sb . AppendLine ( $ "{ cph } , { farmName } , { addressPk } , { diseaseType } , { animalSpeciesCode } , { changeType } ") ;
890+ sb . AppendLine ( $ "{ cph } | { farmName } | { addressPk } | { diseaseType } | { animalSpeciesCode } | { changeType } ") ;
947891 }
948892
949893 return sb . ToString ( ) ;
0 commit comments