Files
mygo/internal/repository/capability_test.go
T
ld a18f96912d feat(repository): refactor query/mutation ports with capability-safe
interfaces

- refactor: split UserRepository into AuthUserRepository and
  AdminUserRepository capabilities
- refactor: split SessionRepository into AuthSessionRepository and
  repository-owned CLI/admin methods
- refactor: replace generic Repository Update/Delete with
  operation-specific params and ownership predicates
- refactor: replace CredentialRepository generic CRUD with
  passkey-specific methods
- refactor: replace FileRepository generic Create/Update/Delete with
  UploadedFileParams, DirectoryParams, and owned soft-delete
- refactor: remove repository fields from WebApp struct; repositories
  are now composition-time wiring only
- feat: add domain error kinds ErrParentNotFound, ErrParentNotDir,
  ErrDirectoryNotEmpty, ErrInvalidMove
- feat: add CredentialTypeAppPasskey constant
- feat: add testutil.SetUserAdmin for test fixture setup that bypasses
  production service ports
- test: add architecture test banning GORM Save in repository package
- test: add capability interface contract tests ensuring each service
  receives the minimal interface
- test: add blockingStorage helper for concurrent promotion tests
- test: add preserved DSN parameter test for sqliteImmediateDSN
- docs: update architecture decisions with repository write rules and
  capability separation
- docs: update roadmap to clarify atomic single-use refresh sessions
- docs: add -race test target to development docs
2026-07-16 12:24:36 +08:00

41 lines
957 B
Go

package repository
import (
"reflect"
"testing"
)
func TestRepositoryCapabilitiesExcludeUnneededOperations(t *testing.T) {
tests := []struct {
name string
capability reflect.Type
forbidden []string
}{
{
name: "auth user",
capability: reflect.TypeFor[AuthUserRepository](),
forbidden: []string{"MarkAdminDeleted", "ListIncludeDeleted"},
},
{
name: "admin user",
capability: reflect.TypeFor[AdminUserRepository](),
forbidden: []string{"CreateRegisteredUser", "FindByEmail"},
},
{
name: "auth session",
capability: reflect.TypeFor[AuthSessionRepository](),
forbidden: []string{"DeleteSessionsByUserID", "DeleteExpiredSessions"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
for _, method := range tt.forbidden {
if _, ok := tt.capability.MethodByName(method); ok {
t.Fatalf("capability unexpectedly exposes %s", method)
}
}
})
}
}