style(backend): apply dotnet format whitespace normalization

- Applied dotnet format to 24 files in backend/
- Corrects spacing, indentation, and formatting consistency
- No functional changes to code logic

Ultraworked with Sisyphus <https://github.com/code-yeongyu/oh-my-opencode>
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
WorkClub Automation
2026-03-05 11:07:19 +01:00
parent 8ba22d3dc3
commit 1a5d5e8651
23 changed files with 190 additions and 189 deletions

View File

@@ -56,7 +56,7 @@ public static class ShiftEndpoints
ShiftService shiftService) ShiftService shiftService)
{ {
var result = await shiftService.GetShiftByIdAsync(id); var result = await shiftService.GetShiftByIdAsync(id);
if (result == null) if (result == null)
return TypedResults.NotFound(); return TypedResults.NotFound();
@@ -75,7 +75,7 @@ public static class ShiftEndpoints
} }
var (shift, error) = await shiftService.CreateShiftAsync(request, createdById); var (shift, error) = await shiftService.CreateShiftAsync(request, createdById);
if (error != null || shift == null) if (error != null || shift == null)
return TypedResults.BadRequest(error ?? "Failed to create shift"); return TypedResults.BadRequest(error ?? "Failed to create shift");
@@ -93,7 +93,7 @@ public static class ShiftEndpoints
{ {
if (error == "Shift not found") if (error == "Shift not found")
return TypedResults.NotFound(); return TypedResults.NotFound();
if (isConflict) if (isConflict)
return TypedResults.Conflict(error); return TypedResults.Conflict(error);
} }
@@ -106,7 +106,7 @@ public static class ShiftEndpoints
ShiftService shiftService) ShiftService shiftService)
{ {
var deleted = await shiftService.DeleteShiftAsync(id); var deleted = await shiftService.DeleteShiftAsync(id);
if (!deleted) if (!deleted)
return TypedResults.NotFound(); return TypedResults.NotFound();
@@ -130,10 +130,10 @@ public static class ShiftEndpoints
{ {
if (error == "Shift not found") if (error == "Shift not found")
return TypedResults.NotFound(); return TypedResults.NotFound();
if (error == "Cannot sign up for past shifts") if (error == "Cannot sign up for past shifts")
return TypedResults.UnprocessableEntity(error); return TypedResults.UnprocessableEntity(error);
if (isConflict) if (isConflict)
return TypedResults.Conflict(error!); return TypedResults.Conflict(error!);
} }
@@ -158,7 +158,7 @@ public static class ShiftEndpoints
{ {
if (error == "Sign-up not found") if (error == "Sign-up not found")
return TypedResults.NotFound(); return TypedResults.NotFound();
return TypedResults.UnprocessableEntity(error!); return TypedResults.UnprocessableEntity(error!);
} }

View File

@@ -47,7 +47,7 @@ public static class TaskEndpoints
TaskService taskService) TaskService taskService)
{ {
var result = await taskService.GetTaskByIdAsync(id); var result = await taskService.GetTaskByIdAsync(id);
if (result == null) if (result == null)
return TypedResults.NotFound(); return TypedResults.NotFound();
@@ -66,7 +66,7 @@ public static class TaskEndpoints
} }
var (task, error) = await taskService.CreateTaskAsync(request, createdById); var (task, error) = await taskService.CreateTaskAsync(request, createdById);
if (error != null || task == null) if (error != null || task == null)
return TypedResults.BadRequest(error ?? "Failed to create task"); return TypedResults.BadRequest(error ?? "Failed to create task");
@@ -84,10 +84,10 @@ public static class TaskEndpoints
{ {
if (error == "Task not found") if (error == "Task not found")
return TypedResults.NotFound(); return TypedResults.NotFound();
if (isConflict) if (isConflict)
return TypedResults.Conflict(error); return TypedResults.Conflict(error);
return TypedResults.UnprocessableEntity(error); return TypedResults.UnprocessableEntity(error);
} }
@@ -99,7 +99,7 @@ public static class TaskEndpoints
TaskService taskService) TaskService taskService)
{ {
var deleted = await taskService.DeleteTaskAsync(id); var deleted = await taskService.DeleteTaskAsync(id);
if (!deleted) if (!deleted)
return TypedResults.NotFound(); return TypedResults.NotFound();

View File

@@ -19,7 +19,7 @@ public class TenantValidationMiddleware
return; return;
} }
if (!context.Request.Headers.TryGetValue("X-Tenant-Id", out var tenantIdHeader) || if (!context.Request.Headers.TryGetValue("X-Tenant-Id", out var tenantIdHeader) ||
string.IsNullOrWhiteSpace(tenantIdHeader)) string.IsNullOrWhiteSpace(tenantIdHeader))
{ {
context.Response.StatusCode = StatusCodes.Status400BadRequest; context.Response.StatusCode = StatusCodes.Status400BadRequest;

View File

@@ -84,7 +84,7 @@ var app = builder.Build();
if (app.Environment.IsDevelopment()) if (app.Environment.IsDevelopment())
{ {
app.MapOpenApi(); app.MapOpenApi();
using var scope = app.Services.CreateScope(); using var scope = app.Services.CreateScope();
var seedService = scope.ServiceProvider.GetRequiredService<SeedDataService>(); var seedService = scope.ServiceProvider.GetRequiredService<SeedDataService>();
await seedService.SeedAsync(); await seedService.SeedAsync();
@@ -113,7 +113,7 @@ var summaries = new[]
app.MapGet("/weatherforecast", () => app.MapGet("/weatherforecast", () =>
{ {
var forecast = Enumerable.Range(1, 5).Select(index => var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast new WeatherForecast
( (
DateOnly.FromDateTime(DateTime.Now.AddDays(index)), DateOnly.FromDateTime(DateTime.Now.AddDays(index)),

View File

@@ -42,7 +42,7 @@ public class MemberSyncService
var email = httpContext.User.FindFirst("email")?.Value ?? httpContext.User.FindFirst("preferred_username")?.Value ?? "unknown@example.com"; var email = httpContext.User.FindFirst("email")?.Value ?? httpContext.User.FindFirst("preferred_username")?.Value ?? "unknown@example.com";
var name = httpContext.User.FindFirst("name")?.Value ?? email.Split('@')[0]; var name = httpContext.User.FindFirst("name")?.Value ?? email.Split('@')[0];
var roleClaim = httpContext.User.FindFirst(System.Security.Claims.ClaimTypes.Role)?.Value ?? "Member"; var roleClaim = httpContext.User.FindFirst(System.Security.Claims.ClaimTypes.Role)?.Value ?? "Member";
var clubRole = roleClaim.ToLowerInvariant() switch var clubRole = roleClaim.ToLowerInvariant() switch
{ {

View File

@@ -57,7 +57,7 @@ public class ShiftService
public async Task<ShiftDetailDto?> GetShiftByIdAsync(Guid id) public async Task<ShiftDetailDto?> GetShiftByIdAsync(Guid id)
{ {
var shift = await _context.Shifts.FindAsync(id); var shift = await _context.Shifts.FindAsync(id);
if (shift == null) if (shift == null)
return null; return null;
@@ -91,7 +91,7 @@ public class ShiftService
public async Task<(ShiftDetailDto? shift, string? error)> CreateShiftAsync(CreateShiftRequest request, Guid createdById) public async Task<(ShiftDetailDto? shift, string? error)> CreateShiftAsync(CreateShiftRequest request, Guid createdById)
{ {
var tenantId = _tenantProvider.GetTenantId(); var tenantId = _tenantProvider.GetTenantId();
var shift = new Shift var shift = new Shift
{ {
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
@@ -132,7 +132,7 @@ public class ShiftService
public async Task<(ShiftDetailDto? shift, string? error, bool isConflict)> UpdateShiftAsync(Guid id, UpdateShiftRequest request) public async Task<(ShiftDetailDto? shift, string? error, bool isConflict)> UpdateShiftAsync(Guid id, UpdateShiftRequest request)
{ {
var shift = await _context.Shifts.FindAsync(id); var shift = await _context.Shifts.FindAsync(id);
if (shift == null) if (shift == null)
return (null, "Shift not found", false); return (null, "Shift not found", false);
@@ -197,7 +197,7 @@ public class ShiftService
public async Task<bool> DeleteShiftAsync(Guid id) public async Task<bool> DeleteShiftAsync(Guid id)
{ {
var shift = await _context.Shifts.FindAsync(id); var shift = await _context.Shifts.FindAsync(id);
if (shift == null) if (shift == null)
return false; return false;
@@ -212,7 +212,7 @@ public class ShiftService
var tenantId = _tenantProvider.GetTenantId(); var tenantId = _tenantProvider.GetTenantId();
var shift = await _context.Shifts.FindAsync(shiftId); var shift = await _context.Shifts.FindAsync(shiftId);
if (shift == null) if (shift == null)
return (false, "Shift not found", false); return (false, "Shift not found", false);

View File

@@ -52,7 +52,7 @@ public class TaskService
public async Task<TaskDetailDto?> GetTaskByIdAsync(Guid id) public async Task<TaskDetailDto?> GetTaskByIdAsync(Guid id)
{ {
var workItem = await _context.WorkItems.FindAsync(id); var workItem = await _context.WorkItems.FindAsync(id);
if (workItem == null) if (workItem == null)
return null; return null;
@@ -73,7 +73,7 @@ public class TaskService
public async Task<(TaskDetailDto? task, string? error)> CreateTaskAsync(CreateTaskRequest request, Guid createdById) public async Task<(TaskDetailDto? task, string? error)> CreateTaskAsync(CreateTaskRequest request, Guid createdById)
{ {
var tenantId = _tenantProvider.GetTenantId(); var tenantId = _tenantProvider.GetTenantId();
var workItem = new WorkItem var workItem = new WorkItem
{ {
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
@@ -111,7 +111,7 @@ public class TaskService
public async Task<(TaskDetailDto? task, string? error, bool isConflict)> UpdateTaskAsync(Guid id, UpdateTaskRequest request) public async Task<(TaskDetailDto? task, string? error, bool isConflict)> UpdateTaskAsync(Guid id, UpdateTaskRequest request)
{ {
var workItem = await _context.WorkItems.FindAsync(id); var workItem = await _context.WorkItems.FindAsync(id);
if (workItem == null) if (workItem == null)
return (null, "Task not found", false); return (null, "Task not found", false);
@@ -172,7 +172,7 @@ public class TaskService
public async Task<bool> DeleteTaskAsync(Guid id) public async Task<bool> DeleteTaskAsync(Guid id)
{ {
var workItem = await _context.WorkItems.FindAsync(id); var workItem = await _context.WorkItems.FindAsync(id);
if (workItem == null) if (workItem == null)
return false; return false;

View File

@@ -1,4 +1,4 @@
namespace WorkClub.Application; namespace WorkClub.Application;
public class Class1 public class Class1
{ {

View File

@@ -1,4 +1,4 @@
namespace WorkClub.Infrastructure; namespace WorkClub.Infrastructure;
public class Class1 public class Class1
{ {

View File

@@ -18,7 +18,7 @@ public class AppDbContext : DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
} }
} }

View File

@@ -39,10 +39,11 @@ public class SaveChangesTenantInterceptor : SaveChangesInterceptor
private void SetTenantIdForNewEntities(DbContext? context) private void SetTenantIdForNewEntities(DbContext? context)
{ {
if (context == null) return; if (context == null)
return;
var tenantId = _tenantAccessor.MultiTenantContext?.TenantInfo?.Identifier; var tenantId = _tenantAccessor.MultiTenantContext?.TenantInfo?.Identifier;
if (string.IsNullOrWhiteSpace(tenantId)) if (string.IsNullOrWhiteSpace(tenantId))
{ {
_logger.LogWarning("No tenant context available for SaveChanges"); _logger.LogWarning("No tenant context available for SaveChanges");
@@ -61,7 +62,7 @@ public class SaveChangesTenantInterceptor : SaveChangesInterceptor
if (string.IsNullOrWhiteSpace(tenantEntity.TenantId)) if (string.IsNullOrWhiteSpace(tenantEntity.TenantId))
{ {
tenantEntity.TenantId = tenantId; tenantEntity.TenantId = tenantId;
_logger.LogDebug("Set TenantId for entity {EntityType}: {TenantId}", _logger.LogDebug("Set TenantId for entity {EntityType}: {TenantId}",
entry.Entity.GetType().Name, tenantId); entry.Entity.GetType().Name, tenantId);
} }
} }

View File

@@ -29,7 +29,7 @@ public class TenantDbConnectionInterceptor : DbConnectionInterceptor
await base.ConnectionOpeningAsync(connection, eventData, result, cancellationToken); await base.ConnectionOpeningAsync(connection, eventData, result, cancellationToken);
var tenantId = _tenantAccessor.MultiTenantContext?.TenantInfo?.Identifier; var tenantId = _tenantAccessor.MultiTenantContext?.TenantInfo?.Identifier;
if (string.IsNullOrWhiteSpace(tenantId)) if (string.IsNullOrWhiteSpace(tenantId))
{ {
_logger.LogWarning("No tenant context available for database connection"); _logger.LogWarning("No tenant context available for database connection");
@@ -40,7 +40,7 @@ public class TenantDbConnectionInterceptor : DbConnectionInterceptor
{ {
await using var command = npgsqlConnection.CreateCommand(); await using var command = npgsqlConnection.CreateCommand();
command.CommandText = $"SET LOCAL app.current_tenant_id = '{tenantId}'"; command.CommandText = $"SET LOCAL app.current_tenant_id = '{tenantId}'";
try try
{ {
await command.ExecuteNonQueryAsync(cancellationToken); await command.ExecuteNonQueryAsync(cancellationToken);
@@ -61,7 +61,7 @@ public class TenantDbConnectionInterceptor : DbConnectionInterceptor
base.ConnectionOpened(connection, eventData); base.ConnectionOpened(connection, eventData);
var tenantId = _tenantAccessor.MultiTenantContext?.TenantInfo?.Identifier; var tenantId = _tenantAccessor.MultiTenantContext?.TenantInfo?.Identifier;
if (string.IsNullOrWhiteSpace(tenantId)) if (string.IsNullOrWhiteSpace(tenantId))
{ {
_logger.LogWarning("No tenant context available for database connection"); _logger.LogWarning("No tenant context available for database connection");
@@ -72,7 +72,7 @@ public class TenantDbConnectionInterceptor : DbConnectionInterceptor
{ {
using var command = npgsqlConnection.CreateCommand(); using var command = npgsqlConnection.CreateCommand();
command.CommandText = $"SET LOCAL app.current_tenant_id = '{tenantId}'"; command.CommandText = $"SET LOCAL app.current_tenant_id = '{tenantId}'";
try try
{ {
command.ExecuteNonQuery(); command.ExecuteNonQuery();

View File

@@ -1,4 +1,4 @@
using System; using System;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable #nullable disable

View File

@@ -27,7 +27,7 @@ public class TenantProvider : ITenantProvider
{ {
throw new InvalidOperationException("Tenant context is not available"); throw new InvalidOperationException("Tenant context is not available");
} }
return tenantInfo.Identifier; return tenantInfo.Identifier;
} }
@@ -41,7 +41,7 @@ public class TenantProvider : ITenantProvider
var tenantId = GetTenantId(); var tenantId = GetTenantId();
var clubsClaim = httpContext.User.FindFirst("clubs")?.Value; var clubsClaim = httpContext.User.FindFirst("clubs")?.Value;
if (string.IsNullOrEmpty(clubsClaim)) if (string.IsNullOrEmpty(clubsClaim))
{ {
throw new InvalidOperationException("User does not have clubs claim"); throw new InvalidOperationException("User does not have clubs claim");

View File

@@ -20,7 +20,7 @@ public class ClubEndpointsTests : IntegrationTestBase
{ {
using var scope = Factory.Services.CreateScope(); using var scope = Factory.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
// Clean up and setup test data // Clean up and setup test data
context.Clubs.RemoveRange(context.Clubs); context.Clubs.RemoveRange(context.Clubs);
context.Members.RemoveRange(context.Members); context.Members.RemoveRange(context.Members);
@@ -29,7 +29,7 @@ public class ClubEndpointsTests : IntegrationTestBase
// Create test clubs // Create test clubs
var club1Id = Guid.NewGuid(); var club1Id = Guid.NewGuid();
var club2Id = Guid.NewGuid(); var club2Id = Guid.NewGuid();
var club1 = new Club var club1 = new Club
{ {
Id = club1Id, Id = club1Id,
@@ -107,8 +107,8 @@ public class ClubEndpointsTests : IntegrationTestBase
{ {
// Arrange - admin is member of 2 clubs // Arrange - admin is member of 2 clubs
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("admin@test.com", new Dictionary<string, string> AuthenticateAs("admin@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Admin", ["tenant1"] = "Admin",
["tenant2"] = "Member" ["tenant2"] = "Member"
}, userId: "admin-user-id"); }, userId: "admin-user-id");
@@ -118,7 +118,7 @@ public class ClubEndpointsTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var clubs = await response.Content.ReadFromJsonAsync<List<ClubListResponse>>(); var clubs = await response.Content.ReadFromJsonAsync<List<ClubListResponse>>();
Assert.NotNull(clubs); Assert.NotNull(clubs);
Assert.Equal(2, clubs.Count); Assert.Equal(2, clubs.Count);
@@ -131,8 +131,8 @@ public class ClubEndpointsTests : IntegrationTestBase
{ {
// Arrange - manager is only member of club1 // Arrange - manager is only member of club1
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("manager@test.com", new Dictionary<string, string> AuthenticateAs("manager@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Manager" ["tenant1"] = "Manager"
}, userId: "manager-user-id"); }, userId: "manager-user-id");
@@ -141,7 +141,7 @@ public class ClubEndpointsTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var clubs = await response.Content.ReadFromJsonAsync<List<ClubListResponse>>(); var clubs = await response.Content.ReadFromJsonAsync<List<ClubListResponse>>();
Assert.NotNull(clubs); Assert.NotNull(clubs);
Assert.Single(clubs); Assert.Single(clubs);
@@ -153,8 +153,8 @@ public class ClubEndpointsTests : IntegrationTestBase
{ {
// Arrange // Arrange
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("admin@test.com", new Dictionary<string, string> AuthenticateAs("admin@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Admin" ["tenant1"] = "Admin"
}, userId: "admin-user-id"); }, userId: "admin-user-id");
@@ -163,7 +163,7 @@ public class ClubEndpointsTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var club = await response.Content.ReadFromJsonAsync<ClubDetailResponse>(); var club = await response.Content.ReadFromJsonAsync<ClubDetailResponse>();
Assert.NotNull(club); Assert.NotNull(club);
Assert.Equal("Test Tennis Club", club.Name); Assert.Equal("Test Tennis Club", club.Name);
@@ -176,8 +176,8 @@ public class ClubEndpointsTests : IntegrationTestBase
{ {
// Arrange // Arrange
SetTenant("tenant2"); SetTenant("tenant2");
AuthenticateAs("admin@test.com", new Dictionary<string, string> AuthenticateAs("admin@test.com", new Dictionary<string, string>
{ {
["tenant2"] = "Member" ["tenant2"] = "Member"
}, userId: "admin-user-id"); }, userId: "admin-user-id");
@@ -186,7 +186,7 @@ public class ClubEndpointsTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var club = await response.Content.ReadFromJsonAsync<ClubDetailResponse>(); var club = await response.Content.ReadFromJsonAsync<ClubDetailResponse>();
Assert.NotNull(club); Assert.NotNull(club);
Assert.Equal("Test Cycling Club", club.Name); Assert.Equal("Test Cycling Club", club.Name);
@@ -197,8 +197,8 @@ public class ClubEndpointsTests : IntegrationTestBase
public async Task GetClubsCurrent_NoTenantContext_ReturnsBadRequest() public async Task GetClubsCurrent_NoTenantContext_ReturnsBadRequest()
{ {
// Arrange - no tenant header set // Arrange - no tenant header set
AuthenticateAs("admin@test.com", new Dictionary<string, string> AuthenticateAs("admin@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Admin" ["tenant1"] = "Admin"
}, userId: "admin-user-id"); }, userId: "admin-user-id");

View File

@@ -78,10 +78,10 @@ public class MigrationTests : IAsyncLifetime
// TenantId indexes // TenantId indexes
Assert.Contains(indexes, i => i.Contains("tenant_id")); Assert.Contains(indexes, i => i.Contains("tenant_id"));
// ClubId indexes // ClubId indexes
Assert.Contains(indexes, i => i.Contains("club_id")); Assert.Contains(indexes, i => i.Contains("club_id"));
// Status indexes for WorkItem // Status indexes for WorkItem
Assert.Contains(indexes, i => i.Contains("status")); Assert.Contains(indexes, i => i.Contains("status"));
} }

View File

@@ -24,7 +24,7 @@ public class RlsTests : IAsyncLifetime
await _container.StartAsync(); await _container.StartAsync();
_connectionString = _container.GetConnectionString(); _connectionString = _container.GetConnectionString();
_adminConnectionString = _connectionString.Replace("app_user", "app_admin") _adminConnectionString = _connectionString.Replace("app_user", "app_admin")
.Replace("apppass", "adminpass"); .Replace("apppass", "adminpass");
@@ -62,7 +62,7 @@ public class RlsTests : IAsyncLifetime
await using var connection = new NpgsqlConnection(_connectionString); await using var connection = new NpgsqlConnection(_connectionString);
await connection.OpenAsync(); await connection.OpenAsync();
await connection.ExecuteAsync("SET LOCAL app.current_tenant_id = 'tenant-1'"); await connection.ExecuteAsync("SET LOCAL app.current_tenant_id = 'tenant-1'");
var clubs = (await connection.QueryAsync<Club>( var clubs = (await connection.QueryAsync<Club>(
@@ -79,7 +79,7 @@ public class RlsTests : IAsyncLifetime
await using var connection = new NpgsqlConnection(_connectionString); await using var connection = new NpgsqlConnection(_connectionString);
await connection.OpenAsync(); await connection.OpenAsync();
await connection.ExecuteAsync("SET LOCAL app.current_tenant_id = 'tenant-1'"); await connection.ExecuteAsync("SET LOCAL app.current_tenant_id = 'tenant-1'");
var tenant1Clubs = (await connection.QueryAsync<Club>( var tenant1Clubs = (await connection.QueryAsync<Club>(
"SELECT * FROM clubs")).ToList(); "SELECT * FROM clubs")).ToList();
@@ -92,7 +92,7 @@ public class RlsTests : IAsyncLifetime
Assert.NotEmpty(tenant2Clubs); Assert.NotEmpty(tenant2Clubs);
Assert.All(tenant1Clubs, c => Assert.Equal("tenant-1", c.TenantId)); Assert.All(tenant1Clubs, c => Assert.Equal("tenant-1", c.TenantId));
Assert.All(tenant2Clubs, c => Assert.Equal("tenant-2", c.TenantId)); Assert.All(tenant2Clubs, c => Assert.Equal("tenant-2", c.TenantId));
var tenant1Ids = tenant1Clubs.Select(c => c.Id).ToHashSet(); var tenant1Ids = tenant1Clubs.Select(c => c.Id).ToHashSet();
var tenant2Ids = tenant2Clubs.Select(c => c.Id).ToHashSet(); var tenant2Ids = tenant2Clubs.Select(c => c.Id).ToHashSet();
Assert.Empty(tenant1Ids.Intersect(tenant2Ids)); Assert.Empty(tenant1Ids.Intersect(tenant2Ids));
@@ -105,7 +105,7 @@ public class RlsTests : IAsyncLifetime
await using var connection = new NpgsqlConnection(_connectionString); await using var connection = new NpgsqlConnection(_connectionString);
await connection.OpenAsync(); await connection.OpenAsync();
await connection.ExecuteAsync("SET LOCAL app.current_tenant_id = 'tenant-1'"); await connection.ExecuteAsync("SET LOCAL app.current_tenant_id = 'tenant-1'");
var tenant1Count = await connection.ExecuteScalarAsync<int>( var tenant1Count = await connection.ExecuteScalarAsync<int>(
"SELECT COUNT(*) FROM work_items"); "SELECT COUNT(*) FROM work_items");
@@ -141,7 +141,7 @@ public class RlsTests : IAsyncLifetime
await using var connection = new NpgsqlConnection(_connectionString); await using var connection = new NpgsqlConnection(_connectionString);
await connection.OpenAsync(); await connection.OpenAsync();
await connection.ExecuteAsync("SET LOCAL app.current_tenant_id = 'tenant-1'"); await connection.ExecuteAsync("SET LOCAL app.current_tenant_id = 'tenant-1'");
var signups = (await connection.QueryAsync<ShiftSignup>( var signups = (await connection.QueryAsync<ShiftSignup>(
"SELECT * FROM shift_signups")).ToList(); "SELECT * FROM shift_signups")).ToList();
@@ -164,7 +164,7 @@ public class RlsTests : IAsyncLifetime
var club1Id = Guid.NewGuid(); var club1Id = Guid.NewGuid();
var club2Id = Guid.NewGuid(); var club2Id = Guid.NewGuid();
await adminConn.ExecuteAsync(@" await adminConn.ExecuteAsync(@"
INSERT INTO clubs (id, tenant_id, name, sport_type, created_at, updated_at) INSERT INTO clubs (id, tenant_id, name, sport_type, created_at, updated_at)
VALUES (@Id1, 'tenant-1', 'Club 1', 0, NOW(), NOW()), VALUES (@Id1, 'tenant-1', 'Club 1', 0, NOW(), NOW()),

View File

@@ -18,10 +18,10 @@ public abstract class IntegrationTestBase : IClassFixture<CustomWebApplicationFa
var clubsJson = JsonSerializer.Serialize(clubs); var clubsJson = JsonSerializer.Serialize(clubs);
Client.DefaultRequestHeaders.Remove("X-Test-Clubs"); Client.DefaultRequestHeaders.Remove("X-Test-Clubs");
Client.DefaultRequestHeaders.Add("X-Test-Clubs", clubsJson); Client.DefaultRequestHeaders.Add("X-Test-Clubs", clubsJson);
Client.DefaultRequestHeaders.Remove("X-Test-Email"); Client.DefaultRequestHeaders.Remove("X-Test-Email");
Client.DefaultRequestHeaders.Add("X-Test-Email", email); Client.DefaultRequestHeaders.Add("X-Test-Email", email);
if (!string.IsNullOrEmpty(userId)) if (!string.IsNullOrEmpty(userId))
{ {
Client.DefaultRequestHeaders.Remove("X-Test-UserId"); Client.DefaultRequestHeaders.Remove("X-Test-UserId");

View File

@@ -20,14 +20,14 @@ public class MemberEndpointsTests : IntegrationTestBase
{ {
using var scope = Factory.Services.CreateScope(); using var scope = Factory.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Members.RemoveRange(context.Members); context.Members.RemoveRange(context.Members);
context.Clubs.RemoveRange(context.Clubs); context.Clubs.RemoveRange(context.Clubs);
await context.SaveChangesAsync(); await context.SaveChangesAsync();
var club1Id = Guid.NewGuid(); var club1Id = Guid.NewGuid();
var club2Id = Guid.NewGuid(); var club2Id = Guid.NewGuid();
context.Clubs.AddRange( context.Clubs.AddRange(
new Club new Club
{ {
@@ -109,15 +109,15 @@ public class MemberEndpointsTests : IntegrationTestBase
public async Task GetMembers_ReturnsOnlyCurrentTenantMembers() public async Task GetMembers_ReturnsOnlyCurrentTenantMembers()
{ {
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("admin@test.com", new Dictionary<string, string> AuthenticateAs("admin@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Admin" ["tenant1"] = "Admin"
}, userId: "admin-user-id"); }, userId: "admin-user-id");
var response = await Client.GetAsync("/api/members"); var response = await Client.GetAsync("/api/members");
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var members = await response.Content.ReadFromJsonAsync<List<MemberListResponse>>(); var members = await response.Content.ReadFromJsonAsync<List<MemberListResponse>>();
Assert.NotNull(members); Assert.NotNull(members);
Assert.Equal(3, members.Count); Assert.Equal(3, members.Count);
@@ -128,15 +128,15 @@ public class MemberEndpointsTests : IntegrationTestBase
public async Task GetMembers_DifferentTenant_ReturnsDifferentMembers() public async Task GetMembers_DifferentTenant_ReturnsDifferentMembers()
{ {
SetTenant("tenant2"); SetTenant("tenant2");
AuthenticateAs("other@test.com", new Dictionary<string, string> AuthenticateAs("other@test.com", new Dictionary<string, string>
{ {
["tenant2"] = "Member" ["tenant2"] = "Member"
}, userId: "other-user-id"); }, userId: "other-user-id");
var response = await Client.GetAsync("/api/members"); var response = await Client.GetAsync("/api/members");
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var members = await response.Content.ReadFromJsonAsync<List<MemberListResponse>>(); var members = await response.Content.ReadFromJsonAsync<List<MemberListResponse>>();
Assert.NotNull(members); Assert.NotNull(members);
Assert.Single(members); Assert.Single(members);
@@ -147,8 +147,8 @@ public class MemberEndpointsTests : IntegrationTestBase
public async Task GetMembers_AsViewer_ReturnsForbidden() public async Task GetMembers_AsViewer_ReturnsForbidden()
{ {
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("viewer@test.com", new Dictionary<string, string> AuthenticateAs("viewer@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Viewer" ["tenant1"] = "Viewer"
}, userId: "viewer-user-id"); }, userId: "viewer-user-id");
@@ -165,15 +165,15 @@ public class MemberEndpointsTests : IntegrationTestBase
var member = await context.Members.FirstAsync(m => m.Email == "manager@test.com"); var member = await context.Members.FirstAsync(m => m.Email == "manager@test.com");
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("admin@test.com", new Dictionary<string, string> AuthenticateAs("admin@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Admin" ["tenant1"] = "Admin"
}, userId: "admin-user-id"); }, userId: "admin-user-id");
var response = await Client.GetAsync($"/api/members/{member.Id}"); var response = await Client.GetAsync($"/api/members/{member.Id}");
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<MemberDetailResponse>(); var result = await response.Content.ReadFromJsonAsync<MemberDetailResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Equal(member.Id, result.Id); Assert.Equal(member.Id, result.Id);
@@ -190,8 +190,8 @@ public class MemberEndpointsTests : IntegrationTestBase
var tenant1Member = await context.Members.FirstAsync(m => m.TenantId == "tenant1"); var tenant1Member = await context.Members.FirstAsync(m => m.TenantId == "tenant1");
SetTenant("tenant2"); SetTenant("tenant2");
AuthenticateAs("other@test.com", new Dictionary<string, string> AuthenticateAs("other@test.com", new Dictionary<string, string>
{ {
["tenant2"] = "Member" ["tenant2"] = "Member"
}, userId: "other-user-id"); }, userId: "other-user-id");
@@ -204,15 +204,15 @@ public class MemberEndpointsTests : IntegrationTestBase
public async Task GetMembersMe_ReturnsCurrentUserMembership() public async Task GetMembersMe_ReturnsCurrentUserMembership()
{ {
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("manager@test.com", new Dictionary<string, string> AuthenticateAs("manager@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Manager" ["tenant1"] = "Manager"
}, userId: "manager-user-id"); }, userId: "manager-user-id");
var response = await Client.GetAsync("/api/members/me"); var response = await Client.GetAsync("/api/members/me");
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<MemberDetailResponse>(); var result = await response.Content.ReadFromJsonAsync<MemberDetailResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Equal("Manager User", result.DisplayName); Assert.Equal("Manager User", result.DisplayName);
@@ -224,8 +224,8 @@ public class MemberEndpointsTests : IntegrationTestBase
public async Task MemberAutoSync_NewUser_CreatesMembeRecordFromJwt() public async Task MemberAutoSync_NewUser_CreatesMembeRecordFromJwt()
{ {
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("newuser@test.com", new Dictionary<string, string> AuthenticateAs("newuser@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Member" ["tenant1"] = "Member"
}, userId: "new-user-id"); }, userId: "new-user-id");
@@ -236,7 +236,7 @@ public class MemberEndpointsTests : IntegrationTestBase
using var scope = Factory.Services.CreateScope(); using var scope = Factory.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var syncedMember = await context.Members.FirstOrDefaultAsync(m => m.ExternalUserId == "new-user-id"); var syncedMember = await context.Members.FirstOrDefaultAsync(m => m.ExternalUserId == "new-user-id");
Assert.NotNull(syncedMember); Assert.NotNull(syncedMember);
Assert.Equal("newuser@test.com", syncedMember.Email); Assert.Equal("newuser@test.com", syncedMember.Email);
Assert.Equal("tenant1", syncedMember.TenantId); Assert.Equal("tenant1", syncedMember.TenantId);
@@ -251,8 +251,8 @@ public class MemberEndpointsTests : IntegrationTestBase
var initialCount = await context1.Members.CountAsync(m => m.ExternalUserId == "admin-user-id"); var initialCount = await context1.Members.CountAsync(m => m.ExternalUserId == "admin-user-id");
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("admin@test.com", new Dictionary<string, string> AuthenticateAs("admin@test.com", new Dictionary<string, string>
{ {
["tenant1"] = "Admin" ["tenant1"] = "Admin"
}, userId: "admin-user-id"); }, userId: "admin-user-id");
@@ -262,7 +262,7 @@ public class MemberEndpointsTests : IntegrationTestBase
using var scope2 = Factory.Services.CreateScope(); using var scope2 = Factory.Services.CreateScope();
var context2 = scope2.ServiceProvider.GetRequiredService<AppDbContext>(); var context2 = scope2.ServiceProvider.GetRequiredService<AppDbContext>();
var finalCount = await context2.Members.CountAsync(m => m.ExternalUserId == "admin-user-id"); var finalCount = await context2.Members.CountAsync(m => m.ExternalUserId == "admin-user-id");
Assert.Equal(initialCount, finalCount); Assert.Equal(initialCount, finalCount);
} }
} }

View File

@@ -34,7 +34,7 @@ public class TenantValidationTests : IClassFixture<CustomWebApplicationFactory>
{ "club-1", "admin" } { "club-1", "admin" }
}; };
var token = CreateTestJwt(clubs); var token = CreateTestJwt(clubs);
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
_client.DefaultRequestHeaders.Add("X-Tenant-Id", "club-1"); _client.DefaultRequestHeaders.Add("X-Tenant-Id", "club-1");
@@ -54,7 +54,7 @@ public class TenantValidationTests : IClassFixture<CustomWebApplicationFactory>
{ "club-1", "admin" } { "club-1", "admin" }
}; };
var token = CreateTestJwt(clubs); var token = CreateTestJwt(clubs);
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
_client.DefaultRequestHeaders.Add("X-Tenant-Id", "club-2"); // User not member of club-2 _client.DefaultRequestHeaders.Add("X-Tenant-Id", "club-2"); // User not member of club-2
@@ -74,7 +74,7 @@ public class TenantValidationTests : IClassFixture<CustomWebApplicationFactory>
{ "club-1", "admin" } { "club-1", "admin" }
}; };
var token = CreateTestJwt(clubs); var token = CreateTestJwt(clubs);
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
// No X-Tenant-Id header // No X-Tenant-Id header
@@ -133,7 +133,7 @@ public class CustomWebApplicationFactory : WebApplicationFactory<Program>
{ {
services.AddAuthentication("TestScheme") services.AddAuthentication("TestScheme")
.AddScheme<AuthenticationSchemeOptions, TestAuthHandler>("TestScheme", options => { }); .AddScheme<AuthenticationSchemeOptions, TestAuthHandler>("TestScheme", options => { });
services.AddAuthorization(); services.AddAuthorization();
}); });
@@ -157,19 +157,19 @@ public class TestAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions
protected override Task<AuthenticateResult> HandleAuthenticateAsync() protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{ {
var authHeader = Request.Headers.Authorization.ToString(); var authHeader = Request.Headers.Authorization.ToString();
if (string.IsNullOrEmpty(authHeader) || !authHeader.StartsWith("Bearer ")) if (string.IsNullOrEmpty(authHeader) || !authHeader.StartsWith("Bearer "))
{ {
return Task.FromResult(AuthenticateResult.NoResult()); return Task.FromResult(AuthenticateResult.NoResult());
} }
var token = authHeader.Substring("Bearer ".Length).Trim(); var token = authHeader.Substring("Bearer ".Length).Trim();
try try
{ {
var handler = new JwtSecurityTokenHandler(); var handler = new JwtSecurityTokenHandler();
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("test-secret-key-for-jwt-signing-must-be-at-least-32-chars")); var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("test-secret-key-for-jwt-signing-must-be-at-least-32-chars"));
var validationParameters = new TokenValidationParameters var validationParameters = new TokenValidationParameters
{ {
ValidateIssuer = true, ValidateIssuer = true,
@@ -183,7 +183,7 @@ public class TestAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions
var principal = handler.ValidateToken(token, validationParameters, out _); var principal = handler.ValidateToken(token, validationParameters, out _);
var ticket = new AuthenticationTicket(principal, "TestScheme"); var ticket = new AuthenticationTicket(principal, "TestScheme");
return Task.FromResult(AuthenticateResult.Success(ticket)); return Task.FromResult(AuthenticateResult.Success(ticket));
} }
catch (Exception ex) catch (Exception ex)

View File

@@ -19,7 +19,7 @@ public class ShiftCrudTests : IntegrationTestBase
{ {
using var scope = Factory.Services.CreateScope(); using var scope = Factory.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
// Clean up existing test data // Clean up existing test data
context.ShiftSignups.RemoveRange(context.ShiftSignups); context.ShiftSignups.RemoveRange(context.ShiftSignups);
context.Shifts.RemoveRange(context.Shifts); context.Shifts.RemoveRange(context.Shifts);
@@ -31,7 +31,7 @@ public class ShiftCrudTests : IntegrationTestBase
{ {
// Arrange // Arrange
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("manager@test.com", new Dictionary<string, string> { ["tenant1"] = "Manager" }); AuthenticateAs("manager@test.com", new Dictionary<string, string> { ["tenant1"] = "Manager" });
@@ -51,7 +51,7 @@ public class ShiftCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.Created, response.StatusCode); Assert.Equal(HttpStatusCode.Created, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<ShiftDetailResponse>(); var result = await response.Content.ReadFromJsonAsync<ShiftDetailResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Equal("Morning Shift", result.Title); Assert.Equal("Morning Shift", result.Title);
@@ -64,7 +64,7 @@ public class ShiftCrudTests : IntegrationTestBase
{ {
// Arrange // Arrange
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("viewer@test.com", new Dictionary<string, string> { ["tenant1"] = "Viewer" }); AuthenticateAs("viewer@test.com", new Dictionary<string, string> { ["tenant1"] = "Viewer" });
@@ -90,11 +90,11 @@ public class ShiftCrudTests : IntegrationTestBase
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
// Shift in date range // Shift in date range
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
@@ -109,7 +109,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
// Shift outside date range // Shift outside date range
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
@@ -124,7 +124,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -139,7 +139,7 @@ public class ShiftCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<ShiftListResponse>(); var result = await response.Content.ReadFromJsonAsync<ShiftListResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Single(result.Items); Assert.Single(result.Items);
@@ -155,11 +155,11 @@ public class ShiftCrudTests : IntegrationTestBase
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var memberId = Guid.NewGuid(); var memberId = Guid.NewGuid();
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -175,7 +175,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
context.ShiftSignups.Add(new ShiftSignup context.ShiftSignups.Add(new ShiftSignup
{ {
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
@@ -184,7 +184,7 @@ public class ShiftCrudTests : IntegrationTestBase
MemberId = memberId, MemberId = memberId,
SignedUpAt = now SignedUpAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -196,7 +196,7 @@ public class ShiftCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<ShiftDetailResponse>(); var result = await response.Content.ReadFromJsonAsync<ShiftDetailResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Equal(shiftId, result.Id); Assert.Equal(shiftId, result.Id);
@@ -213,11 +213,11 @@ public class ShiftCrudTests : IntegrationTestBase
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -231,7 +231,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -249,7 +249,7 @@ public class ShiftCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<ShiftDetailResponse>(); var result = await response.Content.ReadFromJsonAsync<ShiftDetailResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Equal("Updated Title", result.Title); Assert.Equal("Updated Title", result.Title);
@@ -264,11 +264,11 @@ public class ShiftCrudTests : IntegrationTestBase
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -282,7 +282,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -294,7 +294,7 @@ public class ShiftCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
// Verify shift is deleted // Verify shift is deleted
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
@@ -312,11 +312,11 @@ public class ShiftCrudTests : IntegrationTestBase
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -330,7 +330,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -352,11 +352,11 @@ public class ShiftCrudTests : IntegrationTestBase
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -370,7 +370,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -382,7 +382,7 @@ public class ShiftCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
// Verify signup was created // Verify signup was created
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
@@ -400,11 +400,11 @@ public class ShiftCrudTests : IntegrationTestBase
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -418,7 +418,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
// Add one signup to fill capacity // Add one signup to fill capacity
context.ShiftSignups.Add(new ShiftSignup context.ShiftSignups.Add(new ShiftSignup
{ {
@@ -428,7 +428,7 @@ public class ShiftCrudTests : IntegrationTestBase
MemberId = Guid.NewGuid(), MemberId = Guid.NewGuid(),
SignedUpAt = now SignedUpAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -450,11 +450,11 @@ public class ShiftCrudTests : IntegrationTestBase
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -468,7 +468,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now.AddDays(-1), CreatedAt = now.AddDays(-1),
UpdatedAt = now.AddDays(-1) UpdatedAt = now.AddDays(-1)
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -491,11 +491,11 @@ public class ShiftCrudTests : IntegrationTestBase
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var memberId = Guid.Parse("00000000-0000-0000-0000-000000000001"); // Fixed member ID var memberId = Guid.Parse("00000000-0000-0000-0000-000000000001"); // Fixed member ID
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -509,7 +509,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
// Add existing signup // Add existing signup
context.ShiftSignups.Add(new ShiftSignup context.ShiftSignups.Add(new ShiftSignup
{ {
@@ -519,7 +519,7 @@ public class ShiftCrudTests : IntegrationTestBase
MemberId = memberId, MemberId = memberId,
SignedUpAt = now SignedUpAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -542,11 +542,11 @@ public class ShiftCrudTests : IntegrationTestBase
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var memberId = Guid.Parse("00000000-0000-0000-0000-000000000001"); var memberId = Guid.Parse("00000000-0000-0000-0000-000000000001");
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -560,7 +560,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
context.ShiftSignups.Add(new ShiftSignup context.ShiftSignups.Add(new ShiftSignup
{ {
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
@@ -569,7 +569,7 @@ public class ShiftCrudTests : IntegrationTestBase
MemberId = memberId, MemberId = memberId,
SignedUpAt = now SignedUpAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -581,7 +581,7 @@ public class ShiftCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
// Verify signup was deleted // Verify signup was deleted
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
@@ -599,11 +599,11 @@ public class ShiftCrudTests : IntegrationTestBase
var clubId = Guid.NewGuid(); var clubId = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
var now = DateTimeOffset.UtcNow; var now = DateTimeOffset.UtcNow;
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Shifts.Add(new Shift context.Shifts.Add(new Shift
{ {
Id = shiftId, Id = shiftId,
@@ -617,7 +617,7 @@ public class ShiftCrudTests : IntegrationTestBase
CreatedAt = now, CreatedAt = now,
UpdatedAt = now UpdatedAt = now
}); });
// Add one signup (leaving one slot) // Add one signup (leaving one slot)
context.ShiftSignups.Add(new ShiftSignup context.ShiftSignups.Add(new ShiftSignup
{ {
@@ -627,29 +627,29 @@ public class ShiftCrudTests : IntegrationTestBase
MemberId = Guid.NewGuid(), MemberId = Guid.NewGuid(),
SignedUpAt = now SignedUpAt = now
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
SetTenant("tenant1"); SetTenant("tenant1");
// Act - Simulate two concurrent requests // Act - Simulate two concurrent requests
var member1 = Guid.NewGuid(); var member1 = Guid.NewGuid();
var member2 = Guid.NewGuid(); var member2 = Guid.NewGuid();
AuthenticateAs("member1@test.com", new Dictionary<string, string> { ["tenant1"] = "Member" }, member1.ToString()); AuthenticateAs("member1@test.com", new Dictionary<string, string> { ["tenant1"] = "Member" }, member1.ToString());
var response1Task = Client.PostAsync($"/api/shifts/{shiftId}/signup", null); var response1Task = Client.PostAsync($"/api/shifts/{shiftId}/signup", null);
AuthenticateAs("member2@test.com", new Dictionary<string, string> { ["tenant1"] = "Member" }, member2.ToString()); AuthenticateAs("member2@test.com", new Dictionary<string, string> { ["tenant1"] = "Member" }, member2.ToString());
var response2Task = Client.PostAsync($"/api/shifts/{shiftId}/signup", null); var response2Task = Client.PostAsync($"/api/shifts/{shiftId}/signup", null);
var responses = await Task.WhenAll(response1Task, response2Task); var responses = await Task.WhenAll(response1Task, response2Task);
// Assert - One should succeed (200), one should fail (409) // Assert - One should succeed (200), one should fail (409)
var statuses = responses.Select(r => r.StatusCode).OrderBy(s => s).ToList(); var statuses = responses.Select(r => r.StatusCode).OrderBy(s => s).ToList();
Assert.Contains(HttpStatusCode.OK, statuses); Assert.Contains(HttpStatusCode.OK, statuses);
Assert.Contains(HttpStatusCode.Conflict, statuses); Assert.Contains(HttpStatusCode.Conflict, statuses);
// Verify only 2 total signups exist (capacity limit enforced) // Verify only 2 total signups exist (capacity limit enforced)
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {

View File

@@ -20,7 +20,7 @@ public class TaskCrudTests : IntegrationTestBase
{ {
using var scope = Factory.Services.CreateScope(); using var scope = Factory.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
// Clean up existing test data // Clean up existing test data
context.WorkItems.RemoveRange(context.WorkItems); context.WorkItems.RemoveRange(context.WorkItems);
await context.SaveChangesAsync(); await context.SaveChangesAsync();
@@ -32,7 +32,7 @@ public class TaskCrudTests : IntegrationTestBase
// Arrange // Arrange
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("manager@test.com", new Dictionary<string, string> { ["tenant1"] = "Manager" }); AuthenticateAs("manager@test.com", new Dictionary<string, string> { ["tenant1"] = "Manager" });
@@ -48,7 +48,7 @@ public class TaskCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.Created, response.StatusCode); Assert.Equal(HttpStatusCode.Created, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<TaskDetailResponse>(); var result = await response.Content.ReadFromJsonAsync<TaskDetailResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Equal("New Task", result.Title); Assert.Equal("New Task", result.Title);
@@ -62,7 +62,7 @@ public class TaskCrudTests : IntegrationTestBase
{ {
// Arrange // Arrange
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
SetTenant("tenant1"); SetTenant("tenant1");
AuthenticateAs("viewer@test.com", new Dictionary<string, string> { ["tenant1"] = "Viewer" }); AuthenticateAs("viewer@test.com", new Dictionary<string, string> { ["tenant1"] = "Viewer" });
@@ -85,11 +85,11 @@ public class TaskCrudTests : IntegrationTestBase
// Arrange // Arrange
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
// Create tasks for tenant1 // Create tasks for tenant1
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
@@ -102,7 +102,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
@@ -114,7 +114,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
// Create task for tenant2 // Create task for tenant2
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
@@ -127,7 +127,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -139,7 +139,7 @@ public class TaskCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<TaskListResponse>(); var result = await response.Content.ReadFromJsonAsync<TaskListResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Equal(2, result.Items.Count); Assert.Equal(2, result.Items.Count);
@@ -153,11 +153,11 @@ public class TaskCrudTests : IntegrationTestBase
// Arrange // Arrange
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
@@ -169,7 +169,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
@@ -181,7 +181,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -193,7 +193,7 @@ public class TaskCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<TaskListResponse>(); var result = await response.Content.ReadFromJsonAsync<TaskListResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Single(result.Items); Assert.Single(result.Items);
@@ -208,11 +208,11 @@ public class TaskCrudTests : IntegrationTestBase
var taskId = Guid.NewGuid(); var taskId = Guid.NewGuid();
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
Id = taskId, Id = taskId,
@@ -225,7 +225,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -237,7 +237,7 @@ public class TaskCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<TaskDetailResponse>(); var result = await response.Content.ReadFromJsonAsync<TaskDetailResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Equal(taskId, result.Id); Assert.Equal(taskId, result.Id);
@@ -252,11 +252,11 @@ public class TaskCrudTests : IntegrationTestBase
var taskId = Guid.NewGuid(); var taskId = Guid.NewGuid();
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
Id = taskId, Id = taskId,
@@ -268,7 +268,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -286,7 +286,7 @@ public class TaskCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<TaskDetailResponse>(); var result = await response.Content.ReadFromJsonAsync<TaskDetailResponse>();
Assert.NotNull(result); Assert.NotNull(result);
Assert.Equal("Updated Title", result.Title); Assert.Equal("Updated Title", result.Title);
@@ -300,11 +300,11 @@ public class TaskCrudTests : IntegrationTestBase
var taskId = Guid.NewGuid(); var taskId = Guid.NewGuid();
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
Id = taskId, Id = taskId,
@@ -316,7 +316,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -342,11 +342,11 @@ public class TaskCrudTests : IntegrationTestBase
var taskId = Guid.NewGuid(); var taskId = Guid.NewGuid();
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
Id = taskId, Id = taskId,
@@ -358,7 +358,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -382,7 +382,7 @@ public class TaskCrudTests : IntegrationTestBase
// Second update (should detect concurrency conflict if RowVersion is checked) // Second update (should detect concurrency conflict if RowVersion is checked)
var updateRequest2 = new { Title = "Update 2" }; var updateRequest2 = new { Title = "Update 2" };
// Act // Act
var response2 = await Client.PatchAsync($"/api/tasks/{taskId}", JsonContent.Create(updateRequest2)); var response2 = await Client.PatchAsync($"/api/tasks/{taskId}", JsonContent.Create(updateRequest2));
@@ -397,11 +397,11 @@ public class TaskCrudTests : IntegrationTestBase
var taskId = Guid.NewGuid(); var taskId = Guid.NewGuid();
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
Id = taskId, Id = taskId,
@@ -413,7 +413,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@@ -425,7 +425,7 @@ public class TaskCrudTests : IntegrationTestBase
// Assert // Assert
Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
// Verify task is deleted // Verify task is deleted
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
@@ -442,11 +442,11 @@ public class TaskCrudTests : IntegrationTestBase
var taskId = Guid.NewGuid(); var taskId = Guid.NewGuid();
var club1 = Guid.NewGuid(); var club1 = Guid.NewGuid();
var createdBy = Guid.NewGuid(); var createdBy = Guid.NewGuid();
using (var scope = Factory.Services.CreateScope()) using (var scope = Factory.Services.CreateScope())
{ {
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.WorkItems.Add(new WorkItem context.WorkItems.Add(new WorkItem
{ {
Id = taskId, Id = taskId,
@@ -458,7 +458,7 @@ public class TaskCrudTests : IntegrationTestBase
CreatedAt = DateTimeOffset.UtcNow, CreatedAt = DateTimeOffset.UtcNow,
UpdatedAt = DateTimeOffset.UtcNow UpdatedAt = DateTimeOffset.UtcNow
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }

View File

@@ -1,4 +1,4 @@
namespace WorkClub.Tests.Integration; namespace WorkClub.Tests.Integration;
public class UnitTest1 public class UnitTest1
{ {