fix(go): cache mileage after successful write

This commit is contained in:
lingniu
2026-07-03 08:43:58 +08:00
parent 8f5afd20a6
commit 1830798d2e
2 changed files with 40 additions and 1 deletions

View File

@@ -3,6 +3,7 @@ package stats
import (
"context"
"database/sql"
"errors"
"strings"
"testing"
"time"
@@ -174,6 +175,30 @@ func TestWriterSkipsConsecutiveDuplicateMileageSamples(t *testing.T) {
}
}
func TestWriterDoesNotCacheMileageWhenUpsertFails(t *testing.T) {
exec := &recordingExec{errs: []error{errors.New("mysql unavailable"), nil}}
writer := NewWriter(exec, time.FixedZone("Asia/Shanghai", 8*3600))
event := envelope.FrameEnvelope{
Protocol: envelope.ProtocolJT808,
VIN: "LNBVIN00000000001",
EventTimeMS: time.Date(2026, 7, 1, 9, 0, 0, 0, time.FixedZone("Asia/Shanghai", 8*3600)).UnixMilli(),
Fields: map[string]any{
envelope.FieldTotalMileageKM: 10241.2,
},
}
if err := writer.Append(context.Background(), event); err == nil {
t.Fatalf("first Append() error = nil, want mysql error")
}
if err := writer.Append(context.Background(), event); err != nil {
t.Fatalf("retry Append() error = %v", err)
}
if len(exec.calls) != 2 {
t.Fatalf("exec calls = %d, want 2", len(exec.calls))
}
}
func TestWriterKeepsOnlyLatestDateInMileageCache(t *testing.T) {
exec := &recordingExec{}
writer := NewWriter(exec, time.FixedZone("Asia/Shanghai", 8*3600))
@@ -209,9 +234,15 @@ type execCall struct {
type recordingExec struct {
calls []execCall
errs []error
}
func (e *recordingExec) ExecContext(_ context.Context, query string, args ...any) (sql.Result, error) {
e.calls = append(e.calls, execCall{query: query, args: args})
if len(e.errs) > 0 {
err := e.errs[0]
e.errs = e.errs[1:]
return nil, err
}
return nil, nil
}