using Health.Application.Medications; using Health.Domain.Entities; namespace Health.Tests; public sealed class MedicationUpdateTests { [Fact] public async Task Update_CanClearAnExistingEndDate() { var medication = new Medication { Id = Guid.NewGuid(), UserId = Guid.NewGuid(), Name = "阿司匹林", StartDate = new DateOnly(2026, 7, 1), EndDate = new DateOnly(2026, 7, 31), }; var repository = new FakeMedicationRepository(medication); var service = new MedicationService(repository); var updated = await service.UpdateAsync( medication.UserId, medication.Id, new MedicationPatchRequest( null, null, null, null, null, null, null, ClearEndDate: true), CancellationToken.None); Assert.True(updated); Assert.Null(medication.EndDate); Assert.True(repository.Saved); } private sealed class FakeMedicationRepository(Medication medication) : IMedicationRepository { public bool Saved { get; private set; } public Task> ListAsync(Guid userId, string? filter, CancellationToken ct) => Task.FromResult>([medication]); public Task> ListActiveForRemindersAsync(Guid userId, DateOnly today, CancellationToken ct) => Task.FromResult>([medication]); public Task> ListLogsInWindowAsync(Guid userId, DateTime startUtc, DateTime endUtc, CancellationToken ct) => Task.FromResult>([]); public Task GetOwnedAsync(Guid userId, Guid medicationId, CancellationToken ct) => Task.FromResult(medication.UserId == userId && medication.Id == medicationId ? medication : null); public Task ExistsOwnedAsync(Guid userId, Guid medicationId, CancellationToken ct) => Task.FromResult(medication.UserId == userId && medication.Id == medicationId); public Task GetTodayTakenLogAsync(Guid userId, Guid medicationId, DateTime startUtc, DateTime endUtc, CancellationToken ct) => Task.FromResult(null); public Task DoseLogExistsAsync(Guid userId, Guid medicationId, TimeOnly scheduledTime, DateTime startUtc, DateTime endUtc, CancellationToken ct) => Task.FromResult(false); public Task GetDoseLogAsync(Guid userId, Guid medicationId, TimeOnly scheduledTime, DateTime startUtc, DateTime endUtc, CancellationToken ct) => Task.FromResult(null); public Task> ListActiveForReminderScanAsync(CancellationToken ct) => Task.FromResult>([medication]); public Task AddMedicationAsync(Medication value, CancellationToken ct) => Task.CompletedTask; public Task AddLogAsync(MedicationLog log, CancellationToken ct) => Task.CompletedTask; public void DeleteMedication(Medication value) { } public void DeleteLog(MedicationLog log) { } public Task SaveChangesAsync(CancellationToken ct) { Saved = true; return Task.CompletedTask; } } }