Skip to content

Commit a7d303c

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 1211549 commit a7d303c

File tree

4 files changed

+119
-0
lines changed

4 files changed

+119
-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
@@ -94,6 +94,11 @@ describe('msnodesqlv8', function () {
9494
it('request timeout', done => TESTS['request timeout'](done))
9595
it('BigInt parameters', done => TESTS['BigInt parameters'](done))
9696
it('BigInt casted types', done => TESTS['BigInt casted types'](done))
97+
it('per-request timeout overrides pool default', done => TESTS['per-request timeout overrides pool default'](done))
98+
it('per-request timeout does not affect other requests', done => TESTS['per-request timeout does not affect other requests'](done))
99+
it('per-request timeout in transaction', done => TESTS['per-request timeout in transaction'](done))
100+
it('per-request timeout on stored procedure', done => TESTS['per-request timeout on stored procedure'](done))
101+
it('per-request timeout on prepared statement', done => TESTS['per-request timeout on prepared statement'](done))
97102
it('dataLength type correction', done => TESTS['dataLength type correction'](done))
98103
it('chunked xml support', done => TESTS['chunked xml support'](done))
99104

test/prepare.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,15 @@ begin
171171
172172
end')
173173

174+
exec('create procedure [dbo].[__testDelay]
175+
as
176+
begin
177+
178+
waitfor delay ''00:00:05''
179+
select 1 as result
180+
181+
end')
182+
174183
;with nums as
175184
(
176185
select 0 AS n

0 commit comments

Comments
 (0)