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
-[](https://drone.devices.local/mawas/golang-api-skeleton)
+[](https://drone.devices.local/mawas/golang-api-skeleton)
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")
}
}