package ical import ( "strings" "testing" "time" "unicode/utf8" "usoscal/internal/store" ) func TestWrite(t *testing.T) { warsaw, err := time.LoadLocation("Europe/Warsaw") if err != nil { t.Fatal(err) } event := store.Event{ UID: "sm-90917229", Start: time.Date(2026, 10, 9, 11, 45, 0, 0, warsaw), End: time.Date(2026, 10, 9, 13, 15, 0, 0, warsaw), Title: "Algebra liniowa z elementami matematyki dyskretnej", Kind: "Laboratorium", Group: "2", Room: "602", Building: "A1 - BM - Budowa Maszyn, budynek z zegarem", Address: "ul. Piotrowo 3, 61-138 Poznań, Polska", Lecturers: "dr inż. Zażółć Gęślą-Jaźń", URL: "https://usosweb.put.poznan.pl/kontroler.php?_action=x&gr_nr=2", UpdatedAt: time.Date(2026, 10, 1, 8, 0, 0, 0, time.UTC), } var out strings.Builder if err := Write(&out, "USOS", "usos.example", []store.Event{event}); err != nil { t.Fatal(err) } text := out.String() for _, rawLine := range strings.Split(strings.TrimSuffix(text, "\r\n"), "\r\n") { if len(rawLine) > lineLimit+1 { t.Errorf("line longer than the fold limit: %q", rawLine) } if !utf8.ValidString(rawLine) { t.Errorf("fold split a character: %q", rawLine) } } if strings.Contains(strings.ReplaceAll(text, "\r\n", ""), "\n") { t.Error("bare line feed in the output") } unfolded := strings.ReplaceAll(text, "\r\n ", "") for _, want := range []string{ "UID:sm-90917229@usos.example\r\n", "DTSTART:20261009T094500Z\r\n", "DTEND:20261009T111500Z\r\n", "SUMMARY:Algebra liniowa z elementami matematyki dyskretnej (Laboratorium)\r\n", `LOCATION:602 (A1 - BM - Budowa Maszyn\, budynek z zegarem)\, ul. Piotrowo 3\, 61-138 Poznań\, Polska` + "\r\n", `DESCRIPTION:Laboratorium\, group 2\nLecturer: dr inż. Zażółć Gęślą-Jaźń\nhttps://usosweb.put.poznan.pl/kontroler.php?_action=x&gr_nr=2` + "\r\n", "END:VCALENDAR\r\n", } { if !strings.Contains(unfolded, want) { t.Errorf("missing %q in\n%s", want, unfolded) } } } func TestSparseEvent(t *testing.T) { event := store.Event{UID: "x", Title: "Spotkanie", Kind: "Spotkanie", Start: time.Unix(0, 0), End: time.Unix(60, 0)} if got := Summary(event); got != "Spotkanie" { t.Errorf("Summary = %q", got) } if got := Location(event); got != "" { t.Errorf("Location = %q", got) } if got := Description(event); got != "Spotkanie" { t.Errorf("Description = %q", got) } }