internal/task/schedule_hint_test.go
Rama main · réplica de lectura del repositorio original.
package task
import (
"testing"
"time"
)
func hintScheduleFixture(scheduleID string, creatorPersonID string, description string, nextRunAt *time.Time) Schedule {
return Schedule{
ScheduleID: scheduleID,
CreatorPersonID: creatorPersonID,
Name: description,
Kind: ScheduleKindInterval,
IntervalSecond: 3600,
NextRunAt: nextRunAt,
}
}
func TestOpenSchedulesCreatedByLeavesOutColleaguesAndExpiredSchedules(t *testing.T) {
referenceTime := time.Now().UTC()
nextRunAt := referenceTime.Add(time.Hour)
schedules := []Schedule{
hintScheduleFixture("schedule-own", "person-이샘플", "내 점검", &nextRunAt),
hintScheduleFixture("schedule-colleague", "person-박예시", "최견본 점검", &nextRunAt),
hintScheduleFixture("schedule-expired", "person-이샘플", "지난 점검", nil),
}
own := OpenSchedulesCreatedBy(schedules, "person-이샘플", referenceTime)
if len(own) != 1 || own[0].ScheduleID != "schedule-own" {
t.Fatalf("unexpected own schedules: %+v", own)
}
}
func TestResolveScheduleHintPrefersAnExactIdentifier(t *testing.T) {
referenceTime := time.Now().UTC()
nextRunAt := referenceTime.Add(time.Hour)
schedules := []Schedule{
hintScheduleFixture("schedule-1", "person-이샘플", "주간 보고", &nextRunAt),
hintScheduleFixture("schedule-2", "person-이샘플", "schedule-1", &nextRunAt),
}
resolution := ResolveScheduleHint("schedule-1", schedules)
if resolution.Outcome != ScheduleHintResolved || resolution.Match.ScheduleID != "schedule-1" {
t.Fatalf("unexpected resolution: %+v", resolution)
}
}
func TestResolveScheduleHintTakesAUniquePartialDescription(t *testing.T) {
referenceTime := time.Now().UTC()
nextRunAt := referenceTime.Add(time.Hour)
schedules := []Schedule{
hintScheduleFixture("schedule-1", "person-이샘플", "주간 보고 월요일", &nextRunAt),
hintScheduleFixture("schedule-2", "person-이샘플", "일일 점검", &nextRunAt),
}
resolution := ResolveScheduleHint("주간", schedules)
if resolution.Outcome != ScheduleHintResolved || resolution.Match.ScheduleID != "schedule-1" {
t.Fatalf("unexpected resolution: %+v", resolution)
}
}
func TestResolveScheduleHintPrefersAnExactDescriptionOverASharedPrefix(t *testing.T) {
referenceTime := time.Now().UTC()
nextRunAt := referenceTime.Add(time.Hour)
schedules := []Schedule{
hintScheduleFixture("schedule-1", "person-이샘플", "주간 보고", &nextRunAt),
hintScheduleFixture("schedule-2", "person-이샘플", "주간 보고 금요일", &nextRunAt),
}
resolution := ResolveScheduleHint("주간 보고", schedules)
if resolution.Outcome != ScheduleHintResolved || resolution.Match.ScheduleID != "schedule-1" {
t.Fatalf("unexpected resolution: %+v", resolution)
}
}
func TestResolveScheduleHintAnswersSeveralMatchesWithCandidates(t *testing.T) {
referenceTime := time.Now().UTC()
nextRunAt := referenceTime.Add(time.Hour)
schedules := []Schedule{
hintScheduleFixture("schedule-1", "person-이샘플", "주간 보고 월요일", &nextRunAt),
hintScheduleFixture("schedule-2", "person-이샘플", "주간 보고 금요일", &nextRunAt),
}
resolution := ResolveScheduleHint("주간 보고", schedules)
if resolution.Outcome != ScheduleHintAmbiguous || len(resolution.Candidates) != 2 {
t.Fatalf("unexpected resolution: %+v", resolution)
}
if resolution.Candidates[0].ScheduleID != "schedule-1" || resolution.Candidates[0].NextRunAt == nil {
t.Fatalf("unexpected candidates: %+v", resolution.Candidates)
}
}
func TestResolveScheduleHintAnswersNothingWithNoCandidate(t *testing.T) {
referenceTime := time.Now().UTC()
nextRunAt := referenceTime.Add(time.Hour)
schedules := []Schedule{hintScheduleFixture("schedule-1", "person-이샘플", "주간 보고", &nextRunAt)}
for _, hint := range []string{"", "최견본 점검"} {
resolution := ResolveScheduleHint(hint, schedules)
if resolution.Outcome != ScheduleHintNotFound || len(resolution.Candidates) != 0 {
t.Fatalf("hint %q resolution = %+v", hint, resolution)
}
}
}