From 4d46ac0cb5a52b0146ad816ae59213f5143da3b4 Mon Sep 17 00:00:00 2001 From: Mustansir Muzaffar Date: Thu, 23 Apr 2026 14:03:10 +0500 Subject: [PATCH 1/2] add test to ensure new detectors are registered in defaults.go --- pkg/engine/defaults/defaults_test.go | 274 +++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) diff --git a/pkg/engine/defaults/defaults_test.go b/pkg/engine/defaults/defaults_test.go index de3489b3e059..a747bda34890 100644 --- a/pkg/engine/defaults/defaults_test.go +++ b/pkg/engine/defaults/defaults_test.go @@ -65,3 +65,277 @@ func TestDefaultVersionerDetectorsHaveNonZeroVersions(t *testing.T) { ) } } + +// TestAllDetectorTypesAreInDefaultList ensures every proto-defined DetectorType +// is either present in buildDetectorList() or explicitly excluded below. +// +// If you add a new DetectorType to the proto: +// - Add its scanner to buildDetectorList() in defaults.go, OR +// - Add it to excludedFromDefaultList in this test. +func TestAllDetectorTypesAreInDefaultList(t *testing.T) { + activeTypes := make(map[detector_typepb.DetectorType]struct{}) + for _, d := range DefaultDetectors() { + activeTypes[d.Type()] = struct{}{} + } + + for typeInt32, typeName := range detector_typepb.DetectorType_name { + dt := detector_typepb.DetectorType(typeInt32) + if _, ok := activeTypes[dt]; ok { + continue + } + if _, ok := excludedFromDefaultList[dt]; ok { + continue + } + t.Errorf( + "DetectorType %q (value %d) is missing from buildDetectorList(); "+ + "add it to defaults.go or to excludedFromDefaultList in this test", + typeName, typeInt32, + ) + } + + // Reverse check: no excluded type should appear in the active list. + // This catches types that were added to the exclude list by mistake. + for dt := range excludedFromDefaultList { + if _, ok := activeTypes[dt]; ok { + t.Errorf( + "DetectorType %q is in excludedFromDefaultList but is also present in buildDetectorList(); "+ + "remove it from excludedFromDefaultList", + detector_typepb.DetectorType_name[int32(dt)], + ) + } + } +} + +// excludedFromDefaultList contains detector types that are intentionally absent +// from buildDetectorList(). Keep entries grouped and sorted. +// +// TODO: audit this list periodically — entries in the "mistakenly missed" group +// should be removed once the corresponding detector is added to defaults.go. +var excludedFromDefaultList = map[detector_typepb.DetectorType]struct{}{ + // TODO: these detectors have implementations but were mistakenly never added + // to buildDetectorList() — discovered by TestAllDetectorTypesAreInDefaultList. + // They are not added immediately out of caution for the impact on customers/users. + // Remove each entry once its detector has been carefully added. + detector_typepb.DetectorType_BitbucketDataCenter: {}, + detector_typepb.DetectorType_DatadogApikey: {}, + detector_typepb.DetectorType_Guru: {}, + detector_typepb.DetectorType_IPInfo: {}, + detector_typepb.DetectorType_Lob: {}, + detector_typepb.DetectorType_Rev: {}, + detector_typepb.DetectorType_TLy: {}, + detector_typepb.DetectorType_Tru: {}, + detector_typepb.DetectorType_User: {}, + detector_typepb.DetectorType_Wit: {}, + + // Reserved / special types. + detector_typepb.DetectorType_CustomRegex: {}, // added dynamically via engine config, not via buildDetectorList() + detector_typepb.DetectorType_Test: {}, + + // Deprecated — the proto field is marked deprecated=true and the service + // no longer exists or has been superseded by a different type. + detector_typepb.DetectorType_AirtableApiKey: {}, + detector_typepb.DetectorType_ApiScience: {}, + detector_typepb.DetectorType_Blablabus: {}, + detector_typepb.DetectorType_CoinbaseWaaS: {}, + detector_typepb.DetectorType_CoinMarketCap: {}, + detector_typepb.DetectorType_CrossBrowserTesting: {}, + detector_typepb.DetectorType_DataFire: {}, + detector_typepb.DetectorType_EtsyApiKey: {}, + detector_typepb.DetectorType_FakeJSON: {}, + detector_typepb.DetectorType_Flowdash: {}, + detector_typepb.DetectorType_Flowdock: {}, + detector_typepb.DetectorType_Fusebill: {}, + detector_typepb.DetectorType_GlitterlyAPI: {}, + detector_typepb.DetectorType_GoogleApiKey: {}, + detector_typepb.DetectorType_Happi: {}, + detector_typepb.DetectorType_Heatmapapi: {}, + detector_typepb.DetectorType_Integromat: {}, + detector_typepb.DetectorType_Ipify: {}, + detector_typepb.DetectorType_Lastfm: {}, + detector_typepb.DetectorType_Macaddress: {}, + detector_typepb.DetectorType_Nitro: {}, + detector_typepb.DetectorType_Nytimes: {}, + detector_typepb.DetectorType_OnWaterIO: {}, + detector_typepb.DetectorType_Opengraphr: {}, + detector_typepb.DetectorType_Passbase: {}, + detector_typepb.DetectorType_ProspectIO: {}, + detector_typepb.DetectorType_QuickMetrics: {}, + detector_typepb.DetectorType_Restpack: {}, + detector_typepb.DetectorType_Rockset: {}, + detector_typepb.DetectorType_ScraperSite: {}, + detector_typepb.DetectorType_Sentiment: {}, + detector_typepb.DetectorType_SportRadar: {}, + detector_typepb.DetectorType_Squareup: {}, + detector_typepb.DetectorType_Text2Data: {}, + + // Intentionally commented out in buildDetectorList() — implementation + // exists but the detector is disabled (API issues, false positives, etc.). + detector_typepb.DetectorType_Abstract: {}, + detector_typepb.DetectorType_AdobeIO: {}, + detector_typepb.DetectorType_Alconost: {}, + detector_typepb.DetectorType_Apollo: {}, + detector_typepb.DetectorType_AzureFunctionKey: {}, + detector_typepb.DetectorType_Besnappy: {}, + detector_typepb.DetectorType_BlockNative: {}, + detector_typepb.DetectorType_DailyCO: {}, + detector_typepb.DetectorType_Debounce: {}, + detector_typepb.DetectorType_Generic: {}, + detector_typepb.DetectorType_GetEmail: {}, + detector_typepb.DetectorType_GetEmails: {}, + detector_typepb.DetectorType_Hive: {}, + detector_typepb.DetectorType_IbmCloudUserKey: {}, + detector_typepb.DetectorType_LineMessaging: {}, + detector_typepb.DetectorType_M3o: {}, + detector_typepb.DetectorType_Magnetic: {}, + detector_typepb.DetectorType_Manifest: {}, + detector_typepb.DetectorType_Mixpanel: {}, + detector_typepb.DetectorType_NasdaqDataLink: {}, + detector_typepb.DetectorType_Raven: {}, + detector_typepb.DetectorType_Sparkpost: {}, + detector_typepb.DetectorType_SpotifyKey: {}, + detector_typepb.DetectorType_TogglTrack: {}, + detector_typepb.DetectorType_WePay: {}, + detector_typepb.DetectorType_ZapierWebhook: {}, + + // Not yet implemented — proto enum entry exists but no detector has been + // written for this service yet. + detector_typepb.DetectorType_Aerisweather: {}, + detector_typepb.DetectorType_Aftership: {}, + detector_typepb.DetectorType_Convert: {}, + detector_typepb.DetectorType_Honey: {}, + detector_typepb.DetectorType_HubSpot: {}, + detector_typepb.DetectorType_Paymo: {}, + detector_typepb.DetectorType_Sellfy: {}, + detector_typepb.DetectorType_AirtableMetadataApiKey: {}, + detector_typepb.DetectorType_AkamaiToken: {}, + detector_typepb.DetectorType_Alphavantage: {}, + detector_typepb.DetectorType_AmazonMWS: {}, + detector_typepb.DetectorType_AMQP: {}, + detector_typepb.DetectorType_Api2Convert: {}, + detector_typepb.DetectorType_Authorize: {}, + detector_typepb.DetectorType_Avalara: {}, + detector_typepb.DetectorType_BaseApiIO: {}, + detector_typepb.DetectorType_BasisTheory: {}, + detector_typepb.DetectorType_BitGo: {}, + detector_typepb.DetectorType_Bored: {}, + detector_typepb.DetectorType_Brightlocal: {}, + detector_typepb.DetectorType_Bubble: {}, + detector_typepb.DetectorType_Checkmarket: {}, + detector_typepb.DetectorType_CircleCI: {}, + detector_typepb.DetectorType_Cloudant: {}, + detector_typepb.DetectorType_CloudsightKey: {}, + detector_typepb.DetectorType_Cloudways: {}, + detector_typepb.DetectorType_CoinGecko: {}, + detector_typepb.DetectorType_Cometchat: {}, + detector_typepb.DetectorType_ContentfulDelivery: {}, + detector_typepb.DetectorType_ContentStack: {}, + detector_typepb.DetectorType_Copyscape: {}, + detector_typepb.DetectorType_Createsend: {}, + detector_typepb.DetectorType_Cricket: {}, + detector_typepb.DetectorType_DigitalOceanSpaces: {}, + detector_typepb.DetectorType_Distribusion: {}, + detector_typepb.DetectorType_Duda: {}, + detector_typepb.DetectorType_Duffel: {}, + detector_typepb.DetectorType_Dynadot: {}, + detector_typepb.DetectorType_Dynatrace: {}, + detector_typepb.DetectorType_Edusign: {}, + detector_typepb.DetectorType_ElasticPath: {}, + detector_typepb.DetectorType_Emailoctopus: {}, + detector_typepb.DetectorType_EquinixOauth: {}, + detector_typepb.DetectorType_Eversign: {}, + detector_typepb.DetectorType_Fastspring: {}, + detector_typepb.DetectorType_Feedly: {}, + detector_typepb.DetectorType_Filestack: {}, + detector_typepb.DetectorType_Firebase: {}, + detector_typepb.DetectorType_FirebaseCloudMessaging: {}, + detector_typepb.DetectorType_FlagsmithEnvironmentKey: {}, + detector_typepb.DetectorType_FlagsmithToken: {}, + detector_typepb.DetectorType_Formstack: {}, + detector_typepb.DetectorType_Fountain: {}, + detector_typepb.DetectorType_FullContact: {}, + detector_typepb.DetectorType_GitHubOld: {}, + detector_typepb.DetectorType_Goshippo: {}, + detector_typepb.DetectorType_Gosquared: {}, + detector_typepb.DetectorType_Hotwire: {}, + detector_typepb.DetectorType_HubSpotOauth: {}, + detector_typepb.DetectorType_HypeAuditor: {}, + detector_typepb.DetectorType_Image4: {}, + detector_typepb.DetectorType_ImageToText: {}, + detector_typepb.DetectorType_Imgix: {}, + detector_typepb.DetectorType_Imgur: {}, + detector_typepb.DetectorType_Infobip: {}, + detector_typepb.DetectorType_JSONbin: {}, + detector_typepb.DetectorType_Jumpseller: {}, + detector_typepb.DetectorType_Kairos: {}, + detector_typepb.DetectorType_KakaoTalk: {}, + detector_typepb.DetectorType_Kaleyra: {}, + detector_typepb.DetectorType_KalturaAppToken: {}, + detector_typepb.DetectorType_KalturaSession: {}, + detector_typepb.DetectorType_Keygen: {}, + detector_typepb.DetectorType_KiteConnect: {}, + detector_typepb.DetectorType_KubeConfig: {}, + detector_typepb.DetectorType_LinkedIn: {}, + detector_typepb.DetectorType_Linode: {}, + detector_typepb.DetectorType_Messari: {}, + detector_typepb.DetectorType_Midise: {}, + detector_typepb.DetectorType_Mixcloud: {}, + detector_typepb.DetectorType_Mojohelpdesk: {}, + detector_typepb.DetectorType_MollieAccessToken: {}, + detector_typepb.DetectorType_MollieAPIKey: {}, + detector_typepb.DetectorType_Myexperiment: {}, + detector_typepb.DetectorType_NetCore: {}, + detector_typepb.DetectorType_NiceHash: {}, + detector_typepb.DetectorType_Nordigen: {}, + detector_typepb.DetectorType_Nubela: {}, + detector_typepb.DetectorType_OcrSpace: {}, + detector_typepb.DetectorType_Onbuka: {}, + detector_typepb.DetectorType_Opendatasoft: {}, + detector_typepb.DetectorType_Optidash: {}, + detector_typepb.DetectorType_Paddle: {}, + detector_typepb.DetectorType_Page2Images: {}, + detector_typepb.DetectorType_Papyrs: {}, + detector_typepb.DetectorType_PDFmyURL: {}, + detector_typepb.DetectorType_PendoIntegrationKey: {}, + detector_typepb.DetectorType_PlaidToken: {}, + detector_typepb.DetectorType_Printfection: {}, + detector_typepb.DetectorType_Processst: {}, + detector_typepb.DetectorType_Quickbase: {}, + detector_typepb.DetectorType_ReCAPTCHA: {}, + detector_typepb.DetectorType_Redbooth: {}, + detector_typepb.DetectorType_Riotgames: {}, + detector_typepb.DetectorType_Rosette: {}, + detector_typepb.DetectorType_Samsara: {}, + detector_typepb.DetectorType_ScrapingDog: {}, + detector_typepb.DetectorType_Sendoso: {}, + detector_typepb.DetectorType_ShopeeOpenPlatform: {}, + detector_typepb.DetectorType_Simplybook: {}, + detector_typepb.DetectorType_SMSApi: {}, + detector_typepb.DetectorType_StreamChatMessaging: {}, + detector_typepb.DetectorType_Supportbee: {}, + detector_typepb.DetectorType_Surge: {}, + detector_typepb.DetectorType_Teamup: {}, + detector_typepb.DetectorType_TeamViewer: {}, + detector_typepb.DetectorType_Telesign: {}, + detector_typepb.DetectorType_TencentCloudKey: {}, + detector_typepb.DetectorType_Timekit: {}, + detector_typepb.DetectorType_Trimble: {}, + detector_typepb.DetectorType_TwitterApiSecret: {}, + detector_typepb.DetectorType_UberServerToken: {}, + detector_typepb.DetectorType_Uproc: {}, + detector_typepb.DetectorType_Veevavault: {}, + detector_typepb.DetectorType_Vonage: {}, + detector_typepb.DetectorType_Wakatime: {}, + detector_typepb.DetectorType_Webengage: {}, + detector_typepb.DetectorType_WeChatAppKey: {}, + detector_typepb.DetectorType_Woopra: {}, + detector_typepb.DetectorType_WordsApi: {}, + detector_typepb.DetectorType_Workday: {}, + detector_typepb.DetectorType_WpEngine: {}, + detector_typepb.DetectorType_Yext: {}, + detector_typepb.DetectorType_AzureActiveDirectoryApplicationSecret: {}, + detector_typepb.DetectorType_AzureCacheForRedisAccessKey: {}, + detector_typepb.DetectorType_AzureManagementCertificate: {}, + detector_typepb.DetectorType_AzureMLWebServiceClassicIdentifiableKey: {}, + detector_typepb.DetectorType_AzureSQL: {}, + detector_typepb.DetectorType_BuiltWith: {}, +} From c4a392f149892b44fb08dbbf2009d849a7bc2b8c Mon Sep 17 00:00:00 2001 From: Mustansir Muzaffar Date: Thu, 23 Apr 2026 14:38:08 +0500 Subject: [PATCH 2/2] fix lint --- pkg/engine/defaults/defaults_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/engine/defaults/defaults_test.go b/pkg/engine/defaults/defaults_test.go index a747bda34890..c0dee2ed81a8 100644 --- a/pkg/engine/defaults/defaults_test.go +++ b/pkg/engine/defaults/defaults_test.go @@ -233,7 +233,7 @@ var excludedFromDefaultList = map[detector_typepb.DetectorType]struct{}{ detector_typepb.DetectorType_Createsend: {}, detector_typepb.DetectorType_Cricket: {}, detector_typepb.DetectorType_DigitalOceanSpaces: {}, - detector_typepb.DetectorType_Distribusion: {}, + detector_typepb.DetectorType_Distribusion: {}, //nolint:misspell // proto enum name is intentionally spelled this way detector_typepb.DetectorType_Duda: {}, detector_typepb.DetectorType_Duffel: {}, detector_typepb.DetectorType_Dynadot: {},