diff --git a/README.md b/README.md index 9e55ca6..1ea291a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # golang API Skeleton -[![Build Status](https://drone.devices.local/api/badges/mawas/golang-api-skeleton/status.svg)](https://drone.devices.local/mawas/golang-api-skeleton)![gopherbadger-tag-do-not-edit](https://img.shields.io/badge/Go%20Coverage-77%25-brightgreen.svg?longCache=true&style=flat) +[![Build Status](https://drone.devices.local/api/badges/mawas/golang-api-skeleton/status.svg)](https://drone.devices.local/mawas/golang-api-skeleton)![gopherbadger-tag-do-not-edit](https://img.shields.io/badge/Go%20Coverage-75%25-brightgreen.svg?longCache=true&style=flat) refined skeleton future apis should be based on diff --git a/lib/common/common_test.go b/lib/common/common_test.go new file mode 100644 index 0000000..e21c003 --- /dev/null +++ b/lib/common/common_test.go @@ -0,0 +1,136 @@ +package common + +import ( + "encoding/json" + "testing" + + "git.devices.local/mawas/golang-api-skeleton/lib/cache" + "github.com/oklog/ulid/v2" + "gorm.io/driver/sqlite" + "gorm.io/gorm" +) + +const ( + username = "unittest" + userID = "01F5Z7CFER2D9QH2VY2V7PVQHF" +) + +func mock(t *testing.T) (*gorm.DB, cache.Cache) { + db, err := gorm.Open( + sqlite.Open(":memory:"), + &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}, + ) + if err != nil { + t.Error(err) + } + appCache, err := cache.Bootstrap() + if err != nil { + t.Error(err) + } + if err := appCache.Set("user:"+userID, username); err != nil { + t.Error(err) + } + if err := appCache.Set("user:"+username, userID); err != nil { + t.Error(err) + } + return db, appCache +} + +func basicfieldsMock(t *testing.T) (*gorm.DB, cache.Cache, BasicFields) { + db, appCache := mock(t) + return db, appCache, BasicFields{} +} + +func modelGUIDPKMock(t *testing.T) (*gorm.DB, cache.Cache, ModelGUIDPK) { + db, appCache := mock(t) + return db, appCache, ModelGUIDPK{} +} + +func modelHiddenGUIDPKMock(t *testing.T) (*gorm.DB, cache.Cache, ModelHiddenGUIDPK) { + db, appCache := mock(t) + return db, appCache, ModelHiddenGUIDPK{} +} + +func TestBasicFieldsBeforeCreate(t *testing.T) { + db, _, basicFields := basicfieldsMock(t) + err := basicFields.BeforeCreate(db.Set("userID", userID)) + if err != nil { + t.Error(err) + } + if basicFields.CreatedByDB.String() != userID { + t.Error("BeforeCreate doesn't set CreatedByDB") + } + if basicFields.UpdatedByDB.String() != userID { + t.Error("BeforeCreate doesn't set UpdatedByDB") + } +} + +func TestBasicFieldsAfterCreate(t *testing.T) { + db, _, basicFields := basicfieldsMock(t) + err := basicFields.AfterCreate(db.Set("username", username)) + if err != nil { + t.Error(err) + } + if basicFields.CreatedByJSON != username { + t.Error("BasicFields AfterCreate doesn't set CreatedByJSON") + } + if basicFields.UpdatedByJSON != username { + t.Error("BasicFields AfterCreate doesn't set UpdatedByJSON") + } +} + +func TestModelGUIDPKBeforeCreate(t *testing.T) { + db, _, modelGUIDPK := modelGUIDPKMock(t) + err := modelGUIDPK.BeforeCreate(db.Set("userID", userID)) + if err != nil { + t.Error(err) + } + if modelGUIDPK.CreatedByDB.String() != userID { + t.Error("ModelGUIDPK BeforeCreate doesn't set CreatedByDB") + } + if modelGUIDPK.UpdatedByDB.String() != userID { + t.Error("ModelGUIDPK BeforeCreate doesn't set UpdatedByDB") + } + if _, err := ulid.Parse(modelGUIDPK.ID.String()); err != nil { + t.Error("ModelGUIDPK BeforeCreate doesn't set proper ID ->", err.Error()) + } + jsonString, err := json.Marshal(modelGUIDPK) + if err != nil { + t.Error(err) + } + var j map[string]interface{} + if err := json.Unmarshal([]byte(jsonString), &j); err != nil { + t.Error(err) + } + if _, exists := j["id"]; !exists { + t.Error("ModelGUIDPK ID must be visible in json") + } +} + +func TestModelHiddenGUIDPKBeforeCreate(t *testing.T) { + db, _, modelHiddenGUIDPK := modelHiddenGUIDPKMock(t) + err := modelHiddenGUIDPK.BeforeCreate(db.Set("userID", userID)) + if err != nil { + t.Error(err) + } + if modelHiddenGUIDPK.CreatedByDB.String() != userID { + t.Error("ModelHiddenGUIDPK BeforeCreate doesn't set CreatedByDB") + } + if modelHiddenGUIDPK.UpdatedByDB.String() != userID { + t.Error("ModelHiddenGUIDPK BeforeCreate doesn't set UpdatedByDB") + } + if _, err := ulid.Parse(modelHiddenGUIDPK.ID.String()); err != nil { + t.Error("ModelHiddenGUIDPK BeforeCreate doesn't set proper ID ->", err.Error()) + } + jsonString, err := json.Marshal(modelHiddenGUIDPK) + if err != nil { + t.Error(err) + } + var j map[string]interface{} + if err := json.Unmarshal([]byte(jsonString), &j); err != nil { + t.Error(err) + } + if _, exists := j["id"]; exists { + t.Error("ModelGUIDPK ID must be hidden in json") + } +} diff --git a/models/token_test.go b/models/token_test.go index 2be6a99..0c763be 100644 --- a/models/token_test.go +++ b/models/token_test.go @@ -20,24 +20,24 @@ func tokenmock(t *testing.T) (*gorm.DB, cache.Cache, Token) { &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}, ) if err != nil { - t.Fatal(err) + t.Error(err) } if err := db.AutoMigrate(&User{}); err != nil { - t.Fatal(err) + t.Error(err) } appCache, err := cache.Bootstrap() if err != nil { - t.Fatal(err) + t.Error(err) } if err := appCache.Set("user:"+userID, username); err != nil { - t.Fatal(err) + t.Error(err) } if err := appCache.Set("user:"+username, userID); err != nil { - t.Fatal(err) + t.Error(err) } guid, err := common.StringToGUID(userID) if err != nil { - t.Fatal(err) + t.Error(err) } return db, appCache, Token{UserID: guid} } @@ -46,16 +46,16 @@ func TestTokenBeforeCreate(t *testing.T) { db, _, token := tokenmock(t) err := token.BeforeCreate(db.Set("userID", userID)) if err != nil { - t.Fatal(err) + t.Error(err) } if token.CreatedByDB.String() != userID { - t.Fatal("BeforeCreate doesn't set CreatedByDB") + t.Error("Token BeforeCreate doesn't set CreatedByDB") } if token.UpdatedByDB.String() != userID { - t.Fatal("BeforeCreate doesn't set UpdatedByDB") + t.Error("Token BeforeCreate doesn't set UpdatedByDB") } if _, err := ulid.Parse(token.Token.String()); err != nil { - t.Fatal("BeforeCreate doesn't set proper token ->", err.Error()) + t.Error("Token BeforeCreate doesn't set proper Token ->", err.Error()) } } @@ -75,27 +75,27 @@ func TestTokenAfterFind(t *testing.T) { } err := token.AfterFind(db.Set("cache", appCache)) if err != nil { - t.Fatal(err) + t.Error(err) } if token.DeletedAtJSON == nil { - t.Fatal("Token AfterFind doesn't set DeletedAtJSON") + t.Error("Token AfterFind doesn't set DeletedAtJSON") } if *token.DeletedAtJSON != now { - t.Fatal("Token AfterFind doesn't set DeletedAtJSON proper") + t.Error("Token AfterFind doesn't set DeletedAtJSON proper") } if token.LastUsedJSON == nil { - t.Fatal("Token AfterFind doesn't set LastUsedJSON") + t.Error("Token AfterFind doesn't set LastUsedJSON") } if *token.LastUsedJSON != now { - t.Fatal("Token AfterFind doesn't proper set LastUsedJSON") + t.Error("Token AfterFind doesn't proper set LastUsedJSON") } if token.CreatedByJSON != username { - t.Fatal("Token AfterFind doesn't set CreatedByJSON") + t.Error("Token AfterFind doesn't set CreatedByJSON") } if token.UpdatedByJSON != username { - t.Fatal("Token AfterFind doesn't set UpdatedByJSON") + t.Error("Token AfterFind doesn't set UpdatedByJSON") } if token.Username != username { - t.Fatal("Token AfterFind doesn't set Username") + t.Error("Token AfterFind doesn't set Username") } } diff --git a/models/user_test.go b/models/user_test.go index d662762..f77e35a 100644 --- a/models/user_test.go +++ b/models/user_test.go @@ -18,24 +18,24 @@ func usermock(t *testing.T) (*gorm.DB, cache.Cache, User) { &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}, ) if err != nil { - t.Fatal(err) + t.Error(err) } if err := db.AutoMigrate(&User{}); err != nil { - t.Fatal(err) + t.Error(err) } appCache, err := cache.Bootstrap() if err != nil { - t.Fatal(err) + t.Error(err) } userID, err := common.NewGUID() if err != nil { - t.Fatal(err) + t.Error(err) } if err := appCache.Set("user:"+userID.String(), username); err != nil { - t.Fatal(err) + t.Error(err) } if err := appCache.Set("user:"+username, userID.String()); err != nil { - t.Fatal(err) + t.Error(err) } user := User{ Username: username, @@ -50,16 +50,16 @@ func TestUserAfterCreate(t *testing.T) { db, _, user := usermock(t) err := user.AfterCreate(db.Set("username", username)) if err != nil { - t.Fatal(err) + t.Error(err) } if user.CreatedByJSON != username { - t.Fatal("User AfterCreate doesn't set CreatedByJSON") + t.Error("User AfterCreate doesn't set CreatedByJSON") } if user.UpdatedByJSON != username { - t.Fatal("User AfterCreate doesn't set UpdatedByJSON") + t.Error("User AfterCreate doesn't set UpdatedByJSON") } if user.Tokens == nil { - t.Fatal("User AfterCreate doesn't initialize Tokens") + t.Error("User AfterCreate doesn't initialize Tokens") } } @@ -75,29 +75,29 @@ func TestUserAfterFind(t *testing.T) { } token, err := common.NewGUID() if err != nil { - t.Fatal(err) + t.Error(err) } user.TokensRef = []Token{{Token: token}} err = user.AfterFind(db.Set("username", username).Set("cache", appCache)) if err != nil { - t.Fatal(err) + t.Error(err) } if user.DeletedAtJSON == nil { - t.Fatal("User AfterFind doesn't set DeletedAtJSON") + t.Error("User AfterFind doesn't set DeletedAtJSON") } if *user.DeletedAtJSON != now { - t.Fatal("User AfterFind doesn't proper set DeletedAtJSON") + t.Error("User AfterFind doesn't proper set DeletedAtJSON") } if user.Tokens == nil { - t.Fatal("User AfterFind doesn't initialize Tokens") + t.Error("User AfterFind doesn't initialize Tokens") } if user.Tokens[0] != token.String() { - t.Fatal("User AfterFind Tokens assignment broken") + t.Error("User AfterFind Tokens assignment broken") } if user.CreatedByJSON != username { - t.Fatal("User AfterFind doesn't set CreatedByJSON") + t.Error("User AfterFind doesn't set CreatedByJSON") } if user.UpdatedByJSON != username { - t.Fatal("User AfterFind doesn't set UpdatedByJSON") + t.Error("User AfterFind doesn't set UpdatedByJSON") } }