Skip to content

Commit 616eb95

Browse files
Update the SqlServerDacDatabaseInitializer to add the support of additional settings to specify the locations of the database.
1 parent 6dd1083 commit 616eb95

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed

src/Testing.Databases.SqlServer.Dac/SqlServerDacDatabaseInitializer.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ namespace PosInformatique.Testing.Databases.SqlServer
1010

1111
/// <summary>
1212
/// Initializer used to initialize the database for the tests.
13-
/// Call the <see cref="Initialize(SqlServerDatabaseInitializer, string, string)"/> method to initialize a database from
13+
/// Call the <see cref="Initialize(SqlServerDatabaseInitializer, string, string, SqlServerDacDeploymentSettings?)"/> method to initialize a database from
1414
/// a DACPAC file.
1515
/// </summary>
16-
/// <remarks>The database will be created the call of the <see cref="Initialize(SqlServerDatabaseInitializer, string, string)"/> method. For the next calls
16+
/// <remarks>The database will be created the call of the <see cref="Initialize(SqlServerDatabaseInitializer, string, string, SqlServerDacDeploymentSettings?)"/> method. For the next calls
1717
/// the database is preserved but all the data are deleted.</remarks>
1818
public static class SqlServerDacDatabaseInitializer
1919
{
@@ -23,8 +23,9 @@ public static class SqlServerDacDatabaseInitializer
2323
/// <param name="initializer"><see cref="SqlServerDatabaseInitializer"/> which the initialization will be perform on.</param>
2424
/// <param name="packageName">Full path of the DACPAC file.</param>
2525
/// <param name="connectionString">Connection string to the SQL Server with administrator rights.</param>
26+
/// <param name="settings">Additionnal settings for the DACPAC <paramref name="packageName"/> to deploy.</param>
2627
/// <returns>An instance of the <see cref="SqlServerDatabase"/> which allows to perform query to initialize the data.</returns>
27-
public static SqlServerDatabase Initialize(this SqlServerDatabaseInitializer initializer, string packageName, string connectionString)
28+
public static SqlServerDatabase Initialize(this SqlServerDatabaseInitializer initializer, string packageName, string connectionString, SqlServerDacDeploymentSettings? settings = null)
2829
{
2930
var connectionStringBuilder = new SqlConnectionStringBuilder(connectionString);
3031

@@ -34,7 +35,7 @@ public static SqlServerDatabase Initialize(this SqlServerDatabaseInitializer ini
3435

3536
if (!initializer.IsInitialized)
3637
{
37-
database = server.DeployDacPackage(packageName, connectionStringBuilder.InitialCatalog);
38+
database = server.DeployDacPackage(packageName, connectionStringBuilder.InitialCatalog, settings);
3839

3940
initializer.IsInitialized = true;
4041
}

tests/Testing.Databases.SqlServer.Dac.Tests/SqlServerDacExtensionsTest.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ public void DeployDacPackage(bool withSettings)
4040
}
4141

4242
[Fact]
43-
public void DeployDacPackage_WithSpecificFile()
43+
public void DeployDacPackage_WithSpecificDataFileName()
4444
{
4545
// Create existing database to be sure the database is recreated when deploying the database with a DACPAC
46-
CreateDatabase("SqlServerDacExtensionsTest_DeployDacPackage_WithSpecificFile");
46+
CreateDatabase("SqlServerDacExtensionsTest_DeployDacPackage_WithSpecificDataFileName");
4747

4848
using var temporaryFolder = TemporaryFolder.Create();
4949

@@ -54,7 +54,7 @@ public void DeployDacPackage_WithSpecificFile()
5454
DataFileName = Path.Combine(temporaryFolder.Path, "TheSpecificDataFileName.mdf"),
5555
};
5656

57-
var database = server.DeployDacPackage("Testing.Databases.SqlServer.Tests.DacPac.dacpac", "SqlServerDacExtensionsTest_DeployDacPackage_WithSpecificFile", settings);
57+
var database = server.DeployDacPackage("Testing.Databases.SqlServer.Tests.DacPac.dacpac", "SqlServerDacExtensionsTest_DeployDacPackage_WithSpecificDataFileName", settings);
5858

5959
var table = database.ExecuteQuery("SELECT * FROM MyTable");
6060

@@ -72,7 +72,7 @@ public void DeployDacPackage_WithSpecificFile()
7272

7373
result.Rows.Should().HaveCount(2);
7474

75-
result.Rows[0]["name"].Should().Be("SqlServerDacExtensionsTest_DeployDacPackage_WithSpecificFile");
75+
result.Rows[0]["name"].Should().Be("SqlServerDacExtensionsTest_DeployDacPackage_WithSpecificDataFileName");
7676
result.Rows[0]["physical_name"].Should().Be(Path.Combine(temporaryFolder.Path, "TheSpecificDataFileName.mdf"));
7777
result.Rows[0]["type_desc"].Should().Be("ROWS");
7878

@@ -81,7 +81,7 @@ public void DeployDacPackage_WithSpecificFile()
8181
result.Rows[1]["type_desc"].Should().Be("LOG");
8282

8383
// Delete the database (for deleting the temporary folder).
84-
server.DeleteDatabase("SqlServerDacExtensionsTest_DeployDacPackage_WithSpecificFile");
84+
server.DeleteDatabase("SqlServerDacExtensionsTest_DeployDacPackage_WithSpecificDataFileName");
8585
}
8686

8787
private static void CreateDatabase(string name)

tests/Testing.Databases.SqlServer.Dac.Tests/SqlServerDatabaseInitializerTest.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ public class SqlServerDatabaseInitializerTest : IClassFixture<SqlServerDatabaseI
1313

1414
private readonly SqlServerDatabase database;
1515

16+
private readonly SqlServerDatabaseInitializer initializer;
17+
1618
public SqlServerDatabaseInitializerTest(SqlServerDatabaseInitializer initializer)
1719
{
20+
this.initializer = initializer;
1821
this.database = initializer.Initialize("Testing.Databases.SqlServer.Tests.DacPac.dacpac", ConnectionString);
1922

2023
var table = this.database.ExecuteQuery("SELECT * FROM MyTable");
@@ -29,6 +32,8 @@ public SqlServerDatabaseInitializerTest(SqlServerDatabaseInitializer initializer
2932
[Fact]
3033
public void Test1()
3134
{
35+
this.initializer.IsInitialized.Should().BeTrue();
36+
3237
var currentUser = this.database.ExecuteQuery("SELECT SUSER_NAME()");
3338
currentUser.Rows[0][0].Should().Be($"{Environment.UserDomainName}\\{Environment.UserName}");
3439

@@ -50,6 +55,8 @@ public void Test1()
5055
[Fact]
5156
public void Test2()
5257
{
58+
this.initializer.IsInitialized.Should().BeTrue();
59+
5360
var currentUser = this.database.ExecuteQuery("SELECT SUSER_NAME()");
5461
currentUser.Rows[0][0].Should().Be($"{Environment.UserDomainName}\\{Environment.UserName}");
5562

@@ -71,6 +78,8 @@ public void Test2()
7178
[Fact]
7279
public async Task Test1Async()
7380
{
81+
this.initializer.IsInitialized.Should().BeTrue();
82+
7483
var currentUser = await this.database.ExecuteQueryAsync("SELECT SUSER_NAME()");
7584
currentUser.Rows[0][0].Should().Be($"{Environment.UserDomainName}\\{Environment.UserName}");
7685

@@ -92,6 +101,8 @@ public async Task Test1Async()
92101
[Fact]
93102
public async Task Test2Async()
94103
{
104+
this.initializer.IsInitialized.Should().BeTrue();
105+
95106
var currentUser = await this.database.ExecuteQueryAsync("SELECT SUSER_NAME()");
96107
currentUser.Rows[0][0].Should().Be($"{Environment.UserDomainName}\\{Environment.UserName}");
97108

@@ -109,5 +120,61 @@ public async Task Test2Async()
109120
// Insert a row which should not be use in other tests.
110121
await this.database.InsertIntoAsync("MyTable", new { Id = 99, Name = "Should not be here for the next test" });
111122
}
123+
124+
[Fact]
125+
public void Initialize_WithSpecificDataFileName()
126+
{
127+
this.initializer.IsInitialized.Should().BeTrue();
128+
129+
// Create existing database to be sure the database is recreated when deploying the database with a DACPAC
130+
CreateDatabase("SqlServerDatabaseInitializerTest_Initialize_WithSpecificDataFileName");
131+
132+
using var temporaryFolder = TemporaryFolder.Create();
133+
134+
var server = new SqlServer(ConnectionString);
135+
136+
var settings = new SqlServerDacDeploymentSettings()
137+
{
138+
DataFileName = Path.Combine(temporaryFolder.Path, "TheSpecificDataFileName.mdf"),
139+
};
140+
141+
var database = server.DeployDacPackage("Testing.Databases.SqlServer.Tests.DacPac.dacpac", "SqlServerDatabaseInitializerTest_Initialize_WithSpecificDataFileName", settings);
142+
143+
var table = database.ExecuteQuery("SELECT * FROM MyTable");
144+
145+
table.Rows.Should().BeEmpty();
146+
147+
// Insert data to check the connection.
148+
database.InsertInto("MyTable", new { Id = 1, Name = "Name 1" });
149+
database.InsertInto("MyTable", new { Id = 2, Name = "Name 2" });
150+
151+
// Check the location of the database
152+
File.Exists(Path.Combine(temporaryFolder.Path, "TheSpecificDataFileName.mdf")).Should().BeTrue();
153+
File.Exists(Path.Combine(temporaryFolder.Path, "TheSpecificDataFileName_log.ldf")).Should().BeTrue();
154+
155+
var result = database.ExecuteQuery("SELECT * FROM [sys].[database_files] ORDER BY [physical_name]");
156+
157+
result.Rows.Should().HaveCount(2);
158+
159+
result.Rows[0]["name"].Should().Be("SqlServerDatabaseInitializerTest_Initialize_WithSpecificDataFileName");
160+
result.Rows[0]["physical_name"].Should().Be(Path.Combine(temporaryFolder.Path, "TheSpecificDataFileName.mdf"));
161+
result.Rows[0]["type_desc"].Should().Be("ROWS");
162+
163+
result.Rows[1]["name"].Should().Be("TheSpecificDataFileName_log");
164+
result.Rows[1]["physical_name"].Should().Be(Path.Combine(temporaryFolder.Path, "TheSpecificDataFileName_log.ldf"));
165+
result.Rows[1]["type_desc"].Should().Be("LOG");
166+
167+
// Delete the database (for deleting the temporary folder).
168+
server.DeleteDatabase("SqlServerDatabaseInitializerTest_Initialize_WithSpecificDataFileName");
169+
}
170+
171+
private static void CreateDatabase(string name)
172+
{
173+
var server = new SqlServer(ConnectionString);
174+
175+
var database = server.CreateEmptyDatabase(name);
176+
177+
database.ExecuteNonQuery("CREATE TABLE OtherTable (Id INT)");
178+
}
112179
}
113180
}

0 commit comments

Comments
 (0)