Files
lingniu-vehicle-ingest/vehicle-data-platform/apps/api/internal/platform/service_test.go
2026-07-04 07:50:37 +08:00

86 lines
2.8 KiB
Go

package platform
import (
"context"
"net/url"
"testing"
)
type countingStore struct {
*MockStore
vehiclesCalls int
vehicleRealtimeCalls int
overviewBatchCalls int
}
func newCountingStore() *countingStore {
return &countingStore{MockStore: NewMockStore()}
}
func (s *countingStore) Vehicles(ctx context.Context, query url.Values) (Page[VehicleRow], error) {
s.vehiclesCalls++
return s.MockStore.Vehicles(ctx, query)
}
func (s *countingStore) VehicleRealtime(ctx context.Context, query url.Values) (Page[VehicleRealtimeRow], error) {
s.vehicleRealtimeCalls++
return s.MockStore.VehicleRealtime(ctx, query)
}
func (s *countingStore) VehicleServiceOverviews(ctx context.Context, query VehicleOverviewBatchQuery) (Page[VehicleServiceOverview], error) {
s.overviewBatchCalls++
return s.MockStore.VehicleServiceOverviews(ctx, query)
}
func TestVehicleServiceOverviewUsesBatchDataPath(t *testing.T) {
store := newCountingStore()
service := NewService(store)
overview, err := service.VehicleServiceOverview(context.Background(), "粤AG18312", "")
if err != nil {
t.Fatalf("VehicleServiceOverview returned error: %v", err)
}
if overview.VIN != "LB9A32A24R0LS1426" {
t.Fatalf("expected canonical VIN from overview, got %+v", overview)
}
if store.overviewBatchCalls != 1 || store.vehiclesCalls != 0 || store.vehicleRealtimeCalls != 0 {
t.Fatalf("single overview should use one batch store call, batch=%d vehicles=%d realtime=%d", store.overviewBatchCalls, store.vehiclesCalls, store.vehicleRealtimeCalls)
}
}
func TestVehicleServiceOverviewsUsesBatchDataPath(t *testing.T) {
store := newCountingStore()
service := NewService(store)
page, err := service.VehicleServiceOverviews(context.Background(), VehicleOverviewBatchQuery{
Keywords: []string{"粤AG18312", "LMRKH9AC2R1004087"},
Limit: 200,
})
if err != nil {
t.Fatalf("VehicleServiceOverviews returned error: %v", err)
}
if page.Total != 2 || len(page.Items) != 2 {
t.Fatalf("expected two overview rows, got %+v", page)
}
if store.vehiclesCalls > 1 || store.vehicleRealtimeCalls > 1 {
t.Fatalf("batch overview should avoid per-keyword store calls, vehicles=%d realtime=%d", store.vehiclesCalls, store.vehicleRealtimeCalls)
}
}
func TestVehicleServiceSummaryCountsProtocolOnlineByProtocolSlot(t *testing.T) {
service := NewService(NewMockStore())
summary, err := service.VehicleServiceSummary(context.Background())
if err != nil {
t.Fatalf("VehicleServiceSummary returned error: %v", err)
}
byProtocol := map[string]ProtocolStat{}
for _, protocol := range summary.Protocols {
byProtocol[protocol.Protocol] = protocol
}
gb32960 := byProtocol["GB32960"]
if gb32960.Total != 2 {
t.Fatalf("expected two GB32960 source slots, got %+v", gb32960)
}
if gb32960.Online != 1 {
t.Fatalf("GB32960 online count must use GB32960 source status only, got %+v", gb32960)
}
}