This commit is contained in:
6d486f49
2026-08-17 00:45:08 -04:00
parent 3a2f112a73
commit 1d6207fbfe
154 changed files with 126007 additions and 47385 deletions
+93 -24
View File
@@ -10,10 +10,6 @@ namespace Tests;
[TestFixture]
public class DatabaseServiceTests
{
private IDatabaseConfigService _configService = null!;
private IDatabaseService _dbService = null!;
private string _testDbName = null!;
[SetUp]
public async Task Setup()
{
@@ -29,6 +25,10 @@ public class DatabaseServiceTests
await _dbService.EnsureDatabaseCreatedAsync();
}
private IDatabaseConfigService _configService = null!;
private IDatabaseService _dbService = null!;
private string _testDbName = null!;
[Test]
public async Task CheckHealth_InMemory_ReturnsConnected()
{
@@ -38,33 +38,65 @@ public class DatabaseServiceTests
}
[Test]
public async Task CardNotes_FullCrudLifecycle()
public async Task Users_FullCrudLifecycle()
{
var cardName = "Test Hero " + Guid.NewGuid().ToString("N");
var initialNote = new CardNote { CardName = cardName, Note = "Initial note text" };
var username = "player_" + Guid.NewGuid().ToString("N")[..8];
var initialUser = new User { Username = username, Password = "password123", CreatedAt = DateTime.UtcNow };
// 1. Create
var createResult = await _dbService.SaveCardNoteAsync(initialNote, isNew: true);
var createResult = await _dbService.SaveUserAsync(initialUser, true);
Assert.That(createResult.Success, Is.True);
// 2. Read
var fetched = await _dbService.GetCardNoteAsync(cardName);
var fetched = await _dbService.GetUserAsync(username);
Assert.That(fetched, Is.Not.Null);
Assert.That(fetched!.Password, Is.EqualTo("password123"));
// 3. Update
fetched.Password = "newpassword456";
var updateResult = await _dbService.SaveUserAsync(fetched, false);
Assert.That(updateResult.Success, Is.True);
var updated = await _dbService.GetUserAsync(username);
Assert.That(updated!.Password, Is.EqualTo("newpassword456"));
// 4. Delete
var deleteResult = await _dbService.DeleteUserAsync(username);
Assert.That(deleteResult.Success, Is.True);
var deleted = await _dbService.GetUserAsync(username);
Assert.That(deleted, Is.Null);
}
[Test]
public async Task CardNotes_FullCrudLifecycle()
{
var cardName = "Test Hero " + Guid.NewGuid().ToString("N");
var username = "user1";
var initialNote = new CardNote { Username = username, CardName = cardName, Note = "Initial note text" };
// 1. Create
var createResult = await _dbService.SaveCardNoteAsync(initialNote, true);
Assert.That(createResult.Success, Is.True);
// 2. Read
var fetched = await _dbService.GetCardNoteAsync(cardName, username);
Assert.That(fetched, Is.Not.Null);
Assert.That(fetched!.Note, Is.EqualTo("Initial note text"));
// 3. Update
fetched.Note = "Updated note text";
var updateResult = await _dbService.SaveCardNoteAsync(fetched, isNew: false);
var updateResult = await _dbService.SaveCardNoteAsync(fetched, false);
Assert.That(updateResult.Success, Is.True);
var updated = await _dbService.GetCardNoteAsync(cardName);
var updated = await _dbService.GetCardNoteAsync(cardName, username);
Assert.That(updated!.Note, Is.EqualTo("Updated note text"));
// 4. Delete
var deleteResult = await _dbService.DeleteCardNoteAsync(cardName);
var deleteResult = await _dbService.DeleteCardNoteAsync(cardName, username);
Assert.That(deleteResult.Success, Is.True);
var deleted = await _dbService.GetCardNoteAsync(cardName);
var deleted = await _dbService.GetCardNoteAsync(cardName, username);
Assert.That(deleted, Is.Null);
}
@@ -72,13 +104,14 @@ public class DatabaseServiceTests
public async Task DuplicateCardNote_ReturnsFailureResult()
{
var cardName = "Unique Card " + Guid.NewGuid().ToString("N");
var note1 = new CardNote { CardName = cardName, Note = "First" };
var note2 = new CardNote { CardName = cardName, Note = "Second" };
var username = "user1";
var note1 = new CardNote { Username = username, CardName = cardName, Note = "First" };
var note2 = new CardNote { Username = username, CardName = cardName, Note = "Second" };
var res1 = await _dbService.SaveCardNoteAsync(note1, isNew: true);
var res1 = await _dbService.SaveCardNoteAsync(note1, true);
Assert.That(res1.Success, Is.True);
var res2 = await _dbService.SaveCardNoteAsync(note2, isNew: true);
var res2 = await _dbService.SaveCardNoteAsync(note2, true);
Assert.That(res2.Success, Is.False);
Assert.That(res2.Message, Does.Contain("already exists"));
}
@@ -98,7 +131,7 @@ public class DatabaseServiceTests
};
// 1. Create
var createResult = await _dbService.SaveUserDeckAsync(deck, isNew: true);
var createResult = await _dbService.SaveUserDeckAsync(deck, true);
Assert.That(createResult.Success, Is.True);
// 2. Read
@@ -111,7 +144,7 @@ public class DatabaseServiceTests
// 3. Update
fetched.Cards.Add("Added Card");
fetched.Name = "Control Deck v2";
var updateResult = await _dbService.SaveUserDeckAsync(fetched, isNew: false);
var updateResult = await _dbService.SaveUserDeckAsync(fetched, false);
Assert.That(updateResult.Success, Is.True);
var updated = await _dbService.GetUserDeckAsync(deckId);
@@ -143,7 +176,7 @@ public class DatabaseServiceTests
};
// 1. Create
var createResult = await _dbService.SavePasskeyAsync(passkey, isNew: true);
var createResult = await _dbService.SavePasskeyAsync(passkey, true);
Assert.That(createResult.Success, Is.True);
Assert.That(passkey.Id, Is.GreaterThan(0));
@@ -157,7 +190,7 @@ public class DatabaseServiceTests
// 3. Update
fetched.SignCount = 10;
var updateResult = await _dbService.SavePasskeyAsync(fetched, isNew: false);
var updateResult = await _dbService.SavePasskeyAsync(fetched, false);
Assert.That(updateResult.Success, Is.True);
var updated = await _dbService.GetPasskeyAsync(passkey.Id);
@@ -177,14 +210,17 @@ public class DatabaseServiceTests
// 1. Seed
var seedResult = await _dbService.SeedSampleDataAsync();
Assert.That(seedResult.Success, Is.True);
Assert.That(seedResult.UsersSeeded, Is.GreaterThan(0));
Assert.That(seedResult.CardNotesSeeded, Is.GreaterThan(0));
Assert.That(seedResult.UserDecksSeeded, Is.GreaterThan(0));
Assert.That(seedResult.PasskeysSeeded, Is.GreaterThan(0));
var users = await _dbService.GetUsersAsync();
var notes = await _dbService.GetCardNotesAsync();
var decks = await _dbService.GetUserDecksAsync();
var passkeys = await _dbService.GetPasskeysAsync();
Assert.That(users.Count, Is.GreaterThan(0));
Assert.That(notes.Count, Is.GreaterThan(0));
Assert.That(decks.Count, Is.GreaterThan(0));
Assert.That(passkeys.Count, Is.GreaterThan(0));
@@ -193,10 +229,12 @@ public class DatabaseServiceTests
var resetResult = await _dbService.ResetDatabaseAsync();
Assert.That(resetResult.Success, Is.True);
var usersAfterReset = await _dbService.GetUsersAsync();
var notesAfterReset = await _dbService.GetCardNotesAsync();
var decksAfterReset = await _dbService.GetUserDecksAsync();
var passkeysAfterReset = await _dbService.GetPasskeysAsync();
Assert.That(usersAfterReset, Is.Empty);
Assert.That(notesAfterReset, Is.Empty);
Assert.That(decksAfterReset, Is.Empty);
Assert.That(passkeysAfterReset, Is.Empty);
@@ -209,9 +247,40 @@ public class DatabaseServiceTests
Assert.That(testResults, Is.Not.Empty);
var failed = testResults.Where(t => t.Status == TestStatus.Failed).ToList();
Assert.That(failed, Is.Empty, () => $"Failed tests: {string.Join(", ", failed.Select(f => $"{f.Name}: {f.ErrorMessage}"))}");
Assert.That(failed, Is.Empty,
() => $"Failed tests: {string.Join(", ", failed.Select(f => $"{f.Name}: {f.ErrorMessage}"))}");
var passedCount = testResults.Count(t => t.Status == TestStatus.Passed);
Assert.That(passedCount, Is.GreaterThanOrEqualTo(6));
Assert.That(passedCount, Is.GreaterThanOrEqualTo(7));
}
}
[Test]
public void DatabaseConfigService_WithPostgreSQL_Password_EnvironmentVariable_AppliesPassword()
{
var testPassword = "test_custom_env_password_123";
Environment.SetEnvironmentVariable("PostgreSQL_Password", testPassword);
try
{
var config = new ConfigurationBuilder().Build();
var service = new DatabaseConfigService(config);
Assert.That(service.ConnectionString, Does.Contain(testPassword));
}
finally
{
Environment.SetEnvironmentVariable("PostgreSQL_Password", null);
}
}
[Test]
public void DatabaseConfigService_MasksPassword_InDisplay()
{
var config = new ConfigurationBuilder().Build();
var service = new DatabaseConfigService(config);
service.SetConnectionString("Host=localhost;Database=chrono;Username=postgres;Password=secret_password;");
var description = service.GetActiveProviderDescription();
Assert.That(description, Does.Contain("Password=******"));
Assert.That(description, Does.Not.Contain("secret_password"));
}
}