@@ -1434,10 +1434,11 @@ describe.each([
1434
1434
} )
1435
1435
} , 10000 )
1436
1436
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 ) => {
1438
1438
const pool = newPool ( )
1439
1439
1440
1440
jest . spyOn ( pool , 'purge' )
1441
+ jest . spyOn ( pool , 'apply' )
1441
1442
1442
1443
const connectionProvider = newRoutingConnectionProvider (
1443
1444
[
@@ -1468,11 +1469,78 @@ describe.each([
1468
1469
impersonatedUser : user
1469
1470
} )
1470
1471
1472
+ jest . spyOn ( server2Connection , 'close' )
1473
+ jest . spyOn ( server3Connection , 'close' )
1474
+
1471
1475
server3Connection . handleAndTransformError ( error , server3 )
1472
1476
server2Connection . handleAndTransformError ( error , server2 )
1473
1477
1478
+ expect ( server2Connection . close ) . toHaveBeenCalled ( )
1479
+ expect ( server3Connection . close ) . toHaveBeenCalled ( )
1480
+
1474
1481
expect ( pool . purge ) . not . toHaveBeenCalledWith ( server3 )
1475
1482
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' } )
1476
1544
} )
1477
1545
1478
1546
it . each ( usersDataSet ) ( 'should purge not change error when AuthorizationExpired happens [user=%s]' , async ( user ) => {
@@ -1515,6 +1583,7 @@ describe.each([
1515
1583
const pool = newPool ( )
1516
1584
1517
1585
jest . spyOn ( pool , 'purge' )
1586
+ jest . spyOn ( pool , 'apply' )
1518
1587
1519
1588
const connectionProvider = newRoutingConnectionProvider (
1520
1589
[
@@ -1550,6 +1619,49 @@ describe.each([
1550
1619
1551
1620
expect ( pool . purge ) . not . toHaveBeenCalledWith ( server3 )
1552
1621
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' } )
1553
1665
} )
1554
1666
1555
1667
it . each ( usersDataSet ) ( 'should not change error when TokenExpired happens [user=%s]' , async ( user ) => {
@@ -2943,7 +3055,10 @@ describe.each([
2943
3055
return Promise . reject ( e )
2944
3056
}
2945
3057
}
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
+ } ) )
2947
3062
}
2948
3063
return new Pool ( {
2949
3064
config,
@@ -3093,7 +3208,7 @@ function expectPoolToNotContain (pool, addresses) {
3093
3208
}
3094
3209
3095
3210
class FakeConnection extends Connection {
3096
- constructor ( address , release , version , protocolVersion , server ) {
3211
+ constructor ( address , release , version , protocolVersion , server , authToken ) {
3097
3212
super ( null )
3098
3213
3099
3214
this . _address = address
@@ -3103,6 +3218,7 @@ class FakeConnection extends Connection {
3103
3218
this . _release = jest . fn ( ( ) => release ( address , this ) )
3104
3219
this . resetAndFlush = jest . fn ( ( ) => Promise . resolve ( ) )
3105
3220
this . _server = server
3221
+ this . _authToken = authToken
3106
3222
}
3107
3223
3108
3224
get authToken ( ) {
0 commit comments