1
1
use lenient_semver:: Version ;
2
+ use neo4j_testcontainers:: Neo4j ;
2
3
use neo4rs:: { ConfigBuilder , Graph } ;
3
- use testcontainers:: { clients:: Cli , core :: WaitFor , Container , Image } ;
4
+ use testcontainers:: { clients:: Cli , Container } ;
4
5
5
- use std:: { collections :: HashMap , sync:: Arc } ;
6
+ use std:: sync:: Arc ;
6
7
7
8
pub struct Neo4jContainer {
8
9
graph : Arc < Graph > ,
@@ -19,17 +20,21 @@ impl Neo4jContainer {
19
20
pub async fn from_config ( config : ConfigBuilder ) -> Self {
20
21
let _ = pretty_env_logger:: try_init ( ) ;
21
22
22
- let ( server, version ) = Self :: server_from_env ( ) ;
23
+ let server = Self :: server_from_env ( ) ;
23
24
24
25
let ( connection, _container) = match server {
25
- TestServer :: TestContainer { auth } => {
26
- let ( uri, container) = Self :: create_testcontainer ( & auth, & version) . await ;
27
- ( TestConnection { uri, auth } , Some ( container) )
26
+ TestServer :: TestContainer => {
27
+ let ( connection, container) = Self :: create_testcontainer ( ) ;
28
+ ( connection, Some ( container) )
29
+ }
30
+ TestServer :: External ( uri) => {
31
+ let connection = Self :: create_test_endpoint ( uri) ;
32
+ ( connection, None )
28
33
}
29
- TestServer :: External { connection } => ( connection, None ) ,
30
34
} ;
31
35
32
- let graph = Self :: connect ( config, connection) . await ;
36
+ let version = connection. version ;
37
+ let graph = Self :: connect ( config, connection. uri , & connection. auth ) . await ;
33
38
Self {
34
39
graph,
35
40
version,
@@ -49,52 +54,57 @@ impl Neo4jContainer {
49
54
. 0
50
55
}
51
56
52
- fn server_from_env ( ) -> ( TestServer , String ) {
57
+ fn server_from_env ( ) -> TestServer {
58
+ const TEST_URI_VAR : & str = "NEO4J_TEST_URI" ;
59
+
60
+ if let Ok ( uri) = std:: env:: var ( TEST_URI_VAR ) {
61
+ TestServer :: External ( uri)
62
+ } else {
63
+ TestServer :: TestContainer
64
+ }
65
+ }
66
+
67
+ fn create_testcontainer ( ) -> ( TestConnection , Container < ' static , Neo4j > ) {
68
+ let docker = Cli :: default ( ) ;
69
+ let docker = Box :: leak ( Box :: new ( docker) ) ;
70
+
71
+ let container = docker. run ( Neo4j :: default ( ) ) ;
72
+
73
+ let uri = Neo4j :: uri_ipv4 ( & container) ;
74
+ let version = container. image ( ) . version ( ) . to_owned ( ) ;
75
+ let user = container. image ( ) . user ( ) . to_owned ( ) ;
76
+ let pass = container. image ( ) . pass ( ) . to_owned ( ) ;
77
+ let auth = TestAuth { user, pass } ;
78
+
79
+ let connection = TestConnection { uri, version, auth } ;
80
+
81
+ ( connection, container)
82
+ }
83
+
84
+ fn create_test_endpoint ( uri : String ) -> TestConnection {
53
85
const USER_VAR : & str = "NEO4J_TEST_USER" ;
54
86
const PASS_VAR : & str = "NEO4J_TEST_PASS" ;
55
- const TEST_URI_VAR : & str = "NEO4J_TEST_URI" ;
56
87
const VERSION_VAR : & str = "NEO4J_VERSION_TAG" ;
57
88
58
89
const DEFAULT_USER : & str = "neo4j" ;
59
90
const DEFAULT_PASS : & str = "neo" ;
60
- const DEFAULT_VERSION_TAG : & str = "4.2 " ;
91
+ const DEFAULT_VERSION_TAG : & str = "5 " ;
61
92
62
93
use std:: env:: var;
63
94
64
95
let user = var ( USER_VAR ) . unwrap_or_else ( |_| DEFAULT_USER . to_owned ( ) ) ;
65
96
let pass = var ( PASS_VAR ) . unwrap_or_else ( |_| DEFAULT_PASS . to_owned ( ) ) ;
66
97
let auth = TestAuth { user, pass } ;
67
-
68
98
let version = var ( VERSION_VAR ) . unwrap_or_else ( |_| DEFAULT_VERSION_TAG . to_owned ( ) ) ;
69
99
70
- if let Ok ( uri) = var ( TEST_URI_VAR ) {
71
- let config = TestConnection { uri, auth } ;
72
- ( TestServer :: External { connection : config } , version)
73
- } else {
74
- ( TestServer :: TestContainer { auth } , version)
75
- }
100
+ TestConnection { uri, auth, version }
76
101
}
77
102
78
- async fn create_testcontainer (
79
- auth : & TestAuth ,
80
- version : & str ,
81
- ) -> ( String , Container < ' static , Neo4j > ) {
82
- let docker = Cli :: default ( ) ;
83
- let docker = Box :: leak ( Box :: new ( docker) ) ;
84
-
85
- let container = docker. run ( Neo4j :: new ( & auth. user , & auth. pass , version. to_owned ( ) ) ) ;
86
-
87
- let bolt_port = container. ports ( ) . map_to_host_port_ipv4 ( 7687 ) . unwrap ( ) ;
88
- let uri = format ! ( "bolt://127.0.0.1:{}" , bolt_port) ;
89
-
90
- ( uri, container)
91
- }
92
-
93
- async fn connect ( config : ConfigBuilder , info : TestConnection ) -> Arc < Graph > {
103
+ async fn connect ( config : ConfigBuilder , uri : String , auth : & TestAuth ) -> Arc < Graph > {
94
104
let config = config
95
- . uri ( & info . uri )
96
- . user ( & info . auth . user )
97
- . password ( & info . auth . pass )
105
+ . uri ( uri)
106
+ . user ( & auth. user )
107
+ . password ( & auth. pass )
98
108
. build ( )
99
109
. unwrap ( ) ;
100
110
@@ -111,52 +121,11 @@ struct TestAuth {
111
121
112
122
struct TestConnection {
113
123
uri : String ,
124
+ version : String ,
114
125
auth : TestAuth ,
115
126
}
116
127
117
128
enum TestServer {
118
- TestContainer { auth : TestAuth } ,
119
- External { connection : TestConnection } ,
120
- }
121
-
122
- #[ derive( Debug ) ]
123
- struct Neo4j {
124
- version : String ,
125
- env_vars : HashMap < String , String > ,
126
- }
127
-
128
- impl Neo4j {
129
- fn new ( user : & str , pass : & str , version : String ) -> Self {
130
- let mut env_vars = HashMap :: new ( ) ;
131
- env_vars. insert ( "NEO4J_AUTH" . to_owned ( ) , format ! ( "{user}/{pass}" ) ) ;
132
- env_vars. insert (
133
- "NEO4J_dbms_security_auth__minimum__password__length" . to_owned ( ) ,
134
- "3" . to_owned ( ) ,
135
- ) ;
136
-
137
- Self { env_vars, version }
138
- }
139
- }
140
-
141
- impl Image for Neo4j {
142
- type Args = ( ) ;
143
-
144
- fn name ( & self ) -> String {
145
- "neo4j" . to_owned ( )
146
- }
147
-
148
- fn tag ( & self ) -> String {
149
- self . version . clone ( )
150
- }
151
-
152
- fn ready_conditions ( & self ) -> Vec < WaitFor > {
153
- vec ! [
154
- WaitFor :: message_on_stdout( "Bolt enabled on" ) ,
155
- WaitFor :: message_on_stdout( "Started." ) ,
156
- ]
157
- }
158
-
159
- fn env_vars ( & self ) -> Box < dyn Iterator < Item = ( & String , & String ) > + ' _ > {
160
- Box :: new ( self . env_vars . iter ( ) )
161
- }
129
+ TestContainer ,
130
+ External ( String ) ,
162
131
}
0 commit comments