Files

83 lines
3.9 KiB
Go

package api
import (
"context"
"io"
"log/slog"
"net/http/httptest"
"strings"
"testing"
"git.amiirkhl.ir/starcoach-hackathon/zarinpal-analytics-backend/internal/identity"
"git.amiirkhl.ir/starcoach-hackathon/zarinpal-analytics-backend/internal/insight"
)
type fakeInsightService struct {
refreshSection func(int64, string, insight.Module, insight.Section, string) (insight.Job, bool, error)
}
func (fakeInsightService) Latest(context.Context, int64, string, insight.Module) (insight.Snapshot, error) {
return insight.Snapshot{}, insight.ErrNotFound
}
func (fakeInsightService) Refresh(context.Context, int64, string, insight.Module, string) (insight.Job, bool, error) {
return insight.Job{}, false, nil
}
func (fakeInsightService) Enqueue(context.Context, int64, string, insight.Module, string) (insight.Job, bool, error) {
return insight.Job{}, false, nil
}
func (f fakeInsightService) RefreshSection(_ context.Context, merchantID int64, terminalID string, module insight.Module, section insight.Section, key string) (insight.Job, bool, error) {
return f.refreshSection(merchantID, terminalID, module, section, key)
}
func (fakeInsightService) GetJob(context.Context, int64, string) (insight.Job, error) {
return insight.Job{}, insight.ErrNotFound
}
func (fakeInsightService) EventsAfter(context.Context, int64, string, int64) ([]insight.Event, error) {
return nil, nil
}
func (fakeInsightService) LatestForPeriod(context.Context, int64, string, insight.Module, insight.PeriodScope) (insight.Snapshot, error) {
return insight.Snapshot{}, insight.ErrNotFound
}
func (fakeInsightService) RefreshForPeriod(context.Context, int64, string, insight.Module, insight.PeriodScope, string) (insight.Job, bool, error) {
return insight.Job{}, false, nil
}
func (fakeInsightService) RefreshSectionForPeriod(context.Context, int64, string, insight.Module, insight.Section, insight.PeriodScope, string) (insight.Job, bool, error) {
return insight.Job{}, false, nil
}
func TestRefreshAIInsightSectionTargetsOnlyRequestedSection(t *testing.T) {
service := fakeInsightService{refreshSection: func(merchantID int64, terminalID string, module insight.Module, section insight.Section, key string) (insight.Job, bool, error) {
if merchantID != 7 || terminalID != "T83" || module != insight.ModulePayments || section != insight.SectionFuture7Days || key != "section-refresh-123" {
t.Fatalf("unexpected request: %d %s %s %s %s", merchantID, terminalID, module, section, key)
}
return insight.Job{JobID: "insightjob_0123456789abcdef01234567", SnapshotID: "snapshot", Module: module, Section: section, State: "QUEUED"}, false, nil
}}
server := &Server{logger: slog.New(slog.NewTextHandler(io.Discard, nil)), insights: service}
request := httptest.NewRequest("POST", "/", strings.NewReader(`{"terminalId":"T83"}`))
request.SetPathValue("module", "payments")
request.SetPathValue("sectionId", "future-7-days")
request.Header.Set("Idempotency-Key", "section-refresh-123")
request = request.WithContext(context.WithValue(request.Context(), sessionKey{}, identity.Session{MerchantID: 7, UserID: 3}))
response := httptest.NewRecorder()
server.refreshAIInsightSection(response, request)
if response.Code != 202 || !strings.Contains(response.Body.String(), `"sectionId":"future-7-days"`) {
t.Fatalf("status=%d body=%s", response.Code, response.Body.String())
}
}
func TestRefreshAIInsightSectionRejectsUnsupportedNinetyDaySection(t *testing.T) {
server := &Server{logger: slog.New(slog.NewTextHandler(io.Discard, nil)), insights: fakeInsightService{}}
request := httptest.NewRequest("POST", "/", strings.NewReader(`{}`))
request.SetPathValue("module", "payments")
request.SetPathValue("sectionId", "future-90-days")
request.Header.Set("Idempotency-Key", "section-refresh-123")
response := httptest.NewRecorder()
server.refreshAIInsightSection(response, request)
if response.Code != 422 {
t.Fatalf("status=%d body=%s", response.Code, response.Body.String())
}
}