8 changed files with 161 additions and 14 deletions
-
2README.md
-
6repositories/token.go
-
7repositories/token_test.go
-
7repositories/user_test.go
-
8services/token.go
-
141services/token_test.go
-
3services/user.go
-
1services/user_test.go
@ -0,0 +1,141 @@ |
|||||
|
package services |
||||
|
|
||||
|
import ( |
||||
|
"encoding/json" |
||||
|
"testing" |
||||
|
"time" |
||||
|
|
||||
|
"git.devices.local/mawas/golang-api-skeleton/lib/cache" |
||||
|
"git.devices.local/mawas/golang-api-skeleton/lib/common" |
||||
|
"git.devices.local/mawas/golang-api-skeleton/models" |
||||
|
"git.devices.local/mawas/golang-api-skeleton/repositories" |
||||
|
"github.com/oklog/ulid" |
||||
|
"gorm.io/driver/sqlite" |
||||
|
"gorm.io/gorm" |
||||
|
) |
||||
|
|
||||
|
func tokenServiceMock(t *testing.T) (models.Token, *TokenService) { |
||||
|
db, err := gorm.Open( |
||||
|
sqlite.Open(":memory:"), |
||||
|
&gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}, |
||||
|
) |
||||
|
if err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
if err := db.AutoMigrate(&models.User{}); err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
if err := db.AutoMigrate(&models.Token{}); err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
appCache, err := cache.Bootstrap() |
||||
|
if err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
userID, err := common.NewGUID() |
||||
|
if err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
if err := appCache.Set("user:"+userID.String(), username); err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
if err := appCache.Set("user:"+username, userID.String()); err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
userRepository := repositories.NewUserRepository(db, userID.String(), username, appCache) |
||||
|
userService := NewUserService(userRepository) |
||||
|
_, err = userService.Create(&models.User{ |
||||
|
ModelHiddenGUIDPK: common.ModelHiddenGUIDPK{ID: userID}, |
||||
|
Username: username, |
||||
|
Firstname: "Unit", |
||||
|
Lastname: "Test", |
||||
|
Email: "unittest@unittest.test", |
||||
|
Active: true, |
||||
|
}) |
||||
|
if err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
token := NewToken(username) |
||||
|
token.UserID = userID |
||||
|
tokenRepository := repositories.NewTokenRepository(db, token.UserID.String(), username, appCache) |
||||
|
return token, NewTokenService(tokenRepository) |
||||
|
} |
||||
|
|
||||
|
func validateResponse(t *testing.T, response *models.Token, token models.Token) { |
||||
|
if response.Username != token.Username { |
||||
|
t.Errorf("Token Username must be \"%s\" but is \"%s\"\n", token.Username, response.Username) |
||||
|
} |
||||
|
if !response.Active { |
||||
|
t.Error("Token Active must be true") |
||||
|
} |
||||
|
if _, err := ulid.Parse(response.Token.String()); err != nil { |
||||
|
t.Errorf("Token Token must be a valid ULID, %v\n", err) |
||||
|
} |
||||
|
jsonString, err := json.Marshal(response) |
||||
|
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["user_id"]; exists { |
||||
|
t.Error("Token user_id must be hidden in json") |
||||
|
} |
||||
|
if u, exists := j["created_by"]; !exists { |
||||
|
t.Error("User created_by not in json") |
||||
|
} else if u != username { |
||||
|
t.Errorf("User created_by must be \"%s\" but is \"%s\"\n", username, u) |
||||
|
} |
||||
|
if u, exists := j["updated_by"]; !exists { |
||||
|
t.Error("User updated_by not in json") |
||||
|
} else if u != username { |
||||
|
t.Errorf("User updated_by must be \"%s\" but is \"%s\"\n", username, u) |
||||
|
} |
||||
|
if datetime, exists := j["created_at"]; !exists { |
||||
|
t.Error("User created_at not in json") |
||||
|
} else if _, err := time.Parse(time.RFC3339, datetime.(string)); err != nil { |
||||
|
t.Errorf("User created_at must be a valid rfc 3339 date time in json, but is \"%s\"", datetime) |
||||
|
} |
||||
|
if datetime, exists := j["updated_at"]; !exists { |
||||
|
t.Error("User updated_at not in json") |
||||
|
} else if _, err := time.Parse(time.RFC3339, datetime.(string)); err != nil { |
||||
|
t.Errorf("User updated_at must be a valid rfc 3339 date time in json, but is \"%s\"", datetime) |
||||
|
} |
||||
|
if datetime, exists := j["expires_at"]; !exists { |
||||
|
t.Error("User expires_at not in json") |
||||
|
} else if _, err := time.Parse(time.RFC3339, datetime.(string)); err != nil { |
||||
|
t.Errorf("User expires_at must be a valid rfc 3339 date time in json, but is \"%s\"", datetime) |
||||
|
} |
||||
|
if _, exists := j["deleted_by"]; exists { |
||||
|
t.Error("User deleted_by mustn't be set in json") |
||||
|
} |
||||
|
if _, exists := j["deleted_at"]; exists { |
||||
|
t.Error("User deleted_by mustn't be set in json") |
||||
|
} |
||||
|
if _, exists := j["last_used"]; exists { |
||||
|
t.Error("User deleted_by mustn't be set in json") |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func TestTokenRepository(t *testing.T) { |
||||
|
token, tokenService := tokenServiceMock(t) |
||||
|
response, err := tokenService.Create(&token) |
||||
|
if err != nil { |
||||
|
t.Errorf("tokenService Create failed with error: %v\n", err) |
||||
|
} |
||||
|
validateResponse(t, response, token) |
||||
|
response, err = tokenService.ReadByKey(token.Token.String()) |
||||
|
if err != nil { |
||||
|
t.Errorf("tokenService ReadByKey failed with error: %v\n", err) |
||||
|
} |
||||
|
validateResponse(t, response, token) |
||||
|
responses, err := tokenService.ReadAll() |
||||
|
if err != nil { |
||||
|
t.Errorf("tokenService ReadAll failed with error: %v\n", err) |
||||
|
} |
||||
|
if len(responses) != 1 { |
||||
|
t.Error("tokenService ReadAll failed with worng numer of responses") |
||||
|
} |
||||
|
validateResponse(t, responses[0], token) |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue