Files
NianAIGC/backend/internal/httpapi/admin_test.go

76 lines
3.3 KiB
Go

package httpapi
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"strings"
"testing"
"git.nianxx.cn/wangxuming/NianAIGC/backend/internal/administration"
)
func TestAdminGroupsCompatibilityIsGone(t *testing.T) {
authorizer, _ := NewPlatformAuthorizer(AuthState{Required: true}, nil)
handler, _ := NewAdminHandler(authorizer, administration.NewService(&adminStoreStub{}))
w := httptest.NewRecorder()
handler.ServeHTTP(w, httptest.NewRequest(http.MethodPost, "/api/admin/accounts/groups", nil))
if w.Code != http.StatusGone || !strings.Contains(w.Body.String(), "不再使用外部部门接口") {
t.Fatalf("status=%d body=%q", w.Code, w.Body.String())
}
}
func TestAdminAccountsListUsesSecurityProjection(t *testing.T) {
store := &adminStoreStub{accounts: []administration.Account{{ID: "u", Phone: "13800138000", DisplayName: "User", Role: administration.RoleUser, OrganizationID: "org", Status: administration.StatusActive, PasswordHash: "must-not-leak", PasswordSalt: "must-not-leak", SessionVersion: 9}}}
authorizer, _ := NewPlatformAuthorizer(AuthState{}, nil)
handler, _ := NewAdminHandler(authorizer, administration.NewService(store))
w := httptest.NewRecorder()
handler.ServeHTTP(w, httptest.NewRequest(http.MethodGet, "/api/admin/accounts", nil))
if w.Code != http.StatusOK || strings.Contains(w.Body.String(), "must-not-leak") || strings.Contains(w.Body.String(), "sessionVersion") {
t.Fatalf("status=%d body=%q", w.Code, w.Body.String())
}
var body struct {
Members []map[string]any `json:"members"`
CanManage bool `json:"canManageOrganizations"`
}
if json.Unmarshal(w.Body.Bytes(), &body) != nil || len(body.Members) != 1 || !body.CanManage {
t.Fatalf("body=%q", w.Body.String())
}
}
type adminStoreStub struct {
accounts []administration.Account
organizations []administration.Organization
}
func (s *adminStoreStub) ListAccounts(context.Context, administration.AccountFilters) ([]administration.Account, error) {
return s.accounts, nil
}
func (s *adminStoreStub) GetAccount(context.Context, string) (administration.Account, bool, error) {
return administration.Account{}, false, nil
}
func (s *adminStoreStub) CreateAccount(_ context.Context, a administration.Account) (administration.Account, error) {
return a, nil
}
func (s *adminStoreStub) UpdateAccount(_ context.Context, a administration.Account) (administration.Account, error) {
return a, nil
}
func (s *adminStoreStub) DeleteAccount(context.Context, string, string) error { return nil }
func (s *adminStoreStub) ListOrganizations(context.Context, bool) ([]administration.Organization, error) {
return s.organizations, nil
}
func (s *adminStoreStub) GetOrganization(context.Context, string) (administration.Organization, bool, error) {
return administration.Organization{}, false, nil
}
func (s *adminStoreStub) CreateOrganization(_ context.Context, o administration.Organization) (administration.Organization, error) {
return o, nil
}
func (s *adminStoreStub) UpdateOrganization(_ context.Context, o administration.Organization) (administration.Organization, error) {
return o, nil
}
func (s *adminStoreStub) DeleteOrganization(context.Context, string) error { return nil }
func (s *adminStoreStub) CountOrganizationMembers(context.Context, string) (int, error) {
return 0, nil
}