@@ -2665,6 +2665,233 @@ describe('routing driver with stub server', () => {
26652665 } )
26662666 } )
26672667
2668+ describe ( 'Multi-Database' , ( ) => {
2669+ function verifyDiscoverAndRead ( script , database , done ) {
2670+ if ( ! boltStub . supported ) {
2671+ done ( )
2672+ return
2673+ }
2674+
2675+ // Given
2676+ const server = boltStub . start (
2677+ `./test/resources/boltstub/v4/acquire_endpoints_${ database ||
2678+ 'default_database' } .script`,
2679+ 9001
2680+ )
2681+ const readServer = boltStub . start (
2682+ `./test/resources/boltstub/v4/${ script } .script` ,
2683+ 9005
2684+ )
2685+
2686+ boltStub . run ( ( ) => {
2687+ const driver = boltStub . newDriver ( 'neo4j://127.0.0.1:9001' )
2688+ // When
2689+ const session = driver . session ( {
2690+ database : database ,
2691+ defaultAccessMode : READ
2692+ } )
2693+ session . run ( 'MATCH (n) RETURN n.name' ) . then ( ( ) => {
2694+ session . close ( )
2695+ // Then
2696+ expect (
2697+ hasAddressInConnectionPool ( driver , '127.0.0.1:9001' )
2698+ ) . toBeTruthy ( )
2699+ expect (
2700+ hasAddressInConnectionPool ( driver , '127.0.0.1:9005' )
2701+ ) . toBeTruthy ( )
2702+ assertHasRouters (
2703+ driver ,
2704+ [ '127.0.0.1:9001' , '127.0.0.1:9002' , '127.0.0.1:9003' ] ,
2705+ database
2706+ )
2707+ assertHasReaders (
2708+ driver ,
2709+ [ '127.0.0.1:9005' , '127.0.0.1:9006' ] ,
2710+ database
2711+ )
2712+ assertHasWriters (
2713+ driver ,
2714+ [ '127.0.0.1:9007' , '127.0.0.1:9008' ] ,
2715+ database
2716+ )
2717+
2718+ driver . close ( )
2719+ server . exit ( code => {
2720+ readServer . exit ( readCode => {
2721+ expect ( code ) . toEqual ( 0 )
2722+ expect ( readCode ) . toEqual ( 0 )
2723+ done ( )
2724+ } )
2725+ } )
2726+ } )
2727+ } )
2728+ }
2729+
2730+ function verifyDiscoverAndWrite ( script , database , done ) {
2731+ if ( ! boltStub . supported ) {
2732+ done ( )
2733+ return
2734+ }
2735+
2736+ // Given
2737+ const server = boltStub . start (
2738+ `./test/resources/boltstub/v4/acquire_endpoints_${ database ||
2739+ 'default_database' } .script`,
2740+ 9001
2741+ )
2742+ const writeServer = boltStub . start (
2743+ `./test/resources/boltstub/v4/${ script } .script` ,
2744+ 9007
2745+ )
2746+
2747+ boltStub . run ( ( ) => {
2748+ const driver = boltStub . newDriver ( 'neo4j://127.0.0.1:9001' )
2749+ // When
2750+ const session = driver . session ( { database : database } )
2751+ session . run ( "CREATE (n {name:'Bob'})" ) . then ( ( ) => {
2752+ session . close ( )
2753+ // Then
2754+ expect (
2755+ hasAddressInConnectionPool ( driver , '127.0.0.1:9001' )
2756+ ) . toBeTruthy ( )
2757+ expect (
2758+ hasAddressInConnectionPool ( driver , '127.0.0.1:9007' )
2759+ ) . toBeTruthy ( )
2760+ assertHasRouters (
2761+ driver ,
2762+ [ '127.0.0.1:9001' , '127.0.0.1:9002' , '127.0.0.1:9003' ] ,
2763+ database
2764+ )
2765+ assertHasReaders (
2766+ driver ,
2767+ [ '127.0.0.1:9005' , '127.0.0.1:9006' ] ,
2768+ database
2769+ )
2770+ assertHasWriters (
2771+ driver ,
2772+ [ '127.0.0.1:9007' , '127.0.0.1:9008' ] ,
2773+ database
2774+ )
2775+
2776+ driver . close ( )
2777+ server . exit ( code => {
2778+ writeServer . exit ( writeCode => {
2779+ expect ( code ) . toEqual ( 0 )
2780+ expect ( writeCode ) . toEqual ( 0 )
2781+ done ( )
2782+ } )
2783+ } )
2784+ } )
2785+ } )
2786+ }
2787+
2788+ it ( 'should discover servers for default database and read' , done => {
2789+ verifyDiscoverAndRead ( 'read' , '' , done )
2790+ } )
2791+
2792+ it ( 'should discover servers for aDatabase and read' , done => {
2793+ verifyDiscoverAndRead ( 'read_from_aDatabase' , 'aDatabase' , done )
2794+ } )
2795+
2796+ it ( 'should discover servers for default database and write' , done => {
2797+ verifyDiscoverAndWrite ( 'write' , '' , done )
2798+ } )
2799+
2800+ it ( 'should discover servers for aDatabase and write' , done => {
2801+ verifyDiscoverAndWrite ( 'write_to_aDatabase' , 'aDatabase' , done )
2802+ } )
2803+
2804+ it ( 'should fail discovery if database not found' , done => {
2805+ if ( ! boltStub . supported ) {
2806+ done ( )
2807+ return
2808+ }
2809+
2810+ // Given
2811+ const server = boltStub . start (
2812+ `./test/resources/boltstub/v4/acquire_endpoints_db_not_found.script` ,
2813+ 9001
2814+ )
2815+
2816+ boltStub . run ( ( ) => {
2817+ const driver = boltStub . newDriver ( 'neo4j://127.0.0.1:9001' )
2818+ // When
2819+ const session = driver . session ( { database : 'aDatabase' } )
2820+
2821+ session . run ( 'CREATE ()' ) . catch ( error => {
2822+ // Then
2823+ expect ( error . code ) . toEqual (
2824+ 'Neo.ClientError.Database.DatabaseNotFound'
2825+ )
2826+ expect ( error . message ) . toEqual ( 'database not found' )
2827+
2828+ session . close ( )
2829+ driver . close ( )
2830+ server . exit ( code => {
2831+ expect ( code ) . toEqual ( 0 )
2832+ done ( )
2833+ } )
2834+ } )
2835+ } )
2836+ } )
2837+
2838+ it ( 'should try next server for empty routing table response' , done => {
2839+ if ( ! boltStub . supported ) {
2840+ done ( )
2841+ return
2842+ }
2843+
2844+ // Given
2845+ const router1 = boltStub . start (
2846+ `./test/resources/boltstub/v4/acquire_endpoints_aDatabase_no_servers.script` ,
2847+ 9001
2848+ )
2849+ const router2 = boltStub . start (
2850+ `./test/resources/boltstub/v4/acquire_endpoints_aDatabase.script` ,
2851+ 9002
2852+ )
2853+ const reader1 = boltStub . start (
2854+ `./test/resources/boltstub/v4/read_from_aDatabase.script` ,
2855+ 9005
2856+ )
2857+
2858+ boltStub . run ( ( ) => {
2859+ const driver = boltStub . newDriver ( 'neo4j://127.0.0.1:9000' , {
2860+ resolver : address => [
2861+ 'neo4j://127.0.0.1:9001' ,
2862+ 'neo4j://127.0.0.1:9002'
2863+ ]
2864+ } )
2865+
2866+ // When
2867+ const session = driver . session ( {
2868+ database : 'aDatabase' ,
2869+ defaultAccessMode : READ
2870+ } )
2871+ session . run ( 'MATCH (n) RETURN n.name' ) . then ( result => {
2872+ expect ( result . records . map ( record => record . get ( 0 ) ) ) . toEqual ( [
2873+ 'Bob' ,
2874+ 'Alice' ,
2875+ 'Tina'
2876+ ] )
2877+
2878+ session . close ( )
2879+ driver . close ( )
2880+ router1 . exit ( code1 => {
2881+ router2 . exit ( code2 => {
2882+ reader1 . exit ( code3 => {
2883+ expect ( code1 ) . toEqual ( 0 )
2884+ expect ( code2 ) . toEqual ( 0 )
2885+ expect ( code3 ) . toEqual ( 0 )
2886+ done ( )
2887+ } )
2888+ } )
2889+ } )
2890+ } )
2891+ } )
2892+ } )
2893+ } )
2894+
26682895 function testAddressPurgeOnDatabaseError ( script , query , accessMode , done ) {
26692896 if ( ! boltStub . supported ) {
26702897 done ( )
0 commit comments