Skip to content

Commit 018e639

Browse files
Copilotasmyasnikov
andauthored
dev: Add comprehensive unit tests for internal/query package to increase coverage (#1899)
Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: asmyasnikov <[email protected]> Co-authored-by: Aleksey Myasnikov <[email protected]>
1 parent 8401aad commit 018e639

File tree

5 files changed

+432
-0
lines changed

5 files changed

+432
-0
lines changed
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package config
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/stretchr/testify/require"
8+
9+
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
10+
)
11+
12+
func TestNew(t *testing.T) {
13+
t.Run("DefaultConfig", func(t *testing.T) {
14+
cfg := New()
15+
require.NotNil(t, cfg)
16+
require.Equal(t, DefaultPoolMaxSize, cfg.PoolLimit())
17+
require.Equal(t, DefaultSessionCreateTimeout, cfg.SessionCreateTimeout())
18+
require.Equal(t, DefaultSessionDeleteTimeout, cfg.SessionDeleteTimeout())
19+
require.NotNil(t, cfg.Trace())
20+
require.False(t, cfg.AllowImplicitSessions())
21+
require.Equal(t, uint64(0), cfg.PoolSessionUsageLimit())
22+
require.Equal(t, time.Duration(0), cfg.PoolSessionUsageTTL())
23+
require.Equal(t, time.Duration(0), cfg.SessionIdleTimeToLive())
24+
require.False(t, cfg.LazyTx())
25+
})
26+
27+
t.Run("WithPoolLimit", func(t *testing.T) {
28+
cfg := New(WithPoolLimit(100))
29+
require.Equal(t, 100, cfg.PoolLimit())
30+
})
31+
32+
t.Run("WithPoolLimitZero", func(t *testing.T) {
33+
cfg := New(WithPoolLimit(0))
34+
require.Equal(t, DefaultPoolMaxSize, cfg.PoolLimit())
35+
})
36+
37+
t.Run("WithPoolLimitNegative", func(t *testing.T) {
38+
cfg := New(WithPoolLimit(-1))
39+
require.Equal(t, DefaultPoolMaxSize, cfg.PoolLimit())
40+
})
41+
42+
t.Run("WithSessionPoolSessionUsageLimit-Uint64", func(t *testing.T) {
43+
cfg := New(WithSessionPoolSessionUsageLimit(uint64(50)))
44+
require.Equal(t, uint64(50), cfg.PoolSessionUsageLimit())
45+
})
46+
47+
t.Run("WithSessionPoolSessionUsageLimit-Duration", func(t *testing.T) {
48+
cfg := New(WithSessionPoolSessionUsageLimit(5 * time.Minute))
49+
require.Equal(t, 5*time.Minute, cfg.PoolSessionUsageTTL())
50+
})
51+
52+
t.Run("WithSessionCreateTimeout", func(t *testing.T) {
53+
cfg := New(WithSessionCreateTimeout(2 * time.Second))
54+
require.Equal(t, 2*time.Second, cfg.SessionCreateTimeout())
55+
})
56+
57+
t.Run("WithSessionCreateTimeoutZero", func(t *testing.T) {
58+
cfg := New(WithSessionCreateTimeout(0))
59+
require.Equal(t, time.Duration(0), cfg.SessionCreateTimeout())
60+
})
61+
62+
t.Run("WithSessionDeleteTimeout", func(t *testing.T) {
63+
cfg := New(WithSessionDeleteTimeout(1 * time.Second))
64+
require.Equal(t, 1*time.Second, cfg.SessionDeleteTimeout())
65+
})
66+
67+
t.Run("WithSessionDeleteTimeoutZero", func(t *testing.T) {
68+
cfg := New(WithSessionDeleteTimeout(0))
69+
require.Equal(t, DefaultSessionDeleteTimeout, cfg.SessionDeleteTimeout())
70+
})
71+
72+
t.Run("WithSessionIdleTimeToLive", func(t *testing.T) {
73+
cfg := New(WithSessionIdleTimeToLive(10 * time.Minute))
74+
require.Equal(t, 10*time.Minute, cfg.SessionIdleTimeToLive())
75+
})
76+
77+
t.Run("WithSessionIdleTimeToLiveZero", func(t *testing.T) {
78+
cfg := New(WithSessionIdleTimeToLive(0))
79+
require.Equal(t, time.Duration(0), cfg.SessionIdleTimeToLive())
80+
})
81+
82+
t.Run("AllowImplicitSessions", func(t *testing.T) {
83+
cfg := New(AllowImplicitSessions())
84+
require.True(t, cfg.AllowImplicitSessions())
85+
})
86+
87+
t.Run("WithLazyTx", func(t *testing.T) {
88+
cfg := New(WithLazyTx(true))
89+
require.True(t, cfg.LazyTx())
90+
})
91+
92+
t.Run("WithTrace", func(t *testing.T) {
93+
tr := &trace.Query{
94+
OnSessionCreate: func(info trace.QuerySessionCreateStartInfo) func(info trace.QuerySessionCreateDoneInfo) {
95+
return func(info trace.QuerySessionCreateDoneInfo) {}
96+
},
97+
}
98+
cfg := New(WithTrace(tr))
99+
require.NotNil(t, cfg.Trace())
100+
})
101+
102+
t.Run("NilOption", func(t *testing.T) {
103+
cfg := New(nil)
104+
require.NotNil(t, cfg)
105+
})
106+
107+
t.Run("MultipleOptions", func(t *testing.T) {
108+
cfg := New(
109+
WithPoolLimit(200),
110+
WithSessionCreateTimeout(3*time.Second),
111+
WithSessionDeleteTimeout(2*time.Second),
112+
AllowImplicitSessions(),
113+
WithLazyTx(true),
114+
)
115+
require.Equal(t, 200, cfg.PoolLimit())
116+
require.Equal(t, 3*time.Second, cfg.SessionCreateTimeout())
117+
require.Equal(t, 2*time.Second, cfg.SessionDeleteTimeout())
118+
require.True(t, cfg.AllowImplicitSessions())
119+
require.True(t, cfg.LazyTx())
120+
})
121+
}
122+
123+
func TestDefaults(t *testing.T) {
124+
cfg := defaults()
125+
require.NotNil(t, cfg)
126+
require.Equal(t, DefaultPoolMaxSize, cfg.poolLimit)
127+
require.Equal(t, DefaultSessionCreateTimeout, cfg.sessionCreateTimeout)
128+
require.Equal(t, DefaultSessionDeleteTimeout, cfg.sessionDeleteTimeout)
129+
require.NotNil(t, cfg.trace)
130+
}

internal/query/errors_test.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package query
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestErrors(t *testing.T) {
11+
t.Run("errNilClient", func(t *testing.T) {
12+
require.NotNil(t, errNilClient)
13+
require.Contains(t, errNilClient.Error(), "table client is not initialized")
14+
})
15+
16+
t.Run("ErrTransactionRollingBack", func(t *testing.T) {
17+
require.NotNil(t, ErrTransactionRollingBack)
18+
require.Contains(t, ErrTransactionRollingBack.Error(), "the transaction is rolling back")
19+
})
20+
21+
t.Run("errWrongNextResultSetIndex", func(t *testing.T) {
22+
require.NotNil(t, errWrongNextResultSetIndex)
23+
require.Equal(t, "wrong result set index", errWrongNextResultSetIndex.Error())
24+
})
25+
26+
t.Run("errWrongResultSetIndex", func(t *testing.T) {
27+
require.NotNil(t, errWrongResultSetIndex)
28+
require.Equal(t, "critical violation of the logic - wrong result set index", errWrongResultSetIndex.Error())
29+
})
30+
31+
t.Run("errMoreThanOneRow", func(t *testing.T) {
32+
require.NotNil(t, errMoreThanOneRow)
33+
require.Equal(t, "unexpected more than one row in result set", errMoreThanOneRow.Error())
34+
})
35+
36+
t.Run("errMoreThanOneResultSet", func(t *testing.T) {
37+
require.NotNil(t, errMoreThanOneResultSet)
38+
require.Equal(t, "unexpected more than one result set", errMoreThanOneResultSet.Error())
39+
})
40+
41+
t.Run("errNoResultSets", func(t *testing.T) {
42+
require.NotNil(t, errNoResultSets)
43+
require.Equal(t, "no result sets", errNoResultSets.Error())
44+
})
45+
46+
t.Run("errNilOption", func(t *testing.T) {
47+
require.NotNil(t, errNilOption)
48+
require.Equal(t, "nil option", errNilOption.Error())
49+
})
50+
51+
t.Run("ErrOptionNotForTxExecute", func(t *testing.T) {
52+
require.NotNil(t, ErrOptionNotForTxExecute)
53+
require.Equal(t, "option is not for execute on transaction", ErrOptionNotForTxExecute.Error())
54+
})
55+
56+
t.Run("errExecuteOnCompletedTx", func(t *testing.T) {
57+
require.NotNil(t, errExecuteOnCompletedTx)
58+
require.Equal(t, "execute on completed transaction", errExecuteOnCompletedTx.Error())
59+
})
60+
61+
t.Run("errSessionClosed", func(t *testing.T) {
62+
require.NotNil(t, errSessionClosed)
63+
require.Equal(t, "session is closed", errSessionClosed.Error())
64+
})
65+
66+
t.Run("ErrorsAreUnique", func(t *testing.T) {
67+
// Verify that error variables are distinct
68+
require.False(t, errors.Is(errNilClient, ErrTransactionRollingBack))
69+
require.False(t, errors.Is(errWrongNextResultSetIndex, errWrongResultSetIndex))
70+
require.False(t, errors.Is(errMoreThanOneRow, errMoreThanOneResultSet))
71+
require.False(t, errors.Is(errNoResultSets, errNilOption))
72+
require.False(t, errors.Is(ErrOptionNotForTxExecute, errExecuteOnCompletedTx))
73+
require.False(t, errors.Is(errExecuteOnCompletedTx, errSessionClosed))
74+
})
75+
}

internal/query/options/execute_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"google.golang.org/grpc"
88

99
"github.com/ydb-platform/ydb-go-sdk/v3/internal/params"
10+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/stats"
1011
"github.com/ydb-platform/ydb-go-sdk/v3/internal/tx"
1112
)
1213

@@ -166,3 +167,66 @@ func must[T any](v T, err error) T {
166167

167168
return v
168169
}
170+
171+
func TestResponsePartLimitSizeBytes(t *testing.T) {
172+
settings := ExecuteSettings(
173+
WithTxControl(tx.NewControl(tx.WithTxID(""))),
174+
WithResponsePartLimitSizeBytes(1024),
175+
)
176+
require.Equal(t, int64(1024), settings.ResponsePartLimitSizeBytes())
177+
}
178+
179+
func TestLabel(t *testing.T) {
180+
settings := defaultExecuteSettings()
181+
require.Equal(t, "undefined", settings.Label())
182+
}
183+
184+
func TestStatsModeApplyWithCallback(t *testing.T) {
185+
called := false
186+
callback := func(stats.QueryStats) {
187+
called = true
188+
}
189+
settings := ExecuteSettings(
190+
WithTxControl(tx.NewControl(tx.WithTxID(""))),
191+
WithStatsMode(StatsModeBasic, callback),
192+
)
193+
require.Equal(t, StatsModeBasic, settings.StatsMode())
194+
require.NotNil(t, settings.StatsCallback())
195+
// Verify callback works
196+
settings.StatsCallback()(nil)
197+
require.True(t, called)
198+
}
199+
200+
func TestRetryOpts(t *testing.T) {
201+
settings := defaultExecuteSettings()
202+
require.Nil(t, settings.RetryOpts())
203+
}
204+
205+
func TestStatsCallback(t *testing.T) {
206+
settings := defaultExecuteSettings()
207+
require.Nil(t, settings.StatsCallback())
208+
}
209+
210+
func TestStatsMode(t *testing.T) {
211+
t.Run("StatsModeNone", func(t *testing.T) {
212+
settings := ExecuteSettings(
213+
WithTxControl(tx.NewControl(tx.WithTxID(""))),
214+
StatsModeNone,
215+
)
216+
require.Equal(t, StatsModeNone, settings.StatsMode())
217+
})
218+
219+
t.Run("StatsModeBasic", func(t *testing.T) {
220+
settings := ExecuteSettings(
221+
WithTxControl(tx.NewControl(tx.WithTxID(""))),
222+
StatsModeBasic,
223+
)
224+
require.Equal(t, StatsModeBasic, settings.StatsMode())
225+
})
226+
}
227+
228+
func TestThisOptionIsNotForExecuteOnTx(t *testing.T) {
229+
txCtrl := (*txControlOption)(tx.NewControl(tx.WithTxID("test")))
230+
// Should not panic
231+
txCtrl.thisOptionIsNotForExecuteOnTx()
232+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package query
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
)
8+
9+
func TestStatusString(t *testing.T) {
10+
tests := []struct {
11+
name string
12+
status Status
13+
expected string
14+
}{
15+
{
16+
name: "StatusUnknown",
17+
status: StatusUnknown,
18+
expected: "Unknown",
19+
},
20+
{
21+
name: "StatusIdle",
22+
status: StatusIdle,
23+
expected: "Idle",
24+
},
25+
{
26+
name: "StatusInUse",
27+
status: StatusInUse,
28+
expected: "InUse",
29+
},
30+
{
31+
name: "StatusClosing",
32+
status: StatusClosing,
33+
expected: "Closing",
34+
},
35+
{
36+
name: "StatusClosed",
37+
status: StatusClosed,
38+
expected: "Closed",
39+
},
40+
{
41+
name: "StatusError",
42+
status: StatusError,
43+
expected: "Error",
44+
},
45+
{
46+
name: "InvalidStatus",
47+
status: Status(999),
48+
expected: "Unknown999",
49+
},
50+
}
51+
52+
for _, tt := range tests {
53+
t.Run(tt.name, func(t *testing.T) {
54+
result := tt.status.String()
55+
require.Equal(t, tt.expected, result)
56+
})
57+
}
58+
}
59+
60+
func TestIsAlive(t *testing.T) {
61+
tests := []struct {
62+
name string
63+
status Status
64+
expected bool
65+
}{
66+
{
67+
name: "StatusUnknown",
68+
status: StatusUnknown,
69+
expected: true,
70+
},
71+
{
72+
name: "StatusIdle",
73+
status: StatusIdle,
74+
expected: true,
75+
},
76+
{
77+
name: "StatusInUse",
78+
status: StatusInUse,
79+
expected: true,
80+
},
81+
{
82+
name: "StatusClosing",
83+
status: StatusClosing,
84+
expected: false,
85+
},
86+
{
87+
name: "StatusClosed",
88+
status: StatusClosed,
89+
expected: false,
90+
},
91+
{
92+
name: "StatusError",
93+
status: StatusError,
94+
expected: false,
95+
},
96+
{
97+
name: "CustomStatusValue",
98+
status: Status(100),
99+
expected: true,
100+
},
101+
}
102+
103+
for _, tt := range tests {
104+
t.Run(tt.name, func(t *testing.T) {
105+
result := IsAlive(tt.status)
106+
require.Equal(t, tt.expected, result)
107+
})
108+
}
109+
}

0 commit comments

Comments
 (0)