H-263 restore PostgreSQL E2E coverage (#41)
Co-authored-by: Rogee <rogee@ipao.vip>
This commit is contained in:
@@ -22,13 +22,13 @@ type AuthE2ETestSuite struct {
|
||||
E2ETestSuite
|
||||
}
|
||||
|
||||
func (s *AuthE2ETestSuite) TestRegisterNewUser() {
|
||||
func (s *AuthE2ETestSuite) TestRegistrationEndpointIsNotExposed() {
|
||||
account := s.CreateTestAccount("Registration Org")
|
||||
|
||||
registerPayload := map[string]interface{}{
|
||||
"name": "New Test User",
|
||||
"email": "register@test.com",
|
||||
"password": "SecurePass123!",
|
||||
"name": "New Test User",
|
||||
"email": "register@test.com",
|
||||
"password": "SecurePass123!",
|
||||
"account_id": account.ID,
|
||||
}
|
||||
|
||||
@@ -39,29 +39,22 @@ func (s *AuthE2ETestSuite) TestRegisterNewUser() {
|
||||
bytes.NewBuffer(body),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
s.T().Logf("Register endpoint not available yet: %v", err)
|
||||
return
|
||||
}
|
||||
s.Require().NoError(err)
|
||||
defer resp.Body.Close()
|
||||
|
||||
// Verify user was created in database
|
||||
if resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusCreated {
|
||||
var user model.User
|
||||
err = s.DB().Where("email = ?", "register@test.com").First(&user).Error
|
||||
assert.NoError(s.T(), err, "Registered user should exist in database")
|
||||
assert.Equal(s.T(), "New Test User", user.Name)
|
||||
}
|
||||
assert.Equal(s.T(), http.StatusNotFound, resp.StatusCode)
|
||||
var count int64
|
||||
s.Require().NoError(s.DB().Model(&model.User{}).Where("email = ?", "register@test.com").Count(&count).Error)
|
||||
assert.Zero(s.T(), count, "an unregistered route must not create a user")
|
||||
}
|
||||
|
||||
func (s *AuthE2ETestSuite) TestRegisterDuplicateEmailFails() {
|
||||
func (s *AuthE2ETestSuite) TestRegistrationEndpointCannotMutateExistingUser() {
|
||||
account := s.CreateTestAccount("Dup Org")
|
||||
s.CreateTestUser("dup@test.com", "Existing", "hashedpass", "agent", account.ID)
|
||||
|
||||
registerPayload := map[string]interface{}{
|
||||
"name": "Duplicate User",
|
||||
"email": "dup@test.com",
|
||||
"password": "AnotherPass!",
|
||||
"name": "Duplicate User",
|
||||
"email": "dup@test.com",
|
||||
"password": "AnotherPass!",
|
||||
"account_id": account.ID,
|
||||
}
|
||||
|
||||
@@ -72,17 +65,12 @@ func (s *AuthE2ETestSuite) TestRegisterDuplicateEmailFails() {
|
||||
bytes.NewBuffer(body),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
s.T().Logf("Register endpoint not available: %v", err)
|
||||
return
|
||||
}
|
||||
s.Require().NoError(err)
|
||||
defer resp.Body.Close()
|
||||
|
||||
// Duplicate email should be rejected
|
||||
assert.True(s.T(),
|
||||
resp.StatusCode == http.StatusConflict || resp.StatusCode == http.StatusBadRequest,
|
||||
"Duplicate email registration should fail",
|
||||
)
|
||||
assert.Equal(s.T(), http.StatusNotFound, resp.StatusCode)
|
||||
var count int64
|
||||
s.Require().NoError(s.DB().Model(&model.User{}).Where("email = ?", "dup@test.com").Count(&count).Error)
|
||||
assert.Equal(s.T(), int64(1), count, "an unregistered route must not mutate existing users")
|
||||
}
|
||||
|
||||
func (s *AuthE2ETestSuite) TestLoginWithValidCredentials() {
|
||||
@@ -335,8 +323,8 @@ func (s *AuthE2ETestSuite) TestAccessProtectedEndpointWithValidToken() {
|
||||
func (s *AuthE2ETestSuite) TestJWTTokenExpiry() {
|
||||
// Test that expired tokens are rejected
|
||||
cfg := crypto.JWTConfig{
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: -1, // Already expired
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: -1, // Already expired
|
||||
RefreshExpiryHours: 24,
|
||||
}
|
||||
expiredToken, err := crypto.GenerateToken(cfg, 1, "expired@test.com", "agent")
|
||||
@@ -348,8 +336,8 @@ func (s *AuthE2ETestSuite) TestJWTTokenExpiry() {
|
||||
|
||||
func (s *AuthE2ETestSuite) TestJWTTokenValidation() {
|
||||
cfg := crypto.JWTConfig{
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
RefreshExpiryHours: 24,
|
||||
}
|
||||
|
||||
@@ -367,15 +355,15 @@ func (s *AuthE2ETestSuite) TestJWTTokenValidation() {
|
||||
|
||||
func (s *AuthE2ETestSuite) TestInvalidJWTTokenRejected() {
|
||||
cfg := crypto.JWTConfig{
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
RefreshExpiryHours: 24,
|
||||
}
|
||||
|
||||
// Token signed with different secret
|
||||
wrongCfg := crypto.JWTConfig{
|
||||
Secret: []byte("wrong-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
Secret: []byte("wrong-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
RefreshExpiryHours: 24,
|
||||
}
|
||||
wrongToken, err := crypto.GenerateToken(wrongCfg, 1, "wrong@test.com", "agent")
|
||||
@@ -462,8 +450,8 @@ func (s *AuthE2ETestSuite) TestMultipleUsersCanLoginIndependently() {
|
||||
|
||||
// Both users should be able to generate valid JWT tokens independently
|
||||
cfg := crypto.JWTConfig{
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
RefreshExpiryHours: 24,
|
||||
}
|
||||
|
||||
@@ -516,8 +504,8 @@ func (s *AuthE2ETestSuite) TestInactiveUserLoginRejected() {
|
||||
|
||||
func (s *AuthE2ETestSuite) TestAuthTokensContainCorrectClaims() {
|
||||
cfg := crypto.JWTConfig{
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
Secret: []byte("e2e-test-secret-key"),
|
||||
ExpiryHours: 1,
|
||||
RefreshExpiryHours: 24,
|
||||
}
|
||||
|
||||
@@ -534,4 +522,4 @@ func (s *AuthE2ETestSuite) TestAuthTokensContainCorrectClaims() {
|
||||
// TestAuthE2ESuite runs the Auth E2E test suite.
|
||||
func TestAuthE2ESuite(t *testing.T) {
|
||||
suite.Run(t, new(AuthE2ETestSuite))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user