aboutsummaryrefslogtreecommitdiff
path: root/cmd/prognosis/out_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/prognosis/out_test.go')
-rw-r--r--cmd/prognosis/out_test.go91
1 files changed, 91 insertions, 0 deletions
diff --git a/cmd/prognosis/out_test.go b/cmd/prognosis/out_test.go
new file mode 100644
index 0000000..71c1bae
--- /dev/null
+++ b/cmd/prognosis/out_test.go
@@ -0,0 +1,91 @@
+package main
+
+import (
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+ "time"
+)
+
+var when = time.Date(2026, 8, 27, 12, 0, 0, 0, time.UTC)
+
+// A directory gets a generated name: writing into ~/photos/weather is more
+// useful than refusing, and two days do not overwrite each other.
+func TestResolveOutIntoADirectory(t *testing.T) {
+ dir := t.TempDir()
+ got, err := resolveOut(dir, "Krakow, PL", when, "svg")
+ if err != nil {
+ t.Fatal(err)
+ }
+ want := filepath.Join(dir, "krakow-pl-2026-08-27.svg")
+ if got != want {
+ t.Fatalf("got %q, want %q", got, want)
+ }
+
+ // A different day must not collide with the first.
+ other, _ := resolveOut(dir, "Krakow, PL", when.AddDate(0, 0, 1), "svg")
+ if other == got {
+ t.Error("two days produced the same filename")
+ }
+}
+
+func TestResolveOutCreatesATrailingSlashDirectory(t *testing.T) {
+ dir := filepath.Join(t.TempDir(), "photos", "weather") + string(os.PathSeparator)
+ got, err := resolveOut(dir, "Krakow, PL", when, "svg")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if fi, err := os.Stat(filepath.Dir(got)); err != nil || !fi.IsDir() {
+ t.Fatalf("directory was not created: %v", err)
+ }
+}
+
+// "-o weather" should not produce an extensionless file no viewer will open.
+func TestResolveOutAddsTheExtensionToABareName(t *testing.T) {
+ base := filepath.Join(t.TempDir(), "weather")
+ got, err := resolveOut(base, "Krakow, PL", when, "svg")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !strings.HasSuffix(got, ".svg") {
+ t.Fatalf("got %q, want a .svg suffix", got)
+ }
+}
+
+// An explicit extension is respected, whatever the format's default.
+func TestResolveOutKeepsAnExplicitExtension(t *testing.T) {
+ base := filepath.Join(t.TempDir(), "chart.png")
+ got, _ := resolveOut(base, "Krakow, PL", when, "svg")
+ if got != base {
+ t.Fatalf("got %q, want %q unchanged", got, base)
+ }
+}
+
+func TestSlug(t *testing.T) {
+ for in, want := range map[string]string{
+ "Krakow, PL": "krakow-pl",
+ "Tarnów, PL": "tarnow-pl",
+ "Zbylitowska Góra": "zbylitowska-gora",
+ "Gdańsk": "gdansk",
+ "Łódź": "lodz",
+ " spaced out ": "spaced-out",
+ "50.0617,19.9373": "50-0617-19-9373",
+ "!!!": "",
+ } {
+ if got := slug(in); got != want {
+ t.Errorf("slug(%q) = %q, want %q", in, got, want)
+ }
+ }
+}
+
+// A slug must never contain a path separator, or -o would write outside the
+// directory it was given.
+func TestSlugCannotEscapeADirectory(t *testing.T) {
+ for _, nasty := range []string{"../../etc/passwd", "a/b", `c\d`} {
+ got := slug(nasty)
+ if strings.ContainsAny(got, `/\`) || strings.Contains(got, "..") {
+ t.Errorf("slug(%q) = %q, which can escape the directory", nasty, got)
+ }
+ }
+}