Skip to content

Commit 641ca2c

Browse files
committed
fix: Remove dead Jumio verification provider stub
Remove the unimplemented Jumio case from the verification factory and all associated references. Onfido and Stripe Identity are the implemented providers; Jumio was a stub returning ErrUnsupportedProvider. - Remove Jumio cases from NewProvider and NewProviderWithOptions - Remove "jumio" from SupportedProviders in config - Update doc comments across factory, config, entity, and provider - Update tests to use implemented providers (onfido, stripe) instead
1 parent 765be40 commit 641ca2c

9 files changed

Lines changed: 37 additions & 64 deletions

File tree

services/party/adapters/http/verification_webhook_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func TestNewVerificationWebhookHandler(t *testing.T) {
5050
VerificationService: &mockVerificationService{},
5151
HMACSecrets: map[string][]byte{
5252
"onfido": []byte("onfido-secret"),
53-
"jumio": []byte("jumio-secret"),
53+
"stripe": []byte("stripe-secret"),
5454
},
5555
},
5656
wantErr: false,
@@ -397,14 +397,14 @@ func TestVerificationWebhookHandler_HandleWebhook_MethodNotAllowed(t *testing.T)
397397

398398
func TestVerificationWebhookHandler_HandleWebhook_MultipleProviders(t *testing.T) {
399399
onfidoSecret := []byte("onfido-secret")
400-
jumioSecret := []byte("jumio-secret")
400+
stripeSecret := []byte("stripe-secret")
401401

402402
mockService := &mockVerificationService{}
403403
handler, err := NewVerificationWebhookHandler(VerificationWebhookHandlerConfig{
404404
VerificationService: mockService,
405405
HMACSecrets: map[string][]byte{
406406
"onfido": onfidoSecret,
407-
"jumio": jumioSecret,
407+
"stripe": stripeSecret,
408408
},
409409
})
410410
require.NoError(t, err)
@@ -429,11 +429,11 @@ func TestVerificationWebhookHandler_HandleWebhook_MultipleProviders(t *testing.T
429429

430430
assert.Equal(t, http.StatusOK, rr.Code)
431431

432-
// Test with jumio provider - should fail with onfido signature
432+
// Test with stripe provider - should fail with onfido signature
433433
body2, _ := json.Marshal(webhookReq)
434434
wrongSig := GenerateWebhookSignature(body2, onfidoSecret) // Using wrong secret
435435

436-
req2 := httptest.NewRequest(http.MethodPost, "/webhooks/verification/jumio", bytes.NewReader(body2))
436+
req2 := httptest.NewRequest(http.MethodPost, "/webhooks/verification/stripe", bytes.NewReader(body2))
437437
req2.Header.Set("Content-Type", "application/json")
438438
req2.Header.Set(WebhookSignatureHeader, wrongSig)
439439

@@ -620,7 +620,7 @@ func TestExtractProvider(t *testing.T) {
620620
expected string
621621
}{
622622
{"/webhooks/verification/onfido", "onfido"},
623-
{"/webhooks/verification/jumio", "jumio"},
623+
{"/webhooks/verification/stripe", "stripe"},
624624
{"/webhooks/verification/onfido/", "onfido"},
625625
{"/api/v1/webhooks/verification/provider", "provider"},
626626
{"/webhooks/verification", ""},

services/party/adapters/persistence/verification_entity.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ type PartyVerificationEntity struct {
2020
// Provider's verification ID (external reference)
2121
VerificationID string `gorm:"column:verification_id;type:varchar(255);not null;uniqueIndex:idx_party_verification_verification_id"`
2222

23-
// Provider name (e.g., "onfido", "jumio")
23+
// Provider name (e.g., "onfido", "stripe")
2424
Provider string `gorm:"column:provider;type:varchar(100);not null"`
2525

2626
// Verification status (PENDING, APPROVED, REJECTED, MANUAL_REVIEW)

services/party/adapters/persistence/verification_repository_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ func TestCreateVerification_GeneratesID(t *testing.T) {
151151
verification := &PartyVerificationEntity{
152152
PartyID: partyID,
153153
VerificationID: "prov-67890",
154-
Provider: "jumio",
154+
Provider: "onfido",
155155
Status: "PENDING",
156156
}
157157

services/party/config/verification.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
//
1212
// Provider identifies which verification provider to use. Supported values:
1313
// - "mock": Mock provider for testing (always available)
14-
// - "jumio": Jumio identity verification
1514
// - "onfido": Onfido identity verification
1615
// - "stripe": Stripe Identity verification
1716
//
@@ -29,11 +28,11 @@ import (
2928
// WebhookURL is the publicly accessible URL where providers send verification
3029
// callbacks. Required for production deployments.
3130
type VerificationConfig struct {
32-
// Provider is the verification provider to use ("mock", "jumio", "onfido", "stripe").
31+
// Provider is the verification provider to use ("mock", "onfido", "stripe").
3332
Provider string
3433

3534
// ProviderConfig contains provider-specific configuration.
36-
// For jumio/onfido: "api_key", "api_secret", "base_url" (optional).
35+
// For onfido: "api_key", "api_secret", "base_url" (optional).
3736
// For stripe: "api_key", "base_url" (optional), "stripe_account" (optional).
3837
ProviderConfig map[string]string
3938

@@ -65,7 +64,7 @@ var (
6564
)
6665

6766
// SupportedProviders lists all supported verification provider names.
68-
var SupportedProviders = []string{"mock", "jumio", "onfido", "stripe"}
67+
var SupportedProviders = []string{"mock", "onfido", "stripe"}
6968

7069
// LoadVerificationConfig loads verification configuration from environment variables.
7170
//

services/party/config/verification_test.go

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestLoadVerificationConfig_MockProvider_WithOptionalFields(t *testing.T) {
5252

5353
func TestLoadVerificationConfig_NonMockProvider_RequiresWebhookSecret(t *testing.T) {
5454
clearVerificationEnv(t)
55-
t.Setenv("VERIFICATION_PROVIDER", "jumio")
55+
t.Setenv("VERIFICATION_PROVIDER", "onfido")
5656
t.Setenv("VERIFICATION_WEBHOOK_URL", "https://example.com/webhook")
5757
t.Setenv("VERIFICATION_API_KEY", "api-key")
5858
t.Setenv("VERIFICATION_API_SECRET", "api-secret")
@@ -66,7 +66,7 @@ func TestLoadVerificationConfig_NonMockProvider_RequiresWebhookSecret(t *testing
6666

6767
func TestLoadVerificationConfig_NonMockProvider_RequiresWebhookURL(t *testing.T) {
6868
clearVerificationEnv(t)
69-
t.Setenv("VERIFICATION_PROVIDER", "jumio")
69+
t.Setenv("VERIFICATION_PROVIDER", "onfido")
7070
t.Setenv("VERIFICATION_WEBHOOK_SECRET", "secret")
7171
// Missing VERIFICATION_WEBHOOK_URL
7272
t.Setenv("VERIFICATION_API_KEY", "api-key")
@@ -108,22 +108,22 @@ func TestLoadVerificationConfig_NonMockProvider_RequiresAPISecret(t *testing.T)
108108

109109
func TestLoadVerificationConfig_NonMockProvider_ValidFullConfig(t *testing.T) {
110110
clearVerificationEnv(t)
111-
t.Setenv("VERIFICATION_PROVIDER", "jumio")
111+
t.Setenv("VERIFICATION_PROVIDER", "onfido")
112112
t.Setenv("VERIFICATION_WEBHOOK_SECRET", "webhook-secret")
113113
t.Setenv("VERIFICATION_WEBHOOK_URL", "https://api.example.com/webhooks/verification")
114114
t.Setenv("VERIFICATION_API_KEY", "my-api-key")
115115
t.Setenv("VERIFICATION_API_SECRET", "my-api-secret")
116-
t.Setenv("VERIFICATION_BASE_URL", "https://custom.jumio.com/api")
116+
t.Setenv("VERIFICATION_BASE_URL", "https://custom.onfido.com/api")
117117

118118
cfg, err := LoadVerificationConfig()
119119

120120
require.NoError(t, err)
121-
assert.Equal(t, "jumio", cfg.Provider)
121+
assert.Equal(t, "onfido", cfg.Provider)
122122
assert.Equal(t, "webhook-secret", cfg.WebhookSecret)
123123
assert.Equal(t, "https://api.example.com/webhooks/verification", cfg.WebhookURL)
124124
assert.Equal(t, "my-api-key", cfg.ProviderConfig["api_key"])
125125
assert.Equal(t, "my-api-secret", cfg.ProviderConfig["api_secret"])
126-
assert.Equal(t, "https://custom.jumio.com/api", cfg.ProviderConfig["base_url"])
126+
assert.Equal(t, "https://custom.onfido.com/api", cfg.ProviderConfig["base_url"])
127127
}
128128

129129
func TestLoadVerificationConfig_MissingProvider(t *testing.T) {
@@ -206,9 +206,6 @@ func TestVerificationConfig_Validate_ProviderCaseInsensitive(t *testing.T) {
206206
{"mock"},
207207
{"MOCK"},
208208
{"Mock"},
209-
{"jumio"},
210-
{"JUMIO"},
211-
{"Jumio"},
212209
{"onfido"},
213210
{"ONFIDO"},
214211
{"Onfido"},
@@ -244,8 +241,8 @@ func TestVerificationConfig_IsMock(t *testing.T) {
244241
{"mock", true},
245242
{"MOCK", true},
246243
{"Mock", true},
247-
{"jumio", false},
248244
{"onfido", false},
245+
{"stripe", false},
249246
{"", false},
250247
}
251248

@@ -260,10 +257,9 @@ func TestVerificationConfig_IsMock(t *testing.T) {
260257
func TestVerificationConfig_SupportedProviders(t *testing.T) {
261258
// Verify the SupportedProviders list contains expected values
262259
assert.Contains(t, SupportedProviders, "mock")
263-
assert.Contains(t, SupportedProviders, "jumio")
264260
assert.Contains(t, SupportedProviders, "onfido")
265261
assert.Contains(t, SupportedProviders, "stripe")
266-
assert.Len(t, SupportedProviders, 4)
262+
assert.Len(t, SupportedProviders, 3)
267263
}
268264

269265
func TestLoadVerificationConfig_StripeProvider_OnlyNeedsAPIKey(t *testing.T) {
@@ -353,7 +349,7 @@ func TestVerificationConfig_ValidateForEnvironment_ProductionRejectsMock(t *test
353349

354350
func TestVerificationConfig_ValidateForEnvironment_ProductionRejectsHTTPWebhook(t *testing.T) {
355351
cfg := &VerificationConfig{
356-
Provider: "jumio",
352+
Provider: "onfido",
357353
WebhookSecret: "a]strongsecretthatis32charslong!!", // 32+ chars
358354
WebhookURL: "http://api.example.com/webhooks", // HTTP, not HTTPS
359355
ProviderConfig: map[string]string{"api_key": "key", "api_secret": "secret"},
@@ -367,7 +363,7 @@ func TestVerificationConfig_ValidateForEnvironment_ProductionRejectsHTTPWebhook(
367363

368364
func TestVerificationConfig_ValidateForEnvironment_ProductionRejectsWeakSecret(t *testing.T) {
369365
cfg := &VerificationConfig{
370-
Provider: "jumio",
366+
Provider: "onfido",
371367
WebhookSecret: "short-secret", // < 32 chars
372368
WebhookURL: "https://api.example.com/webhooks",
373369
ProviderConfig: map[string]string{"api_key": "key", "api_secret": "secret"},
@@ -391,7 +387,7 @@ func TestVerificationConfig_ValidateForEnvironment_DevelopmentAllowsMock(t *test
391387

392388
func TestVerificationConfig_ValidateForEnvironment_ProductionAcceptsValidConfig(t *testing.T) {
393389
cfg := &VerificationConfig{
394-
Provider: "jumio",
390+
Provider: "onfido",
395391
WebhookSecret: "a-very-strong-secret-that-is-at-least-32-characters-long",
396392
WebhookURL: "https://api.example.com/webhooks/verification",
397393
ProviderConfig: map[string]string{"api_key": "key", "api_secret": "secret"},

services/party/verification/factory.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ var (
2222
// - "onfido": Onfido identity verification
2323
// - "stripe": Stripe Identity verification
2424
//
25-
// Future providers (stubs, not yet implemented):
26-
// - "jumio": Jumio identity verification
27-
//
2825
// Returns ErrUnsupportedProvider for any unrecognized provider name.
2926
// The MockProvider is configured with AlwaysApprove=true by default.
3027
func NewProvider(cfg *config.VerificationConfig) (Provider, error) {
@@ -36,9 +33,6 @@ func NewProvider(cfg *config.VerificationConfig) (Provider, error) {
3633
switch provider {
3734
case "mock":
3835
return NewMockProvider().WithAlwaysApprove(true), nil
39-
case "jumio":
40-
// Jumio provider not yet implemented
41-
return nil, ErrUnsupportedProvider
4236
case "onfido":
4337
return NewOnfidoProvider(cfg, slog.Default())
4438
case "stripe":
@@ -77,8 +71,6 @@ func NewProviderWithOptions(cfg *config.VerificationConfig, opts ProviderOptions
7771
return NewMockProvider().
7872
WithAlwaysApprove(opts.MockAlwaysApprove).
7973
WithAsyncMode(opts.MockAsyncMode), nil
80-
case "jumio":
81-
return nil, ErrUnsupportedProvider
8274
case "onfido":
8375
return NewOnfidoProvider(cfg, slog.Default())
8476
case "stripe":

services/party/verification/factory_test.go

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,6 @@ func TestNewProvider_MockProviderCaseInsensitive(t *testing.T) {
4949
}
5050
}
5151

52-
func TestNewProvider_JumioProvider_NotImplemented(t *testing.T) {
53-
cfg := &config.VerificationConfig{
54-
Provider: "jumio",
55-
WebhookSecret: "secret",
56-
WebhookURL: "https://example.com/webhook",
57-
ProviderConfig: map[string]string{"api_key": "key", "api_secret": "secret"},
58-
}
59-
60-
provider, err := NewProvider(cfg)
61-
62-
assert.Nil(t, provider)
63-
assert.ErrorIs(t, err, ErrUnsupportedProvider)
64-
}
65-
6652
func TestNewProvider_OnfidoProvider(t *testing.T) {
6753
cfg := &config.VerificationConfig{
6854
Provider: "onfido",
@@ -174,7 +160,7 @@ func TestNewProviderWithOptions_RespectsAsyncMode(t *testing.T) {
174160
}
175161

176162
func TestNewProviderWithOptions_NonMockProvider_ReturnsError(t *testing.T) {
177-
testCases := []string{"jumio", "unknown"}
163+
testCases := []string{"unknown", "nonexistent"}
178164

179165
for _, providerName := range testCases {
180166
t.Run(providerName, func(t *testing.T) {

services/party/verification/integration_test.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,16 @@ func TestProviderFactory_SwitchProviderViaConfig(t *testing.T) {
3838
require.NoError(t, err)
3939
assert.Equal(t, verification.StatusApproved, result.Status)
4040

41-
// Attempt to switch to jumio (should return error since not implemented)
42-
jumioCfg := &config.VerificationConfig{
43-
Provider: "jumio",
41+
// Attempt unsupported provider (should return error)
42+
unsupportedCfg := &config.VerificationConfig{
43+
Provider: "unsupported",
4444
WebhookSecret: "secret",
4545
WebhookURL: "https://example.com/webhook",
4646
ProviderConfig: map[string]string{"api_key": "key", "api_secret": "secret"},
4747
}
4848

49-
jumioProvider, err := verification.NewProvider(jumioCfg)
50-
assert.Nil(t, jumioProvider)
49+
unsupportedProvider, err := verification.NewProvider(unsupportedCfg)
50+
assert.Nil(t, unsupportedProvider)
5151
assert.ErrorIs(t, err, verification.ErrUnsupportedProvider)
5252

5353
// Can switch back to mock with different options
@@ -286,14 +286,14 @@ func TestWebhookSecurity_TamperedBodyRejected(t *testing.T) {
286286
// TestMultiProviderWebhooks tests that different providers use different secrets
287287
func TestMultiProviderWebhooks(t *testing.T) {
288288
onfidoSecret := []byte("onfido-secret-key")
289-
jumioSecret := []byte("jumio-secret-key")
289+
stripeSecret := []byte("stripe-secret-key")
290290

291291
mockService := &mockWebhookService{}
292292
handler, err := partyhttp.NewVerificationWebhookHandler(partyhttp.VerificationWebhookHandlerConfig{
293293
VerificationService: mockService,
294294
HMACSecrets: map[string][]byte{
295295
"onfido": onfidoSecret,
296-
"jumio": jumioSecret,
296+
"stripe": stripeSecret,
297297
},
298298
})
299299
require.NoError(t, err)
@@ -319,18 +319,18 @@ func TestMultiProviderWebhooks(t *testing.T) {
319319
assert.Equal(t, 200, rr.Code)
320320
})
321321

322-
t.Run("jumio webhook with correct secret succeeds", func(t *testing.T) {
322+
t.Run("stripe webhook with correct secret succeeds", func(t *testing.T) {
323323
mockService.calls = nil // Reset
324324

325325
webhookReq := partyhttp.VerificationWebhookRequest{
326-
VerificationID: "jumio-verify-456",
326+
VerificationID: "stripe-verify-456",
327327
Status: "REJECTED",
328328
Timestamp: time.Now(),
329329
}
330330
body, _ := json.Marshal(webhookReq)
331-
signature := partyhttp.GenerateWebhookSignature(body, jumioSecret)
331+
signature := partyhttp.GenerateWebhookSignature(body, stripeSecret)
332332

333-
req := httptest.NewRequest("POST", "/webhooks/verification/jumio", bytes.NewReader(body))
333+
req := httptest.NewRequest("POST", "/webhooks/verification/stripe", bytes.NewReader(body))
334334
req.Header.Set("Content-Type", "application/json")
335335
req.Header.Set(partyhttp.WebhookSignatureHeader, signature)
336336

@@ -340,7 +340,7 @@ func TestMultiProviderWebhooks(t *testing.T) {
340340
assert.Equal(t, 200, rr.Code)
341341
})
342342

343-
t.Run("onfido webhook with jumio secret fails", func(t *testing.T) {
343+
t.Run("onfido webhook with stripe secret fails", func(t *testing.T) {
344344
mockService.calls = nil // Reset
345345

346346
webhookReq := partyhttp.VerificationWebhookRequest{
@@ -350,7 +350,7 @@ func TestMultiProviderWebhooks(t *testing.T) {
350350
}
351351
body, _ := json.Marshal(webhookReq)
352352
// Sign with wrong provider's secret
353-
wrongSignature := partyhttp.GenerateWebhookSignature(body, jumioSecret)
353+
wrongSignature := partyhttp.GenerateWebhookSignature(body, stripeSecret)
354354

355355
req := httptest.NewRequest("POST", "/webhooks/verification/onfido", bytes.NewReader(body))
356356
req.Header.Set("Content-Type", "application/json")

services/party/verification/provider.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func (sr SanctionsResult) Validate() error {
108108
}
109109

110110
// Provider defines the interface for KYC/AML verification services.
111-
// Implementations may integrate with external providers like Onfido, Jumio, etc.
111+
// Implementations may integrate with external providers like Onfido, Stripe Identity, etc.
112112
type Provider interface {
113113
// VerifyIdentity initiates an identity verification check for the given party.
114114
// Returns a Result with a unique VerificationID that can be used

0 commit comments

Comments
 (0)