Add tests

This commit is contained in:
rossmill76 committed 2026-03-01 19:00:23 +00:00
1 parent d5127c7405
commit 88aaaecb1a
15 files changed
+1755 -34

No files matched your search

@@ -0,0 +1,238 @@
using BudgetApp.Data;
using BudgetApp.Services;
using BudgetApp.Tests.Helpers;
using Xunit;
namespace BudgetApp.Tests.Services;
public class AccountServiceTests
{
[Fact]
public async Task GetAccountsAsync_ReturnsOnlyUserAccounts()
{
using var factory = new TestDbContextFactory();
using (var ctx = factory.CreateContext())
{
ctx.Accounts.AddRange(
new Account { Name = "Mine", UserId = TestDbContextFactory.TestUserId },
new Account { Name = "Theirs", UserId = TestDbContextFactory.OtherUserId });
await ctx.SaveChangesAsync();
}
using var context = factory.CreateContext();
var service = new AccountService(context);
var result = await service.GetAccountsAsync(TestDbContextFactory.TestUserId);
Assert.Single(result);
Assert.Equal("Mine", result[0].Name);
}
[Fact]
public async Task GetAccountsAsync_OrderedByName()
{
using var factory = new TestDbContextFactory();
using (var ctx = factory.CreateContext())
{
ctx.Accounts.AddRange(
new Account { Name = "Zebra", UserId = TestDbContextFactory.TestUserId },
new Account { Name = "Alpha", UserId = TestDbContextFactory.TestUserId });
await ctx.SaveChangesAsync();
}
using var context = factory.CreateContext();
var service = new AccountService(context);
var result = await service.GetAccountsAsync(TestDbContextFactory.TestUserId);
Assert.Equal("Alpha", result[0].Name);
Assert.Equal("Zebra", result[1].Name);
}
[Fact]
public async Task GetAccountAsync_ReturnsMatchingAccount()
{
using var factory = new TestDbContextFactory();
int accountId;
using (var ctx = factory.CreateContext())
{
var account = new Account { Name = "Test", UserId = TestDbContextFactory.TestUserId };
ctx.Accounts.Add(account);
await ctx.SaveChangesAsync();
accountId = account.Id;
}
using var context = factory.CreateContext();
var service = new AccountService(context);
var result = await service.GetAccountAsync(accountId, TestDbContextFactory.TestUserId);
Assert.NotNull(result);
Assert.Equal("Test", result.Name);
}
[Fact]
public async Task GetAccountAsync_WrongUser_ReturnsNull()
{
using var factory = new TestDbContextFactory();
int accountId;
using (var ctx = factory.CreateContext())
{
var account = new Account { Name = "Test", UserId = TestDbContextFactory.TestUserId };
ctx.Accounts.Add(account);
await ctx.SaveChangesAsync();
accountId = account.Id;
}
using var context = factory.CreateContext();
var service = new AccountService(context);
var result = await service.GetAccountAsync(accountId, TestDbContextFactory.OtherUserId);
Assert.Null(result);
}
[Fact]
public async Task CreateAccountAsync_AddsToDatabase()
{
using var factory = new TestDbContextFactory();
using var context = factory.CreateContext();
var service = new AccountService(context);
var account = new Account { Name = "New", UserId = TestDbContextFactory.TestUserId, CurrencyCode = "GBP" };
await service.CreateAccountAsync(account);
using var verifyCtx = factory.CreateContext();
Assert.Single(verifyCtx.Accounts);
}
[Fact]
public async Task UpdateBalanceAsync_UpdatesBalance()
{
using var factory = new TestDbContextFactory();
int accountId;
using (var ctx = factory.CreateContext())
{
var account = new Account { Name = "Test", CurrentBalance = 100m, UserId = TestDbContextFactory.TestUserId };
ctx.Accounts.Add(account);
await ctx.SaveChangesAsync();
accountId = account.Id;
}
using var context = factory.CreateContext();
var service = new AccountService(context);
await service.UpdateBalanceAsync(accountId, TestDbContextFactory.TestUserId, 250m);
using var verifyCtx = factory.CreateContext();
var updated = verifyCtx.Accounts.Single();
Assert.Equal(250m, updated.CurrentBalance);
}
[Fact]
public async Task UpdateBalanceAsync_WrongUser_DoesNothing()
{
using var factory = new TestDbContextFactory();
int accountId;
using (var ctx = factory.CreateContext())
{
var account = new Account { Name = "Test", CurrentBalance = 100m, UserId = TestDbContextFactory.TestUserId };
ctx.Accounts.Add(account);
await ctx.SaveChangesAsync();
accountId = account.Id;
}
using var context = factory.CreateContext();
var service = new AccountService(context);
await service.UpdateBalanceAsync(accountId, TestDbContextFactory.OtherUserId, 999m);
using var verifyCtx = factory.CreateContext();
Assert.Equal(100m, verifyCtx.Accounts.Single().CurrentBalance);
}
[Fact]
public async Task UpdateAccountDetailsAsync_UpdatesFields()
{
using var factory = new TestDbContextFactory();
int accountId;
using (var ctx = factory.CreateContext())
{
var account = new Account { Name = "Old", Color = "#000", CurrencyCode = "GBP", UserId = TestDbContextFactory.TestUserId };
ctx.Accounts.Add(account);
await ctx.SaveChangesAsync();
accountId = account.Id;
}
using var context = factory.CreateContext();
var service = new AccountService(context);
await service.UpdateAccountDetailsAsync(accountId, TestDbContextFactory.TestUserId, "New", "#fff", "USD");
using var verifyCtx = factory.CreateContext();
var updated = verifyCtx.Accounts.Single();
Assert.Equal("New", updated.Name);
Assert.Equal("#fff", updated.Color);
Assert.Equal("USD", updated.CurrencyCode);
}
[Fact]
public async Task UpdateAccountDetailsAsync_WrongUser_DoesNothing()
{
using var factory = new TestDbContextFactory();
int accountId;
using (var ctx = factory.CreateContext())
{
var account = new Account { Name = "Original", Color = "#000", CurrencyCode = "GBP", UserId = TestDbContextFactory.TestUserId };
ctx.Accounts.Add(account);
await ctx.SaveChangesAsync();
accountId = account.Id;
}
using var context = factory.CreateContext();
var service = new AccountService(context);
await service.UpdateAccountDetailsAsync(accountId, TestDbContextFactory.OtherUserId, "Hacked", "#fff", "USD");
using var verifyCtx = factory.CreateContext();
Assert.Equal("Original", verifyCtx.Accounts.Single().Name);
}
[Fact]
public async Task DeleteAccountAsync_RemovesAccount()
{
using var factory = new TestDbContextFactory();
int accountId;
using (var ctx = factory.CreateContext())
{
var account = new Account { Name = "ToDelete", UserId = TestDbContextFactory.TestUserId };
ctx.Accounts.Add(account);
await ctx.SaveChangesAsync();
accountId = account.Id;
}
using var context = factory.CreateContext();
var service = new AccountService(context);
await service.DeleteAccountAsync(accountId, TestDbContextFactory.TestUserId);
using var verifyCtx = factory.CreateContext();
Assert.Empty(verifyCtx.Accounts);
}
[Fact]
public async Task DeleteAccountAsync_WrongUser_DoesNothing()
{
using var factory = new TestDbContextFactory();
int accountId;
using (var ctx = factory.CreateContext())
{
var account = new Account { Name = "Protected", UserId = TestDbContextFactory.TestUserId };
ctx.Accounts.Add(account);
await ctx.SaveChangesAsync();
accountId = account.Id;
}
using var context = factory.CreateContext();
var service = new AccountService(context);
await service.DeleteAccountAsync(accountId, TestDbContextFactory.OtherUserId);
using var verifyCtx = factory.CreateContext();
Assert.Single(verifyCtx.Accounts);
}
}