From bb95f7457989efb6312cbe1f09ac042c041641fb Mon Sep 17 00:00:00 2001 From: CarterPerez-dev Date: Tue, 12 May 2026 02:43:53 -0400 Subject: [PATCH] =?UTF-8?q?feat(canary):=20generator=20registry=20(token.T?= =?UTF-8?q?ype=20=E2=86=92=20Generator)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../token/generators/registry/registry.go | 22 ++++++++ .../generators/registry/registry_test.go | 52 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 PROJECTS/beginner/canary-token-generator/backend/internal/token/generators/registry/registry.go create mode 100644 PROJECTS/beginner/canary-token-generator/backend/internal/token/generators/registry/registry_test.go diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/token/generators/registry/registry.go b/PROJECTS/beginner/canary-token-generator/backend/internal/token/generators/registry/registry.go new file mode 100644 index 00000000..37657a64 --- /dev/null +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/token/generators/registry/registry.go @@ -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(), + } +} diff --git a/PROJECTS/beginner/canary-token-generator/backend/internal/token/generators/registry/registry_test.go b/PROJECTS/beginner/canary-token-generator/backend/internal/token/generators/registry/registry_test.go new file mode 100644 index 00000000..2f7e1f10 --- /dev/null +++ b/PROJECTS/beginner/canary-token-generator/backend/internal/token/generators/registry/registry_test.go @@ -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") +}