using CTA.Rules.Actions;
using CTA.Rules.Models;
using Newtonsoft.Json.Linq;
using NUnit.Framework;
using System;
using System.Configuration;
using System.IO;
using System.Reflection;
namespace CTA.Rules.Test.Actions.ActionHelpers
{
public class ConfigMigrateTests
{
[Test]
public void TestCTAOnWebforms()
{
var projectType = ProjectType.ClassLibrary;
ConfigMigrate configMigrateInstance = new ConfigMigrate(Directory.GetCurrentDirectory(), projectType);
Type configMigrateType = configMigrateInstance.GetType();
var loadWebConfigMethod = TestUtils.GetPrivateMethod(configMigrateType, "LoadWebConfig");
var processWebConfigMethod = TestUtils.GetPrivateMethod(configMigrateType, "ProcessWebConfig");
var addAppSettingsJsonFileMethod = TestUtils.GetPrivateMethod(configMigrateType, "AddAppSettingsJsonFile");
var webConfig = String.Format(@"
");
File.WriteAllText("web.config", webConfig);
var templateContent = @"{}";
var outputDir = "";
var configuration = (Configuration)loadWebConfigMethod.Invoke(configMigrateInstance, new object[] { outputDir });
// Invoke method and read contents of method output
var content = (JObject)processWebConfigMethod.Invoke(configMigrateInstance, new object[] { configuration, templateContent });
var methodParams = new object[] { content, outputDir };
addAppSettingsJsonFileMethod.Invoke(configMigrateInstance, methodParams);
var appSettingsContent = File.ReadAllText(Path.Combine(outputDir, "appsettings.json"));
File.Delete(Path.Combine(outputDir, "appsettings.json"));
File.Delete(Path.Combine(outputDir, "web.config"));
Assert.True(appSettingsContent.Contains("UseMockData"));
Assert.True(appSettingsContent.Contains("UseCustomizationData"));
Assert.True(appSettingsContent.Contains("CatalogDBContext"));
}
[Test]
public void AddAppSettingsJsonFile_Formats_Connection_Strings_With_A_Backslash()
{
// Get private method to invoke
var projectType = ProjectType.ClassLibrary;
ConfigMigrate configMigrateInstance = new ConfigMigrate(Directory.GetCurrentDirectory(), projectType);
Type configMigrateType = configMigrateInstance.GetType();
var loadWebConfigMethod = TestUtils.GetPrivateMethod(configMigrateType, "LoadWebConfig");
var processWebConfigMethod = TestUtils.GetPrivateMethod(configMigrateType, "ProcessWebConfig");
var addAppSettingsJsonFileMethod = TestUtils.GetPrivateMethod(configMigrateType, "AddAppSettingsJsonFile");
var appSetting1 = @"ClientValidationEnabled";
var appSetting2 = @"UnobtrusiveJavaScriptEnabled";
var connectionStringWithBackSlash = @"Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;";
var connectionString2 = @"Data Source=Test;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;";
var webConfig = string.Format(@"
", appSetting1, appSetting2, connectionStringWithBackSlash, connectionString2);
File.WriteAllText("web.config", webConfig);
var templateContent = @"{}";
var outputDir = "";
var configuration = (Configuration)loadWebConfigMethod.Invoke(configMigrateInstance, new object[] { outputDir });
// Invoke method and read contents of method output
var content = (JObject)processWebConfigMethod.Invoke(configMigrateInstance, new object[] { configuration, templateContent });
var methodParams = new object[] { content, outputDir };
addAppSettingsJsonFileMethod.Invoke(configMigrateInstance, methodParams);
var appSettingsContent = File.ReadAllText(Path.Combine(outputDir, "appsettings.json"));
File.Delete(Path.Combine(outputDir, "appsettings.json"));
File.Delete(Path.Combine(outputDir, "web.config"));
Assert.True(appSettingsContent.Contains(appSetting1));
Assert.True(appSettingsContent.Contains(appSetting2));
Assert.True(appSettingsContent.Contains(connectionStringWithBackSlash.Replace(@"\", @"\\")));
Assert.True(appSettingsContent.Contains(connectionString2));
}
[Test]
public void AddConfigWithoutAppSettings()
{
// Get private method to invoke
var projectType = ProjectType.ClassLibrary;
ConfigMigrate configMigrateInstance = new ConfigMigrate(Directory.GetCurrentDirectory(), projectType);
Type configMigrateType = configMigrateInstance.GetType();
var loadWebConfigMethod = TestUtils.GetPrivateMethod(configMigrateType, "LoadWebConfig");
var processWebConfigMethod = TestUtils.GetPrivateMethod(configMigrateType, "ProcessWebConfig");
var addAppSettingsJsonFileMethod = TestUtils.GetPrivateMethod(configMigrateType, "AddAppSettingsJsonFile");
var connectionStringWithBackSlash = @"Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;";
var connectionString2 = @"Data Source=Test;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;";
var webConfig = string.Format(@"
", connectionStringWithBackSlash, connectionString2);
File.WriteAllText("web.config", webConfig);
var templateContent = @"{}";
var outputDir = "";
var configuration = (Configuration)loadWebConfigMethod.Invoke(configMigrateInstance, new object[] { outputDir });
// Invoke method and read contents of method output
var content = (JObject)processWebConfigMethod.Invoke(configMigrateInstance, new object[] { configuration, templateContent });
var methodParams = new object[] { content, outputDir };
addAppSettingsJsonFileMethod.Invoke(configMigrateInstance, methodParams);
var appSettingsContent = File.ReadAllText(Path.Combine(outputDir, "appsettings.json"));
File.Delete(Path.Combine(outputDir, "appsettings.json"));
File.Delete(Path.Combine(outputDir, "web.config"));
Assert.True(appSettingsContent.Contains(connectionStringWithBackSlash.Replace(@"\", @"\\")));
Assert.True(appSettingsContent.Contains(connectionString2));
}
[Test]
public void AddConfigWithoutAppSettingsAndWithEncryptedConnectionString()
{
// Get private method to invoke
var projectType = ProjectType.ClassLibrary;
ConfigMigrate configMigrateInstance = new ConfigMigrate(Directory.GetCurrentDirectory(), projectType);
Type configMigrateType = configMigrateInstance.GetType();
var loadWebConfigMethod = TestUtils.GetPrivateMethod(configMigrateType, "LoadWebConfig");
var processWebConfigMethod = TestUtils.GetPrivateMethod(configMigrateType, "ProcessWebConfig");
var addAppSettingsJsonFileMethod = TestUtils.GetPrivateMethod(configMigrateType, "AddAppSettingsJsonFile");
var encryptedConnectionString = (@"
Rsa Key
nkxQIoF9mSLILi28QYHJJgWdKARI7wi6Eobci45cobGuGqT6O7CDSTnDm2MEP1AGOkp/WYsWPZu+m1AVCwM+L9XNClKn0JQD/0EjW8Xt5J6EbNadQ0+jaWoeLdG5zuDDEzrKd3L13nAOuZngXCM0iKh1Lp9jVDojbcaXVt88cK5SD6V0z/8ug+7g+sZqLVJd6zyRzBenbNB5w+XVUCcLkAIfgBlvLvx26CrZ2sq36iRmmO1xM1VkXvKfMDb0Mu4UTwNcxB17fipgj4eu5AUfQj+nKbagSwFVmOOw92rVYr6jgveElgoSiqzL/sN01eT+xCKDWXqcS7T5ks5QQIIh/A==
TD/NPQ/BWh1C95odOotarRZDT3pENWUEKbGULkBFE/iL39rq7L5HvxgezKqz6YKLhUm2LyU05VE03dGPP5yJQVW6bAJjHIC47hVzlzIRehx7ihk4yDqgrROpwmGl9zw1n/V+QDwrqnkYOPZE9ubZsgPPSaWf7/FwtrbpRbWLXLzmBT4LRxOBeZLmSM40XMYkZgQiUAWNw6tu6XiFg7y/kbBXGa2jzoAXPaxcMqjhyQfVGyDhirOh5vmSJJV+kkiZ43KQIv/eoKv6pylHnocP0rW05y5Jl1YfgsiXJVqhDFYsd8wHqUe5iuOwqE4n5KiDwf37Z6HRwnnCKsw2O6bzud4lEsKjFte/FpL/esBxrQvCAmDIgix8UEadDqlCG3cG
");
var connectionString2 = @"Data Source=Test;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;";
var defaultConnectionString = @"data source=.\\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true";
var connectionStrings = string.Format(@"
{0}
",
encryptedConnectionString, connectionString2);
var webConfig = string.Format(@"
{0}
",
connectionStrings);
File.WriteAllText("web.config", webConfig);
var templateContent = @"{}";
var outputDir = "";
var configuration = (Configuration)loadWebConfigMethod.Invoke(configMigrateInstance, new object[] { outputDir });
// Invoke method and read contents of method output
var content = (JObject)processWebConfigMethod.Invoke(configMigrateInstance, new object[] { configuration, templateContent });
var methodParams = new object[] { content, outputDir };
addAppSettingsJsonFileMethod.Invoke(configMigrateInstance, methodParams);
var appSettingsContent = File.ReadAllText(Path.Combine(outputDir, "appsettings.json"));
File.Delete(Path.Combine(outputDir, "appsettings.json"));
File.Delete(Path.Combine(outputDir, "web.config"));
Assert.True(appSettingsContent.Contains(defaultConnectionString));
}
[Test]
public void LoadWebConfigWithErrors()
{
// Get private method to invoke
var projectType = ProjectType.ClassLibrary;
ConfigMigrate configMigrateInstance = new ConfigMigrate(Directory.GetCurrentDirectory(), projectType);
Type configMigrateType = configMigrateInstance.GetType();
var loadWebConfigMethod = TestUtils.GetPrivateMethod(configMigrateType, "LoadWebConfig");
var invalidWebConfig = @"
";
var projectDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
File.WriteAllText(Path.Combine(projectDir, "web.config"), invalidWebConfig);
// Invoke method and read contents of method output
var doc = (string)loadWebConfigMethod.Invoke(configMigrateInstance, new object[] { projectDir });
Assert.Null(doc);
}
}
}