package binlog import ( "testing" "time" ) func TestSummarizeTransaction(t *testing.T) { tx := Transaction{ GTID: "uuid:1", Timestamp: 100, StartPos: 120, EndPos: 240, Size: 120, LastCommitted: 98, SequenceNumber: 100, TransactionLength: 4096, Txs: []TxDetail{ {SqlType: "query", Sql: "BEGIN", Timestamp: 100}, {SqlType: "insert", Db: "Shop", Table: "Orders", Sql: "insert into orders values (1)", RowCount: 2, Timestamp: 101}, {SqlType: "delete", Db: "shop", Table: "orders", Sql: "delete from orders where id = 2", RowCount: 1, Timestamp: 102}, {SqlType: "query", Sql: "COMMIT", Timestamp: 103}, }, } got := SummarizeTransaction(tx) if got.Outcome != TransactionOutcomeCommit { t.Fatalf("unexpected outcome: %s", got.Outcome) } if !got.HasBeginBoundary || !got.HasEndBoundary || !got.HasExplicitDuration || !got.HasDuration { t.Fatalf("expected explicit duration markers: %#v", got) } if got.Duration != 3*time.Second { t.Fatalf("unexpected duration: %s", got.Duration) } if got.RowsCount != 3 || got.StatementsCount != 2 { t.Fatalf("unexpected rows/statements: rows=%d stmts=%d", got.RowsCount, got.StatementsCount) } if len(got.Tables) != 1 || got.Tables[0] != "shop.orders" { t.Fatalf("unexpected tables: %#v", got.Tables) } if got.SampleSQL != "insert into orders values (1)" { t.Fatalf("unexpected sample sql: %q", got.SampleSQL) } if got.LastCommitted != 98 || got.SequenceNumber != 100 || got.TransactionLength != 4096 { t.Fatalf("logical metadata not preserved: %#v", got) } } func TestSummarizeTransaction_Autocommit(t *testing.T) { tx := Transaction{ GTID: "uuid:2", Timestamp: 100, Txs: []TxDetail{ {SqlType: "insert", Db: "db", Table: "tb", Sql: "insert into tb values (1)", RowCount: 1, Timestamp: 100}, }, } got := SummarizeTransaction(tx) if got.Outcome != TransactionOutcomeAutocommit { t.Fatalf("unexpected outcome: %s", got.Outcome) } if got.SeenTime.IsZero() || got.BeginTime.IsZero() || got.EndTime.IsZero() { t.Fatalf("expected lazy times to be filled: %#v", got) } }