This commit is contained in:
Alex
2025-03-24 17:46:11 +01:00
parent 5d55f5a8d9
commit 560623788a
4 changed files with 74 additions and 62 deletions

View File

@@ -87,7 +87,7 @@ func TestMain(t *testing.T) {
log.Fatalf("Error setting environment variable: %v", err) log.Fatalf("Error setting environment variable: %v", err)
} }
config.LoadConfig() config.LoadConfig()
db, err := database.Open("test.db", config.Recipients.AdminEmail) db, err := database.Open("test.db", config.Recipients.AdminEmail, true)
if err != nil { if err != nil {
log.Fatalf("Failed to create DB: %#v", err) log.Fatalf("Failed to create DB: %#v", err)
} }
@@ -120,20 +120,28 @@ func TestMain(t *testing.T) {
log.Fatalf("Failed to init Categories: %v", err) log.Fatalf("Failed to init Categories: %v", err)
} }
admin := models.User{ admin := models.User{
FirstName: "Ad", FirstName: "Ad",
LastName: "min", LastName: "min",
Email: "admin@example.com", Email: "admin@example.com",
DateOfBirth: time.Date(1990, 1, 1, 0, 0, 0, 0, time.UTC), DateOfBirth: time.Date(1990, 1, 1, 0, 0, 0, 0, time.UTC),
Company: "SampleCorp", Company: "SampleCorp",
Phone: "+123456789", Phone: "+123456789",
Address: "123 Main Street", Address: "123 Main Street",
ZipCode: "12345", ZipCode: "12345",
City: "SampleCity", City: "SampleCity",
Status: constants.ActiveStatus, Status: constants.ActiveStatus,
RoleID: 8, Password: "",
} Notes: "",
RoleID: constants.Roles.Admin,
Consents: nil,
Verifications: nil,
Membership: nil,
BankAccount: nil,
Licence: &models.Licence{
Status: constants.UnverifiedStatus,
}}
admin.SetPassword("securepassword") admin.SetPassword("securepassword")
database.DB.Create(&admin) admin.Create(db)
validation.SetupValidators(db) validation.SetupValidators(db)
t.Run("userController", func(t *testing.T) { t.Run("userController", func(t *testing.T) {
testUserController(t) testUserController(t)
@@ -267,41 +275,39 @@ func GetMockedFormContext(formData url.Values, url string) (*gin.Context, *httpt
func getBaseUser() models.User { func getBaseUser() models.User {
return models.User{ return models.User{
DateOfBirth: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), DateOfBirth: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC),
FirstName: "John", FirstName: "John",
LastName: "Doe", LastName: "Doe",
Email: "john.doe@example.com", Email: "john.doe@example.com",
Address: "Pablo Escobar Str. 4", Address: "Pablo Escobar Str. 4",
ZipCode: "25474", ZipCode: "25474",
City: "Hasloh", City: "Hasloh",
Phone: "01738484993", Phone: "01738484993",
BankAccount: models.BankAccount{IBAN: "DE89370400440532013000"}, BankAccount: &models.BankAccount{IBAN: "DE89370400440532013000"},
Membership: models.Membership{SubscriptionModel: models.SubscriptionModel{Name: "Basic"}}, Membership: &models.Membership{SubscriptionModel: models.SubscriptionModel{Name: "Basic"}},
Licence: nil, Licence: nil,
ProfilePicture: "", Password: "passw@#$#%$!-ord123",
Password: "passw@#$#%$!-ord123", Company: "",
Company: "", RoleID: 1,
RoleID: 1,
} }
} }
func getBaseSupporter() models.User { func getBaseSupporter() models.User {
return models.User{ return models.User{
DateOfBirth: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), DateOfBirth: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC),
FirstName: "John", FirstName: "John",
LastName: "Rich", LastName: "Rich",
Email: "john.supporter@example.com", Email: "john.supporter@example.com",
Address: "Pablo Escobar Str. 4", Address: "Pablo Escobar Str. 4",
ZipCode: "25474", ZipCode: "25474",
City: "Hasloh", City: "Hasloh",
Phone: "01738484993", Phone: "01738484993",
BankAccount: models.BankAccount{IBAN: "DE89370400440532013000"}, BankAccount: &models.BankAccount{IBAN: "DE89370400440532013000"},
Membership: models.Membership{SubscriptionModel: models.SubscriptionModel{Name: "Basic"}}, Membership: &models.Membership{SubscriptionModel: models.SubscriptionModel{Name: "Basic"}},
Licence: nil, Licence: nil,
ProfilePicture: "", Password: "passw@#$#%$!-ord123",
Password: "passw@#$#%$!-ord123", Company: "",
Company: "", RoleID: 0,
RoleID: 0,
} }
} }
func deleteTestDB(dbPath string) error { func deleteTestDB(dbPath string) error {

View File

@@ -31,8 +31,10 @@ func setupTestContext() (*TestContext, error) {
testEmail := "john.doe@example.com" testEmail := "john.doe@example.com"
user, err := Uc.Service.FromEmail(&testEmail) user, err := Uc.Service.FromEmail(&testEmail)
if err != nil { if err != nil {
logger.Error.Printf("error fetching user: %#v", err)
return nil, err return nil, err
} }
logger.Error.Printf("found user: %#v", user)
return &TestContext{ return &TestContext{
router: gin.Default(), router: gin.Default(),
response: httptest.NewRecorder(), response: httptest.NewRecorder(),
@@ -60,7 +62,6 @@ func testCreatePasswordHandler(t *testing.T) {
req, _ := http.NewRequest("POST", "/password", bytes.NewBuffer(body)) req, _ := http.NewRequest("POST", "/password", bytes.NewBuffer(body))
req.AddCookie(AdminCookie) req.AddCookie(AdminCookie)
tc.router.ServeHTTP(tc.response, req) tc.router.ServeHTTP(tc.response, req)
logger.Error.Printf("Test results for %#v", t.Name())
assert.Equal(t, http.StatusAccepted, tc.response.Code) assert.Equal(t, http.StatusAccepted, tc.response.Code)
assert.JSONEq(t, `{"message":"password_change_requested"}`, tc.response.Body.String()) assert.JSONEq(t, `{"message":"password_change_requested"}`, tc.response.Body.String())
err = checkEmailDelivery(tc.user, true) err = checkEmailDelivery(tc.user, true)

View File

@@ -137,9 +137,7 @@ func (uc *UserController) DeleteUser(c *gin.Context) {
} }
type deleteData struct { type deleteData struct {
User struct { ID uint `json:"id" binding:"required,numeric"`
ID uint `json:"id" binding:"required,numeric"`
} `json:"user"`
} }
var data deleteData var data deleteData
@@ -148,13 +146,13 @@ func (uc *UserController) DeleteUser(c *gin.Context) {
return return
} }
if !requestUser.HasPrivilege(constants.Priviliges.Delete) && data.User.ID != requestUser.ID { if !requestUser.HasPrivilege(constants.Priviliges.Delete) && data.ID != requestUser.ID {
utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to delete user", http.StatusForbidden, errors.Responses.Fields.User, errors.Responses.Keys.Unauthorized) utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to delete user", http.StatusForbidden, errors.Responses.Fields.User, errors.Responses.Keys.Unauthorized)
return return
} }
logger.Error.Printf("Deleting user: %v", data.User) logger.Error.Printf("Deleting user: %v", data)
if err := uc.Service.Delete(&data.User.ID); err != nil { if err := uc.Service.Delete(&data.ID); err != nil {
utils.HandleDeleteUserError(c, err) utils.HandleDeleteUserError(c, err)
return return
} }
@@ -291,12 +289,14 @@ func (uc *UserController) RegisterUser(c *gin.Context) {
LastName: regData.User.LastName, LastName: regData.User.LastName,
Email: regData.User.Email, Email: regData.User.Email,
ConsentType: "TermsOfService", ConsentType: "TermsOfService",
UserID: regData.User.ID,
}, },
{ {
FirstName: regData.User.FirstName, FirstName: regData.User.FirstName,
LastName: regData.User.LastName, LastName: regData.User.LastName,
Email: regData.User.Email, Email: regData.User.Email,
ConsentType: "Privacy", ConsentType: "Privacy",
UserID: regData.User.ID,
}, },
} }

View File

@@ -78,7 +78,6 @@ func testUserController(t *testing.T) {
database.DB.Model(&models.User{}).Where("email = ?", "john.doe@example.com").Update("status", constants.ActiveStatus) database.DB.Model(&models.User{}).Where("email = ?", "john.doe@example.com").Update("status", constants.ActiveStatus)
loginEmail := testLoginHandler(t) loginEmail := testLoginHandler(t)
testCurrentUserHandler(t, loginEmail) testCurrentUserHandler(t, loginEmail)
// creating a admin cookie // creating a admin cookie
c, w, _ := GetMockedJSONContext([]byte(`{ c, w, _ := GetMockedJSONContext([]byte(`{
"email": "admin@example.com", "email": "admin@example.com",
@@ -402,7 +401,6 @@ func validateUser(assert bool, wantDBData map[string]interface{}) error {
if err != nil { if err != nil {
return fmt.Errorf("Error in database ops: %#v", err) return fmt.Errorf("Error in database ops: %#v", err)
} }
if assert != (len(*users) != 0) { if assert != (len(*users) != 0) {
return fmt.Errorf("User entry query didn't met expectation: %v != %#v", assert, *users) return fmt.Errorf("User entry query didn't met expectation: %v != %#v", assert, *users)
} }
@@ -575,7 +573,7 @@ func testUpdateUser(t *testing.T) {
var licenceRepo repositories.LicenceInterface = &repositories.LicenceRepository{} var licenceRepo repositories.LicenceInterface = &repositories.LicenceRepository{}
category, err := licenceRepo.FindCategoryByName("B") category, err := licenceRepo.FindCategoryByName("B")
assert.NoError(t, err) assert.NoError(t, err)
u.Licence.Categories = []models.Category{category} u.Licence.Categories = []*models.Category{&category}
}, },
expectedStatus: http.StatusAccepted, expectedStatus: http.StatusAccepted,
}, },
@@ -594,7 +592,7 @@ func testUpdateUser(t *testing.T) {
category, err := licenceRepo.FindCategoryByName("A") category, err := licenceRepo.FindCategoryByName("A")
category2, err := licenceRepo.FindCategoryByName("BE") category2, err := licenceRepo.FindCategoryByName("BE")
assert.NoError(t, err) assert.NoError(t, err)
u.Licence.Categories = []models.Category{category, category2} u.Licence.Categories = []*models.Category{&category, &category2}
}, },
expectedStatus: http.StatusAccepted, expectedStatus: http.StatusAccepted,
}, },
@@ -612,7 +610,7 @@ func testUpdateUser(t *testing.T) {
var licenceRepo repositories.LicenceInterface = &repositories.LicenceRepository{} var licenceRepo repositories.LicenceInterface = &repositories.LicenceRepository{}
category, err := licenceRepo.FindCategoryByName("A") category, err := licenceRepo.FindCategoryByName("A")
assert.NoError(t, err) assert.NoError(t, err)
u.Licence.Categories = []models.Category{category} u.Licence.Categories = []*models.Category{&category}
}, },
expectedStatus: http.StatusAccepted, expectedStatus: http.StatusAccepted,
}, },
@@ -627,7 +625,7 @@ func testUpdateUser(t *testing.T) {
u.LastName = "Doe Updated" u.LastName = "Doe Updated"
u.Phone = "01738484994" u.Phone = "01738484994"
u.Licence.Number = "B072RRE2I50" u.Licence.Number = "B072RRE2I50"
u.Licence.Categories = []models.Category{} u.Licence.Categories = []*models.Category{}
}, },
expectedStatus: http.StatusAccepted, expectedStatus: http.StatusAccepted,
}, },
@@ -806,11 +804,9 @@ func testUpdateUser(t *testing.T) {
assert.Equal(t, updatedUser.Company, updatedUserFromDB.Company, "Company mismatch") assert.Equal(t, updatedUser.Company, updatedUserFromDB.Company, "Company mismatch")
assert.Equal(t, updatedUser.Phone, updatedUserFromDB.Phone, "Phone mismatch") assert.Equal(t, updatedUser.Phone, updatedUserFromDB.Phone, "Phone mismatch")
assert.Equal(t, updatedUser.Notes, updatedUserFromDB.Notes, "Notes mismatch") assert.Equal(t, updatedUser.Notes, updatedUserFromDB.Notes, "Notes mismatch")
assert.Equal(t, updatedUser.ProfilePicture, updatedUserFromDB.ProfilePicture, "ProfilePicture mismatch")
assert.Equal(t, updatedUser.Address, updatedUserFromDB.Address, "Address mismatch") assert.Equal(t, updatedUser.Address, updatedUserFromDB.Address, "Address mismatch")
assert.Equal(t, updatedUser.ZipCode, updatedUserFromDB.ZipCode, "ZipCode mismatch") assert.Equal(t, updatedUser.ZipCode, updatedUserFromDB.ZipCode, "ZipCode mismatch")
assert.Equal(t, updatedUser.City, updatedUserFromDB.City, "City mismatch") assert.Equal(t, updatedUser.City, updatedUserFromDB.City, "City mismatch")
assert.Equal(t, updatedUser.PaymentStatus, updatedUserFromDB.PaymentStatus, "PaymentStatus mismatch")
assert.Equal(t, updatedUser.Status, updatedUserFromDB.Status, "Status mismatch") assert.Equal(t, updatedUser.Status, updatedUserFromDB.Status, "Status mismatch")
assert.Equal(t, updatedUser.RoleID, updatedUserFromDB.RoleID, "RoleID mismatch") assert.Equal(t, updatedUser.RoleID, updatedUserFromDB.RoleID, "RoleID mismatch")
@@ -839,8 +835,17 @@ func testUpdateUser(t *testing.T) {
assert.Equal(t, updatedUser.Licence.IssuingCountry, updatedUserFromDB.Licence.IssuingCountry, "Licence.IssuingCountry mismatch") assert.Equal(t, updatedUser.Licence.IssuingCountry, updatedUserFromDB.Licence.IssuingCountry, "Licence.IssuingCountry mismatch")
} }
// For slices or more complex nested structures, you might want to use deep equality checks if len(updatedUser.Consents) > 0 {
assert.ElementsMatch(t, updatedUser.Consents, updatedUserFromDB.Consents, "Consents mismatch") for i := range updatedUser.Consents {
assert.Equal(t, updatedUser.Consents[i].ConsentType, updatedUserFromDB.Consents[i].ConsentType, "ConsentType mismatch at index %d", i)
assert.Equal(t, updatedUser.Consents[i].Email, updatedUserFromDB.Consents[i].Email, "ConsentEmail mismatch at index %d", i)
assert.Equal(t, updatedUser.Consents[i].FirstName, updatedUserFromDB.Consents[i].FirstName, "ConsentFirstName mismatch at index %d", i)
assert.Equal(t, updatedUser.Consents[i].LastName, updatedUserFromDB.Consents[i].LastName, "ConsentLastName mismatch at index %d", i)
assert.Equal(t, updatedUser.Consents[i].UserID, updatedUserFromDB.Consents[i].UserID, "Consent UserId mismatch at index %d", i)
}
} else {
assert.Emptyf(t, updatedUserFromDB.Licence.Categories, "Categories aren't empty when they should")
}
if len(updatedUser.Licence.Categories) > 0 { if len(updatedUser.Licence.Categories) > 0 {
for i := range updatedUser.Licence.Categories { for i := range updatedUser.Licence.Categories {
assert.Equal(t, updatedUser.Licence.Categories[i].Name, updatedUserFromDB.Licence.Categories[i].Name, "Category Category mismatch at index %d", i) assert.Equal(t, updatedUser.Licence.Categories[i].Name, updatedUserFromDB.Licence.Categories[i].Name, "Category Category mismatch at index %d", i)
@@ -1272,7 +1277,7 @@ func getTestUsers() []RegisterUserTest {
{ {
Name: "Correct Licence number, should pass", Name: "Correct Licence number, should pass",
WantResponse: http.StatusCreated, WantResponse: http.StatusCreated,
WantDBData: map[string]interface{}{"email": "john.correctLicenceNumber@example.com"}, WantDBData: map[string]interface{}{"email": "john.correctlicencenumber@example.com"},
Assert: true, Assert: true,
Input: GenerateInputJSON(customizeInput(func(user models.User) models.User { Input: GenerateInputJSON(customizeInput(func(user models.User) models.User {
user.Email = "john.correctLicenceNumber@example.com" user.Email = "john.correctLicenceNumber@example.com"