Skip to content

Commit ac6882d

Browse files
committed
Add tests for handle error in the RoutingConnectionProvider
1 parent b54aee3 commit ac6882d

File tree

1 file changed

+119
-3
lines changed

1 file changed

+119
-3
lines changed

packages/bolt-connection/test/connection-provider/connection-provider-routing.test.js

Lines changed: 119 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,10 +1434,11 @@ describe.each([
14341434
})
14351435
}, 10000)
14361436

1437-
it.each(usersDataSet)('should not purge connections for address when AuthorizationExpired happens [user=%s]', async (user) => {
1437+
it.each(usersDataSet)('should close connection and erase authToken for connection with address when AuthorizationExpired happens [user=%s]', async (user) => {
14381438
const pool = newPool()
14391439

14401440
jest.spyOn(pool, 'purge')
1441+
jest.spyOn(pool, 'apply')
14411442

14421443
const connectionProvider = newRoutingConnectionProvider(
14431444
[
@@ -1468,11 +1469,78 @@ describe.each([
14681469
impersonatedUser: user
14691470
})
14701471

1472+
jest.spyOn(server2Connection, 'close')
1473+
jest.spyOn(server3Connection, 'close')
1474+
14711475
server3Connection.handleAndTransformError(error, server3)
14721476
server2Connection.handleAndTransformError(error, server2)
14731477

1478+
expect(server2Connection.close).toHaveBeenCalled()
1479+
expect(server3Connection.close).toHaveBeenCalled()
1480+
14741481
expect(pool.purge).not.toHaveBeenCalledWith(server3)
14751482
expect(pool.purge).not.toHaveBeenCalledWith(server2)
1483+
1484+
expect(pool.apply).toHaveBeenCalledTimes(2)
1485+
1486+
const [[
1487+
calledAddress1, appliedFunction1
1488+
],
1489+
[
1490+
calledAddress2, appliedFunction2
1491+
]] = pool.apply.mock.calls
1492+
1493+
expect(calledAddress1).toBe(server3)
1494+
let fakeConn = { authToken: 'some token' }
1495+
appliedFunction1(fakeConn)
1496+
expect(fakeConn.authToken).toBe(null)
1497+
pool.apply(server3, conn => expect(conn.authToken).toBe(null))
1498+
1499+
expect(calledAddress2).toBe(server2)
1500+
fakeConn = { authToken: 'some token' }
1501+
appliedFunction2(fakeConn)
1502+
expect(fakeConn.authToken).toBe(null)
1503+
pool.apply(server2, conn => expect(conn.authToken).toBe(null))
1504+
})
1505+
1506+
it.each(usersDataSet)('should call authenticationAuthProvider.handleError when AuthorizationExpired happens [user=%s]', async (user) => {
1507+
const pool = newPool()
1508+
const connectionProvider = newRoutingConnectionProvider(
1509+
[
1510+
newRoutingTable(
1511+
null,
1512+
[server1, server2],
1513+
[server3, server2],
1514+
[server2, server4]
1515+
)
1516+
],
1517+
pool
1518+
)
1519+
1520+
const handleError = jest.spyOn(connectionProvider._authenticationProvider, 'handleError')
1521+
1522+
const error = newError(
1523+
'Message',
1524+
'Neo.ClientError.Security.AuthorizationExpired'
1525+
)
1526+
1527+
const server2Connection = await connectionProvider.acquireConnection({
1528+
accessMode: 'WRITE',
1529+
database: null,
1530+
impersonatedUser: user
1531+
})
1532+
1533+
const server3Connection = await connectionProvider.acquireConnection({
1534+
accessMode: 'READ',
1535+
database: null,
1536+
impersonatedUser: user
1537+
})
1538+
1539+
server3Connection.handleAndTransformError(error, server3)
1540+
server2Connection.handleAndTransformError(error, server2)
1541+
1542+
expect(handleError).toBeCalledWith({ connection: server3Connection, code: 'Neo.ClientError.Security.AuthorizationExpired' })
1543+
expect(handleError).toBeCalledWith({ connection: server2Connection, code: 'Neo.ClientError.Security.AuthorizationExpired' })
14761544
})
14771545

14781546
it.each(usersDataSet)('should purge not change error when AuthorizationExpired happens [user=%s]', async (user) => {
@@ -1515,6 +1583,7 @@ describe.each([
15151583
const pool = newPool()
15161584

15171585
jest.spyOn(pool, 'purge')
1586+
jest.spyOn(pool, 'apply')
15181587

15191588
const connectionProvider = newRoutingConnectionProvider(
15201589
[
@@ -1550,6 +1619,49 @@ describe.each([
15501619

15511620
expect(pool.purge).not.toHaveBeenCalledWith(server3)
15521621
expect(pool.purge).not.toHaveBeenCalledWith(server2)
1622+
expect(pool.apply).toHaveBeenCalledTimes(0)
1623+
pool.apply(server2, conn => expect(conn.authToken).toBeDefined())
1624+
pool.apply(server3, conn => expect(conn.authToken).toBeDefined())
1625+
})
1626+
1627+
it.each(usersDataSet)('should call authenticationAuthProvider.handleError when TokenExpired happens [user=%s]', async (user) => {
1628+
const pool = newPool()
1629+
const connectionProvider = newRoutingConnectionProvider(
1630+
[
1631+
newRoutingTable(
1632+
null,
1633+
[server1, server2],
1634+
[server3, server2],
1635+
[server2, server4]
1636+
)
1637+
],
1638+
pool
1639+
)
1640+
1641+
const handleError = jest.spyOn(connectionProvider._authenticationProvider, 'handleError')
1642+
1643+
const error = newError(
1644+
'Message',
1645+
'Neo.ClientError.Security.TokenExpired'
1646+
)
1647+
1648+
const server2Connection = await connectionProvider.acquireConnection({
1649+
accessMode: 'WRITE',
1650+
database: null,
1651+
impersonatedUser: user
1652+
})
1653+
1654+
const server3Connection = await connectionProvider.acquireConnection({
1655+
accessMode: 'READ',
1656+
database: null,
1657+
impersonatedUser: user
1658+
})
1659+
1660+
server3Connection.handleAndTransformError(error, server3)
1661+
server2Connection.handleAndTransformError(error, server2)
1662+
1663+
expect(handleError).toBeCalledWith({ connection: server3Connection, code: 'Neo.ClientError.Security.TokenExpired' })
1664+
expect(handleError).toBeCalledWith({ connection: server2Connection, code: 'Neo.ClientError.Security.TokenExpired' })
15531665
})
15541666

15551667
it.each(usersDataSet)('should not change error when TokenExpired happens [user=%s]', async (user) => {
@@ -2943,7 +3055,10 @@ describe.each([
29433055
return Promise.reject(e)
29443056
}
29453057
}
2946-
return Promise.resolve(new FakeConnection(address, release, 'version', PROTOCOL_VERSION))
3058+
return Promise.resolve(new FakeConnection(address, release, 'version', PROTOCOL_VERSION, undefined, {
3059+
scheme: 'bearer',
3060+
credentials: 'token'
3061+
}))
29473062
}
29483063
return new Pool({
29493064
config,
@@ -3093,7 +3208,7 @@ function expectPoolToNotContain (pool, addresses) {
30933208
}
30943209

30953210
class FakeConnection extends Connection {
3096-
constructor (address, release, version, protocolVersion, server) {
3211+
constructor (address, release, version, protocolVersion, server, authToken) {
30973212
super(null)
30983213

30993214
this._address = address
@@ -3103,6 +3218,7 @@ class FakeConnection extends Connection {
31033218
this._release = jest.fn(() => release(address, this))
31043219
this.resetAndFlush = jest.fn(() => Promise.resolve())
31053220
this._server = server
3221+
this._authToken = authToken
31063222
}
31073223

31083224
get authToken () {

0 commit comments

Comments
 (0)