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) } }