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 <[email protected]> AuthorDate: Fri May 20 12:35:50 2022 +0000 test: unit test for data convertor TestApiConvertorExecute TestApiConvertorExecute_Cancel Nddtfjiang <[email protected]> --- 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")) +}
