package api import ( "testing" "time" "gardomatic.kleiax.de/internal/storage" ) func TestSyncSeasonTaskTemplatesCreatesAndPreservesDerivedTemplates(t *testing.T) { gardenID, march, day, april := 3, 3, 10, 4 model := &templateTestModel{items: map[int]storage.SpeciesTaskTemplate{}, nextID: 4} app, _, _ := newGardenTestApplication() app.models.SpeciesTaskTemplates = model species := storage.Species{ID: 2, GardenID: &gardenID, PlantingMonthFrom: &march, PlantingDayFrom: &day, PlantingMonthTo: &april, PlantingDayTo: &day} if err := app.syncSeasonTaskTemplates(gardenID, species); err != nil { t.Fatal(err) } if len(model.items) != 1 { t.Fatalf("templates=%d want=1", len(model.items)) } var generated storage.SpeciesTaskTemplate for _, generated = range model.items { } if generated.Origin != storage.TaskTemplateOriginSeasonPlanting || generated.TriggerType != storage.TaskTriggerRelativeToSpeciesPlanting { t.Fatalf("unexpected generated template: %+v", generated) } if generated.Duration != 31 || generated.Recurrence != storage.TaskRecurrenceNone { t.Fatalf("unexpected generated schedule: %+v", generated) } generated.Title, generated.Active = "Eigener Titel", false model.items[generated.ID] = generated if err := app.syncSeasonTaskTemplates(gardenID, species); err != nil { t.Fatal(err) } if got := model.items[generated.ID]; got.Title != "Eigener Titel" || got.Active { t.Fatalf("user changes were overwritten: %+v", got) } } func TestGeneratedTaskUsesSpeciesPlantingSeason(t *testing.T) { acquired := time.Date(2026, 8, 1, 0, 0, 0, 0, time.UTC) month, day := 3, 15 plant := storage.Plant{ID: 8, AcquiredAt: &acquired} species := storage.Species{PlantingMonthFrom: &month, PlantingDayFrom: &day} template := storage.SpeciesTaskTemplate{ID: 9, Title: "Pflanzen", TriggerType: storage.TaskTriggerRelativeToSpeciesPlanting, DurationUnit: storage.TaskDurationDay} tasks := generatedTasksForTemplate(plant, species, template, nil, 3, 1, time.Date(2026, 9, 1, 0, 0, 0, 0, time.UTC)) if len(tasks) != 1 || tasks[0].DueAtStart.Month() != time.March || tasks[0].DueAtStart.Day() != 15 || tasks[0].DueAtStart.Year() != 2027 { t.Fatalf("unexpected planting season task: %+v", tasks) } }