You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by wa...@apache.org on 2022/05/23 11:40:54 UTC
[incubator-devlake] 03/03: test: unit test for data convertor
This is an automated email from the ASF dual-hosted git repository.
warren pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
commit 2e0e673fca477b469cfeb2e3923b3a0526b31667
Author: Nddtfjiang <jz...@qq.com>
AuthorDate: Fri May 20 12:35:50 2022 +0000
test: unit test for data convertor
TestApiConvertorExecute
TestApiConvertorExecute_Cancel
Nddtfjiang <zh...@merico.dev>
---
plugins/helper/data_convertor_test.go | 171 ++++++++++++++++++++++++++++++++++
1 file changed, 171 insertions(+)
diff --git a/plugins/helper/data_convertor_test.go b/plugins/helper/data_convertor_test.go
new file mode 100644
index 00000000..01843d26
--- /dev/null
+++ b/plugins/helper/data_convertor_test.go
@@ -0,0 +1,171 @@
+package helper
+
+import (
+ "context"
+ "database/sql"
+ "fmt"
+ "reflect"
+ "testing"
+ "time"
+
+ "github.com/agiledragon/gomonkey/v2"
+ "github.com/magiconair/properties/assert"
+ "github.com/sirupsen/logrus"
+ "gorm.io/gorm"
+)
+
+// go test -gcflags=all=-l
+func CreateTestDataConverter(t *testing.T) (*DataConverter, error) {
+ var ctx context.Context
+ ctx, Cancel = context.WithCancel(context.Background())
+ return NewDataConverter(DataConverterArgs{
+ RawDataSubTaskArgs: RawDataSubTaskArgs{
+ Ctx: &DefaultSubTaskContext{
+ defaultExecContext: newDefaultExecContext(GetConfigForTest("../../"), NewDefaultLogger(logrus.New(), "Test", make(map[string]*logrus.Logger)), &gorm.DB{}, ctx, "Test", nil, nil),
+ },
+ Table: TestTable{}.TableName(),
+ Params: &TestParam{
+ Test: TestUrlParam,
+ },
+ },
+ InputRowType: reflect.TypeOf(TestTable{}),
+ Input: &sql.Rows{},
+ BatchSize: TestBatchSize,
+ Convert: func(row interface{}) ([]interface{}, error) {
+ assert.Equal(t, row, TestTableData)
+ results := make([]interface{}, 0, TestDataCount)
+ for i := 0; i < TestDataCount; i++ {
+ results = append(results, TestTableData)
+ }
+ return results, nil
+ },
+ })
+}
+
+func TestDataConvertorExecute(t *testing.T) {
+ MockDB(t)
+ defer UnMockDB()
+
+ gt.Reset()
+ gt = gomonkey.ApplyMethod(reflect.TypeOf(&gorm.DB{}), "Table", func(db *gorm.DB, name string, args ...interface{}) *gorm.DB {
+ assert.Equal(t, name, "_raw_"+TestTableData.TableName())
+ return db
+ },
+ )
+
+ dataConvertor, _ := CreateTestDataConverter(t)
+
+ datacount := TestDataCount
+ gn := gomonkey.ApplyMethod(reflect.TypeOf(&sql.Rows{}), "Next", func(r *sql.Rows) bool {
+ if datacount > 0 {
+ datacount--
+ return true
+ } else {
+ return false
+ }
+ })
+ defer gn.Reset()
+
+ gcl := gomonkey.ApplyMethod(reflect.TypeOf(&sql.Rows{}), "Close", func(r *sql.Rows) error {
+ return nil
+ })
+ defer gcl.Reset()
+
+ gs.Reset()
+
+ scanrowTimes := 0
+ gs = gomonkey.ApplyMethod(reflect.TypeOf(&gorm.DB{}), "ScanRows", func(db *gorm.DB, rows *sql.Rows, dest interface{}) error {
+ scanrowTimes++
+ *dest.(*TestTable) = *TestTableData
+ return nil
+ },
+ )
+
+ fortypeTimes := 0
+ gf := gomonkey.ApplyMethod(reflect.TypeOf(&BatchSaveDivider{}), "ForType", func(d *BatchSaveDivider, rowType reflect.Type) (*BatchSave, error) {
+ fortypeTimes++
+ assert.Equal(t, rowType, reflect.TypeOf(TestTableData))
+ err := d.onNewBatchSave(rowType)
+ assert.Equal(t, err, nil)
+
+ return &BatchSave{}, nil
+ })
+ defer gf.Reset()
+
+ addTimes := 0
+ gsv := gomonkey.ApplyMethod(reflect.TypeOf(&BatchSave{}), "Add", func(c *BatchSave, slot interface{}) error {
+ addTimes++
+ assert.Equal(t, slot, TestTableData)
+ return nil
+ })
+ defer gsv.Reset()
+
+ // begin testing
+ err := dataConvertor.Execute()
+ assert.Equal(t, err, nil)
+ assert.Equal(t, scanrowTimes, TestDataCount)
+ assert.Equal(t, fortypeTimes, TestDataCount*TestDataCount)
+ assert.Equal(t, addTimes, TestDataCount*TestDataCount)
+}
+
+func TestDataConvertorExecute_Cancel(t *testing.T) {
+ MockDB(t)
+ defer UnMockDB()
+
+ gt.Reset()
+ gt = gomonkey.ApplyMethod(reflect.TypeOf(&gorm.DB{}), "Table", func(db *gorm.DB, name string, args ...interface{}) *gorm.DB {
+ assert.Equal(t, name, "_raw_"+TestTableData.TableName())
+ return db
+ },
+ )
+
+ dataConvertor, _ := CreateTestDataConverter(t)
+
+ gn := gomonkey.ApplyMethod(reflect.TypeOf(&sql.Rows{}), "Next", func(r *sql.Rows) bool {
+ // death loop for testing cancel
+ return true
+ })
+ defer gn.Reset()
+
+ gcl := gomonkey.ApplyMethod(reflect.TypeOf(&sql.Rows{}), "Close", func(r *sql.Rows) error {
+ return nil
+ })
+ defer gcl.Reset()
+
+ gs.Reset()
+
+ scanrowTimes := 0
+ gs = gomonkey.ApplyMethod(reflect.TypeOf(&gorm.DB{}), "ScanRows", func(db *gorm.DB, rows *sql.Rows, dest interface{}) error {
+ scanrowTimes++
+ *dest.(*TestTable) = *TestTableData
+ return nil
+ },
+ )
+
+ fortypeTimes := 0
+ gf := gomonkey.ApplyMethod(reflect.TypeOf(&BatchSaveDivider{}), "ForType", func(d *BatchSaveDivider, rowType reflect.Type) (*BatchSave, error) {
+ fortypeTimes++
+ assert.Equal(t, rowType, reflect.TypeOf(TestTableData))
+ err := d.onNewBatchSave(rowType)
+ assert.Equal(t, err, nil)
+
+ return &BatchSave{}, nil
+ })
+ defer gf.Reset()
+
+ addTimes := 0
+ gsv := gomonkey.ApplyMethod(reflect.TypeOf(&BatchSave{}), "Add", func(c *BatchSave, slot interface{}) error {
+ addTimes++
+ assert.Equal(t, slot, TestTableData)
+ return nil
+ })
+ defer gsv.Reset()
+
+ go func() {
+ time.Sleep(time.Duration(500) * time.Microsecond)
+ Cancel()
+ }()
+
+ err := dataConvertor.Execute()
+ assert.Equal(t, err, fmt.Errorf("context canceled"))
+}