v10: Use ForceCreateDatabase during unattended install and extend GetUmbracoConnectionString extension methods (#12397)
* Add extension methods to get the Umbraco connection string/provider name from configuration
* Added tests for configuration extension methods.
* Fix issue with InstallMissingDatabase and ForceCreateDatabase
* Fix comments
* Revert casing change in GenerateConnectionString
* Re-add AddOptions (without config binding) to fix test
* Update src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs
Co-authored-by: Ronald Barendse <ronald@barend.se>
* Update src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs
* Update src/Umbraco.Infrastructure/Runtime/RuntimeState.cs
* Whitespace and documentation updates
* Add DatabaseProviderMetadataExtensions
* Filter before ordering
* Replace DataDirectory placeholder when setting connection string
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
(cherry picked from commit 8e6e262c7f)
This commit is contained in:
committed by
Bjarke Berg
parent
e90bf26577
commit
7087c3d9f6
@@ -1,36 +0,0 @@
|
||||
// Copyright (c) Umbraco.
|
||||
// See LICENSE for more details.
|
||||
|
||||
using System;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Cms.Core.Configuration;
|
||||
using Umbraco.Cms.Core.Configuration.Models;
|
||||
using Umbraco.Cms.Tests.UnitTests.AutoFixture;
|
||||
using Constants = Umbraco.Cms.Core.Constants;
|
||||
|
||||
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Configuration.Models
|
||||
{
|
||||
[TestFixture]
|
||||
public class ConnectionStringsTests
|
||||
{
|
||||
[Test]
|
||||
public void ProviderName_WhenNotExplicitlySet_HasDefaultSet()
|
||||
{
|
||||
var sut = new ConnectionStrings();
|
||||
Assert.That(sut.ProviderName, Is.EqualTo(ConnectionStrings.DefaultProviderName));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[AutoMoqData]
|
||||
public void ConnectionString_WhenSetterCalled_ReplacesDataDirectoryPlaceholder(string aDataDirectory)
|
||||
{
|
||||
AppDomain.CurrentDomain.SetData("DataDirectory", aDataDirectory);
|
||||
|
||||
var sut = new ConnectionStrings
|
||||
{
|
||||
ConnectionString = $"{ConnectionStrings.DataDirectoryPlaceholder}/foo"
|
||||
};
|
||||
Assert.That(sut.ConnectionString, Contains.Substring($"{aDataDirectory}/foo"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ using Umbraco.Cms.Core.Configuration;
|
||||
using Umbraco.Cms.Core.Configuration.Models;
|
||||
using Umbraco.Cms.Tests.UnitTests.AutoFixture;
|
||||
|
||||
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Configuration;
|
||||
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Configuration;
|
||||
|
||||
[TestFixture]
|
||||
public class ConfigureConnectionStringsTests
|
||||
@@ -27,7 +27,7 @@ public class ConfigureConnectionStringsTests
|
||||
var configuration = configurationBuilder.Build();
|
||||
|
||||
var services = new ServiceCollection();
|
||||
services.AddOptions<ConnectionStrings>().Bind(configuration.GetSection("ConnectionStrings"));
|
||||
services.AddOptions();
|
||||
services.AddSingleton<IConfigureOptions<ConnectionStrings>, ConfigureConnectionStrings>();
|
||||
services.AddSingleton<IConfiguration>(configuration);
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
// Copyright (c) Umbraco.
|
||||
// See LICENSE for more details.
|
||||
|
||||
using System;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Cms.Core;
|
||||
using Umbraco.Cms.Core.Configuration.Models;
|
||||
using Umbraco.Extensions;
|
||||
|
||||
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Extensions
|
||||
{
|
||||
[TestFixture]
|
||||
public class ConfigurationExtensionsTests
|
||||
{
|
||||
private const string DataDirectory = @"C:\Data";
|
||||
|
||||
[Test]
|
||||
public void CanParseSqlServerConnectionString()
|
||||
{
|
||||
const string ConfiguredConnectionString = @"Server=.\SQLEXPRESS;Database=UmbracoCms;Integrated Security=true";
|
||||
|
||||
Mock<IConfiguration> mockedConfig = CreateConfig(ConfiguredConnectionString);
|
||||
|
||||
string connectionString = mockedConfig.Object.GetUmbracoConnectionString(out string providerName);
|
||||
|
||||
AssertResults(
|
||||
ConfiguredConnectionString,
|
||||
"Microsoft.Data.SqlClient",
|
||||
connectionString,
|
||||
providerName);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CanParseLocalDbConnectionString()
|
||||
{
|
||||
const string ConfiguredConnectionString = @"Server=(LocalDb)\MyInstance;Integrated Security=true;";
|
||||
|
||||
Mock<IConfiguration> mockedConfig = CreateConfig(ConfiguredConnectionString);
|
||||
|
||||
string connectionString = mockedConfig.Object.GetUmbracoConnectionString(out string providerName);
|
||||
|
||||
AssertResults(
|
||||
ConfiguredConnectionString,
|
||||
"Microsoft.Data.SqlClient",
|
||||
connectionString,
|
||||
providerName);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CanParseLocalDbConnectionStringWithDataDirectory()
|
||||
{
|
||||
const string ConfiguredConnectionString = @"Data Source=(LocalDb)\MyInstance;Initial Catalog=UmbracoDb;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\Umbraco.mdf";
|
||||
|
||||
Mock<IConfiguration> mockedConfig = CreateConfig(ConfiguredConnectionString);
|
||||
SetDataDirectory();
|
||||
|
||||
string connectionString = mockedConfig.Object.GetUmbracoConnectionString(out string providerName);
|
||||
|
||||
AssertResults(
|
||||
@"Data Source=(LocalDb)\MyInstance;Initial Catalog=UmbracoDb;Integrated Security=SSPI;AttachDBFilename=C:\Data\Umbraco.mdf",
|
||||
"Microsoft.Data.SqlClient",
|
||||
connectionString,
|
||||
providerName);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CanParseSQLiteConnectionStringWithDataDirectory()
|
||||
{
|
||||
const string ConfiguredConnectionString = "Data Source=|DataDirectory|/Umbraco.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True";
|
||||
const string ConfiguredProviderName = "Microsoft.Data.SQLite";
|
||||
|
||||
Mock<IConfiguration> mockedConfig = CreateConfig(ConfiguredConnectionString, ConfiguredProviderName);
|
||||
SetDataDirectory();
|
||||
|
||||
string connectionString = mockedConfig.Object.GetUmbracoConnectionString(out string providerName);
|
||||
|
||||
AssertResults(
|
||||
@"Data Source=C:\Data/Umbraco.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True",
|
||||
"Microsoft.Data.SQLite",
|
||||
connectionString,
|
||||
providerName);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CanParseConnectionStringWithNamedProvider()
|
||||
{
|
||||
const string ConfiguredConnectionString = @"Server=.\SQLEXPRESS;Database=UmbracoCms;Integrated Security=true";
|
||||
const string ConfiguredProviderName = "MyProvider";
|
||||
|
||||
Mock<IConfiguration> mockedConfig = CreateConfig(ConfiguredConnectionString, ConfiguredProviderName);
|
||||
|
||||
string connectionString = mockedConfig.Object.GetUmbracoConnectionString(out string providerName);
|
||||
|
||||
AssertResults(
|
||||
ConfiguredConnectionString,
|
||||
ConfiguredProviderName,
|
||||
connectionString,
|
||||
providerName);
|
||||
}
|
||||
|
||||
private static Mock<IConfiguration> CreateConfig(string configuredConnectionString, string configuredProviderName = ConnectionStrings.DefaultProviderName)
|
||||
{
|
||||
var mockConfigSection = new Mock<IConfigurationSection>();
|
||||
mockConfigSection
|
||||
.SetupGet(m => m[It.Is<string>(s => s == Constants.System.UmbracoConnectionName)])
|
||||
.Returns(configuredConnectionString);
|
||||
mockConfigSection
|
||||
.SetupGet(m => m[It.Is<string>(s => s == $"{Constants.System.UmbracoConnectionName}{ConnectionStrings.ProviderNamePostfix}")])
|
||||
.Returns(configuredProviderName);
|
||||
|
||||
var mockedConfig = new Mock<IConfiguration>();
|
||||
mockedConfig
|
||||
.Setup(a => a.GetSection(It.Is<string>(s => s == "ConnectionStrings")))
|
||||
.Returns(mockConfigSection.Object);
|
||||
|
||||
return mockedConfig;
|
||||
}
|
||||
|
||||
private static void SetDataDirectory() =>
|
||||
AppDomain.CurrentDomain.SetData("DataDirectory", DataDirectory);
|
||||
|
||||
private static void AssertResults(string expectedConnectionString, string expectedProviderName, string connectionString, string providerName)
|
||||
{
|
||||
Assert.AreEqual(expectedConnectionString, connectionString);
|
||||
Assert.AreEqual(expectedProviderName, providerName);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user