1+ package consul
2+
3+ import (
4+ "fmt"
5+ "testing"
6+
7+ "github.com/hashicorp/consul/api"
8+ "github.com/stretchr/testify/assert"
9+ )
10+
11+ // MockConsulClient for testing
12+ type MockConsulClient struct {
13+ MockAgent * MockAgent
14+ }
15+
16+ func (m * MockConsulClient ) Agent () ConsulAgent {
17+ return m .MockAgent
18+ }
19+
20+ type MockAgent struct {
21+ ServiceFunc func (serviceID string , q * api.QueryOptions ) (* api.AgentService , * api.QueryMeta , error )
22+ ServiceRegisterFunc func (reg * api.AgentServiceRegistration ) error
23+ }
24+
25+ func (m * MockAgent ) Service (serviceID string , q * api.QueryOptions ) (* api.AgentService , * api.QueryMeta , error ) {
26+ if m .ServiceFunc != nil {
27+ return m .ServiceFunc (serviceID , q )
28+ }
29+ return nil , nil , nil
30+ }
31+
32+ func (m * MockAgent ) ServiceRegister (reg * api.AgentServiceRegistration ) error {
33+ if m .ServiceRegisterFunc != nil {
34+ return m .ServiceRegisterFunc (reg )
35+ }
36+ return nil
37+ }
38+
39+ func TestDefaultFactory (t * testing.T ) {
40+ factory := & DefaultFactory {}
41+
42+ // Test with valid configuration
43+ // Note: This will actually try to connect to Consul, so it might fail
44+ // in environments without Consul running
45+ t .Run ("Create client with valid config" , func (t * testing.T ) {
46+ client , err := factory .NewClient ("127.0.0.1:8500" , "test-token" )
47+ // We expect this to succeed in creating a client object,
48+ // even if Consul isn't actually running
49+ assert .NoError (t , err )
50+ assert .NotNil (t , client )
51+ })
52+ }
53+
54+ func TestMockFactory (t * testing.T ) {
55+ t .Run ("Returns mock client" , func (t * testing.T ) {
56+ mockClient := & MockConsulClient {
57+ MockAgent : & MockAgent {},
58+ }
59+ factory := & MockFactory {
60+ MockClient : mockClient ,
61+ }
62+
63+ client , err := factory .NewClient ("any-address" , "any-token" )
64+ assert .NoError (t , err )
65+ assert .Equal (t , mockClient , client )
66+ })
67+
68+ t .Run ("Returns error when configured" , func (t * testing.T ) {
69+ expectedErr := fmt .Errorf ("connection failed" )
70+ factory := & MockFactory {
71+ MockError : expectedErr ,
72+ }
73+
74+ client , err := factory .NewClient ("any-address" , "any-token" )
75+ assert .Error (t , err )
76+ assert .Equal (t , expectedErr , err )
77+ assert .Nil (t , client )
78+ })
79+ }
80+
81+ func TestGlobalFactory (t * testing.T ) {
82+ // Save original factory
83+ originalFactory := Factory
84+ defer func () {
85+ Factory = originalFactory
86+ }()
87+
88+ t .Run ("Default factory is set" , func (t * testing.T ) {
89+ ResetFactory ()
90+ _ , ok := Factory .(* DefaultFactory )
91+ assert .True (t , ok , "Default factory should be DefaultFactory type" )
92+ })
93+
94+ t .Run ("Can set mock factory" , func (t * testing.T ) {
95+ mockFactory := & MockFactory {
96+ MockClient : & MockConsulClient {},
97+ }
98+ SetFactory (mockFactory )
99+ assert .Equal (t , mockFactory , Factory )
100+ })
101+
102+ t .Run ("CreateClient uses global factory" , func (t * testing.T ) {
103+ mockClient := & MockConsulClient {
104+ MockAgent : & MockAgent {},
105+ }
106+ mockFactory := & MockFactory {
107+ MockClient : mockClient ,
108+ }
109+ SetFactory (mockFactory )
110+
111+ client , err := CreateClient ("test-addr" , "test-token" )
112+ assert .NoError (t , err )
113+ assert .Equal (t , mockClient , client )
114+ })
115+
116+ t .Run ("ResetFactory restores default" , func (t * testing.T ) {
117+ mockFactory := & MockFactory {}
118+ SetFactory (mockFactory )
119+ ResetFactory ()
120+ _ , ok := Factory .(* DefaultFactory )
121+ assert .True (t , ok , "Factory should be reset to DefaultFactory" )
122+ })
123+ }
0 commit comments