using CareFix.Api.Infrastructure; using Xunit; namespace CareFix.Tests; public class CsvTests { [Fact] public void Reads_quoted_fields_with_commas_and_quotes() { var rows = Csv.Read("TableName,Meaning\nIPD_BILL,\"Header, one per admission\"\nRECEIPT,\"He said \"\"paid\"\"\""); Assert.Equal(2, rows.Count); Assert.Equal("Header, one per admission", rows[0]["Meaning"]); Assert.Equal("He said \"paid\"", rows[1]["Meaning"]); } [Fact] public void Handles_crlf_a_byte_order_mark_and_blank_lines() { var rows = Csv.Read("\uFEFFTableName,Module\r\nIPD_BILL,Billing\r\n\r\nRECEIPT,Finance\r\n"); Assert.Equal(2, rows.Count); Assert.Equal("IPD_BILL", rows[0]["TableName"]); Assert.Equal("Finance", rows[1]["Module"]); } [Fact] public void Keeps_new_lines_inside_quoted_fields() { var rows = Csv.Read("Title,FixGuidance\nDuplicate,\"Step 1\nStep 2\""); Assert.Contains("\n", rows[0]["FixGuidance"]); } [Fact] public void Column_names_are_case_insensitive_and_short_rows_are_filled() { var rows = Csv.Read("TableName,ColumnName,Meaning\nIPD_BILL,NET_AMT"); Assert.Equal("NET_AMT", rows[0]["columnname"]); Assert.Equal("", rows[0]["Meaning"]); } [Theory] [InlineData("1", true)] [InlineData("Yes", true)] [InlineData("TRUE", true)] [InlineData("0", false)] [InlineData("no", false)] [InlineData("rubbish", false)] public void Bool_reads_the_usual_spellings(string value, bool expected) => Assert.Equal(expected, Csv.Bool(value)); [Fact] public void Bool_falls_back_when_the_cell_is_empty() { Assert.True(Csv.Bool("", fallback: true)); // Editable defaults to yes Assert.False(Csv.Bool(" ")); // IsPii defaults to no } }