Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 139 additions & 0 deletions kilozdazolik.WaterLogger.Tests/WaterLogServiceTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
using kilozdazolik.WaterLogger.Data;
using kilozdazolik.WaterLogger.Models;
using kilozdazolik.WaterLogger.Services;
using Microsoft.EntityFrameworkCore;
using Xunit;

namespace kilozdazolik.WaterLogger.Tests
{
public class WaterLogServiceTests
{
private WaterLoggerContext GetInMemoryContext(string dbName)
{
var options = new DbContextOptionsBuilder<WaterLoggerContext>()
.UseInMemoryDatabase(databaseName: dbName)
.Options;

return new WaterLoggerContext(options);
}

[Fact]
public async Task AddAsync_WithVesselId_AddsLogCorrectly()
{
// Arrange
var dbName = Guid.NewGuid().ToString();
using var context = GetInMemoryContext(dbName);
var service = new WaterLogService(context);

var vessel = new VesselType { Id = 1, Name = "Glass", CapacityMl = 250 };
context.VesselTypes.Add(vessel);
await context.SaveChangesAsync();

// Act
await service.AddAsync(vessel.Id, null);

// Assert
var log = await context.WaterLogs.FirstOrDefaultAsync();
Assert.NotNull(log);
Assert.Equal(vessel.Id, log.VesselTypeId);
Assert.Equal(250, log.Volume);
}

[Fact]
public async Task AddAsync_WithManualAmount_AddsLogCorrectly()
{
// Arrange
var dbName = Guid.NewGuid().ToString();
using var context = GetInMemoryContext(dbName);
var service = new WaterLogService(context);

// Act
await service.AddAsync(null, 500);

// Assert
var log = await context.WaterLogs.FirstOrDefaultAsync();
Assert.NotNull(log);
Assert.Null(log.VesselTypeId);
Assert.Equal(500, log.Volume);
}

[Fact]
public async Task DeleteAsync_ExistingLog_RemovesLog()
{
// Arrange
var dbName = Guid.NewGuid().ToString();
using var context = GetInMemoryContext(dbName);
var service = new WaterLogService(context);

var log = new WaterLog { Id = 1, Volume = 300 };
context.WaterLogs.Add(log);
await context.SaveChangesAsync();

// Act
await service.DeleteAsync(1);

// Assert
var exists = await context.WaterLogs.AnyAsync();
Assert.False(exists);
}

[Fact]
public async Task EditAsync_UpdatesVolumeAndClearsVesselRef()
{
// Arrange
var dbName = Guid.NewGuid().ToString();
using var context = GetInMemoryContext(dbName);
var service = new WaterLogService(context);

var log = new WaterLog { Id = 1, VesselTypeId = 5, Volume = 300 };
context.WaterLogs.Add(log);
await context.SaveChangesAsync();

// Act
await service.EditAsync(1, 400);

// Assert
var updatedLog = await context.WaterLogs.FindAsync(1);
Assert.NotNull(updatedLog);
Assert.Equal(400, updatedLog.Volume);
Assert.Null(updatedLog.VesselTypeId);
}

[Fact]
public async Task SetGoalAsync_NewGoal_CreatesGoal()
{
// Arrange
var dbName = Guid.NewGuid().ToString();
using var context = GetInMemoryContext(dbName);
var service = new WaterLogService(context);

// Act
await service.SetGoalAsync(2500);

// Assert
var goal = await context.DailyGoals.FirstOrDefaultAsync(g => g.Date == DateTime.Today);
Assert.NotNull(goal);
Assert.Equal(2500, goal.GoalMl);
}

[Fact]
public async Task SetGoalAsync_ExistingGoal_UpdatesGoal()
{
// Arrange
var dbName = Guid.NewGuid().ToString();
using var context = GetInMemoryContext(dbName);
var service = new WaterLogService(context);

context.DailyGoals.Add(new DailyGoal { Date = DateTime.Today, GoalMl = 2000 });
await context.SaveChangesAsync();

// Act
await service.SetGoalAsync(3000);

// Assert
var goal = await context.DailyGoals.FirstOrDefaultAsync(g => g.Date == DateTime.Today);
Assert.NotNull(goal);
Assert.Equal(3000, goal.GoalMl);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="10.0.7" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\kilozdazolik.WaterLogger\kilozdazolik.WaterLogger.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\kilozdazolik.WaterLogger\kilozdazolik.WaterLogger.csproj" />
</ItemGroup>

<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>

</Project>
4 changes: 4 additions & 0 deletions kilozdazolik.WaterLogger.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<Solution>
<Project Path="kilozdazolik.WaterLogger.Tests/kilozdazolik.WaterLogger.Tests.csproj" />
<Project Path="kilozdazolik.WaterLogger/kilozdazolik.WaterLogger.csproj" />
</Solution>
31 changes: 31 additions & 0 deletions kilozdazolik.WaterLogger/Data/WaterLoggerContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using kilozdazolik.WaterLogger.Models;
using Microsoft.EntityFrameworkCore;

namespace kilozdazolik.WaterLogger.Data
{
public class WaterLoggerContext : DbContext
{
public WaterLoggerContext(DbContextOptions<WaterLoggerContext> options)
: base(options) { }


public DbSet<WaterLog> WaterLogs { get; set; }
public DbSet<VesselType> VesselTypes { get; set; }
public DbSet<DailyGoal> DailyGoals { get; set; }

public static void SeedData(WaterLoggerContext context)
{

if (!context.VesselTypes.Any())
{
context.VesselTypes.AddRange(
new VesselType { Name = "Glass", CapacityMl = 250 },
new VesselType { Name = "Mug", CapacityMl = 350 },
new VesselType { Name = "Bottle", CapacityMl = 500 }
);
context.SaveChanges();
}
}
}

}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading