package service import ( "errors" "testing" "github.com/DATA-DOG/go-sqlmock" "github.com/wmms/wmms/internal/model" "github.com/wmms/wmms/internal/repository" "github.com/wmms/wmms/pkg/database" ) func TestGeneratedTokenCarriesEveryUserRole(t *testing.T) { user := &model.User{ ID: 7, Username: "zhangsan", Roles: []model.Role{ {ID: 2, Code: "warehouse_admin", Name: "仓库管理员", Enabled: true}, {ID: 3, Code: "purchaser", Name: "采购人员", Enabled: true}, }, } service := NewAuthService() tokenString, err := service.GenerateToken(user) if err != nil { t.Fatalf("generate token: %v", err) } token, err := service.ValidateToken(tokenString) if err != nil { t.Fatalf("validate token: %v", err) } if len(token.Roles) != 2 || token.Roles[0] != "warehouse_admin" || token.Roles[1] != "purchaser" { t.Fatalf("unexpected token roles: %+v", token.Roles) } } func TestUserCreateOrganizationOmittedRejectsOrdinaryUser(t *testing.T) { db, mock, err := sqlmock.New() if err != nil { t.Fatal(err) } database.DB = db t.Cleanup(func() { database.DB = nil; db.Close() }) mock.ExpectBegin() mock.ExpectExec("INSERT INTO users").WithArgs("new", sqlmock.AnyArg(), "").WillReturnResult(sqlmock.NewResult(7, 1)) mock.ExpectQuery("SELECT COUNT.*FROM roles").WithArgs(int64(2), int64(7)).WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(1)) mock.ExpectExec("INSERT INTO user_roles").WithArgs(int64(7), int64(2)).WillReturnResult(sqlmock.NewResult(0, 1)) mock.ExpectQuery("SELECT organization_id, is_default FROM user_organizations").WithArgs(int64(7)).WillReturnRows(sqlmock.NewRows([]string{"organization_id", "is_default"})) mock.ExpectQuery("SELECT EXISTS").WithArgs(int64(7)).WillReturnRows(sqlmock.NewRows([]string{"admin"}).AddRow(false)) mock.ExpectRollback() _, err = NewAuthService().CreateUser("new", "secret", "", []int64{2}) if !errors.Is(err, repository.ErrInvalidOrganizations) { t.Fatalf("want invalid organizations, got %v", err) } if err := mock.ExpectationsWereMet(); err != nil { t.Fatal(err) } }