Skip to content

Commit 916c6fd

Browse files
author
aligneddev
committed
implemented all tests pass
1 parent 0326e70 commit 916c6fd

22 files changed

Lines changed: 3152 additions & 2 deletions

File tree

specs/004-create-the-record-ride-mvp/tasks.md

Lines changed: 1274 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
using BikeTracking.Api.Application.Rides;
2+
using BikeTracking.Api.Contracts;
3+
using BikeTracking.Api.Infrastructure.Persistence;
4+
using BikeTracking.Api.Infrastructure.Persistence.Entities;
5+
using Microsoft.EntityFrameworkCore;
6+
using Microsoft.Extensions.Logging;
7+
8+
namespace BikeTracking.Api.Tests.Application;
9+
10+
public sealed class RidesApplicationServiceTests
11+
{
12+
[Fact]
13+
public async Task RecordRideService_WithValidRequest_PersistsRideAndCreatesEvent()
14+
{
15+
using var context = CreateDbContext();
16+
// Seed user
17+
var user = new UserEntity { DisplayName = "Alice", NormalizedName = "alice", CreatedAtUtc = DateTime.UtcNow };
18+
context.Users.Add(user);
19+
await context.SaveChangesAsync();
20+
21+
var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
22+
var logger = loggerFactory.CreateLogger<RecordRideService>();
23+
var service = new RecordRideService(context, logger);
24+
var request = new RecordRideRequest(DateTime.Now, 10.5m, 45, 72m);
25+
26+
var (rideId, eventPayload) = await service.ExecuteAsync(user.UserId, request);
27+
28+
Assert.True(rideId > 0);
29+
Assert.NotNull(eventPayload);
30+
Assert.Equal(user.UserId, eventPayload.RiderId);
31+
Assert.Equal(10.5m, eventPayload.Miles);
32+
Assert.Equal(45, eventPayload.RideMinutes);
33+
Assert.Equal(72m, eventPayload.Temperature);
34+
35+
// Verify ride was persisted
36+
var persistedRide = await context.Rides.FindAsync(rideId);
37+
Assert.NotNull(persistedRide);
38+
Assert.Equal(user.UserId, persistedRide.RiderId);
39+
Assert.Equal(10.5m, persistedRide.Miles);
40+
}
41+
42+
[Fact]
43+
public async Task RecordRideService_ValidatesMillesGreaterThanZero()
44+
{
45+
using var context = CreateDbContext();
46+
var user = new UserEntity { DisplayName = "Bob", NormalizedName = "bob", CreatedAtUtc = DateTime.UtcNow };
47+
context.Users.Add(user);
48+
await context.SaveChangesAsync();
49+
50+
var service = new RecordRideService(context, null!);
51+
var request = new RecordRideRequest(DateTime.Now, 0m);
52+
53+
await Assert.ThrowsAsync<ArgumentException>(() => service.ExecuteAsync(user.UserId, request));
54+
}
55+
56+
[Fact]
57+
public async Task RecordRideService_ValidatesRideMinutesGreaterThanZeroWhenProvided()
58+
{
59+
using var context = CreateDbContext();
60+
var user = new UserEntity { DisplayName = "Charlie", NormalizedName = "charlie", CreatedAtUtc = DateTime.UtcNow };
61+
context.Users.Add(user);
62+
await context.SaveChangesAsync();
63+
64+
var service = new RecordRideService(context, null!);
65+
var request = new RecordRideRequest(DateTime.Now, 10m, -5);
66+
67+
await Assert.ThrowsAsync<ArgumentException>(() => service.ExecuteAsync(user.UserId, request));
68+
}
69+
70+
[Fact]
71+
public async Task GetRideDefaultsService_ReturnsDefaultsForNewRider()
72+
{
73+
using var context = CreateDbContext();
74+
var user = new UserEntity { DisplayName = "Diana", NormalizedName = "diana", CreatedAtUtc = DateTime.UtcNow };
75+
context.Users.Add(user);
76+
await context.SaveChangesAsync();
77+
78+
var service = new GetRideDefaultsService(context);
79+
80+
var defaults = await service.ExecuteAsync(user.UserId);
81+
82+
Assert.False(defaults.HasPreviousRide);
83+
Assert.Null(defaults.DefaultMiles);
84+
Assert.Null(defaults.DefaultRideMinutes);
85+
Assert.Null(defaults.DefaultTemperature);
86+
Assert.NotEqual(DateTime.MinValue, defaults.DefaultRideDateTimeLocal);
87+
}
88+
89+
[Fact]
90+
public async Task GetRideDefaultsService_ReturnsLastRideDefaults()
91+
{
92+
using var context = CreateDbContext();
93+
var user = new UserEntity { DisplayName = "Eve", NormalizedName = "eve", CreatedAtUtc = DateTime.UtcNow };
94+
context.Users.Add(user);
95+
await context.SaveChangesAsync();
96+
97+
// Create previous ride
98+
var previousRide = new RideEntity
99+
{
100+
RiderId = user.UserId,
101+
RideDateTimeLocal = DateTime.Now.AddHours(-1),
102+
Miles = 10.5m,
103+
RideMinutes = 45,
104+
Temperature = 72m,
105+
CreatedAtUtc = DateTime.UtcNow
106+
};
107+
context.Rides.Add(previousRide);
108+
await context.SaveChangesAsync();
109+
110+
var service = new GetRideDefaultsService(context);
111+
112+
var defaults = await service.ExecuteAsync(user.UserId);
113+
114+
Assert.True(defaults.HasPreviousRide);
115+
Assert.Equal(10.5m, defaults.DefaultMiles);
116+
Assert.Equal(45, defaults.DefaultRideMinutes);
117+
Assert.Equal(72m, defaults.DefaultTemperature);
118+
}
119+
120+
private static BikeTrackingDbContext CreateDbContext()
121+
{
122+
var options = new DbContextOptionsBuilder<BikeTrackingDbContext>()
123+
.UseInMemoryDatabase(Guid.NewGuid().ToString())
124+
.Options;
125+
126+
return new BikeTrackingDbContext(options);
127+
}
128+
}

0 commit comments

Comments
 (0)