weather/cache_test.go
2026-01-28 12:24:50 -05:00

84 lines
2.2 KiB
Go

package main
import (
"os"
"path/filepath"
"testing"
"time"
)
func TestCacheLocationRoundTrip(t *testing.T) {
tmp := t.TempDir()
t.Setenv("WEATHER_CACHE_DIR", tmp)
cache := NewCache(tmp)
loc := Location{Lat: 1.23, Lon: 4.56, City: "Testville", State: "TS"}
if err := cache.SaveLocation("Testville", loc); err != nil {
t.Fatalf("save location failed: %v", err)
}
loaded, ok, err := cache.LoadLocation()
if err != nil {
t.Fatalf("load location failed: %v", err)
}
if !ok {
t.Fatalf("expected cached location")
}
if loaded.City != loc.City || loaded.Lat != loc.Lat || loaded.Lon != loc.Lon {
t.Fatalf("loaded location mismatch: %+v", loaded)
}
}
func TestCacheForecastExpiry(t *testing.T) {
tmp := t.TempDir()
cache := NewCache(tmp)
loc := Location{Lat: 1.23, Lon: 4.56}
period := ForecastPeriod{Temp: 70, Unit: "F"}
if err := cache.SaveForecast(loc, "F", period); err != nil {
t.Fatalf("save forecast failed: %v", err)
}
path := filepath.Join(tmp, forecastCacheFile)
var payload ForecastCache
if err := readJSON(path, &payload); err != nil {
t.Fatalf("read forecast cache failed: %v", err)
}
payload.FetchedAt = time.Now().Add(-2 * time.Hour)
if err := writeJSON(path, payload); err != nil {
t.Fatalf("write forecast cache failed: %v", err)
}
_, ok, err := cache.LoadForecast(loc, "F", 10*time.Minute)
if err != nil {
t.Fatalf("load forecast failed: %v", err)
}
if ok {
t.Fatalf("expected expired forecast to be ignored")
}
}
func TestCacheClear(t *testing.T) {
tmp := t.TempDir()
cache := NewCache(tmp)
loc := Location{Lat: 1.23, Lon: 4.56}
period := ForecastPeriod{Temp: 70, Unit: "F"}
if err := cache.SaveLocation("Testville", loc); err != nil {
t.Fatalf("save location failed: %v", err)
}
if err := cache.SaveForecast(loc, "F", period); err != nil {
t.Fatalf("save forecast failed: %v", err)
}
if err := cache.Clear(); err != nil {
t.Fatalf("clear cache failed: %v", err)
}
if _, err := os.Stat(filepath.Join(tmp, locationCacheFile)); !os.IsNotExist(err) {
t.Fatalf("expected location cache removed, got %v", err)
}
if _, err := os.Stat(filepath.Join(tmp, forecastCacheFile)); !os.IsNotExist(err) {
t.Fatalf("expected forecast cache removed, got %v", err)
}
}