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
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Hosting.Internal;
using TeachingRecordSystem.Core.DataStore.Postgres;
using TeachingRecordSystem.Core.DataStore.Postgres.Models;
using TeachingRecordSystem.Core.Services.GetAnIdentity;
using TeachingRecordSystem.Core.Services.OneLogin;
using TeachingRecordSystem.Core.Services.Persons;
using TeachingRecordSystem.Core.Services.SupportTasks;
using TeachingRecordSystem.Core.Services.TrnRequests;
using TeachingRecordSystem.Core.Services.Webhooks;

namespace TeachingRecordSystem.Cli;

public partial class Commands
{
public static Command MarkDeceasedCommand(IConfiguration configuration)
{
var trn = new Option<string>("--trn") { Required = true };
var dateOfDeath = new Option<DateOnly>("--date-of-death") { Required = true };
var connectionStringOption = new Option<string>("--connection-string") { Required = true };
var configuredConnectionString = configuration.GetConnectionString("DefaultConnection");
if (configuredConnectionString is not null)
{
connectionStringOption.DefaultValueFactory = _ => configuredConnectionString;
}

var command =
new Command("mark-deceased",
"Marks a person as deceased")
{
trn, connectionStringOption,dateOfDeath
};

command.SetAction(async parseResult =>
{
var connectionString = parseResult.GetRequiredValue(connectionStringOption);
var environment = new HostingEnvironment { EnvironmentName = Environments.Production };

var services = new ServiceCollection()
.AddClock()
.AddDatabase(connectionString)
.AddTrnRequestService(configuration)
.AddPersonService()
.AddOneLoginService()
.AddSupportTaskService()
.AddWebhookOptions(configuration)
.AddWebhookDeliveryService(configuration)
.AddWebhookMessageFactory()
.AddMemoryCache()
.AddIdentityApi(configuration)
.AddEventPublisher()
.AddBackgroundJobScheduler(environment)
.AddHangfire(environment);

services.AddDbContext<IdDbContext>(
options => options.UseInMemoryDatabase("TeacherAuthId"),
contextLifetime: ServiceLifetime.Transient);

var serviceProvider = services.BuildServiceProvider();
using var scope = serviceProvider.CreateScope();
var personService = scope.ServiceProvider.GetRequiredService<PersonService>();
var dbContext = scope.ServiceProvider.GetRequiredService<TrsDbContext>();
var processContext = new ProcessContext(processType: ProcessType.PersonDeceased, now: DateTime.UtcNow,
SystemUser.SystemUserId);
var person = await dbContext.Persons.SingleAsync(x => x.Trn == parseResult.GetRequiredValue(trn));
await personService.DeactivatePersonAsync(
new DeactivatePersonOptions(
PersonId: person.PersonId,
DateOfDeath: parseResult.GetRequiredValue(dateOfDeath)),
processContext);
});

return command;
}
}
3 changes: 2 additions & 1 deletion TeachingRecordSystem/src/TeachingRecordSystem.Cli/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
Commands.CreateResetTrnRequestCommand(configuration),
Commands.CreateImportCapitaFileCommand(configuration),
Commands.CreateImportClaimTestDataCommand(configuration),
Commands.CorrectQualificationStartDate(configuration)
Commands.CorrectQualificationStartDate(configuration),
Commands.MarkDeceasedCommand(configuration)
};

var parseResult = rootCommand.Parse(args);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using System.CommandLine;

namespace TeachingRecordSystem.Cli.Tests.CommandTests;

public class MarkDeceasedTests(IServiceProvider services) : CommandTestBase(services)
{
[Fact]
public async Task MissingTrnOption_ReturnsError()
{
// Arrange
var command = GetCommand();

var parseResult = command.Parse([
"mark-deceased"
]);

// Act
var result = await parseResult.InvokeAsync();

// Assert
Assert.Contains(parseResult.Errors, e => e.Message == "Option '--trn' is required.");
}

[Fact]
public async Task MissingDateOfDeathOption_ReturnsError()
{
// Arrange
var person = await TestData.CreatePersonAsync();

var command = GetCommand();

var parseResult = command.Parse([
"mark-deceased", "--trn", person.Trn
]);

// Act
var result = await parseResult.InvokeAsync();

// Assert
Assert.Contains(parseResult.Errors, e => e.Message == "Option '--date-of-death' is required.");
}

[Fact]
public async Task ValidInvocation_DeactivatesPerson()
{
// Arrange
var person = await TestData.CreatePersonAsync();
var dateOfDeath = Clock.Today.AddDays(-1);

var command = GetCommand();

var parseResult = command.Parse([
"mark-deceased", "--trn", person.Trn,"--date-of-death", dateOfDeath.ToString()
]);

// Act
var result = await parseResult.InvokeAsync();

// Assert
Assert.Equal(0, result);
await WithDbContextAsync(async dbContext =>
{
var updatePerson = await dbContext.Persons
.IgnoreQueryFilters()
.SingleOrDefaultAsync(t => t.Trn == person.Trn);

Assert.NotNull(updatePerson?.DateOfDeath);
Assert.Equal(dateOfDeath, updatePerson.DateOfDeath);
});
}

private Command GetCommand() => Commands.MarkDeceasedCommand(Configuration);
}

Loading