From a0b70669e7b148b58faf65de667a8ca8bf738e45 Mon Sep 17 00:00:00 2001 From: Ian Tan Date: Wed, 22 Nov 2017 15:44:06 +0800 Subject: [PATCH] Support mock has one --- expecter_result.go | 20 ++++++++++++++++++++ expecter_test.go | 31 ++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/expecter_result.go b/expecter_result.go index 59c2379b..b983672d 100644 --- a/expecter_result.go +++ b/expecter_result.go @@ -5,6 +5,7 @@ import ( "fmt" "reflect" + "github.com/davecgh/go-spew/spew" sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1" ) @@ -69,7 +70,25 @@ func getRelationRows(rVal reflect.Value, fieldName string, relation *Relationshi ) switch relation.Kind { + case "has_one": + // just a plain struct + scope := &Scope{Value: rVal.Interface()} + + for _, field := range scope.GetModelStruct().StructFields { + if field.IsNormal { + columns = append(columns, field.DBName) + } + } + + rows = sqlmock.NewRows(columns) + + // we don't have a slice + row := getRowForFields(scope.Fields()) + rows = rows.AddRow(row...) + + return rows, true case "has_many", "many_to_many": + // in this case, we're guarnateed to have a slice elem := rVal.Type().Elem() scope := &Scope{Value: reflect.New(elem).Interface()} @@ -165,6 +184,7 @@ func (q *SqlmockQuery) Returns(out interface{}) ExpectedQuery { for i, query := range q.queries { query.WillReturnRows(rows[i]) + spew.Dump(query) } return q diff --git a/expecter_test.go b/expecter_test.go index 6b84f198..fbdbbb2d 100644 --- a/expecter_test.go +++ b/expecter_test.go @@ -145,6 +145,31 @@ func TestMockPreloadHasMany(t *testing.T) { } } +func TestMockPreloadHasOne(t *testing.T) { + db, expect, err := gorm.NewDefaultExpecter() + defer func() { + db.Close() + }() + + if err != nil { + t.Fatal(err) + } + + in := User{Id: 1} + out := User{Id: 1, CreditCard: CreditCard{Number: "12345678"}} + + expect.Preload("CreditCard").Find(&in).Returns(out) + db.Preload("CreditCard").Find(&in) + + if err := expect.AssertExpectations(); err != nil { + t.Error(err) + } + + if !reflect.DeepEqual(in, out) { + t.Error("In and out are not equal") + } +} + func TestMockPreloadMany2Many(t *testing.T) { db, expect, err := gorm.NewDefaultExpecter() defer func() { @@ -166,7 +191,7 @@ func TestMockPreloadMany2Many(t *testing.T) { t.Error(err) } - // if !reflect.DeepEqual(in, out) { - // t.Error("In and out are not equal") - // } + // if !reflect.DeepEqual(in, out) { + // t.Error("In and out are not equal") + // } }