package trafficusage import ( "context" "errors" "git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/model" "testing" ) func TestPersistenceFailureRetainsSnapshot(t *testing.T) { upstream := &upstreamStub{dailyOutput: validDailyOutput()} repository := &repositoryStub{dailyErr: errors.New("database offline")} service := New(upstream, repository) message := validDailyMessage() var failure *Failure if err := service.RetryDaily(context.Background(), message); !errors.As(err, &failure) || failure.UsageMb == nil || *failure.UsageMb != 1 { t.Fatalf("snapshot missing: %v", err) } message.UsageMb = failure.UsageMb repository.dailyErr = nil if err := service.RetryDaily(context.Background(), message); err != nil { t.Fatal(err) } if upstream.dailyCalls != 1 || repository.dailyCalls != 2 { t.Fatal("persistence retry queried upstream again") } } func TestZeroSnapshotBypassesUpstream(t *testing.T) { upstream, repository := &upstreamStub{}, &repositoryStub{} service := New(upstream, repository) zero := 0.0 message := validDailyMessage() message.UsageMb = &zero if err := service.RetryDaily(context.Background(), message); err != nil { t.Fatal(err) } monthly := model.TrafficUsageMonthlyRetryMessage{SimKey: message.SimKey, Card: message.Card, QueryDate: "202607", UsageMb: &zero} if err := service.RetryMonthly(context.Background(), monthly); err != nil { t.Fatal(err) } if upstream.dailyCalls != 0 || upstream.monthlyCalls != 0 || repository.dailyCalls != 1 || repository.monthlyCalls != 1 { t.Fatal("zero snapshot was not persisted directly") } } func TestRejectMismatchedOrMissingResult(t *testing.T) { for _, output := range [][]model.SimBaseRes[model.SimDataUsageDailyOutputItem]{nil, {{}}, {{SimKey: &model.SimKey{ICCID: "wrong"}}}, {validDailyOutput()[0], validDailyOutput()[0]}} { upstream, repository := &upstreamStub{dailyOutput: output}, &repositoryStub{} if err := New(upstream, repository).RetryDaily(context.Background(), validDailyMessage()); err == nil || repository.dailyCalls != 0 { t.Fatal("invalid result accepted") } } }