add csv export

This commit is contained in:
2026-09-03 11:59:57 -04:00
parent 7c886a7927
commit 30442d8ece
3 changed files with 150 additions and 8 deletions

View File

@@ -0,0 +1,61 @@
package entries
import (
"encoding/csv"
"strings"
"testing"
)
func TestWriteBitwardenCSV(t *testing.T) {
secrets := []Secret{{
Description: `Example, "personal"`,
URL: "https://example.com/login?a=1,b=2",
Notes: "First line\nSecond line",
Username: "person@example.com",
Password: `correct,"quoted" password`,
}}
var output strings.Builder
if err := WriteBitwardenCSV(&output, secrets); err != nil {
t.Fatalf("write export: %v", err)
}
records, err := csv.NewReader(strings.NewReader(output.String())).ReadAll()
if err != nil {
t.Fatalf("read generated CSV: %v", err)
}
if len(records) != 2 {
t.Fatalf("expected header and one item, got %d rows", len(records))
}
wantHeader := []string{
"folder", "favorite", "type", "name", "notes", "fields", "reprompt",
"login_uri", "login_username", "login_password", "login_totp",
}
if strings.Join(records[0], "|") != strings.Join(wantHeader, "|") {
t.Fatalf("unexpected header: %#v", records[0])
}
row := records[1]
if row[2] != "login" || row[3] != secrets[0].Description || row[4] != secrets[0].Notes {
t.Fatalf("item metadata was not preserved: %#v", row)
}
if row[7] != secrets[0].URL || row[8] != secrets[0].Username || row[9] != secrets[0].Password {
t.Fatalf("login fields were not preserved: %#v", row)
}
}
func TestWriteBitwardenCSVWithNoSecrets(t *testing.T) {
var output strings.Builder
if err := WriteBitwardenCSV(&output, nil); err != nil {
t.Fatalf("write export: %v", err)
}
records, err := csv.NewReader(strings.NewReader(output.String())).ReadAll()
if err != nil {
t.Fatalf("read generated CSV: %v", err)
}
if len(records) != 1 {
t.Fatalf("expected only the header, got %d rows", len(records))
}
}