using e_suite.API.Common.models; using e_suite.Database.Audit; using eSuite.Core.Miscellaneous; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Moq; using NUnit.Framework; using UserProfile = eSuite.API.Models.UserProfile; namespace eSuite.API.UnitTests.Controllers.AccountControllerUnitTests; [TestFixture] public class ProfilePostUnitTests : AccountControllerTestBase { [SetUp] public override async Task Setup() { await base.Setup(); } [Test] public async Task ProfilePost_WhenSsoIdNotChanged_UpdatesProfileThenRedirectsToProfileGet() { //Arrange _cookieManagerMock.Setup(x => x.GetSsoIdFromSsoIdCookie(It.IsAny())).ReturnsAsync(() => null); var userId = 99; var email = "email@mail.test"; var displayName = "Testy McTester"; AddAuthorisedUserToController(userId, email, displayName); var userProfile = new UserProfile { Email = "Test@test.test", FirstName = "Testy", MiddleNames = "The tested", LastName = "McTester", SsoProviderId = 2 }; var savedUserProfile = new e_suite.API.Common.models.UserProfile { Email = "Test@test.test", FirstName = "Testy", MiddleNames = "The tested", LastName = "McTester", SsoProviderId = 2 }; _userManagerMock.Setup(x => x.GetProfile(email, It.IsAny())) .ReturnsAsync(() => savedUserProfile); //Act var response = await _accountController.ProfilePost(userProfile, CancellationToken.None); //Assert Assert.That(response, Is.TypeOf()); var redirectResult = response as RedirectResult; Assert.That(redirectResult?.Url, Is.EqualTo("~/account/profile")); _userManagerMock.Verify(x => x.TurnOfSsoForUser(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); _userManagerMock.Verify( x => x.UpdateProfile(It.IsAny(), email, It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task ProfilePost_WhenSsoIdSetToRemoved_UpdatesProfileRemovesSsoLinkThenRedirectToProfileGet() { //Arrange _cookieManagerMock.Setup(x => x.GetSsoIdFromSsoIdCookie(It.IsAny())).ReturnsAsync(() => null); var userId = 99; var email = "email@mail.test"; var displayName = "Testy McTester"; AddAuthorisedUserToController(userId, email, displayName); var userProfile = new UserProfile { Email = "Test@test.test", FirstName = "Testy", MiddleNames = "The tested", LastName = "McTester", SsoProviderId = -1 }; var savedUserProfile = new e_suite.API.Common.models.UserProfile { Email = "Test@test.test", FirstName = "Testy", MiddleNames = "The tested", LastName = "McTester", SsoProviderId = 2 }; _userManagerMock.Setup(x => x.GetProfile(email, It.IsAny())) .ReturnsAsync(() => savedUserProfile); //Act var response = await _accountController.ProfilePost(userProfile, CancellationToken.None); //Assert Assert.That(response, Is.TypeOf()); var redirectResult = response as RedirectResult; Assert.That(redirectResult?.Url, Is.EqualTo("~/account/profile")); _userManagerMock.Verify(x => x.TurnOfSsoForUser(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); _userManagerMock.Verify(x => x.UpdateProfile(It.IsAny(), email, It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task ProfilePost_WhenSsoIdChanged_UpdatesProfileThenStartsProcessOfLinkingTheNewSsoProvider() { //Arrange _cookieManagerMock.Setup(x => x.GetSsoIdFromSsoIdCookie(It.IsAny())).ReturnsAsync(() => null); var userId = 99; var email = "email@mail.test"; var displayName = "Testy McTester"; AddAuthorisedUserToController(userId, email, displayName); var userProfile = new UserProfile { Email = "Test@test.test", FirstName = "Testy", MiddleNames = "The tested", LastName = "McTester", SsoProviderId = 3 }; var savedUserProfile = new e_suite.API.Common.models.UserProfile { Email = "Test@test.test", FirstName = "Testy", MiddleNames = "The tested", LastName = "McTester", SsoProviderId = 2 }; _userManagerMock.Setup(x => x.GetProfile(email, It.IsAny())) .ReturnsAsync(() => savedUserProfile); var ssoUrl = "ssoUrl"; _singleSignOnMock.Setup(x => x.StartSingleSignOn(userProfile.SsoProviderId, It.IsAny())) .ReturnsAsync(() => ssoUrl); //Act var response = await _accountController.ProfilePost(userProfile, CancellationToken.None); //Assert Assert.That(response, Is.TypeOf()); var redirectResult = response as RedirectResult; Assert.That(redirectResult?.Url, Is.EqualTo(ssoUrl)); _cookieManagerMock.Verify( x => x.CreateProfileLinkCookie(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); _userManagerMock.Verify(x => x.TurnOfSsoForUser(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); _userManagerMock.Verify(x => x.UpdateProfile(It.IsAny(), email, It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task ProfilePost_WhenUpdatedSsoIdIsInvalid_SkipsUpdatingTheSsoLink() { //Arrange _cookieManagerMock.Setup(x => x.GetSsoIdFromSsoIdCookie(It.IsAny())).ReturnsAsync(() => null); var userId = 99; var email = "email@mail.test"; var displayName = "Testy McTester"; AddAuthorisedUserToController(userId, email, displayName); var userProfile = new UserProfile { Email = "Test@test.test", FirstName = "Testy", MiddleNames = "The tested", LastName = "McTester", SsoProviderId = 3 }; var savedUserProfile = new e_suite.API.Common.models.UserProfile { Email = "Test@test.test", FirstName = "Testy", MiddleNames = "The tested", LastName = "McTester", SsoProviderId = 2 }; _userManagerMock.Setup(x => x.GetProfile(email, It.IsAny())) .ReturnsAsync(() => savedUserProfile); _singleSignOnMock.Setup(x => x.StartSingleSignOn(userProfile.SsoProviderId, It.IsAny())) .ReturnsAsync(() => null!); //Act var response = await _accountController.ProfilePost(userProfile, CancellationToken.None); //Assert Assert.That(response, Is.TypeOf()); var redirectResult = response as RedirectResult; Assert.That(redirectResult?.Url, Is.EqualTo("~/account/profile")); _cookieManagerMock.Verify( x => x.CreateProfileLinkCookie(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); _userManagerMock.Verify(x => x.TurnOfSsoForUser(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); _userManagerMock.Verify(x => x.UpdateProfile(It.IsAny(), email, It.IsAny(), It.IsAny()), Times.Once); } }