Skip to content

Commit 6963127

Browse files
authored
fix: address AI review findings across reconciliation and grpc packages (#917)
Add empty reason validation to BalanceAssertion.Override(), clarify Attributes vs Metadata doc comments, rename misleading test function, extract duplicate test logger helper, and fix doc comment example in grpc client. Co-authored-by: Ben Coombs <bjcoombs@users.noreply.github.com>
1 parent 569e5b3 commit 6963127

6 files changed

Lines changed: 22 additions & 8 deletions

File tree

services/reconciliation/domain/balance_assertion.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ type BalanceAssertion struct {
4141
// OverrideReason records why a failed assertion was overridden.
4242
OverrideReason string
4343

44-
// Attributes stores flexible metadata.
44+
// Attributes stores caller-supplied business data (tags, labels, custom identifiers).
4545
Attributes map[string]string
4646

47-
// Metadata stores additional structured metadata.
47+
// Metadata stores system-defined internal data (processing hints, audit info).
4848
Metadata map[string]string
4949

5050
// AssertedAt is when the assertion was evaluated.
@@ -126,6 +126,9 @@ func (a *BalanceAssertion) Fail(actualBalance decimal.Decimal, reason string) er
126126
// The original FailureReason is preserved; the override justification
127127
// is stored in OverrideReason.
128128
func (a *BalanceAssertion) Override(reason string) error {
129+
if reason == "" {
130+
return ErrEmptyOverrideReason
131+
}
129132
if !a.Status.CanTransitionTo(AssertionStatusOverride) {
130133
return ErrInvalidStatusTransition
131134
}

services/reconciliation/domain/balance_assertion_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ func TestBalanceAssertion_Override(t *testing.T) {
126126
assert.Equal(t, "approved by manager", a.OverrideReason)
127127
}
128128

129+
func TestBalanceAssertion_OverrideEmptyReason(t *testing.T) {
130+
a := newTestAssertion(t)
131+
require.NoError(t, a.Fail(decimal.NewFromFloat(9500.00), "mismatch"))
132+
err := a.Override("")
133+
assert.ErrorIs(t, err, domain.ErrEmptyOverrideReason)
134+
}
135+
129136
func TestBalanceAssertion_OverrideFromNonFailed(t *testing.T) {
130137
t.Run("cannot override from pending", func(t *testing.T) {
131138
a := newTestAssertion(t)

services/reconciliation/domain/errors.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,6 @@ var (
4545
ErrRunNotCompleted = errors.New("settlement run must be in COMPLETED state to finalize")
4646
// ErrPositionLockFailed is returned when the position lock request to PK fails after retries.
4747
ErrPositionLockFailed = errors.New("failed to acquire position lock")
48+
// ErrEmptyOverrideReason is returned when override reason is empty.
49+
ErrEmptyOverrideReason = errors.New("override reason cannot be empty")
4850
)

services/reconciliation/service/stub_valuation_engine_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func TestStubValuationEngine_IntegrationWithVarianceValuator(t *testing.T) {
137137
assert.Equal(t, "GBP", varianceRepo.variances[0].Currency)
138138
}
139139

140-
func TestStubValuationEngine_MaterialityAutoAccept(t *testing.T) {
140+
func TestVarianceValuator_MaterialityAutoAccept(t *testing.T) {
141141
runRepo := newMockRunRepo()
142142
varianceRepo := &mockVarianceRepoFull{}
143143

services/reconciliation/worker/stub_refdata_client_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,19 @@ import (
1010
"github.com/stretchr/testify/require"
1111
)
1212

13+
func newTestLogger() *slog.Logger {
14+
return slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelError}))
15+
}
16+
1317
func TestStubReferenceDataClient_ReturnsEmptyList(t *testing.T) {
14-
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelError}))
15-
client := NewStubReferenceDataClient(logger)
18+
client := NewStubReferenceDataClient(newTestLogger())
1619

1720
schedules, err := client.ListSettlementSchedules(context.Background())
1821
require.NoError(t, err)
1922
assert.Empty(t, schedules)
2023
}
2124

2225
func TestStubReferenceDataClient_ImplementsInterface(t *testing.T) {
23-
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelError}))
24-
var client ReferenceDataClient = NewStubReferenceDataClient(logger)
26+
var client ReferenceDataClient = NewStubReferenceDataClient(newTestLogger())
2527
assert.NotNil(t, client)
2628
}

shared/pkg/grpc/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ type ClientConfig struct {
6767
// ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
6868
// defer cancel()
6969
//
70-
// conn, err := grpc.NewClient(ctx, grpc.ClientConfig{
70+
// conn, err := NewClient(ctx, ClientConfig{
7171
// ServiceName: "financial-accounting",
7272
// Namespace: "default",
7373
// Port: 50052,

0 commit comments

Comments
 (0)