feat: load legacy Cuts and Res runtime assets
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
namespace MBN_STOCK_WEBVIEW.LegacyWeb.Tests;
|
||||
|
||||
public sealed class LegacyDbSmokeRuntimeSelectionContractTests
|
||||
{
|
||||
private static readonly string RepositoryRoot = FindRepositoryRoot();
|
||||
private static readonly string Program = File.ReadAllText(Path.Combine(
|
||||
RepositoryRoot,
|
||||
"tools",
|
||||
"MBN_STOCK_WEBVIEW.DbSmoke",
|
||||
"Program.cs"));
|
||||
private static readonly string NxtAudit = File.ReadAllText(Path.Combine(
|
||||
RepositoryRoot,
|
||||
"tools",
|
||||
"MBN_STOCK_WEBVIEW.DbSmoke",
|
||||
"NxtThemeRestoreDbAudit.cs"));
|
||||
|
||||
[Fact]
|
||||
public void SelectedLegacyRuntimeEndpointIsInjectedIntoNxtAudit()
|
||||
{
|
||||
Assert.Contains(
|
||||
"var iniPath = Path.Combine(root, \"Res\", \"MmoneyCoder.ini\");",
|
||||
Program,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"new LegacyIniDatabaseOptionsLoader(_ => null).Load(iniPath)",
|
||||
Program,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"MariaDbEndpointReference.From(selectedOptions.MariaDb)",
|
||||
Program,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"selection.ReferenceMariaDb",
|
||||
Program,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"MariaDbEndpointReference referenceOptions",
|
||||
NxtAudit,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"referenceOptions.Host",
|
||||
NxtAudit,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"referenceOptions.Port",
|
||||
NxtAudit,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"referenceOptions.Database",
|
||||
NxtAudit,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void JsonRuntimeEndpointIsCapturedBeforeEnvironmentOverrides()
|
||||
{
|
||||
Assert.Contains(
|
||||
"new DatabaseOptionsLoader(_ => null).Load(configurationPath)",
|
||||
Program,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"var runtime = DatabaseRuntime.CreateDefault(configurationPath);",
|
||||
Program,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"HasCompleteEndpointIdentity(configuredMariaDb)",
|
||||
Program,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"MariaDbEndpointReference.From(configuredMariaDb)",
|
||||
Program,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"MariaDbEndpointReference.From(runtime.Options.MariaDb)",
|
||||
Program,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NxtAuditHasNoMachineSpecificOriginalConfigurationDependency()
|
||||
{
|
||||
Assert.DoesNotContain("OriginalConfigurationPath", NxtAudit, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("ReadOriginalEndpoint", NxtAudit, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("MBN_STOCK_N", NxtAudit, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.DoesNotContain("MmoneyCoder.ini", NxtAudit, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void InjectedReferenceContainsEndpointIdentityOnly()
|
||||
{
|
||||
Assert.Contains(
|
||||
"internal sealed record MariaDbEndpointReference(",
|
||||
NxtAudit,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("string? Host", NxtAudit, StringComparison.Ordinal);
|
||||
Assert.Contains("int Port", NxtAudit, StringComparison.Ordinal);
|
||||
Assert.Contains("string? Database", NxtAudit, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("UserName", NxtAudit, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("Password", NxtAudit, StringComparison.Ordinal);
|
||||
|
||||
Assert.Contains("originalSha256=", NxtAudit, StringComparison.Ordinal);
|
||||
Assert.Contains("currentSha256=", NxtAudit, StringComparison.Ordinal);
|
||||
Assert.Contains("configuredEqual=", NxtAudit, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
private static string FindRepositoryRoot()
|
||||
{
|
||||
var current = new DirectoryInfo(AppContext.BaseDirectory);
|
||||
while (current is not null)
|
||||
{
|
||||
if (File.Exists(Path.Combine(current.FullName, "MBN_STOCK_WEBVIEW.sln")))
|
||||
{
|
||||
return current.FullName;
|
||||
}
|
||||
|
||||
current = current.Parent;
|
||||
}
|
||||
|
||||
throw new DirectoryNotFoundException("Could not locate the repository root.");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,238 @@
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace MBN_STOCK_WEBVIEW.LegacyWeb.Tests;
|
||||
|
||||
public sealed class LegacyRuntimeAssetDeploymentContractTests
|
||||
{
|
||||
private static readonly string RepositoryRoot = FindRepositoryRoot();
|
||||
private static readonly string ProjectPath = Path.Combine(
|
||||
RepositoryRoot,
|
||||
"src",
|
||||
"MBN_STOCK_WEBVIEW.LegacyParityApp",
|
||||
"MBN_STOCK_WEBVIEW.LegacyParityApp.csproj");
|
||||
|
||||
[Fact]
|
||||
public void LegacyParityProjectLinksCutsAndResIntoOutputPublishAndMsix()
|
||||
{
|
||||
var project = XDocument.Load(ProjectPath);
|
||||
var contents = project.Descendants("Content").ToArray();
|
||||
|
||||
AssertLinkedRuntimeTree(contents, "$(LegacyCutsSourceRoot)\\**\\*", "Cuts\\");
|
||||
AssertLinkedRuntimeTree(contents, "@(LegacyPackagedResAsset)", "Res\\");
|
||||
|
||||
var packagedResNames = project.Descendants("LegacyPackagedResAsset")
|
||||
.Select(element => Path.GetFileName(element.Attribute("Include")?.Value))
|
||||
.ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||
string[] requiredUiMenus =
|
||||
[
|
||||
"setup.ini",
|
||||
"기타.ini",
|
||||
"업종.ini",
|
||||
"업종_코스닥.ini",
|
||||
"업종_코스피.ini",
|
||||
"종목.ini",
|
||||
"종목_0111.ini",
|
||||
"종목비교.ini",
|
||||
"지수.ini",
|
||||
"지수_0318.ini",
|
||||
"지수_250401.ini",
|
||||
"해외.ini",
|
||||
"환율.ini"
|
||||
];
|
||||
|
||||
Assert.Equal(34, packagedResNames.Count);
|
||||
Assert.All(requiredUiMenus, name => Assert.Contains(name, packagedResNames));
|
||||
Assert.DoesNotContain("MmoneyCoder.ini", packagedResNames);
|
||||
Assert.DoesNotContain("MmoneyCoder - 복사본.ini", packagedResNames);
|
||||
Assert.DoesNotContain("MmoneyCoder.ini.bak", packagedResNames);
|
||||
Assert.DoesNotContain("MmoneyCoder.zip", packagedResNames);
|
||||
Assert.DoesNotContain("afiedt.buf.txt", packagedResNames);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ActiveDatabaseIniIsPostBuildOutputOnlyAndNeverAPackagingItem()
|
||||
{
|
||||
var project = XDocument.Load(ProjectPath);
|
||||
Assert.DoesNotContain(
|
||||
project.Descendants().Where(element =>
|
||||
element.Name.LocalName is "Content" or "None"),
|
||||
element => (element.Attribute("Include")?.Value ?? string.Empty)
|
||||
.Contains("MmoneyCoder.ini", StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
var upToDateInput = Assert.Single(project.Descendants("UpToDateCheckInput"));
|
||||
Assert.Equal(
|
||||
"$(LegacyResSourceRoot)\\MmoneyCoder.ini",
|
||||
upToDateInput.Attribute("Include")?.Value);
|
||||
var upToDateBuilt = Assert.Single(project.Descendants("UpToDateCheckBuilt"));
|
||||
Assert.Equal(
|
||||
"$(TargetDir)Res\\MmoneyCoder.ini",
|
||||
upToDateBuilt.Attribute("Include")?.Value);
|
||||
|
||||
var copyTarget = Assert.Single(
|
||||
project.Descendants("Target"),
|
||||
element => string.Equals(
|
||||
element.Attribute("Name")?.Value,
|
||||
"CopyLegacyDatabaseIniToLocalOutput",
|
||||
StringComparison.Ordinal));
|
||||
Assert.Equal("Build", copyTarget.Attribute("AfterTargets")?.Value);
|
||||
Assert.Contains(
|
||||
"GenerateAppxPackageOnBuild",
|
||||
copyTarget.Attribute("Condition")?.Value,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"PublishAppxPackage",
|
||||
copyTarget.Attribute("Condition")?.Value,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Equal(
|
||||
"$(LegacyResSourceRoot)\\MmoneyCoder.ini",
|
||||
copyTarget.Attribute("Inputs")?.Value);
|
||||
Assert.Equal(
|
||||
"$(TargetDir)Res\\MmoneyCoder.ini",
|
||||
copyTarget.Attribute("Outputs")?.Value);
|
||||
var copy = Assert.Single(copyTarget.Elements("Copy"));
|
||||
Assert.Equal(
|
||||
"$(LegacyResSourceRoot)\\MmoneyCoder.ini",
|
||||
copy.Attribute("SourceFiles")?.Value);
|
||||
Assert.Equal(
|
||||
"$(TargetDir)Res\\MmoneyCoder.ini",
|
||||
copy.Attribute("DestinationFiles")?.Value);
|
||||
var fileWrite = Assert.Single(copyTarget.Descendants("FileWrites"));
|
||||
Assert.Equal(
|
||||
"$(TargetDir)Res\\MmoneyCoder.ini",
|
||||
fileWrite.Attribute("Include")?.Value);
|
||||
|
||||
var cleanTarget = Assert.Single(
|
||||
project.Descendants("Target"),
|
||||
element => string.Equals(
|
||||
element.Attribute("Name")?.Value,
|
||||
"RemoveLegacyDatabaseIniFromLocalOutput",
|
||||
StringComparison.Ordinal));
|
||||
Assert.Equal("Clean", cleanTarget.Attribute("BeforeTargets")?.Value);
|
||||
var delete = Assert.Single(cleanTarget.Elements("Delete"));
|
||||
Assert.Equal(
|
||||
"$(TargetDir)Res\\MmoneyCoder.ini",
|
||||
delete.Attribute("Files")?.Value);
|
||||
|
||||
var rejectionTarget = Assert.Single(
|
||||
project.Descendants("Target"),
|
||||
element => string.Equals(
|
||||
element.Attribute("Name")?.Value,
|
||||
"RejectLegacyDatabaseIniFromPackagePayload",
|
||||
StringComparison.Ordinal));
|
||||
Assert.Equal(
|
||||
"_ComputeAppxPackagePayload",
|
||||
rejectionTarget.Attribute("BeforeTargets")?.Value);
|
||||
Assert.Single(rejectionTarget.Elements("Error"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LegacyRuntimeSourceRootIsOverrideableAndValidatedBeforeBuild()
|
||||
{
|
||||
var project = XDocument.Load(ProjectPath);
|
||||
var sourceRoot = Assert.Single(
|
||||
project.Descendants("LegacyRuntimeSourceRoot"),
|
||||
element => element.Attribute("Condition") is not null);
|
||||
|
||||
Assert.Equal("'$(LegacyRuntimeSourceRoot)' == ''", sourceRoot.Attribute("Condition")!.Value);
|
||||
Assert.Contains("MBN_STOCK_N\\MBN_STOCK_N\\bin\\Debug", sourceRoot.Value,
|
||||
StringComparison.Ordinal);
|
||||
|
||||
var target = Assert.Single(
|
||||
project.Descendants("Target"),
|
||||
element => string.Equals(
|
||||
element.Attribute("Name")?.Value,
|
||||
"ValidateLegacyRuntimeAssets",
|
||||
StringComparison.Ordinal));
|
||||
Assert.Equal("PrepareForBuild", target.Attribute("BeforeTargets")?.Value);
|
||||
|
||||
var conditions = target.Elements("Error")
|
||||
.Select(error => error.Attribute("Condition")?.Value)
|
||||
.Where(condition => condition is not null)
|
||||
.ToArray();
|
||||
string[] requiredSentinels =
|
||||
[
|
||||
"$(LegacyRuntimeSourceRoot)",
|
||||
"$(LegacyCutsSourceRoot)",
|
||||
"$(LegacyResSourceRoot)",
|
||||
"$(LegacyCutsSourceRoot)\\5001.t2s",
|
||||
"$(LegacyResSourceRoot)\\MmoneyCoder.ini",
|
||||
"$(LegacyResSourceRoot)\\종목.ini",
|
||||
"$(LegacyResSourceRoot)\\업종_코스피.ini",
|
||||
"$(LegacyResSourceRoot)\\업종_코스닥.ini",
|
||||
"$(LegacyResSourceRoot)\\해외.ini",
|
||||
"$(LegacyResSourceRoot)\\환율.ini",
|
||||
"$(LegacyResSourceRoot)\\지수.ini"
|
||||
];
|
||||
|
||||
Assert.All(requiredSentinels, sentinel =>
|
||||
Assert.Contains(conditions, condition =>
|
||||
condition!.Contains(sentinel, StringComparison.Ordinal)));
|
||||
|
||||
var databaseIniError = Assert.Single(
|
||||
target.Elements("Error"),
|
||||
error => (error.Attribute("Condition")?.Value ?? string.Empty)
|
||||
.Contains("$(LegacyResSourceRoot)\\MmoneyCoder.ini", StringComparison.Ordinal));
|
||||
Assert.Contains(
|
||||
"GenerateAppxPackageOnBuild",
|
||||
databaseIniError.Attribute("Condition")?.Value,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"PublishAppxPackage",
|
||||
databaseIniError.Attribute("Condition")?.Value,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RepositoryDoesNotContainCopiedLegacyRuntimeTrees()
|
||||
{
|
||||
Assert.False(Directory.Exists(Path.Combine(RepositoryRoot, "Cuts")));
|
||||
Assert.False(Directory.Exists(Path.Combine(RepositoryRoot, "Res")));
|
||||
Assert.False(Directory.Exists(Path.Combine(
|
||||
RepositoryRoot,
|
||||
"src",
|
||||
"MBN_STOCK_WEBVIEW.LegacyParityApp",
|
||||
"Cuts")));
|
||||
Assert.False(Directory.Exists(Path.Combine(
|
||||
RepositoryRoot,
|
||||
"src",
|
||||
"MBN_STOCK_WEBVIEW.LegacyParityApp",
|
||||
"Res")));
|
||||
}
|
||||
|
||||
private static void AssertLinkedRuntimeTree(
|
||||
IReadOnlyCollection<XElement> contents,
|
||||
string include,
|
||||
string targetPrefix)
|
||||
{
|
||||
var content = Assert.Single(
|
||||
contents,
|
||||
element => string.Equals(
|
||||
element.Attribute("Include")?.Value,
|
||||
include,
|
||||
StringComparison.Ordinal));
|
||||
|
||||
Assert.StartsWith(targetPrefix, content.Element("Link")?.Value, StringComparison.Ordinal);
|
||||
Assert.StartsWith(
|
||||
targetPrefix,
|
||||
content.Element("TargetPath")?.Value,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Equal("PreserveNewest", content.Element("CopyToOutputDirectory")?.Value);
|
||||
Assert.Equal("PreserveNewest", content.Element("CopyToPublishDirectory")?.Value);
|
||||
}
|
||||
|
||||
private static string FindRepositoryRoot()
|
||||
{
|
||||
var current = new DirectoryInfo(AppContext.BaseDirectory);
|
||||
while (current is not null)
|
||||
{
|
||||
if (File.Exists(Path.Combine(current.FullName, "MBN_STOCK_WEBVIEW.sln")))
|
||||
{
|
||||
return current.FullName;
|
||||
}
|
||||
|
||||
current = current.Parent;
|
||||
}
|
||||
|
||||
throw new DirectoryNotFoundException("Could not locate the repository root.");
|
||||
}
|
||||
}
|
||||
@@ -38,32 +38,37 @@ public sealed class LegacyRuntimeStockCutMenuNativeContractTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DatabaseInitializationErrorWinsOverTheSingleCutMenuFallbackWarning()
|
||||
public void DatabaseInitializationErrorWinsOverCombinedRuntimeCatalogWarnings()
|
||||
{
|
||||
var errorBranch = MainWindow.IndexOf(
|
||||
"if (initializationError is not null)",
|
||||
StringComparison.Ordinal);
|
||||
var warningBranch = MainWindow.IndexOf(
|
||||
"else if (cutMenuComposition.WarningMessage is { } cutMenuWarning)",
|
||||
"cutMenuComposition.WarningMessage,",
|
||||
errorBranch,
|
||||
StringComparison.Ordinal);
|
||||
var runtimeUiWarning = MainWindow.IndexOf(
|
||||
"runtimeUiCatalogs.WarningMessage",
|
||||
warningBranch,
|
||||
StringComparison.Ordinal);
|
||||
var errorReport = MainWindow.IndexOf(
|
||||
"_controller.ReportError(initializationError);",
|
||||
errorBranch,
|
||||
StringComparison.Ordinal);
|
||||
var warningReport = MainWindow.IndexOf(
|
||||
"_controller.ReportWarning(cutMenuWarning);",
|
||||
"_controller.ReportWarning(string.Join(\" \", catalogWarnings));",
|
||||
warningBranch,
|
||||
StringComparison.Ordinal);
|
||||
|
||||
Assert.True(errorBranch >= 0);
|
||||
Assert.True(errorReport > errorBranch);
|
||||
Assert.True(warningBranch > errorReport);
|
||||
Assert.True(runtimeUiWarning > warningBranch);
|
||||
Assert.True(warningReport > warningBranch);
|
||||
Assert.Equal(
|
||||
warningReport,
|
||||
MainWindow.LastIndexOf(
|
||||
"_controller.ReportWarning(cutMenuWarning);",
|
||||
"_controller.ReportWarning(string.Join(\" \", catalogWarnings));",
|
||||
StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user