Files
YKanBan/YKanBan.Tests/Storage/Workspace/WorkspacePresetTests.cs
T
doyaGu 22102cd1ea fix(storage): initialize workspaces under the lock in one transaction
Follows PLAN 4.2: create .ykanban, take the lock, then build the database.
SqliteDatabase.Create writes every migration and the preset columns in a
single transaction and deletes the file again on failure, so no empty
version-0 database is left behind. WorkspaceSession.Initialize keeps the lock
into the session instead of releasing and re-acquiring it.

A lock conflict while initializing shows the lock-conflict page.
2026-10-03 08:12:35 -04:00

97 lines
3.1 KiB
C#

using System.Globalization;
using Microsoft.Data.Sqlite;
using YKanBan.Storage.Workspace;
using YKanBan.Tests.TestUtilities;
namespace YKanBan.Tests.Storage.Workspace;
/// <summary>
/// Verifies that the preset column titles follow the UI language active when
/// they are added and then live as ordinary data. These tests mutate the
/// global <see cref="Resources.Culture"/>, so they are marked do-not-parallelize.
/// </summary>
[TestClass]
[DoNotParallelize]
public class WorkspacePresetTests
{
[TestMethod]
public void AddPresetColumnsStoresEnglishTitlesUnderEnglishCulture()
{
CultureInfo? original = Resources.Culture;
try
{
Resources.Culture = new CultureInfo("en");
string[] expected =
[
Resources.PresetColumn_Todo,
Resources.PresetColumn_InProgress,
Resources.PresetColumn_Done,
];
using var directory = new TempDirectory();
WorkspaceSession.Initialize(directory.FullPath).Dispose();
using SqliteConnection connection = SqliteTestHelper.OpenWorkspace(directory.FullPath);
CollectionAssert.AreEqual(expected, SqliteTestHelper.GetColumnTitles(connection));
}
finally
{
Resources.Culture = original;
}
}
[TestMethod]
public void AddPresetColumnsStoresChineseTitlesUnderChineseCulture()
{
CultureInfo? original = Resources.Culture;
try
{
Resources.Culture = new CultureInfo("zh-Hans");
string[] expected =
[
Resources.PresetColumn_Todo,
Resources.PresetColumn_InProgress,
Resources.PresetColumn_Done,
];
using var directory = new TempDirectory();
WorkspaceSession.Initialize(directory.FullPath).Dispose();
using SqliteConnection connection = SqliteTestHelper.OpenWorkspace(directory.FullPath);
CollectionAssert.AreEqual(expected, SqliteTestHelper.GetColumnTitles(connection));
}
finally
{
Resources.Culture = original;
}
}
[TestMethod]
public void PresetTitlesAreDataAndIgnoreLaterCultureChanges()
{
CultureInfo? original = Resources.Culture;
try
{
Resources.Culture = new CultureInfo("en");
string[] expected =
[
Resources.PresetColumn_Todo,
Resources.PresetColumn_InProgress,
Resources.PresetColumn_Done,
];
using var directory = new TempDirectory();
WorkspaceSession.Initialize(directory.FullPath).Dispose();
// Switching the language after adding the presets must not rewrite stored data.
Resources.Culture = new CultureInfo("zh-Hans");
using SqliteConnection connection = SqliteTestHelper.OpenWorkspace(directory.FullPath);
CollectionAssert.AreEqual(expected, SqliteTestHelper.GetColumnTitles(connection));
}
finally
{
Resources.Culture = original;
}
}
}