fix(store-and-forward): create the SQLite database directory on init (StoreAndForward-014)
StoreAndForwardStorage.InitializeAsync opened a SqliteConnection against the configured SqliteDbPath (default ./data/store-and-forward.db) without ensuring the parent directory exists. SQLite creates the database file but not its directory, so when data/ was absent the connection failed with "SQLite Error 14: unable to open database file" — aborting the site host's RegisterSiteActors at StoreAndForwardService.StartAsync. This was the root cause of the six failing SiteActorPathTests. Production masked it because the Docker image / deployment creates data/. InitializeAsync now calls EnsureDatabaseDirectoryExists, which parses the connection string and creates the parent directory of a file-backed database (in-memory databases and bare filenames are skipped). Regression test InitializeAsync_FileInMissingDirectory_CreatesDirectory fails against the pre-fix code. Host suite now 155/155 green (was 149/155).
This commit is contained in:
@@ -221,4 +221,31 @@ public class StoreAndForwardStorageTests : IAsyncLifetime, IDisposable
|
||||
Status = StoreAndForwardMessageStatus.Pending
|
||||
};
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task InitializeAsync_FileInMissingDirectory_CreatesDirectory()
|
||||
{
|
||||
// SQLite creates the database file on demand but not its parent directory;
|
||||
// the storage must create the directory itself or OpenAsync fails with
|
||||
// "unable to open database file" (the cause of the SiteActorPathTests failures).
|
||||
var directory = Path.Combine(Path.GetTempPath(), "sf-storage-test-" + Guid.NewGuid().ToString("N"));
|
||||
var dbPath = Path.Combine(directory, "store-and-forward.db");
|
||||
Assert.False(Directory.Exists(directory));
|
||||
|
||||
try
|
||||
{
|
||||
var storage = new StoreAndForwardStorage(
|
||||
$"Data Source={dbPath}", NullLogger<StoreAndForwardStorage>.Instance);
|
||||
|
||||
await storage.InitializeAsync();
|
||||
|
||||
Assert.True(Directory.Exists(directory));
|
||||
Assert.True(File.Exists(dbPath));
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (Directory.Exists(directory))
|
||||
Directory.Delete(directory, recursive: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user