From e91a7dadb4401a553ffdd4f3661640921e425eb6 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Mon, 27 Jul 2026 13:23:51 +0200 Subject: feat(cli): --cal-new scaffold + --cal-check lint for custom calendar layers Also: reject out-of-range MM-DD in resolveDate (strict validation for user data). --- internal/cli/callayer_test.go | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 internal/cli/callayer_test.go (limited to 'internal/cli/callayer_test.go') diff --git a/internal/cli/callayer_test.go b/internal/cli/callayer_test.go new file mode 100644 index 0000000..4803fdf --- /dev/null +++ b/internal/cli/callayer_test.go @@ -0,0 +1,57 @@ +package cli + +import ( + "bytes" + "os" + "path/filepath" + "strings" + "testing" +) + +func TestRunCalNewAndCheck(t *testing.T) { + dir := t.TempDir() + t.Setenv("LECTIO_CONFIG", filepath.Join(dir, "config.ini")) + + var buf bytes.Buffer + if code := runCalNew("krakow", &buf, &buf); code != 0 { + t.Fatalf("cal-new exit %d: %s", code, buf.String()) + } + path := filepath.Join(dir, "calendars", "krakow.ini") + if _, err := os.Stat(path); err != nil { + t.Fatal("scaffold not written") + } + + // the scaffold must validate clean + buf.Reset() + if code := runCalCheck("krakow", &buf, &buf); code != 0 { + t.Fatalf("cal-check on scaffold exit %d: %s", code, buf.String()) + } + if !strings.Contains(buf.String(), "ok:") { + t.Errorf("expected ok, got: %s", buf.String()) + } + + // refuse to overwrite + buf.Reset() + if code := runCalNew("krakow", &buf, &buf); code == 0 { + t.Error("cal-new should refuse to overwrite an existing file") + } +} + +func TestRunCalCheckReportsBadFields(t *testing.T) { + dir := t.TempDir() + t.Setenv("LECTIO_CONFIG", filepath.Join(dir, "config.ini")) + os.MkdirAll(filepath.Join(dir, "calendars"), 0o755) + os.WriteFile(filepath.Join(dir, "calendars", "bad.ini"), + []byte("[layer]\nid = bad\n\n[x]\ndate = 99-99\nrank = archfeast\ncolour = teal\n"), 0o644) + + var buf bytes.Buffer + if code := runCalCheck("bad", &buf, &buf); code == 0 { + t.Fatalf("cal-check should fail on bad fields:\n%s", buf.String()) + } + out := buf.String() + for _, want := range []string{"date", "rank", "colour"} { + if !strings.Contains(out, want) { + t.Errorf("expected a %s problem reported:\n%s", want, out) + } + } +} -- cgit v1.3