| 540 | } |
| 541 | |
| 542 | func TestStringSliceFile(t *testing.T) { |
| 543 | tests := []struct { |
| 544 | content string |
| 545 | want []string |
| 546 | }{ |
| 547 | {content: "line1\nline2\nline3\n", want: []string{"line1", "line2", "line3"}}, |
| 548 | { |
| 549 | content: "line1\n\nline2\n\n\nline3\n", |
| 550 | want: []string{"line1", "line2", "line3"}, |
| 551 | }, |
| 552 | { |
| 553 | content: "line1\n# comment\nline2\n# another comment\nline3\n", |
| 554 | want: []string{"line1", "line2", "line3"}, |
| 555 | }, |
| 556 | { |
| 557 | content: " line1 \n line2\nline3 \n", |
| 558 | want: []string{"line1", "line2", "line3"}, |
| 559 | }, |
| 560 | {content: "line1\nline2\nline3", want: []string{"line1", "line2", "line3"}}, |
| 561 | } |
| 562 | |
| 563 | for _, tt := range tests { |
| 564 | t.Run(fmt.Sprint(tt.want), func(t *testing.T) { |
| 565 | tmpfile, err := os.CreateTemp(t.TempDir(), "test-*.txt") |
| 566 | require.NoError(t, err) |
| 567 | defer os.Remove(tmpfile.Name()) |
| 568 | |
| 569 | _, err = tmpfile.WriteString(tt.content) |
| 570 | require.NoError(t, err) |
| 571 | tmpfile.Close() |
| 572 | |
| 573 | t.Setenv(testVar, tmpfile.Name()) |
| 574 | desc := env.StringSliceFile(testVar) |
| 575 | |
| 576 | var result []string |
| 577 | require.NoError(t, desc.Parse(&result)) |
| 578 | |
| 579 | assert.Equal(t, tt.want, result) |
| 580 | }) |
| 581 | } |
| 582 | |
| 583 | t.Run("returns nil for empty path", func(t *testing.T) { |
| 584 | t.Setenv(testVar, "") |
| 585 | desc := env.StringSliceFile(testVar) |
| 586 | |
| 587 | var result []string |
| 588 | require.NoError(t, desc.Parse(&result)) |
| 589 | |
| 590 | assert.Nil(t, result) |
| 591 | }) |
| 592 | |
| 593 | t.Run("returns error for nonexistent file", func(t *testing.T) { |
| 594 | t.Setenv(testVar, "/nonexistent/file.txt") |
| 595 | desc := env.StringSliceFile(testVar) |
| 596 | |
| 597 | var result []string |
| 598 | err := desc.Parse(&result) |
| 599 | |