Files
Umbraco-CMS/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/ConfigurationExtensionsTests.cs
Ronald Barendse 8e6e262c7f 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>
2022-05-17 12:59:01 +02:00

131 lines
5.2 KiB
C#

// 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);
}
}
}