1+ // Copyright 2025 Google LLC
2+ //
3+ // Licensed under the Apache License, Version 2.0 (the "License");
4+ // you may not use this file except in compliance with the License.
5+ // You may obtain a copy of the License at
6+ //
7+ // https://www.apache.org/licenses/LICENSE-2.0
8+ //
9+ // Unless required by applicable law or agreed to in writing, software
10+ // distributed under the License is distributed on an "AS IS" BASIS,
11+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ // See the License for the specific language governing permissions and
13+ // limitations under the License.
14+
15+ using System . Data ;
16+
17+ namespace Google . Cloud . Spanner . DataProvider . Tests ;
18+
19+ public class ConnectionStringBuilderTests
20+ {
21+ [ Test ]
22+ public void Basic ( )
23+ {
24+ var builder = new SpannerConnectionStringBuilder ( ) ;
25+ Assert . That ( builder . Keys , Is . Empty ) ;
26+ Assert . That ( builder . Count , Is . EqualTo ( 0 ) ) ;
27+ Assert . False ( builder . ContainsKey ( "host" ) ) ;
28+ builder . Host = "myhost" ;
29+ Assert . That ( builder [ "host" ] , Is . EqualTo ( "myhost" ) ) ;
30+ Assert . That ( builder . Count , Is . EqualTo ( 1 ) ) ;
31+ Assert . That ( builder . ConnectionString , Is . EqualTo ( "Host=myhost" ) ) ;
32+ builder . Remove ( "HOST" ) ;
33+ Assert . That ( builder [ "host" ] , Is . EqualTo ( "" ) ) ;
34+ Assert . That ( builder . Count , Is . EqualTo ( 0 ) ) ;
35+ }
36+
37+ [ Test ]
38+ public void TryGetValue ( )
39+ {
40+ var builder = new SpannerConnectionStringBuilder
41+ {
42+ ConnectionString = "Host=myhost"
43+ } ;
44+ Assert . That ( builder . TryGetValue ( "Host" , out var value ) , Is . True ) ;
45+ Assert . That ( value , Is . EqualTo ( "myhost" ) ) ;
46+ Assert . That ( builder . TryGetValue ( "SomethingUnknown" , out value ) , Is . False ) ;
47+ }
48+
49+ [ Test ]
50+ public void Remove ( )
51+ {
52+ var builder = new SpannerConnectionStringBuilder
53+ {
54+ UsePlainText = true
55+ } ;
56+ Assert . That ( builder [ "Use plain text" ] , Is . True ) ;
57+ builder . Remove ( "UsePlainText" ) ;
58+ Assert . That ( builder . ConnectionString , Is . EqualTo ( "" ) ) ;
59+ }
60+
61+ [ Test ]
62+ public void Clear ( )
63+ {
64+ var builder = new SpannerConnectionStringBuilder { Host = "myhost" } ;
65+ builder . Clear ( ) ;
66+ Assert . That ( builder . Count , Is . EqualTo ( 0 ) ) ;
67+ Assert . That ( builder [ "host" ] , Is . EqualTo ( "" ) ) ;
68+ Assert . That ( builder . Host , Is . Empty ) ;
69+ }
70+
71+ [ Test ]
72+ public void RemovingResetsToDefault ( )
73+ {
74+ var builder = new SpannerConnectionStringBuilder ( ) ;
75+ Assert . That ( builder . Port , Is . EqualTo ( SpannerConnectionStringOption . Port . DefaultValue ) ) ;
76+ builder . Port = 8 ;
77+ builder . Remove ( "Port" ) ;
78+ Assert . That ( builder . Port , Is . EqualTo ( SpannerConnectionStringOption . Port . DefaultValue ) ) ;
79+ }
80+
81+ [ Test ]
82+ public void SettingToNullResetsToDefault ( )
83+ {
84+ var builder = new SpannerConnectionStringBuilder ( ) ;
85+ Assert . That ( builder . Port , Is . EqualTo ( SpannerConnectionStringOption . Port . DefaultValue ) ) ;
86+ builder . Port = 8 ;
87+ builder [ "Port" ] = null ;
88+ Assert . That ( builder . Port , Is . EqualTo ( SpannerConnectionStringOption . Port . DefaultValue ) ) ;
89+ }
90+
91+ [ Test ]
92+ public void Enum ( )
93+ {
94+ var builder = new SpannerConnectionStringBuilder
95+ {
96+ ConnectionString = "DefaultIsolationLevel=Serializable"
97+ } ;
98+ Assert . That ( builder . DefaultIsolationLevel , Is . EqualTo ( IsolationLevel . Serializable ) ) ;
99+ Assert . That ( builder . Count , Is . EqualTo ( 1 ) ) ;
100+ }
101+
102+ [ Test ]
103+ public void EnumCaseInsensitive ( )
104+ {
105+ var builder = new SpannerConnectionStringBuilder
106+ {
107+ ConnectionString = "defaultisolationlevel=repeatable read"
108+ } ;
109+ Assert . That ( builder . DefaultIsolationLevel , Is . EqualTo ( IsolationLevel . RepeatableRead ) ) ;
110+ Assert . That ( builder . Count , Is . EqualTo ( 1 ) ) ;
111+ }
112+
113+ [ Test ]
114+ public void Clone ( )
115+ {
116+ var builder = new SpannerConnectionStringBuilder
117+ {
118+ Host = "myhost"
119+ } ;
120+ var builder2 = builder . Clone ( ) ;
121+ Assert . That ( builder2 . Host , Is . EqualTo ( "myhost" ) ) ;
122+ Assert . That ( builder2 [ "Host" ] , Is . EqualTo ( "myhost" ) ) ;
123+ Assert . That ( builder . Port , Is . EqualTo ( SpannerConnectionStringOption . Port . DefaultValue ) ) ;
124+ }
125+
126+ [ Test ]
127+ public void ConversionErrorThrows ( )
128+ {
129+ // ReSharper disable once CollectionNeverQueried.Local
130+ var builder = new SpannerConnectionStringBuilder ( ) ;
131+ Assert . That ( ( ) => builder [ "Port" ] = "hello" ,
132+ Throws . Exception . TypeOf < ArgumentException > ( ) . With . Message . Contains ( "Port" ) ) ;
133+ }
134+
135+ [ Test ]
136+ public void InvalidConnectionStringThrows ( )
137+ {
138+ var builder = new SpannerConnectionStringBuilder ( ) ;
139+ Assert . That ( ( ) => builder . ConnectionString = "Server=127.0.0.1;User Id=npgsql_tests;Pooling:false" ,
140+ Throws . Exception . TypeOf < ArgumentException > ( ) ) ;
141+ }
142+
143+ [ Test ]
144+ public void ConnectionStringToProperties ( )
145+ {
146+ var builder = new SpannerConnectionStringBuilder
147+ {
148+ ConnectionString = "Host=localhost;Port=80;UsePlainText=true;DefaultIsolationLevel=Repeatable read" ,
149+ } ;
150+ Assert . That ( builder . Host , Is . EqualTo ( "localhost" ) ) ;
151+ Assert . That ( builder . Port , Is . EqualTo ( 80 ) ) ;
152+ Assert . That ( builder . UsePlainText , Is . True ) ;
153+ Assert . That ( builder . DefaultIsolationLevel , Is . EqualTo ( IsolationLevel . RepeatableRead ) ) ;
154+ }
155+
156+ [ Test ]
157+ public void PropertiesToConnectionString ( )
158+ {
159+ var builder = new SpannerConnectionStringBuilder
160+ {
161+ Host = "localhost" ,
162+ Port = 80 ,
163+ UsePlainText = true ,
164+ DefaultIsolationLevel = IsolationLevel . RepeatableRead ,
165+ DataSource = "projects/project1/instances/instance1/databases/database1"
166+ } ;
167+ Assert . That ( builder . ConnectionString , Is . EqualTo ( "Data Source=projects/project1/instances/instance1/databases/database1;Host=localhost;Port=80;UsePlainText=True;DefaultIsolationLevel=RepeatableRead" ) ) ;
168+ Assert . That ( builder . SpannerLibConnectionString , Is . EqualTo ( "localhost:80/projects/project1/instances/instance1/databases/database1;UsePlainText=True;DefaultIsolationLevel=RepeatableRead" ) ) ;
169+ }
170+
171+ }
0 commit comments