Skip to content

Commit f66566c

Browse files
committed
Add unit tests
1 parent 47b7508 commit f66566c

File tree

2 files changed

+109
-8
lines changed

2 files changed

+109
-8
lines changed

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ const DATABASE_NOT_FOUND_CODE = 'Neo.ClientError.Database.DatabaseNotFound'
4747
const INVALID_BOOKMARK_CODE = 'Neo.ClientError.Transaction.InvalidBookmark'
4848
const INVALID_BOOKMARK_MIXTURE_CODE =
4949
'Neo.ClientError.Transaction.InvalidBookmarkMixture'
50-
const FORBIDEN_CODE = 'Neo.ClientError.Security.Forbidden'
5150
const AUTHORIZATION_EXPIRED_CODE =
5251
'Neo.ClientError.Security.AuthorizationExpired'
5352

@@ -489,7 +488,7 @@ export default class RoutingConnectionProvider extends PooledConnectionProvider
489488
impersonatedUser
490489
)
491490
} catch (error) {
492-
return this._handleRediscoveryError(error)
491+
return this._handleRediscoveryError(error, currentRouter)
493492
} finally {
494493
session.close()
495494
}
@@ -532,11 +531,11 @@ export default class RoutingConnectionProvider extends PooledConnectionProvider
532531
impersonatedUser
533532
})
534533
} catch (error) {
535-
return this._handleRediscoveryError(error)
534+
return this._handleRediscoveryError(error, routerAddress)
536535
}
537536
}
538537

539-
_handleRediscoveryError(error) {
538+
_handleRediscoveryError(error, routerAddress) {
540539
if (_isFailFastError(error) || _isFailFastSecurityError(error)) {
541540
throw error
542541
} else if (error.code === PROCEDURE_NOT_FOUND_CODE) {
@@ -690,7 +689,6 @@ class RoutingTableRegistry {
690689
function _isFailFastError (error) {
691690
return [
692691
DATABASE_NOT_FOUND_CODE,
693-
FORBIDEN_CODE,
694692
INVALID_BOOKMARK_CODE,
695693
INVALID_BOOKMARK_MIXTURE_CODE,
696694
].includes(error.code)

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

Lines changed: 106 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1658,6 +1658,86 @@ describe('#unit RoutingConnectionProvider', () => {
16581658
})
16591659
}, 10000)
16601660

1661+
describe('when rediscovery.lookupRoutingTableOnRouter fails', () => {
1662+
describe.each([
1663+
'Neo.ClientError.Database.DatabaseNotFound',
1664+
'Neo.ClientError.Transaction.InvalidBookmark',
1665+
'Neo.ClientError.Transaction.InvalidBookmarkMixture',
1666+
'Neo.ClientError.Security.Forbidden',
1667+
'Neo.ClientError.Security.IWontTellYou'
1668+
])('with "%s"', errorCode => {
1669+
it('should fail without change the error ', async () => {
1670+
const error = newError('something wrong', errorCode)
1671+
const connectionProvider = newRoutingConnectionProviderWithFakeRediscovery(
1672+
new FakeRediscovery(null, error),
1673+
newPool()
1674+
)
1675+
1676+
let completed = false
1677+
try {
1678+
await connectionProvider.acquireConnection({ accessMode: READ })
1679+
completed = true
1680+
} catch (capturedError) {
1681+
expect(capturedError).toBe(error)
1682+
}
1683+
1684+
expect(completed).toBe(false)
1685+
})
1686+
})
1687+
1688+
describe('with "Neo.ClientError.Procedure.ProcedureNotFound"', () => {
1689+
it('should fail with SERVICE_UNAVAILABLE and a message about do not connect to cause cluster', async () => {
1690+
const error = newError('something wrong', 'Neo.ClientError.Procedure.ProcedureNotFound')
1691+
const connectionProvider = newRoutingConnectionProviderWithFakeRediscovery(
1692+
new FakeRediscovery(null, error),
1693+
newPool()
1694+
)
1695+
1696+
let completed = false
1697+
try {
1698+
await connectionProvider.acquireConnection({ accessMode: READ })
1699+
completed = true
1700+
} catch (capturedError) {
1701+
expect(capturedError.code).toBe(SERVICE_UNAVAILABLE)
1702+
expect(capturedError.message).toBe(
1703+
'Server at server-non-existing-seed-router:7687 can\'t '
1704+
+ 'perform routing. Make sure you are connecting to a causal cluster'
1705+
)
1706+
}
1707+
1708+
expect(completed).toBe(false)
1709+
})
1710+
})
1711+
1712+
describe.each([
1713+
'Neo.ClientError.Security.AuthorizationExpired',
1714+
'Neo.ClientError.MadeUp.Error'
1715+
])('with "%s"', errorCode => {
1716+
it('should fail with SERVICE_UNAVAILABLE and message about no routing servers available ', async () => {
1717+
const error = newError('something wrong', errorCode)
1718+
const connectionProvider = newRoutingConnectionProviderWithFakeRediscovery(
1719+
new FakeRediscovery(null, error),
1720+
newPool()
1721+
)
1722+
1723+
let completed = false
1724+
try {
1725+
await connectionProvider.acquireConnection({ accessMode: READ })
1726+
completed = true
1727+
} catch (capturedError) {
1728+
expect(capturedError.code).toBe(SERVICE_UNAVAILABLE)
1729+
expect(capturedError.message).toEqual(expect.stringContaining(
1730+
'Could not perform discovery. ' +
1731+
'No routing servers available. Known routing table: '
1732+
))
1733+
}
1734+
1735+
expect(completed).toBe(false)
1736+
})
1737+
1738+
})
1739+
})
1740+
16611741
describe('multi-database', () => {
16621742
it.each(usersDataSet)('should acquire read connection from correct routing table [user=%s]', async (user) => {
16631743
const pool = newPool()
@@ -2843,13 +2923,31 @@ function newRoutingConnectionProvider (
28432923
)
28442924
}
28452925

2926+
function newRoutingConnectionProviderWithFakeRediscovery (
2927+
fakeRediscovery,
2928+
pool = null,
2929+
routerToRoutingTable = { null: {} }
2930+
) {
2931+
const seedRouter = ServerAddress.fromUrl('server-non-existing-seed-router')
2932+
return newRoutingConnectionProviderWithSeedRouter(
2933+
seedRouter,
2934+
[seedRouter],
2935+
[],
2936+
routerToRoutingTable,
2937+
pool,
2938+
null,
2939+
fakeRediscovery
2940+
)
2941+
}
2942+
28462943
function newRoutingConnectionProviderWithSeedRouter (
28472944
seedRouter,
28482945
seedRouterResolved,
28492946
routingTables,
28502947
routerToRoutingTable = { null: {} },
28512948
connectionPool = null,
2852-
routingTablePurgeDelay = null
2949+
routingTablePurgeDelay = null,
2950+
fakeRediscovery = null
28532951
) {
28542952
const pool = connectionPool || newPool()
28552953
const connectionProvider = new RoutingConnectionProvider({
@@ -2865,7 +2963,8 @@ function newRoutingConnectionProviderWithSeedRouter (
28652963
routingTables.forEach(r => {
28662964
connectionProvider._routingTableRegistry.register(r)
28672965
})
2868-
connectionProvider._rediscovery = new FakeRediscovery(routerToRoutingTable)
2966+
connectionProvider._rediscovery =
2967+
fakeRediscovery || new FakeRediscovery(routerToRoutingTable)
28692968
connectionProvider._hostNameResolver = new FakeDnsResolver(seedRouterResolved)
28702969
connectionProvider._useSeedRouter = routingTables.every(
28712970
r => r.expirationTime !== Integer.ZERO
@@ -2999,11 +3098,15 @@ class FakeConnection extends Connection {
29993098
}
30003099

30013100
class FakeRediscovery {
3002-
constructor (routerToRoutingTable) {
3101+
constructor (routerToRoutingTable, error) {
30033102
this._routerToRoutingTable = routerToRoutingTable
3103+
this._error = error
30043104
}
30053105

30063106
lookupRoutingTableOnRouter (ignored, database, router, user) {
3107+
if (this._error) {
3108+
return Promise.reject(this._error)
3109+
}
30073110
const table = this._routerToRoutingTable[database || null]
30083111
if (table) {
30093112
let routingTables = table[router.asKey()]

0 commit comments

Comments
 (0)