123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- package service
- import (
- "encoding/json"
- "reflect"
- "testing"
- "go-common/app/infra/canal/model"
- pb "github.com/pingcap/tidb-tools/tidb_binlog/slave_binlog_proto/go-binlog"
- )
- func Test_tidbMakeData(t *testing.T) {
- insertMsg, insertData := prepareInsertData()
- delMsg, delData := prepareDeleteData()
- updateMsg, updateData := prepareUpdateData()
- updateMsg2, updateData2 := prepareUpdateData2()
- type args struct {
- m *msg
- }
- tests := []struct {
- name string
- args args
- wantData *model.Data
- wantErr bool
- }{
- {name: "insert", args: args{m: insertMsg}, wantData: insertData, wantErr: false},
- {name: "delete", args: args{m: delMsg}, wantData: delData, wantErr: false},
- {name: "update", args: args{m: updateMsg}, wantData: updateData, wantErr: false},
- {name: "update2", args: args{m: updateMsg2}, wantData: updateData2, wantErr: false},
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- gotData, err := tidbMakeData(tt.args.m)
- if (err != nil) != tt.wantErr {
- t.Errorf("tidbMakeData() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- gotjson, _ := json.Marshal(gotData)
- wantjson, _ := json.Marshal(tt.wantData)
- if !reflect.DeepEqual(gotjson, wantjson) {
- t.Errorf("tidbMakeData() = %v, want %v", gotData, tt.wantData)
- }
- })
- }
- }
- func prepareInsertData() (*msg, *model.Data) {
- insertPb := &pb.Binlog{}
- json.Unmarshal([]byte(`{"type":0,"commit_ts":403846216359608325,"dml_data":{"tables":[{"schema_name":"bilibili_likes","table_name":"likes","column_info":[{"name":"id","mysql_type":"bigint","is_primary_key":false},{"name":"mtime","mysql_type":"timestamp","is_primary_key":false},{"name":"ctime","mysql_type":"timestamp","is_primary_key":false},{"name":"business_id","mysql_type":"int","is_primary_key":false},{"name":"origin_id","mysql_type":"bigint","is_primary_key":false},{"name":"message_id","mysql_type":"bigint","is_primary_key":false},{"name":"mid","mysql_type":"int","is_primary_key":false},{"name":"type","mysql_type":"tinyint","is_primary_key":false}],"mutations":[{"type":0,"row":{"columns":[{"uint64_value":1},{"string_value":"2018-10-26 18:50:57"},{"string_value":"2018-10-26 18:50:57"},{"uint64_value":5},{"uint64_value":0},{"uint64_value":1},{"uint64_value":8167601},{"uint64_value":1}]}}]}]}}`), insertPb)
- insertMsg := &msg{
- db: "bilibili_likes",
- table: "counts",
- tableRegexp: "counts",
- mu: insertPb.DmlData.Tables[0].Mutations[0],
- ignore: map[string]bool{"ctime": true},
- keys: []string{"id", "mid"},
- columns: insertPb.DmlData.Tables[0].ColumnInfo,
- }
- insertData := &model.Data{
- Action: "insert",
- Table: "counts",
- Key: "1,8167601",
- New: map[string]interface{}{
- "id": 1,
- "business_id": 5,
- "origin_id": 0,
- "message_id": 1,
- "mid": 8167601,
- "type": 1,
- "mtime": "2018-10-26 18:50:57",
- },
- }
- return insertMsg, insertData
- }
- func prepareDeleteData() (*msg, *model.Data) {
- pbData := &pb.Binlog{}
- json.Unmarshal([]byte(`{"type":0,"commit_ts":403846189135953921,"dml_data":{"tables":[{"schema_name":"bilibili_likes","table_name":"likes","column_info":[{"name":"id","mysql_type":"bigint","is_primary_key":false},{"name":"mtime","mysql_type":"timestamp","is_primary_key":false},{"name":"ctime","mysql_type":"timestamp","is_primary_key":false},{"name":"business_id","mysql_type":"int","is_primary_key":false},{"name":"origin_id","mysql_type":"bigint","is_primary_key":false},{"name":"message_id","mysql_type":"bigint","is_primary_key":false},{"name":"mid","mysql_type":"int","is_primary_key":false},{"name":"type","mysql_type":"tinyint","is_primary_key":false}],"mutations":[{"type":2,"row":{"columns":[{"uint64_value":7},{"string_value":"2018-01-11 12:19:10"},{"string_value":"2018-01-11 12:19:10"},{"uint64_value":2},{"uint64_value":0},{"uint64_value":897},{"uint64_value":27515233},{"uint64_value":1}]}}]}]}}`), pbData)
- msg := &msg{
- db: "bilibili_likes",
- table: "counts",
- tableRegexp: "counts",
- mu: pbData.DmlData.Tables[0].Mutations[0],
- ignore: map[string]bool{"ctime": true},
- keys: []string{"message_id"},
- columns: pbData.DmlData.Tables[0].ColumnInfo,
- }
- data := &model.Data{
- Action: "delete",
- Table: "counts",
- Key: "897",
- New: map[string]interface{}{
- "id": 7,
- "business_id": 2,
- "origin_id": 0,
- "message_id": 897,
- "mid": 27515233,
- "type": 1,
- "mtime": "2018-01-11 12:19:10",
- },
- }
- return msg, data
- }
- func prepareUpdateData() (*msg, *model.Data) {
- pbData := &pb.Binlog{}
- // update likes type from 1 to 0
- json.Unmarshal([]byte(`{"type":0,"commit_ts":403846165844459523,"dml_data":{"tables":[{"schema_name":"bilibili_likes","table_name":"likes","column_info":[{"name":"id","mysql_type":"bigint","is_primary_key":false},{"name":"mtime","mysql_type":"timestamp","is_primary_key":false},{"name":"ctime","mysql_type":"timestamp","is_primary_key":false},{"name":"business_id","mysql_type":"int","is_primary_key":false},{"name":"origin_id","mysql_type":"bigint","is_primary_key":false},{"name":"message_id","mysql_type":"bigint","is_primary_key":false},{"name":"mid","mysql_type":"int","is_primary_key":false},{"name":"type","mysql_type":"tinyint","is_primary_key":false}],"mutations":[{"type":1,"row":{"columns":[{"uint64_value":4},{"string_value":"2018-10-26 18:47:44"},{"string_value":"2017-12-22 15:05:29"},{"uint64_value":5},{"uint64_value":0},{"uint64_value":46997},{"uint64_value":88895031},{"uint64_value":0}]},"change_row":{"columns":[{"uint64_value":4},{"string_value":"2017-12-22 15:55:52"},{"string_value":"2017-12-22 15:05:29"},{"uint64_value":5},{"uint64_value":0},{"uint64_value":46997},{"uint64_value":88895031},{"uint64_value":1}]}}]}]}}`), pbData)
- msg := &msg{
- db: "bilibili_likes",
- table: "counts",
- tableRegexp: "counts",
- mu: pbData.DmlData.Tables[0].Mutations[0],
- ignore: map[string]bool{"ctime": true},
- keys: []string{"mid"},
- columns: pbData.DmlData.Tables[0].ColumnInfo,
- }
- data := &model.Data{
- Action: "update",
- Table: "counts",
- Key: "88895031",
- Old: map[string]interface{}{
- "id": 4,
- "business_id": 5,
- "origin_id": 0,
- "message_id": 46997,
- "mid": 88895031,
- "type": 1,
- "mtime": "2017-12-22 15:55:52",
- },
- New: map[string]interface{}{
- "id": 4,
- "business_id": 5,
- "origin_id": 0,
- "message_id": 46997,
- "mid": 88895031,
- "type": 0,
- "mtime": "2018-10-26 18:47:44",
- },
- }
- return msg, data
- }
- func prepareUpdateData2() (*msg, *model.Data) {
- muJson := `{"type":1,"row":{"columns":[{"uint64_value":0},{"string_value":"2018-11-03 17:07:44"},{"string_value":"2018-11-03 14:55:38"},{"uint64_value":3},{"uint64_value":0},{"uint64_value":88889},{"uint64_value":3},{"uint64_value":0},{"int64_value":0},{"int64_value":0},{"uint64_value":8167601}]},"change_row":{"columns":[{"uint64_value":0},{"string_value":"2018-11-03 16:36:39"},{"string_value":"2018-11-03 14:55:38"},{"uint64_value":3},{"uint64_value":0},{"uint64_value":88889},{"uint64_value":2},{"uint64_value":0},{"int64_value":0},{"int64_value":0},{"uint64_value":8167601}]}}`
- columnJson := `[{"name":"id","mysql_type":"bigint","is_primary_key":false},{"name":"mtime","mysql_type":"timestamp","is_primary_key":false},{"name":"ctime","mysql_type":"timestamp","is_primary_key":false},{"name":"business_id","mysql_type":"int","is_primary_key":false},{"name":"origin_id","mysql_type":"bigint","is_primary_key":false},{"name":"message_id","mysql_type":"bigint","is_primary_key":false},{"name":"likes_count","mysql_type":"int","is_primary_key":false},{"name":"dislikes_count","mysql_type":"int","is_primary_key":false},{"name":"likes_change","mysql_type":"bigint","is_primary_key":false},{"name":"dislikes_change","mysql_type":"bigint","is_primary_key":false},{"name":"up_mid","mysql_type":"int","is_primary_key":false}]`
- msg := &msg{
- db: "bilibili_likes",
- table: "counts",
- tableRegexp: "counts",
- keys: []string{"message_id"},
- }
- json.Unmarshal([]byte(columnJson), &msg.columns)
- json.Unmarshal([]byte(muJson), &msg.mu)
- data := &model.Data{
- Action: "update",
- Table: "counts",
- Key: "88889",
- Old: map[string]interface{}{
- "ctime": "2018-11-03 14:55:38",
- "origin_id": 0,
- "dislikes_count": 0,
- "up_mid": 8167601,
- "id": 0,
- "mtime": "2018-11-03 16:36:39",
- "likes_count": 2,
- "likes_change": 0,
- "dislikes_change": 0,
- "business_id": 3,
- "message_id": 88889,
- },
- New: map[string]interface{}{
- "likes_count": 3,
- "dislikes_count": 0,
- "likes_change": 0,
- "id": 0,
- "mtime": "2018-11-03 17:07:44",
- "ctime": "2018-11-03 14:55:38",
- "origin_id": 0,
- "message_id": 88889,
- "business_id": 3,
- "dislikes_change": 0,
- "up_mid": 8167601,
- },
- }
- return msg, data
- }
|