package utils import ( "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestParseICCIDFromCSV(t *testing.T) { tests := []struct { name string csvContent string wantICCIDs []string wantTotalCount int wantErrorCount int }{ { name: "单列ICCID无表头", csvContent: "89860012345678901234\n89860012345678901235\n89860012345678901236", wantICCIDs: []string{"89860012345678901234", "89860012345678901235", "89860012345678901236"}, wantTotalCount: 3, wantErrorCount: 0, }, { name: "单列ICCID有表头-iccid", csvContent: "iccid\n89860012345678901234\n89860012345678901235", wantICCIDs: []string{"89860012345678901234", "89860012345678901235"}, wantTotalCount: 2, wantErrorCount: 0, }, { name: "单列ICCID有表头-ICCID大写", csvContent: "ICCID\n89860012345678901234", wantICCIDs: []string{"89860012345678901234"}, wantTotalCount: 1, wantErrorCount: 0, }, { name: "单列ICCID有表头-卡号", csvContent: "卡号\n89860012345678901234", wantICCIDs: []string{"89860012345678901234"}, wantTotalCount: 1, wantErrorCount: 0, }, { name: "单列ICCID有表头-号码", csvContent: "号码\n89860012345678901234", wantICCIDs: []string{"89860012345678901234"}, wantTotalCount: 1, wantErrorCount: 0, }, { name: "空文件", csvContent: "", wantICCIDs: []string{}, wantTotalCount: 0, wantErrorCount: 0, }, { name: "只有表头", csvContent: "iccid", wantICCIDs: []string{}, wantTotalCount: 0, wantErrorCount: 0, }, { name: "包含空行", csvContent: "89860012345678901234\n\n89860012345678901235\n \n89860012345678901236", wantICCIDs: []string{"89860012345678901234", "89860012345678901235", "89860012345678901236"}, wantTotalCount: 3, wantErrorCount: 0, }, { name: "ICCID前后有空格", csvContent: " 89860012345678901234 \n89860012345678901235", wantICCIDs: []string{"89860012345678901234", "89860012345678901235"}, wantTotalCount: 2, wantErrorCount: 0, }, { name: "多列CSV只取第一列", csvContent: "89860012345678901234,额外数据,更多数据\n89860012345678901235,忽略,忽略", wantICCIDs: []string{"89860012345678901234", "89860012345678901235"}, wantTotalCount: 2, wantErrorCount: 0, }, { name: "Windows换行符CRLF", csvContent: "89860012345678901234\r\n89860012345678901235\r\n89860012345678901236", wantICCIDs: []string{"89860012345678901234", "89860012345678901235", "89860012345678901236"}, wantTotalCount: 3, wantErrorCount: 0, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { reader := strings.NewReader(tt.csvContent) result, err := ParseICCIDFromCSV(reader) require.NoError(t, err) assert.Equal(t, tt.wantICCIDs, result.ICCIDs, "ICCIDs 不匹配") assert.Equal(t, tt.wantTotalCount, result.TotalCount, "TotalCount 不匹配") assert.Equal(t, tt.wantErrorCount, len(result.ParseErrors), "ParseErrors 数量不匹配") }) } } func TestIsHeader(t *testing.T) { tests := []struct { value string expected bool }{ {"iccid", true}, {"ICCID", true}, {"Iccid", true}, {"卡号", true}, {"号码", true}, {"89860012345678901234", false}, {"", false}, {"id", false}, {"card", false}, } for _, tt := range tests { t.Run(tt.value, func(t *testing.T) { result := isHeader(tt.value) assert.Equal(t, tt.expected, result) }) } }