@@ -47,6 +47,50 @@ func TestContextExecCancel(t *testing.T) {
4747 }
4848}
4949
50+ func TestPreparedStatementContextExecCancel (t * testing.T ) {
51+ t .Parallel ()
52+ db , mock , err := New ()
53+ if err != nil {
54+ t .Errorf ("an error '%s' was not expected when opening a stub database connection" , err )
55+ }
56+ defer db .Close ()
57+
58+ mock .ExpectPrepare ("DELETE FROM users" ).
59+ ExpectExec ().
60+ WillDelayFor (time .Second ).
61+ WillReturnResult (NewResult (1 , 1 ))
62+
63+ ctx , cancel := context .WithCancel (context .Background ())
64+
65+ go func () {
66+ time .Sleep (time .Millisecond * 10 )
67+ cancel ()
68+ }()
69+
70+ stmt , err := db .Prepare ("DELETE FROM users" )
71+ if err != nil {
72+ t .Errorf ("error was not expected, but got: %v" , err )
73+ }
74+
75+ _ , err = stmt .ExecContext (ctx )
76+ if err == nil {
77+ t .Error ("error was expected, but there was none" )
78+ }
79+
80+ if err != ErrCancelled {
81+ t .Errorf ("was expecting cancel error, but got: %v" , err )
82+ }
83+
84+ _ , err = stmt .ExecContext (ctx )
85+ if err != context .Canceled {
86+ t .Error ("error was expected since context was already done, but there was none" )
87+ }
88+
89+ if err := mock .ExpectationsWereMet (); err != nil {
90+ t .Errorf ("there were unfulfilled expections: %s" , err )
91+ }
92+ }
93+
5094func TestContextExecWithNamedArg (t * testing.T ) {
5195 t .Parallel ()
5296 db , mock , err := New ()
@@ -164,6 +208,53 @@ func TestContextQueryCancel(t *testing.T) {
164208 }
165209}
166210
211+ func TestPreparedStatementContextQueryCancel (t * testing.T ) {
212+ t .Parallel ()
213+ db , mock , err := New ()
214+ if err != nil {
215+ t .Errorf ("an error '%s' was not expected when opening a stub database connection" , err )
216+ }
217+ defer db .Close ()
218+
219+ rs := NewRows ([]string {"id" , "title" }).AddRow (5 , "hello world" )
220+
221+ mock .ExpectPrepare ("SELECT (.+) FROM articles WHERE id = ?" ).
222+ ExpectQuery ().
223+ WithArgs (5 ).
224+ WillDelayFor (time .Second ).
225+ WillReturnRows (rs )
226+
227+ ctx , cancel := context .WithCancel (context .Background ())
228+
229+ go func () {
230+ time .Sleep (time .Millisecond * 10 )
231+ cancel ()
232+ }()
233+
234+ stmt , err := db .Prepare ("SELECT id, title FROM articles WHERE id = ?" )
235+ if err != nil {
236+ t .Errorf ("error was not expected, but got: %v" , err )
237+ }
238+
239+ _ , err = stmt .QueryContext (ctx , 5 )
240+ if err == nil {
241+ t .Error ("error was expected, but there was none" )
242+ }
243+
244+ if err != ErrCancelled {
245+ t .Errorf ("was expecting cancel error, but got: %v" , err )
246+ }
247+
248+ _ , err = stmt .QueryContext (ctx , 5 )
249+ if err != context .Canceled {
250+ t .Error ("error was expected since context was already done, but there was none" )
251+ }
252+
253+ if err := mock .ExpectationsWereMet (); err != nil {
254+ t .Errorf ("there were unfulfilled expections: %s" , err )
255+ }
256+ }
257+
167258func TestContextQuery (t * testing.T ) {
168259 t .Parallel ()
169260 db , mock , err := New ()
0 commit comments