@@ -3,6 +3,7 @@ package batch
33import (
44 "context"
55 "fmt"
6+ "sync/atomic"
67 "testing"
78
89 "github.com/stretchr/testify/assert"
@@ -16,8 +17,27 @@ import (
1617 "go.uber.org/zap/zaptest"
1718)
1819
20+ // mockCounter implements counter.Counter for testing.
21+ type mockCounter struct {
22+ nextFunc func (ctx context.Context , domain string ) (int64 , error )
23+ }
24+
25+ func (m * mockCounter ) Next (ctx context.Context , domain string ) (int64 , error ) {
26+ return m .nextFunc (ctx , domain )
27+ }
28+
29+ // newSequentialCounter returns a mock counter that returns incrementing values starting at 1.
30+ func newSequentialCounter () * mockCounter {
31+ var seq int64
32+ return & mockCounter {
33+ nextFunc : func (ctx context.Context , domain string ) (int64 , error ) {
34+ return atomic .AddInt64 (& seq , 1 ), nil
35+ },
36+ }
37+ }
38+
1939// newTestController creates a controller with test dependencies.
20- func newTestController (t * testing.T , ctrl * gomock.Controller , publishErr error ) * Controller {
40+ func newTestController (t * testing.T , ctrl * gomock.Controller , cnt * mockCounter , publishErr error ) * Controller {
2141 logger := zaptest .NewLogger (t ).Sugar ()
2242 scope := tally .NoopScope
2343
@@ -36,12 +56,12 @@ func newTestController(t *testing.T, ctrl *gomock.Controller, publishErr error)
3656 nil ,
3757 )
3858
39- return NewController (logger , scope , registry , consumer .TopicToBatch , "orchestrator-batch" )
59+ return NewController (logger , scope , registry , cnt , consumer .TopicToBatch , "orchestrator-batch" )
4060}
4161
4262func TestNewController (t * testing.T ) {
4363 ctrl := gomock .NewController (t )
44- controller := newTestController (t , ctrl , nil )
64+ controller := newTestController (t , ctrl , newSequentialCounter (), nil )
4565
4666 require .NotNil (t , controller )
4767 assert .Equal (t , consumer .TopicToBatch , controller .Topic ())
@@ -52,7 +72,7 @@ func TestNewController(t *testing.T) {
5272func TestController_Process_Success (t * testing.T ) {
5373 ctrl := gomock .NewController (t )
5474
55- controller := newTestController (t , ctrl , nil )
75+ controller := newTestController (t , ctrl , newSequentialCounter (), nil )
5676
5777 request := entity.Request {
5878 ID : "test-queue/123" ,
@@ -78,7 +98,7 @@ func TestController_Process_Success(t *testing.T) {
7898func TestController_Process_InvalidJSON (t * testing.T ) {
7999 ctrl := gomock .NewController (t )
80100
81- controller := newTestController (t , ctrl , nil )
101+ controller := newTestController (t , ctrl , newSequentialCounter (), nil )
82102
83103 invalidPayload := []byte (`{"invalid": json"}` )
84104 msg := queue .NewMessage ("invalid-msg" , invalidPayload , "partition1" , nil )
@@ -95,7 +115,7 @@ func TestController_Process_InvalidJSON(t *testing.T) {
95115func TestController_Process_PublishFailure (t * testing.T ) {
96116 ctrl := gomock .NewController (t )
97117
98- controller := newTestController (t , ctrl , fmt .Errorf ("publish failed" ))
118+ controller := newTestController (t , ctrl , newSequentialCounter (), fmt .Errorf ("publish failed" ))
99119
100120 request := entity.Request {
101121 ID : "test-queue/123" ,
@@ -118,9 +138,40 @@ func TestController_Process_PublishFailure(t *testing.T) {
118138 assert .Error (t , err )
119139}
120140
141+ func TestController_Process_CounterFailure (t * testing.T ) {
142+ ctrl := gomock .NewController (t )
143+
144+ cnt := & mockCounter {
145+ nextFunc : func (ctx context.Context , domain string ) (int64 , error ) {
146+ return 0 , fmt .Errorf ("counter unavailable" )
147+ },
148+ }
149+ controller := newTestController (t , ctrl , cnt , nil )
150+
151+ request := entity.Request {
152+ ID : "test-queue/123" ,
153+ Queue : "test-queue" ,
154+ Change : entity.Change {URIs : []string {"github://uber/service/pull/456/abc123def" }},
155+ LandStrategy : entity .RequestLandStrategyRebase ,
156+ State : entity .RequestStateNew ,
157+ Version : 1 ,
158+ }
159+
160+ payload , err := request .ToBytes ()
161+ require .NoError (t , err )
162+
163+ msg := queue .NewMessage (request .ID , payload , request .Queue , nil )
164+ delivery := queuemock .NewMockDelivery (ctrl )
165+ delivery .EXPECT ().Message ().Return (msg ).AnyTimes ()
166+ delivery .EXPECT ().Attempt ().Return (1 ).AnyTimes ()
167+
168+ err = controller .Process (context .Background (), delivery )
169+ assert .Error (t , err )
170+ }
171+
121172func TestController_InterfaceImplementation (t * testing.T ) {
122173 ctrl := gomock .NewController (t )
123- controller := newTestController (t , ctrl , nil )
174+ controller := newTestController (t , ctrl , newSequentialCounter (), nil )
124175
125176 var _ consumer.Controller = controller
126177}
0 commit comments