Skip to content

Commit

Permalink
Merge pull request #1813 from ministryofjustice/MLPAB-2786-contact-vo…
Browse files Browse the repository at this point in the history
…ucher-when-fee-approved-and-paid

MLPAB-2786: Send voucher access code when fee approved and paid
  • Loading branch information
acsauk authored Mar 4, 2025
2 parents 66f139a + 8c9a84f commit 1d32f7d
Show file tree
Hide file tree
Showing 14 changed files with 172 additions and 20 deletions.
3 changes: 2 additions & 1 deletion cmd/event-received/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,10 @@ type SecretsClient interface {
}

type ShareCodeSender interface {
SendAttorneys(context.Context, appcontext.Data, *lpadata.Lpa) error
SendCertificateProviderInvite(context.Context, appcontext.Data, sharecode.CertificateProviderInvite, notify.ToEmail) error
SendCertificateProviderPrompt(context.Context, appcontext.Data, *donordata.Provided) error
SendAttorneys(context.Context, appcontext.Data, *lpadata.Lpa) error
SendVoucherAccessCode(ctx context.Context, provided *donordata.Provided, appData appcontext.Data) error
}

type UidStore interface {
Expand Down
48 changes: 48 additions & 0 deletions cmd/event-received/mock_ShareCodeSender_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions cmd/event-received/sirius_event_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,14 @@ func handleFeeApproved(
return fmt.Errorf("failed to send share code to certificate provider: %w", err)
}
}

if donor.Voucher.Allowed && donor.VoucherInvitedAt.IsZero() {
if err := shareCodeSender.SendVoucherAccessCode(ctx, donor, appData); err != nil {
return err
}

donor.VoucherInvitedAt = now()
}
} else {
donor.Tasks.PayForLpa = task.PaymentStateApproved
}
Expand Down
82 changes: 82 additions & 0 deletions cmd/event-received/sirius_event_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -529,6 +529,88 @@ func TestHandleFeeApprovedWhenApprovedTypeDiffers(t *testing.T) {
}
}

func TestHandleFeeApprovedWhenVoucherSelected(t *testing.T) {
event := &events.CloudWatchEvent{
DetailType: "reduced-fee-approved",
Detail: json.RawMessage(`{"uid":"M-1111-2222-3333","approvedType":"NoFee"}`),
}

donor := &donordata.Provided{
PK: dynamo.LpaKey("123"),
SK: dynamo.LpaOwnerKey(dynamo.DonorKey("456")),
FeeType: pay.NoFee,
Tasks: donordata.Tasks{PayForLpa: task.PaymentStatePending},
Voucher: donordata.Voucher{Allowed: true},
}

updatedDonor := *donor
updatedDonor.Tasks.PayForLpa = task.PaymentStateCompleted
updatedDonor.VoucherInvitedAt = testNow
updatedDonor.ReducedFeeApprovedAt = testNow
updatedDonor.UpdateHash()
updatedDonor.UpdatedAt = testNow

client := newMockDynamodbClient(t)
client.EXPECT().
OneByUID(ctx, "M-1111-2222-3333", mock.Anything).
Return(nil).
SetData(dynamo.Keys{PK: dynamo.LpaKey("123"), SK: dynamo.LpaOwnerKey(dynamo.DonorKey("456"))})
client.EXPECT().
One(ctx, dynamo.LpaKey("123"), dynamo.DonorKey("456"), mock.Anything).
Return(nil).
SetData(donor)
client.EXPECT().
Put(ctx, &updatedDonor).
Return(nil)

shareCodeSender := newMockShareCodeSender(t)
shareCodeSender.EXPECT().
SendVoucherAccessCode(ctx, &donordata.Provided{
PK: dynamo.LpaKey("123"),
SK: dynamo.LpaOwnerKey(dynamo.DonorKey("456")),
FeeType: pay.NoFee,
Tasks: donordata.Tasks{PayForLpa: task.PaymentStateCompleted},
Voucher: donordata.Voucher{Allowed: true},
}, appcontext.Data{}).
Return(nil)

err := handleFeeApproved(ctx, client, event, shareCodeSender, nil, nil, appcontext.Data{}, testNowFn)
assert.Nil(t, err)
}

func TestHandleFeeApprovedWhenVoucherSelectedAndShareCodeSenderError(t *testing.T) {
event := &events.CloudWatchEvent{
DetailType: "reduced-fee-approved",
Detail: json.RawMessage(`{"uid":"M-1111-2222-3333","approvedType":"NoFee"}`),
}

donor := &donordata.Provided{
PK: dynamo.LpaKey("123"),
SK: dynamo.LpaOwnerKey(dynamo.DonorKey("456")),
FeeType: pay.NoFee,
Tasks: donordata.Tasks{PayForLpa: task.PaymentStatePending},
Voucher: donordata.Voucher{Allowed: true},
}

client := newMockDynamodbClient(t)
client.EXPECT().
OneByUID(mock.Anything, mock.Anything, mock.Anything).
Return(nil).
SetData(dynamo.Keys{PK: dynamo.LpaKey("123"), SK: dynamo.LpaOwnerKey(dynamo.DonorKey("456"))})
client.EXPECT().
One(mock.Anything, mock.Anything, mock.Anything, mock.Anything).
Return(nil).
SetData(donor)

shareCodeSender := newMockShareCodeSender(t)
shareCodeSender.EXPECT().
SendVoucherAccessCode(mock.Anything, mock.Anything, mock.Anything).
Return(expectedError)

err := handleFeeApproved(ctx, client, event, shareCodeSender, nil, nil, appcontext.Data{}, testNowFn)
assert.ErrorIs(t, err, expectedError)
}

func TestHandleFeeApprovedWhenDynamoClientPutError(t *testing.T) {
event := &events.CloudWatchEvent{
DetailType: "reduced-fee-approved",
Expand Down
Loading

0 comments on commit 1d32f7d

Please sign in to comment.