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"))
+}