@@ -22,23 +22,166 @@ public void Constructor(string connectionString, string expectedMasterConnection
2222 server . Master . Server . Should ( ) . BeSameAs ( server ) ;
2323 }
2424
25- [ Fact ]
26- public async Task CreateAndDeleteAsync ( )
25+ [ Theory ]
26+ [ InlineData ( false ) ]
27+ [ InlineData ( true ) ]
28+ public async Task CreateAndDelete ( bool withCreationSettings )
2729 {
2830 var server = new SqlServer ( ConnectionString ) ;
2931
30- var database = await server . CreateEmptyDatabaseAsync ( "CreateAndDeleteDB" , CancellationToken . None ) ;
32+ SqlDatabaseCreationSettings settings = null ;
33+
34+ if ( withCreationSettings )
35+ {
36+ settings = new SqlDatabaseCreationSettings ( ) ;
37+ }
38+
39+ var database = server . CreateEmptyDatabase ( "CreateAndDeleteDB" , settings ) ;
3140
3241 database . ConnectionString . Should ( ) . Be ( "Data Source=(localDB)\\ posinfo-tests;Initial Catalog=CreateAndDeleteDB;Integrated Security=True" ) ;
3342
3443 var table = await server . Master . ExecuteQueryAsync ( "SELECT * FROM [sys].[databases] WHERE [name] = 'CreateAndDeleteDB'" ) ;
3544 table . Rows . Should ( ) . HaveCount ( 1 ) ;
3645
3746 // Delete the database
38- await server . DeleteDatabaseAsync ( "CreateAndDeleteDB" , CancellationToken . None ) ;
47+ server . DeleteDatabase ( "CreateAndDeleteDB" ) ;
3948
4049 table = await server . Master . ExecuteQueryAsync ( "SELECT * FROM [sys].[databases] WHERE [name] = 'CreateAndDeleteDB'" ) ;
4150 table . Rows . Should ( ) . BeEmpty ( ) ;
4251 }
52+
53+ [ Fact ]
54+ public async Task CreateAndDelete_WithSpecificName ( )
55+ {
56+ using var temporaryFolder = TemporaryFolder . Create ( ) ;
57+
58+ var server = new SqlServer ( ConnectionString ) ;
59+
60+ var settings = new SqlDatabaseCreationSettings ( )
61+ {
62+ DataFileName = Path . Combine ( temporaryFolder . Path , "TheSpecificName.mdf" ) ,
63+ } ;
64+
65+ var database = server . CreateEmptyDatabase ( "CreateAndDeleteDB_WithSpecificName" , settings ) ;
66+
67+ database . ConnectionString . Should ( ) . Be ( "Data Source=(localDB)\\ posinfo-tests;Initial Catalog=CreateAndDeleteDB_WithSpecificName;Integrated Security=True" ) ;
68+
69+ var table = await server . Master . ExecuteQueryAsync ( "SELECT * FROM [sys].[databases] WHERE [name] = 'CreateAndDeleteDB_WithSpecificName'" ) ;
70+ table . Rows . Should ( ) . HaveCount ( 1 ) ;
71+
72+ // Check the location of the database
73+ File . Exists ( Path . Combine ( temporaryFolder . Path , "TheSpecificName.mdf" ) ) . Should ( ) . BeTrue ( ) ;
74+ File . Exists ( Path . Combine ( temporaryFolder . Path , "TheSpecificName_log.ldf" ) ) . Should ( ) . BeTrue ( ) ;
75+
76+ var result = database . ExecuteQuery ( "SELECT * FROM [sys].[database_files] ORDER BY [physical_name]" ) ;
77+
78+ result . Rows . Should ( ) . HaveCount ( 2 ) ;
79+
80+ result . Rows [ 0 ] [ "name" ] . Should ( ) . Be ( "CreateAndDeleteDB_WithSpecificName" ) ;
81+ result . Rows [ 0 ] [ "physical_name" ] . Should ( ) . Be ( Path . Combine ( temporaryFolder . Path , "TheSpecificName.mdf" ) ) ;
82+ result . Rows [ 0 ] [ "type_desc" ] . Should ( ) . Be ( "ROWS" ) ;
83+
84+ result . Rows [ 1 ] [ "name" ] . Should ( ) . Be ( "TheSpecificName_log" ) ;
85+ result . Rows [ 1 ] [ "physical_name" ] . Should ( ) . Be ( Path . Combine ( temporaryFolder . Path , "TheSpecificName_log.ldf" ) ) ;
86+ result . Rows [ 1 ] [ "type_desc" ] . Should ( ) . Be ( "LOG" ) ;
87+
88+ // Delete the database
89+ server . DeleteDatabase ( "CreateAndDeleteDB_WithSpecificName" ) ;
90+
91+ table = await server . Master . ExecuteQueryAsync ( "SELECT * FROM [sys].[databases] WHERE [name] = 'CreateAndDeleteDB_WithSpecificName'" ) ;
92+ table . Rows . Should ( ) . BeEmpty ( ) ;
93+ }
94+
95+ [ Fact ]
96+ public async Task CreateAndDeleteAsync ( )
97+ {
98+ var server = new SqlServer ( ConnectionString ) ;
99+
100+ var database = await server . CreateEmptyDatabaseAsync ( "CreateAndDeleteDBAsync" , new SqlDatabaseCreationSettings ( ) , CancellationToken . None ) ;
101+
102+ database . ConnectionString . Should ( ) . Be ( "Data Source=(localDB)\\ posinfo-tests;Initial Catalog=CreateAndDeleteDBAsync;Integrated Security=True" ) ;
103+
104+ var table = await server . Master . ExecuteQueryAsync ( "SELECT * FROM [sys].[databases] WHERE [name] = 'CreateAndDeleteDBAsync'" ) ;
105+ table . Rows . Should ( ) . HaveCount ( 1 ) ;
106+
107+ // Delete the database
108+ await server . DeleteDatabaseAsync ( "CreateAndDeleteDBAsync" , CancellationToken . None ) ;
109+
110+ table = await server . Master . ExecuteQueryAsync ( "SELECT * FROM [sys].[databases] WHERE [name] = 'CreateAndDeleteDBAsync'" ) ;
111+ table . Rows . Should ( ) . BeEmpty ( ) ;
112+ }
113+
114+ [ Fact ]
115+ public async Task CreateAndDeleteAsync_WithSpecificName ( )
116+ {
117+ using var temporaryFolder = TemporaryFolder . Create ( ) ;
118+
119+ var server = new SqlServer ( ConnectionString ) ;
120+
121+ var settings = new SqlDatabaseCreationSettings ( )
122+ {
123+ DataFileName = Path . Combine ( temporaryFolder . Path , "TheSpecificNameAsync.mdf" ) ,
124+ } ;
125+
126+ var database = await server . CreateEmptyDatabaseAsync ( "CreateAndDeleteDB_WithSpecificNameAsync" , settings ) ;
127+
128+ database . ConnectionString . Should ( ) . Be ( "Data Source=(localDB)\\ posinfo-tests;Initial Catalog=CreateAndDeleteDB_WithSpecificNameAsync;Integrated Security=True" ) ;
129+
130+ var table = await server . Master . ExecuteQueryAsync ( "SELECT * FROM [sys].[databases] WHERE [name] = 'CreateAndDeleteDB_WithSpecificNameAsync'" ) ;
131+ table . Rows . Should ( ) . HaveCount ( 1 ) ;
132+
133+ // Check the location of the database
134+ File . Exists ( Path . Combine ( temporaryFolder . Path , "TheSpecificNameAsync.mdf" ) ) . Should ( ) . BeTrue ( ) ;
135+ File . Exists ( Path . Combine ( temporaryFolder . Path , "TheSpecificNameAsync_log.ldf" ) ) . Should ( ) . BeTrue ( ) ;
136+
137+ var result = database . ExecuteQuery ( "SELECT * FROM [sys].[database_files] ORDER BY [physical_name]" ) ;
138+
139+ result . Rows . Should ( ) . HaveCount ( 2 ) ;
140+
141+ result . Rows [ 0 ] [ "name" ] . Should ( ) . Be ( "CreateAndDeleteDB_WithSpecificNameAsync" ) ;
142+ result . Rows [ 0 ] [ "physical_name" ] . Should ( ) . Be ( Path . Combine ( temporaryFolder . Path , "TheSpecificNameAsync.mdf" ) ) ;
143+ result . Rows [ 0 ] [ "type_desc" ] . Should ( ) . Be ( "ROWS" ) ;
144+
145+ result . Rows [ 1 ] [ "name" ] . Should ( ) . Be ( "TheSpecificNameAsync_log" ) ;
146+ result . Rows [ 1 ] [ "physical_name" ] . Should ( ) . Be ( Path . Combine ( temporaryFolder . Path , "TheSpecificNameAsync_log.ldf" ) ) ;
147+ result . Rows [ 1 ] [ "type_desc" ] . Should ( ) . Be ( "LOG" ) ;
148+
149+ // Delete the database
150+ await server . DeleteDatabaseAsync ( "CreateAndDeleteDB_WithSpecificNameAsync" ) ;
151+
152+ table = await server . Master . ExecuteQueryAsync ( "SELECT * FROM [sys].[databases] WHERE [name] = 'CreateAndDeleteDB_WithSpecificNameAsync'" ) ;
153+ table . Rows . Should ( ) . BeEmpty ( ) ;
154+ }
155+
156+ private sealed class TemporaryFolder : IDisposable
157+ {
158+ private TemporaryFolder ( string path )
159+ {
160+ this . Path = path ;
161+ }
162+
163+ public string Path { get ; }
164+
165+ public static TemporaryFolder Create ( )
166+ {
167+ var temporaryFolder = System . IO . Path . Combine ( System . IO . Path . GetTempPath ( ) , "PosInformatique.Testing.Databases.SqlServer.Tests" , Guid . NewGuid ( ) . ToString ( ) ) ;
168+
169+ Directory . CreateDirectory ( temporaryFolder ) ;
170+
171+ return new TemporaryFolder ( temporaryFolder ) ;
172+ }
173+
174+ public void Dispose ( )
175+ {
176+ try
177+ {
178+ Directory . Delete ( this . Path , true ) ;
179+ }
180+ catch ( IOException )
181+ {
182+ // Ignore the errors.
183+ }
184+ }
185+ }
43186 }
44187}
0 commit comments