Skip to content

Commit 4c9d695

Browse files
dhensbyCopilot
andcommitted
test: add integration tests for per-request timeout overrides
Add functional tests to verify per-request requestTimeout works across all code paths: query, stored procedure, transaction, and prepared statement. Tests confirm the timeout override fires independently of the pool-level default. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent b919a7e commit 4c9d695

File tree

5 files changed

+124
-0
lines changed

5 files changed

+124
-0
lines changed

test/cleanup.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ if exists (select * from sys.procedures where name = '__testInputOutputValue')
2222
if exists (select * from sys.procedures where name = '__testRowsAffected')
2323
exec('drop procedure [dbo].[__testRowsAffected]')
2424

25+
if exists (select * from sys.procedures where name = '__testDelay')
26+
exec('drop procedure [dbo].[__testDelay]')
27+
2528
if exists (select * from sys.types where is_user_defined = 1 and name = 'MSSQLTestType')
2629
exec('drop type [dbo].[MSSQLTestType]')
2730

test/common/tests.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,6 +1198,108 @@ module.exports = (sql, driver) => {
11981198
})
11991199
},
12001200

1201+
'per-request timeout overrides pool default' (done, driver, message) {
1202+
const config = readConfig()
1203+
config.driver = driver
1204+
config.requestTimeout = 15000
1205+
1206+
new sql.ConnectionPool(config).connect().then(conn => {
1207+
const req = new sql.Request(conn, { requestTimeout: 1000 })
1208+
req.query('waitfor delay \'00:00:05\';select 1').catch(err => {
1209+
assert.ok((message ? (message.exec(err.message) != null) : (err instanceof sql.RequestError)))
1210+
1211+
conn.close()
1212+
done()
1213+
})
1214+
}).catch(done)
1215+
},
1216+
1217+
'per-request timeout does not affect other requests' (done, driver, message) {
1218+
const config = readConfig()
1219+
config.driver = driver
1220+
config.requestTimeout = 15000
1221+
1222+
new sql.ConnectionPool(config).connect().then(conn => {
1223+
const reqFast = new sql.Request(conn, { requestTimeout: 1000 })
1224+
const reqNormal = new sql.Request(conn)
1225+
1226+
Promise.allSettled([
1227+
reqFast.query('waitfor delay \'00:00:05\';select 1'),
1228+
reqNormal.query('waitfor delay \'00:00:02\';select 1')
1229+
]).then(([fastResult, normalResult]) => {
1230+
assert.strictEqual(fastResult.status, 'rejected')
1231+
assert.ok((message ? (message.exec(fastResult.reason.message) != null) : (fastResult.reason instanceof sql.RequestError)))
1232+
assert.strictEqual(normalResult.status, 'fulfilled')
1233+
1234+
conn.close()
1235+
done()
1236+
})
1237+
}).catch(done)
1238+
},
1239+
1240+
'per-request timeout in transaction' (done, driver, message) {
1241+
const config = readConfig()
1242+
config.driver = driver
1243+
config.requestTimeout = 15000
1244+
1245+
new sql.ConnectionPool(config).connect().then(conn => {
1246+
const tx = new sql.Transaction(conn, { requestTimeout: 1000 })
1247+
tx.begin().then(() => {
1248+
const req = tx.request()
1249+
req.query('waitfor delay \'00:00:05\';select 1').catch(err => {
1250+
assert.ok((message ? (message.exec(err.message) != null) : (err instanceof sql.RequestError)))
1251+
1252+
tx.rollback().then(() => {
1253+
conn.close()
1254+
done()
1255+
}).catch(() => {
1256+
conn.close()
1257+
done()
1258+
})
1259+
})
1260+
})
1261+
}).catch(done)
1262+
},
1263+
1264+
'per-request timeout on stored procedure' (done, driver, message) {
1265+
const config = readConfig()
1266+
config.driver = driver
1267+
config.requestTimeout = 15000
1268+
1269+
new sql.ConnectionPool(config).connect().then(conn => {
1270+
const req = new sql.Request(conn, { requestTimeout: 1000 })
1271+
req.execute('__testDelay').catch(err => {
1272+
assert.ok((message ? (message.exec(err.message) != null) : (err instanceof sql.RequestError)))
1273+
1274+
conn.close()
1275+
done()
1276+
})
1277+
}).catch(done)
1278+
},
1279+
1280+
'per-request timeout on prepared statement' (done, driver, message) {
1281+
const config = readConfig()
1282+
config.driver = driver
1283+
config.requestTimeout = 15000
1284+
1285+
new sql.ConnectionPool(config).connect().then(conn => {
1286+
const ps = new sql.PreparedStatement(conn, { requestTimeout: 1000 })
1287+
ps.prepare('waitfor delay \'00:00:05\';select 1').then(() => {
1288+
ps.execute().catch(err => {
1289+
assert.ok((message ? (message.exec(err.message) != null) : (err instanceof sql.RequestError)))
1290+
1291+
ps.unprepare().then(() => {
1292+
conn.close()
1293+
done()
1294+
}).catch(() => {
1295+
conn.close()
1296+
done()
1297+
})
1298+
})
1299+
})
1300+
}).catch(done)
1301+
},
1302+
12011303
'type validation' (mode, done) {
12021304
const req = new TestRequest()
12031305
req.input('image', sql.VarBinary, 'asdf')

test/msnodesqlv8/msnodesqlv8.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ describe('msnodesqlv8', function () {
9292
it('connection healthy works', done => TESTS['connection healthy works'](config(), done))
9393
it('healthy connection goes bad', done => TESTS['healthy connection goes bad'](config(), done))
9494
it('request timeout', done => TESTS['request timeout'](done))
95+
it('per-request timeout overrides pool default', done => TESTS['per-request timeout overrides pool default'](done))
96+
it('per-request timeout does not affect other requests', done => TESTS['per-request timeout does not affect other requests'](done))
97+
it('per-request timeout in transaction', done => TESTS['per-request timeout in transaction'](done))
98+
it('per-request timeout on stored procedure', done => TESTS['per-request timeout on stored procedure'](done))
99+
it('per-request timeout on prepared statement', done => TESTS['per-request timeout on prepared statement'](done))
95100
it('dataLength type correction', done => TESTS['dataLength type correction'](done))
96101
it('chunked xml support', done => TESTS['chunked xml support'](done))
97102

test/prepare.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,15 @@ begin
167167
168168
end')
169169

170+
exec('create procedure [dbo].[__testDelay]
171+
as
172+
begin
173+
174+
waitfor delay ''00:00:05''
175+
select 1 as result
176+
177+
end')
178+
170179
;with nums as
171180
(
172181
select 0 AS n

test/tedious/tedious.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ describe('tedious', () => {
101101
it('connection healthy works', done => TESTS['connection healthy works'](config(), done))
102102
it('healthy connection goes bad', done => TESTS['healthy connection goes bad'](config(), done))
103103
it('request timeout', done => TESTS['request timeout'](done, 'tedious', /Timeout: Request failed to complete in 1000ms/))
104+
it('per-request timeout overrides pool default', done => TESTS['per-request timeout overrides pool default'](done, 'tedious', /Timeout: Request failed to complete in 1000ms/))
105+
it('per-request timeout does not affect other requests', done => TESTS['per-request timeout does not affect other requests'](done, 'tedious', /Timeout: Request failed to complete in 1000ms/))
106+
it('per-request timeout in transaction', done => TESTS['per-request timeout in transaction'](done, 'tedious', /Timeout: Request failed to complete in 1000ms/))
107+
it('per-request timeout on stored procedure', done => TESTS['per-request timeout on stored procedure'](done, 'tedious', /Timeout: Request failed to complete in 1000ms/))
108+
it('per-request timeout on prepared statement', done => TESTS['per-request timeout on prepared statement'](done, 'tedious', /Timeout: Request failed to complete in 1000ms/))
104109
it('dataLength type correction', done => TESTS['dataLength type correction'](done))
105110
it('type validation', done => TESTS['type validation']('query', done))
106111
it('type validation (batch)', done => TESTS['type validation']('batch', done))

0 commit comments

Comments
 (0)