Ctrl K
ComunidadGuías…

internal/task/schedule_hint_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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)
		}
	}
}