Files
kra-new/internal/service/business/account_test.go
T

88 lines
3.2 KiB
Go

package business
import (
"context"
"encoding/json"
"kra/internal/biz/business"
"kra/internal/service/dto"
"testing"
)
type accountUsecaseFake struct {
AccountUsecase
created *business.Account
filter business.AccountFilter
options business.ListOptions
}
func (f *accountUsecaseFake) CreateChild(_ context.Context, a *business.Account) (*business.Account, error) {
f.created = a
return a, nil
}
func (f *accountUsecaseFake) List(_ context.Context, filter business.AccountFilter, opts ...business.ListOption) ([]*business.Account, int64, error) {
f.filter, f.options = filter, business.NewListOptions(opts...)
return []*business.Account{}, 0, nil
}
func TestAccountTransportIgnoresForgedOwnershipAndPreservesDefaultStatus(t *testing.T) {
var req dto.BusinessAccountRequest
if err := json.Unmarshal([]byte(`{"userId":999,"userName":"child","realName":"姓名","password":"abc123","hireDate":"2026-11-01","level":1,"parentId":999,"roleIds":[888]}`), &req); err != nil {
t.Fatal(err)
}
f := &accountUsecaseFake{}
s := &AccountService{uc: f}
value, err := s.Create(context.Background(), &req)
if err != nil {
t.Fatal(err)
}
if f.created.ID != 0 || f.created.ParentID != 0 || f.created.AuthorityID != 0 || f.created.Level != 0 || f.created.Status != 0 {
t.Fatalf("传输层接受了身份注入: %+v", f.created)
}
data, err := json.Marshal(value)
if err != nil {
t.Fatal(err)
}
var payload map[string]any
if err := json.Unmarshal(data, &payload); err != nil {
t.Fatal(err)
}
if _, ok := payload["password"]; ok {
t.Fatal("响应不应包含密码")
}
}
func TestAccountQueryEmptyFiltersAndPageBounds(t *testing.T) {
f := &accountUsecaseFake{}
s := &AccountService{uc: f}
if _, err := s.List(context.Background(), &dto.BusinessAccountQuery{PageSize: 99999}); err != nil {
t.Fatal(err)
}
if f.filter.Level != nil || f.filter.Status != nil || f.options.Limit != 500 || f.options.Offset != 0 {
t.Fatalf("缺省过滤或分页不正确: %+v %+v", f.filter, f.options)
}
if _, err := s.List(context.Background(), &dto.BusinessAccountQuery{Status: "0"}); err != nil || f.filter.Status == nil || *f.filter.Status != 0 {
t.Fatalf("正常状态筛选未保留: %v", err)
}
if _, err := s.List(context.Background(), &dto.BusinessAccountQuery{Page: int(^uint(0) >> 1), PageSize: 500}); err != business.ErrAccountInput {
t.Fatalf("溢出分页应拒绝: %v", err)
}
}
func TestCreateBusinessRequiresHireDateAndValidPhone(t *testing.T) {
f := &accountUsecaseFake{}
s := &AccountService{uc: f}
name, owner, phone, hire := "member", "负责人", "abc", "2026-11-01"
req := &dto.BusinessAccountRequest{Username: &name, RealName: &owner, Password: "test-password"}
if _, err := s.Create(context.Background(), req); err != business.ErrMemberInput || f.created != nil {
t.Fatal("missing hire date must not reach usecase")
}
req.HireDate, req.Phone = &hire, &phone
if _, err := s.Create(context.Background(), req); err != business.ErrMemberInput || f.created != nil {
t.Fatal("invalid phone must not reach usecase")
}
phone = "138 0013 8000"
if _, err := s.Create(context.Background(), req); err != nil || f.created.HireDate != hire {
t.Fatalf("valid profile rejected: %v", err)
}
}