fix: persist first-run folder paths only

This commit is contained in:
2026-07-28 01:03:55 +09:00
parent 347900701b
commit 11d3849933
13 changed files with 240 additions and 666 deletions

View File

@@ -59,16 +59,11 @@ public sealed class LegacyFirstRunSetupNativeContractTests
}
[Fact]
public void BothFoldersAndAllActiveIniContractsAreValidatedBeforeSetup()
public void BothFolderSelectionsValidateOnlyCanonicalPaths()
{
var setup = File.ReadAllText(Path.Combine(
AppRoot,
"FirstRunSetupWindow.xaml.cs"));
var settings = File.ReadAllText(Path.Combine(
RepositoryRoot,
"src",
"MBN_STOCK_WEBVIEW.LegacyApplication",
"LegacyOperatorSettings.cs"));
Assert.Contains(
"LegacyOperatorSettingsFolderKind.Scene",
@@ -78,13 +73,8 @@ public sealed class LegacyFirstRunSetupNativeContractTests
"LegacyOperatorSettingsFolderKind.Resource",
setup,
StringComparison.Ordinal);
Assert.Contains(
"validation.Folder.DatabaseIniDetected",
setup,
StringComparison.Ordinal);
Assert.Contains(
"new LegacyIniDatabaseOptionsLoader",
setup,
Assert.DoesNotContain("MmoneyCoder.ini", setup, StringComparison.Ordinal);
Assert.DoesNotContain("LegacyIniDatabaseOptionsLoader", setup,
StringComparison.Ordinal);
var clearCuts = setup.IndexOf(
"_cutsDirectory = null;",
@@ -112,62 +102,55 @@ public sealed class LegacyFirstRunSetupNativeContractTests
" \"Res\"",
setup.ReplaceLineEndings("\n"),
StringComparison.Ordinal);
foreach (var ini in new[]
{
"종목.ini",
"업종_코스피.ini",
"업종_코스닥.ini",
"해외.ini",
"환율.ini",
"지수.ini",
"종목비교.ini"
})
{
Assert.Contains($"\"{ini}\"", settings, StringComparison.Ordinal);
}
}
[Fact]
public void SetupUsesArgumentListAndPinsTheVerifiedLocalK3dAtTheDefaultEndpoint()
public void SetupPersistsOnlyTheSelectedPathsWithoutStartingAChildProcess()
{
var setup = File.ReadAllText(Path.Combine(
AppRoot,
"FirstRunSetupWindow.xaml.cs"));
Assert.Contains(
"startInfo.ArgumentList.Add(argument);",
var saveSettings = RequiredIndex(
setup,
StringComparison.Ordinal);
Assert.Contains("\"-NoFolderPicker\"", setup, StringComparison.Ordinal);
Assert.Contains("\"-DatabaseIniPath\"", setup, StringComparison.Ordinal);
Assert.Contains("\"-ConfigureDevelopmentLive\"", setup, StringComparison.Ordinal);
"var saved = store.Save(current with");
var saveBinding = RequiredIndex(
setup,
"SaveRuntimeBinding(repositoryRoot, runtimeRoot);");
Assert.True(saveSettings < saveBinding);
Assert.Contains(
"private const string DefaultPlayoutHost = \"127.0.0.1\";",
"var store = new LegacyOperatorSettingsStore();",
setup,
StringComparison.Ordinal);
Assert.Contains(
"private const int DefaultPlayoutPort = 30001;",
setup,
StringComparison.Ordinal);
Assert.Contains("\"-PinRegisteredK3D\"", setup, StringComparison.Ordinal);
Assert.Contains("\"-ReplaceRuntimeBinding\"", setup, StringComparison.Ordinal);
Assert.Contains("\"-ReplaceDatabaseProfile\"", setup, StringComparison.Ordinal);
Assert.Contains("\"-ReplaceLiveConfig\"", setup, StringComparison.Ordinal);
Assert.Contains(
"result.LocalConfigurationReplacementRequired",
"SceneDirectory = cutsDirectory",
setup,
StringComparison.Ordinal);
Assert.Contains(
"await ConfirmLocalConfigurationReplacementAsync()",
"ResourceDirectory = resourceDirectory",
setup,
StringComparison.Ordinal);
Assert.DoesNotContain("\"-ReplaceK3DPin\"", setup, StringComparison.Ordinal);
Assert.DoesNotContain("\"-SkipBuild\"", setup, StringComparison.Ordinal);
Assert.Contains(
"Directory.Build.local.props",
setup,
StringComparison.Ordinal);
Assert.Contains(
"File.Move(temporary, destination, overwrite: true);",
setup,
StringComparison.Ordinal);
Assert.DoesNotContain("ProcessStartInfo", setup, StringComparison.Ordinal);
Assert.DoesNotContain("Process.Start", setup, StringComparison.Ordinal);
Assert.DoesNotContain("RunSetupAsync", setup, StringComparison.Ordinal);
Assert.DoesNotContain("powershell.exe", setup, StringComparison.OrdinalIgnoreCase);
Assert.DoesNotContain("dotnet", setup, StringComparison.OrdinalIgnoreCase);
Assert.DoesNotContain("ConfigureDevelopmentLive", setup,
StringComparison.Ordinal);
Assert.DoesNotContain("PinRegisteredK3D", setup, StringComparison.Ordinal);
Assert.DoesNotContain("DatabaseIniPath", setup, StringComparison.Ordinal);
}
[Fact]
public void SourceOnlyBuildEmbedsOnlyItsOwnClonePathForTheReviewedSetupScript()
public void SourceOnlyBuildEmbedsOnlyItsOwnClonePathForTheLocalBinding()
{
var project = XDocument.Load(Path.Combine(
AppRoot,
@@ -283,4 +266,11 @@ public sealed class LegacyFirstRunSetupNativeContractTests
throw new DirectoryNotFoundException("Repository root was not found.");
}
private static int RequiredIndex(string value, string marker)
{
var index = value.IndexOf(marker, StringComparison.Ordinal);
Assert.True(index >= 0, $"Required marker was not found: {marker}");
return index;
}
}

View File

@@ -203,7 +203,9 @@ public sealed class LegacyOperatorSettingsWebContractTests
Assert.Contains("databasePollingSeconds", App, StringComparison.Ordinal);
Assert.Contains("LegacyOperatorFolderValidator.TryValidate", SettingsHost,
StringComparison.Ordinal);
Assert.Contains("CanReadSelectedDatabaseProfile", SettingsHost,
Assert.DoesNotContain("CanReadSelectedDatabaseProfile", SettingsHost,
StringComparison.Ordinal);
Assert.DoesNotContain("LegacyIniDatabaseOptionsLoader", SettingsHost,
StringComparison.Ordinal);
Assert.Contains("ResolveDatabaseHealthLabel", SettingsHost,
StringComparison.Ordinal);