feat(go): cache realtime locations in mysql
This commit is contained in:
@@ -36,13 +36,16 @@ func TestSnapshotWriterEnsuresSchemaAndUpsertsParsedJSON(t *testing.T) {
|
||||
t.Fatalf("Update() error = %v", err)
|
||||
}
|
||||
|
||||
if len(exec.calls) != 2 {
|
||||
t.Fatalf("exec calls = %d, want 2", len(exec.calls))
|
||||
if len(exec.calls) != 3 {
|
||||
t.Fatalf("exec calls = %d, want 3", len(exec.calls))
|
||||
}
|
||||
if !strings.Contains(exec.calls[0].query, "CREATE TABLE IF NOT EXISTS vehicle_realtime_snapshot") {
|
||||
t.Fatalf("schema query = %s", exec.calls[0].query)
|
||||
}
|
||||
upsert := exec.calls[1]
|
||||
if !strings.Contains(exec.calls[1].query, "CREATE TABLE IF NOT EXISTS vehicle_realtime_location") {
|
||||
t.Fatalf("location schema query = %s", exec.calls[1].query)
|
||||
}
|
||||
upsert := exec.calls[2]
|
||||
if !strings.Contains(upsert.query, "ON DUPLICATE KEY UPDATE") {
|
||||
t.Fatalf("upsert query = %s", upsert.query)
|
||||
}
|
||||
@@ -61,6 +64,68 @@ func TestSnapshotWriterEnsuresSchemaAndUpsertsParsedJSON(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSnapshotWriterUpsertsRealtimeLocationWhenCoordinatesExist(t *testing.T) {
|
||||
exec := &recordingSnapshotExec{}
|
||||
writer := NewSnapshotWriter(exec)
|
||||
|
||||
if err := writer.Update(context.Background(), envelope.FrameEnvelope{
|
||||
Protocol: envelope.ProtocolJT808,
|
||||
MessageID: "0x0200",
|
||||
Sequence: 9,
|
||||
VIN: "VIN001",
|
||||
Phone: "13307795425",
|
||||
DeviceID: "device-1",
|
||||
Plate: "沪A12345",
|
||||
SourceEndpoint: "1.2.3.4:808",
|
||||
EventTimeMS: 1782918600000,
|
||||
ReceivedAtMS: 1782918601000,
|
||||
EventID: "event-1",
|
||||
Parsed: map[string]any{"location": map[string]any{"latitude": 30.590151, "longitude": 121.069881}},
|
||||
Fields: map[string]any{
|
||||
envelope.FieldLatitude: 30.590151,
|
||||
envelope.FieldLongitude: 121.069881,
|
||||
envelope.FieldSpeedKMH: 23.0,
|
||||
envelope.FieldTotalMileageKM: 10241.2,
|
||||
envelope.FieldSOCPercent: 88,
|
||||
"altitude_m": uint16(5),
|
||||
"direction_deg": uint16(79),
|
||||
"alarm_flag": uint32(0),
|
||||
"status_flag": uint32(786435),
|
||||
},
|
||||
}); err != nil {
|
||||
t.Fatalf("Update() error = %v", err)
|
||||
}
|
||||
|
||||
if len(exec.calls) != 2 {
|
||||
t.Fatalf("exec calls = %d, want 2", len(exec.calls))
|
||||
}
|
||||
locationUpsert := exec.calls[1]
|
||||
if !strings.Contains(locationUpsert.query, "INSERT INTO vehicle_realtime_location") {
|
||||
t.Fatalf("location upsert query = %s", locationUpsert.query)
|
||||
}
|
||||
if got, want := locationUpsert.args[0], "JT808"; got != want {
|
||||
t.Fatalf("protocol arg = %#v, want %q", got, want)
|
||||
}
|
||||
if got, want := locationUpsert.args[1], "VIN001"; got != want {
|
||||
t.Fatalf("vehicle key arg = %#v, want %q", got, want)
|
||||
}
|
||||
if got, want := locationUpsert.args[10], 30.590151; got != want {
|
||||
t.Fatalf("latitude arg = %#v, want %v", got, want)
|
||||
}
|
||||
if got, want := locationUpsert.args[11], 121.069881; got != want {
|
||||
t.Fatalf("longitude arg = %#v, want %v", got, want)
|
||||
}
|
||||
if got, want := locationUpsert.args[12], 23.0; got != want {
|
||||
t.Fatalf("speed arg = %#v, want %v", got, want)
|
||||
}
|
||||
if got, want := locationUpsert.args[13], 10241.2; got != want {
|
||||
t.Fatalf("mileage arg = %#v, want %v", got, want)
|
||||
}
|
||||
if got, want := locationUpsert.args[14], 88.0; got != want {
|
||||
t.Fatalf("soc arg = %#v, want %v", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSnapshotWriterSkipsUnknownVehicleKey(t *testing.T) {
|
||||
exec := &recordingSnapshotExec{}
|
||||
writer := NewSnapshotWriter(exec)
|
||||
|
||||
Reference in New Issue
Block a user