Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DP-826 - Rejoin Organisation after being rejected #911

Merged
merged 2 commits into from
Nov 11, 2024
Merged
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
Expand Up @@ -9,7 +9,7 @@
using CO.CDP.OrganisationInformation;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using OrganisationJoinRequest = CO.CDP.Organisation.WebApi.Model.OrganisationJoinRequest;
using OrganisationJoinRequestModel = CO.CDP.Organisation.WebApi.Model.OrganisationJoinRequest;
using Person = CO.CDP.OrganisationInformation.Persistence.Person;

namespace CO.CDP.Organisation.WebApi.Tests.UseCase;
Expand Down Expand Up @@ -72,7 +72,7 @@ public CreateOrganisationJoinRequestUseCaseTests()
}

[Fact]
public async Task Execute_WhenOrganisationIsUnknown_ShouldThrowUnknownOrganisationException()
public async Task Execute_ShouldThrowUnknownOrganisationException_WhenOrganisationIsUnknown()
{
var organisationId = Guid.NewGuid();
var createJoinRequestCommand = new CreateOrganisationJoinRequest { PersonId = Guid.NewGuid() };
Expand All @@ -87,26 +87,50 @@ await action.Should().ThrowAsync<UnknownOrganisationException>()
}

[Fact]
public async Task Execute_WhenOrganisationIsknownAndPersonAlreadyInvited_ShouldThrowPersonAlreadyInvitedToOrganisationException()
public async Task Execute_ShouldUpdateExistingJoinRequest_WhenPersonAlreadyHasPendingRequest()
{
var createJoinRequestCommand = new CreateOrganisationJoinRequest { PersonId = _person.Guid };

var joinRequestId = Guid.NewGuid();
var existingJoinRequest = new CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest
{
Guid = joinRequestId,
Status = OrganisationJoinRequestStatus.Rejected,
Id = default,
Person = null!,
Organisation = null!,
ReviewedBy = null!,
ReviewedOn = default
};

_mockOrganisationRepository.Setup(repo => repo.Find(_organisation.Guid))
.ReturnsAsync(_organisation);

_mockPersonRepository.Setup(repo => repo.Find(_person.Guid))
.ReturnsAsync(_person);

_mockOrganisationJoinRequestRepository.Setup(repo => repo.FindByOrganisationAndPerson(_organisation.Guid, _person.Guid))
.ReturnsAsync(new OrganisationInformation.Persistence.OrganisationJoinRequest() { Guid = Guid.NewGuid(), Status = OrganisationJoinRequestStatus.Pending});
.ReturnsAsync(new OrganisationInformation.Persistence.OrganisationJoinRequest() { Guid = joinRequestId, Status = OrganisationJoinRequestStatus.Rejected });

Func<Task> action = async () => await _useCase.Execute((_organisation.Guid, createJoinRequestCommand));
_mockMapper.Setup(mapper => mapper.Map<OrganisationJoinRequestModel>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()))
.Returns(new OrganisationJoinRequestModel
{
Status = OrganisationJoinRequestStatus.Pending,
Id = default,
Person = null!,
Organisation = null!,
ReviewedBy = null!,
ReviewedOn = default
});

await action.Should().ThrowAsync<PersonAlreadyInvitedToOrganisationException>();
var result = await _useCase.Execute((_organisation.Guid, createJoinRequestCommand));

result.Status.Should().Be(OrganisationJoinRequestStatus.Pending);
_mockOrganisationJoinRequestRepository.Verify(repo => repo.Save(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()), Times.Once);
_mockMapper.Verify(mapper => mapper.Map<OrganisationJoinRequestModel>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()), Times.Once);
}

[Fact]
public async Task Execute_WhenPersonIsUnknown_ShouldThrowUnknownPersonException()
public async Task Execute_ShouldThrowUnknownPersonException_WhenPersonIsUnknown()
{
var personId = Guid.NewGuid();
var createJoinRequestCommand = new CreateOrganisationJoinRequest { PersonId = personId };
Expand Down Expand Up @@ -134,8 +158,8 @@ public async Task Execute_ShouldCreateAndSaveOrganisationJoinRequest()
_mockPersonRepository.Setup(repo => repo.Find(_person.Guid))
.ReturnsAsync(_person);

_mockMapper.Setup(mapper => mapper.Map<OrganisationJoinRequest>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()))
.Returns(new OrganisationJoinRequest
_mockMapper.Setup(mapper => mapper.Map<OrganisationJoinRequestModel>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()))
.Returns(new OrganisationJoinRequestModel
{
Status = OrganisationJoinRequestStatus.Pending,
Id = default,
Expand All @@ -151,7 +175,7 @@ public async Task Execute_ShouldCreateAndSaveOrganisationJoinRequest()
result.Status.Should().Be(OrganisationJoinRequestStatus.Pending);

_mockOrganisationJoinRequestRepository.Verify(repo => repo.Save(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()), Times.Once);
_mockMapper.Verify(mapper => mapper.Map<OrganisationJoinRequest>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()), Times.Once);
_mockMapper.Verify(mapper => mapper.Map<OrganisationJoinRequestModel>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()), Times.Once);
}

[Fact]
Expand All @@ -165,8 +189,8 @@ public async Task ItShouldSendUserRequestSentEmail()
_mockPersonRepository.Setup(repo => repo.Find(_person.Guid))
.ReturnsAsync(_person);

_mockMapper.Setup(mapper => mapper.Map<OrganisationJoinRequest>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()))
.Returns(new OrganisationJoinRequest
_mockMapper.Setup(mapper => mapper.Map<OrganisationJoinRequestModel>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()))
.Returns(new OrganisationJoinRequestModel
{
Status = OrganisationJoinRequestStatus.Pending,
Id = default,
Expand Down Expand Up @@ -222,8 +246,8 @@ public async Task ItShouldSendEmailsToOrgAdmins()
Organisation = null!
}).ToList());

_mockMapper.Setup(mapper => mapper.Map<OrganisationJoinRequest>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()))
.Returns(new OrganisationJoinRequest
_mockMapper.Setup(mapper => mapper.Map<OrganisationJoinRequestModel>(It.IsAny<CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest>()))
.Returns(new OrganisationJoinRequestModel
{
Status = OrganisationJoinRequestStatus.Pending,
Id = default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,24 @@ public async Task<OrganisationJoinRequest> Execute((Guid organisationId, CreateO
?? throw new UnknownPersonException($"Unknown person {command.createOrganisationJoinRequestCommand.PersonId}.");

await GuardPersonIsNotAlreadyAdded(organisation, person);
await GuardPersonIsNotAlreadyInvited(organisation, person);
andymantell marked this conversation as resolved.
Show resolved Hide resolved

var joinRequest = await organisationJoinRequestRepository.FindByOrganisationAndPerson(organisation.Guid, person.Guid);

var organisationJoinRequest = CreateOrganisationJoinRequest(organisation, person);
if (joinRequest != null)
{
joinRequest.Status = OrganisationJoinRequestStatus.Pending;
}
else
{
joinRequest = CreateOrganisationJoinRequest(organisation, person);
}

organisationJoinRequestRepository.Save(organisationJoinRequest);
organisationJoinRequestRepository.Save(joinRequest);

await NotifyUserRequestSent(organisation: organisation, person: person);
await NotifyOrgAdminsOfApprovalRequest(organisation: organisation, person: person);

return mapper.Map<OrganisationJoinRequest>(organisationJoinRequest);
return mapper.Map<OrganisationJoinRequest>(joinRequest);
}

private Persistence.OrganisationJoinRequest CreateOrganisationJoinRequest(
Expand Down Expand Up @@ -161,18 +169,7 @@ private async Task<List<Person>> GetOrganisationAdminUsers(Persistence.Organisat
var organisationPersons = await organisationRepository.FindOrganisationPersons(organisation.Guid);
return organisationPersons.Where(op => op.Scopes.Contains(Constants.OrganisationPersonScope.Admin)).Select(op => op.Person).ToList();
}

private async Task GuardPersonIsNotAlreadyInvited(Persistence.Organisation organisation, Person person)
{
var joinRequest = await organisationJoinRequestRepository.FindByOrganisationAndPerson(organisation.Guid, person.Guid);

if (joinRequest != null)
{
throw new PersonAlreadyInvitedToOrganisationException(
$"Person {person.Guid} already invited to organisation {organisation.Guid}.");
}
}


private async Task GuardPersonIsNotAlreadyAdded(Persistence.Organisation organisation, Person person)
{
var matchingOrganisationPerson = await organisationRepository.FindOrganisationPerson(organisation.Guid, person.Guid);
Expand Down