88 lines
3.2 KiB
Go
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)
|
|
}
|
|
}
|