Files
jiu/backend/internal/service/auth_test.go
T
wangjia 31ea370cea fix(backend): JWT config mapstructure tag 修复 + 模型从 hotel 重构为 shop
- 修复 JWTConfig 缺少 mapstructure tag 导致 access_expire_min 解析为 0,
  token 签发即过期,所有 API 请求返回 401
- 全部 config struct 补齐 mapstructure tag(secret/dsn/hmac_secret 等)
- 模型层从 hotel/HotelID 统一重命名为 shop/ShopID
- 删除旧 migrations(001-004),新增 001_init 综合迁移文件
- 更新 schema.sql、testutil、handler/service/model 相关引用

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 22:20:12 +08:00

133 lines
3.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package service
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/wangjia/jiu/backend/testutil"
)
func TestAuthService_Login_Success(t *testing.T) {
db := testutil.SetupTestDB()
shop := testutil.CreateTestShop(db, "HOTEL001")
testutil.CreateTestUser(db, shop.ID, "admin", "password123", "admin")
svc := NewAuthService(db)
pair, user, err := svc.Login("HOTEL001", "admin", "password123")
require.NoError(t, err)
require.NotNil(t, pair)
require.NotNil(t, user)
assert.NotEmpty(t, pair.AccessToken)
assert.NotEmpty(t, pair.RefreshToken)
assert.Equal(t, "admin", user.Username)
}
func TestAuthService_Login_WrongPassword(t *testing.T) {
db := testutil.SetupTestDB()
shop := testutil.CreateTestShop(db, "HOTEL002")
testutil.CreateTestUser(db, shop.ID, "admin", "password123", "admin")
svc := NewAuthService(db)
pair, user, err := svc.Login("HOTEL002", "admin", "wrongpassword")
assert.Error(t, err)
assert.Equal(t, ErrInvalidCredentials, err)
assert.Nil(t, pair)
assert.Nil(t, user)
}
func TestAuthService_Login_WrongHotel(t *testing.T) {
db := testutil.SetupTestDB()
testutil.CreateTestShop(db, "HOTEL003")
svc := NewAuthService(db)
pair, user, err := svc.Login("NONEXISTENT", "admin", "password123")
assert.Error(t, err)
assert.Equal(t, ErrInvalidCredentials, err)
assert.Nil(t, pair)
assert.Nil(t, user)
}
func TestAuthService_Login_DisabledUser(t *testing.T) {
db := testutil.SetupTestDB()
shop := testutil.CreateTestShop(db, "HOTEL004")
user := testutil.CreateTestUser(db, shop.ID, "disabled", "password123", "operator")
// 禁用用户
db.Model(user).Update("is_active", false)
svc := NewAuthService(db)
pair, u, err := svc.Login("HOTEL004", "disabled", "password123")
assert.Error(t, err)
assert.Equal(t, ErrUserInactive, err)
assert.Nil(t, pair)
assert.Nil(t, u)
}
func TestAuthService_Login_WrongUsername(t *testing.T) {
db := testutil.SetupTestDB()
shop := testutil.CreateTestShop(db, "HOTEL005")
testutil.CreateTestUser(db, shop.ID, "admin", "password123", "admin")
svc := NewAuthService(db)
pair, user, err := svc.Login("HOTEL005", "nonexistent", "password123")
assert.Error(t, err)
assert.Equal(t, ErrInvalidCredentials, err)
assert.Nil(t, pair)
assert.Nil(t, user)
}
func TestAuthService_RefreshTokens(t *testing.T) {
db := testutil.SetupTestDB()
shop := testutil.CreateTestShop(db, "HOTEL006")
testutil.CreateTestUser(db, shop.ID, "admin", "password123", "admin")
svc := NewAuthService(db)
pair, _, err := svc.Login("HOTEL006", "admin", "password123")
require.NoError(t, err)
require.NotNil(t, pair)
// 用 refresh token 换新 token
newPair, err := svc.RefreshTokens(pair.RefreshToken)
require.NoError(t, err)
require.NotNil(t, newPair)
assert.NotEmpty(t, newPair.AccessToken)
assert.NotEmpty(t, newPair.RefreshToken)
}
func TestAuthService_RefreshTokens_Invalid(t *testing.T) {
db := testutil.SetupTestDB()
testutil.InitConfig()
svc := NewAuthService(db)
newPair, err := svc.RefreshTokens("invalid.token.here")
assert.Error(t, err)
assert.Nil(t, newPair)
}
func TestHashPassword(t *testing.T) {
hash, err := HashPassword("mypassword")
require.NoError(t, err)
assert.NotEmpty(t, hash)
assert.NotEqual(t, "mypassword", hash)
// 第二次哈希应不同(bcrypt 加 salt
hash2, err := HashPassword("mypassword")
require.NoError(t, err)
assert.NotEqual(t, hash, hash2)
}
func TestInitConfig(t *testing.T) {
testutil.InitConfig()
}
func init() {
testutil.InitConfig()
}