From 1d4adece95df3c257a06bb8e5db59c4a3abb34f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Garcia?= Date: Fri, 26 Feb 2021 23:12:37 -0300 Subject: [PATCH] Add error test cases for QueryChunk() --- kiss_orm.go | 4 +++ kiss_orm_test.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/kiss_orm.go b/kiss_orm.go index 01f826f..cf19fec 100644 --- a/kiss_orm.go +++ b/kiss_orm.go @@ -693,6 +693,10 @@ func (c DB) Transaction(ctx context.Context, fn func(ORMProvider) error) error { var errType = reflect.TypeOf(new(error)).Elem() func parseInputFunc(fn interface{}) (reflect.Type, error) { + if fn == nil { + return nil, fmt.Errorf("the ForEachChunk attribute is required and cannot be nil") + } + t := reflect.TypeOf(fn) if t.Kind() != reflect.Func { diff --git a/kiss_orm_test.go b/kiss_orm_test.go index f246a43..9ff02d3 100644 --- a/kiss_orm_test.go +++ b/kiss_orm_test.go @@ -888,6 +888,69 @@ func TestQueryChunks(t *testing.T) { assert.Equal(t, "User3", users[2].Name) assert.Equal(t, []int{2, 1}, lengths) }) + + t.Run("should report error if the input function is invalid", func(t *testing.T) { + db := connectDB(t, driver) + defer db.Close() + + ctx := context.Background() + c := newTestDB(db, driver, "users") + + funcs := []interface{}{ + nil, + "not a function", + func() error { + return nil + }, + func(extraInputValue []User, extra []User) error { + return nil + }, + func(invalidArgType string) error { + return nil + }, + func(missingReturnType []User) { + return + }, + func(users []User) string { + return "" + }, + func(extraReturnValue []User) ([]User, error) { + return nil, nil + }, + func(notSliceOfStructs []string) error { + return nil + }, + } + + for _, fn := range funcs { + err := c.QueryChunks(ctx, ChunkParser{ + Query: `SELECT * FROM users`, + Params: []interface{}{}, + + ChunkSize: 2, + ForEachChunk: fn, + }) + assert.NotEqual(t, nil, err) + } + }) + + t.Run("should report error if the query is not valid", func(t *testing.T) { + db := connectDB(t, driver) + defer db.Close() + + ctx := context.Background() + c := newTestDB(db, driver, "users") + err := c.QueryChunks(ctx, ChunkParser{ + Query: `SELECT * FROM not a valid query`, + Params: []interface{}{}, + + ChunkSize: 2, + ForEachChunk: func(buffer []User) error { + return nil + }, + }) + assert.NotEqual(t, nil, err) + }) }) } }