* 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)
131 lines
5.2 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|