feat: complete legacy parity and modernize operator UI
This commit is contained in:
@@ -49,6 +49,109 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
|
||||
Assert.DoesNotContain("afiedt.buf.txt", packagedResNames);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GraphEPreviewsExposeOnlyFourAllowlistedBitmapsThroughTheTrustedWebRoot()
|
||||
{
|
||||
var project = XDocument.Load(ProjectPath);
|
||||
var previewNames = project.Descendants("LegacyFinancialPreviewAsset")
|
||||
.Select(element => Path.GetFileName(element.Attribute("Include")?.Value)!)
|
||||
.ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
Assert.Equal(
|
||||
new HashSet<string>(
|
||||
["pie.bmp", "Grow.bmp", "sell.bmp", "profit.bmp"],
|
||||
StringComparer.OrdinalIgnoreCase),
|
||||
previewNames);
|
||||
|
||||
var previewContent = Assert.Single(
|
||||
project.Descendants("Content"),
|
||||
element => string.Equals(
|
||||
element.Attribute("Include")?.Value,
|
||||
"@(LegacyFinancialPreviewAsset)",
|
||||
StringComparison.Ordinal));
|
||||
Assert.Equal(
|
||||
"Web\\Previews\\%(Filename)%(Extension)",
|
||||
previewContent.Element("Link")?.Value);
|
||||
Assert.Equal(
|
||||
"Web\\Previews\\%(Filename)%(Extension)",
|
||||
previewContent.Element("TargetPath")?.Value);
|
||||
Assert.Equal(
|
||||
"PreserveNewest",
|
||||
previewContent.Element("CopyToOutputDirectory")?.Value);
|
||||
Assert.Equal(
|
||||
"PreserveNewest",
|
||||
previewContent.Element("CopyToPublishDirectory")?.Value);
|
||||
|
||||
Assert.DoesNotContain(
|
||||
project.Descendants("Content"),
|
||||
element => string.Equals(
|
||||
element.Attribute("Include")?.Value,
|
||||
"$(LegacyResSourceRoot)\\**\\*",
|
||||
StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
var window = File.ReadAllText(Path.Combine(
|
||||
RepositoryRoot,
|
||||
"src",
|
||||
"MBN_STOCK_WEBVIEW.LegacyParityApp",
|
||||
"MainWindow.xaml.cs"));
|
||||
Assert.Equal(
|
||||
1,
|
||||
window.Split(
|
||||
"SetVirtualHostNameToFolderMapping(",
|
||||
StringSplitOptions.None).Length - 1);
|
||||
Assert.Contains("LegacyBridgeProtocol.TrustedHost", window, StringComparison.Ordinal);
|
||||
Assert.Contains("webRoot", window, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain(
|
||||
"SetVirtualHostNameToFolderMapping(\"res",
|
||||
window,
|
||||
StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WebViewIgnoresItsPersistentCacheBeforeExactTrustedNavigation()
|
||||
{
|
||||
var window = File.ReadAllText(Path.Combine(
|
||||
RepositoryRoot,
|
||||
"src",
|
||||
"MBN_STOCK_WEBVIEW.LegacyParityApp",
|
||||
"MainWindow.xaml.cs"));
|
||||
|
||||
var mapping = window.IndexOf(
|
||||
"SetVirtualHostNameToFolderMapping(",
|
||||
StringComparison.Ordinal);
|
||||
var disableCache = window.IndexOf(
|
||||
"\"Network.setCacheDisabled\"",
|
||||
StringComparison.Ordinal);
|
||||
var navigation = window.IndexOf(
|
||||
"Browser.Source = new Uri(",
|
||||
StringComparison.Ordinal);
|
||||
|
||||
Assert.True(mapping >= 0);
|
||||
Assert.True(disableCache > mapping);
|
||||
Assert.True(navigation > disableCache);
|
||||
Assert.Contains(
|
||||
"CoreWebView2HostResourceAccessKind.DenyCors",
|
||||
window,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Equal(
|
||||
1,
|
||||
window.Split(
|
||||
"\"Network.setCacheDisabled\"",
|
||||
StringSplitOptions.None).Length - 1);
|
||||
Assert.Contains(
|
||||
"\"{\\\"cacheDisabled\\\":true}\"",
|
||||
window,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"$\"https://{LegacyBridgeProtocol.TrustedHost}/index.html\"",
|
||||
window,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain(
|
||||
"$\"https://{LegacyBridgeProtocol.TrustedHost}/index.html?",
|
||||
window,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ActiveDatabaseIniIsPostBuildOutputOnlyAndNeverAPackagingItem()
|
||||
{
|
||||
@@ -122,6 +225,12 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
|
||||
Assert.Equal(
|
||||
"_ComputeAppxPackagePayload",
|
||||
rejectionTarget.Attribute("BeforeTargets")?.Value);
|
||||
var forbiddenPayload = Assert.Single(
|
||||
rejectionTarget.Descendants("_ForbiddenLegacyDatabasePackagePayload"));
|
||||
Assert.Contains(
|
||||
"%(PackagingOutputs.Filename)%(PackagingOutputs.Extension)",
|
||||
forbiddenPayload.Attribute("Condition")?.Value,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Single(rejectionTarget.Elements("Error"));
|
||||
}
|
||||
|
||||
@@ -154,7 +263,8 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
|
||||
"$(LegacyRuntimeSourceRoot)",
|
||||
"$(LegacyCutsSourceRoot)",
|
||||
"$(LegacyResSourceRoot)",
|
||||
"$(LegacyCutsSourceRoot)\\5001.t2s",
|
||||
"$(LegacyCutsSourceRoot)\\%(LegacyRequiredScene.Identity).t2s",
|
||||
"$(LegacyCutsSourceRoot)\\%(LegacyRequiredBuiltInAsset.Identity)",
|
||||
"$(LegacyResSourceRoot)\\MmoneyCoder.ini",
|
||||
"$(LegacyResSourceRoot)\\종목.ini",
|
||||
"$(LegacyResSourceRoot)\\업종_코스피.ini",
|
||||
@@ -168,6 +278,27 @@ public sealed class LegacyRuntimeAssetDeploymentContractTests
|
||||
Assert.Contains(conditions, condition =>
|
||||
condition!.Contains(sentinel, StringComparison.Ordinal)));
|
||||
|
||||
var requiredScenes = Assert.Single(project.Descendants("LegacyRequiredScene"))
|
||||
.Attribute("Include")!.Value
|
||||
.Split(';', StringSplitOptions.RemoveEmptyEntries);
|
||||
Assert.Equal(45, requiredScenes.Length);
|
||||
Assert.Equal(requiredScenes.Length,
|
||||
requiredScenes.Distinct(StringComparer.Ordinal).Count());
|
||||
Assert.Contains("5001", requiredScenes);
|
||||
Assert.Contains("5076", requiredScenes);
|
||||
Assert.Contains("5079", requiredScenes);
|
||||
Assert.Contains("6001", requiredScenes);
|
||||
|
||||
var requiredAssets = Assert.Single(
|
||||
project.Descendants("LegacyRequiredBuiltInAsset"))
|
||||
.Attribute("Include")!.Value
|
||||
.Split(';', StringSplitOptions.RemoveEmptyEntries);
|
||||
Assert.Equal(9, requiredAssets.Length);
|
||||
Assert.Contains(@"images\주유기merge.png", requiredAssets);
|
||||
Assert.Contains(@"images\35752913_l.jpg", requiredAssets);
|
||||
Assert.Contains(@"Images\KRX.png", requiredAssets);
|
||||
Assert.Contains(@"Images\NXT.png", requiredAssets);
|
||||
|
||||
var databaseIniError = Assert.Single(
|
||||
target.Elements("Error"),
|
||||
error => (error.Attribute("Condition")?.Value ?? string.Empty)
|
||||
|
||||
Reference in New Issue
Block a user