feat(canary): generator registry (token.Type → Generator)
Lives in its own subpackage to break the otherwise-cyclic import
(generators interface → webbug impl → generators interface): the registry
must import concrete implementations, which themselves import the
generators package for Artifact/TriggerResponse types.
- registry.Config { BaseURL string } (reserved for future stateful generators)
- registry.Registry = map[token.Type]generators.Generator
- registry.Build registers webbug only; subsequent phases append
slowredirect, docx, pdf, kubeconfig, envfile, mysql
Tests assert webbug present, unknown type returns nil, pending types
are not yet claimed, Phase 2 cardinality is exactly 1.
This commit is contained in:
parent
9c0ad74973
commit
bb95f74579
|
|
@ -0,0 +1,22 @@
|
|||
// ©AngelaMos | 2026
|
||||
// registry.go
|
||||
|
||||
package registry
|
||||
|
||||
import (
|
||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/token"
|
||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/token/generators"
|
||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/token/generators/webbug"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
BaseURL string
|
||||
}
|
||||
|
||||
type Registry map[token.Type]generators.Generator
|
||||
|
||||
func Build(_ Config) Registry {
|
||||
return Registry{
|
||||
token.TypeWebbug: webbug.New(),
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
// ©AngelaMos | 2026
|
||||
// registry_test.go
|
||||
|
||||
package registry_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/token"
|
||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/token/generators/registry"
|
||||
)
|
||||
|
||||
const testBaseURL = "https://canary.example.com"
|
||||
|
||||
func TestBuild_RegistersWebbug(t *testing.T) {
|
||||
reg := registry.Build(registry.Config{BaseURL: testBaseURL})
|
||||
g, ok := reg[token.TypeWebbug]
|
||||
require.True(t, ok, "expected webbug generator registered")
|
||||
require.NotNil(t, g)
|
||||
require.Equal(t, token.TypeWebbug, g.Type())
|
||||
}
|
||||
|
||||
func TestBuild_UnknownTypeReturnsZeroValue(t *testing.T) {
|
||||
reg := registry.Build(registry.Config{BaseURL: testBaseURL})
|
||||
g, ok := reg["nonexistent-type"]
|
||||
require.False(t, ok, "unknown type must not be present")
|
||||
require.Nil(t, g, "map zero value for missing key must be nil interface")
|
||||
}
|
||||
|
||||
func TestBuild_PendingTypesNotYetRegistered(t *testing.T) {
|
||||
reg := registry.Build(registry.Config{BaseURL: testBaseURL})
|
||||
pending := []token.Type{
|
||||
token.TypeSlowRedirect,
|
||||
token.TypeDocx,
|
||||
token.TypePDF,
|
||||
token.TypeKubeconfig,
|
||||
token.TypeEnvfile,
|
||||
token.TypeMySQL,
|
||||
}
|
||||
for _, tt := range pending {
|
||||
_, ok := reg[tt]
|
||||
require.False(t, ok,
|
||||
"type %q is not yet registered (subsequent phases will add it); registry must not claim it", tt)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuild_OnlyExpectedTypesPresentInPhase2(t *testing.T) {
|
||||
reg := registry.Build(registry.Config{BaseURL: testBaseURL})
|
||||
require.Len(t, reg, 1, "Phase 2 registers exactly one generator (webbug); other phases append")
|
||||
}
|
||||
Loading…
Reference in New Issue