public async Task HandleAsync_WithNonInternalUserOrOrganisationUser_ThrowsSecurityException()
        {
            // Arrange
            var authorizationBuilder = new AuthorizationBuilder()
                .DenyInternalOrOrganisationAccess();

            var authorization = authorizationBuilder.Build();

            var dataAccess = A.Dummy<IOrganisationDetailsDataAccess>();
            var weeeEmailService = A.Dummy<IWeeeEmailService>();

            var handler =
                new UpdateOrganisationContactDetailsHandler(authorization, dataAccess, weeeEmailService);

            var request = new UpdateOrganisationContactDetails(new OrganisationData { Id = Guid.NewGuid() }, false);

            // Act, Assert
            await Assert.ThrowsAsync<SecurityException>(() => handler.HandleAsync(request));
        }
        public async Task HandleAsync_WithValidData_FetchesOrganisationAndUpdatesAndSaves()
        {
            // Arrange
            OrganisationData organisationData = new OrganisationData();
            organisationData.Id = new Guid("93646500-85A1-4F9D-AE18-73265426EF40");
            organisationData.Contact = new ContactData();
            organisationData.Contact.FirstName = "FirstName";
            organisationData.Contact.LastName = "LastName";
            organisationData.Contact.Position = "Position";
            organisationData.OrganisationAddress = new Core.Shared.AddressData();
            organisationData.OrganisationAddress.Address1 = "Address1";
            organisationData.OrganisationAddress.Address2 = "Address2";
            organisationData.OrganisationAddress.TownOrCity = "Town";
            organisationData.OrganisationAddress.CountyOrRegion = "County";
            organisationData.OrganisationAddress.Postcode = "Postcode";
            organisationData.OrganisationAddress.CountryId = new Guid("1AF4BB2F-D2B0-41EA-BFD8-B83764C1ECBC");
            organisationData.OrganisationAddress.Telephone = "012345678";
            organisationData.OrganisationAddress.Email = "*****@*****.**";

            UpdateOrganisationContactDetails request = new UpdateOrganisationContactDetails(organisationData);

            IWeeeAuthorization authorization = A.Dummy<IWeeeAuthorization>();
            IOrganisationDetailsDataAccess dataAccess = A.Fake<IOrganisationDetailsDataAccess>();
            IWeeeEmailService weeeEmailService = A.Dummy<IWeeeEmailService>();

            Organisation organisation = A.Dummy<Organisation>();

            A.CallTo(() => dataAccess.FetchOrganisationAsync(new Guid("93646500-85A1-4F9D-AE18-73265426EF40")))
                .Returns(organisation);

            Country country = new Country(
                new Guid("1AF4BB2F-D2B0-41EA-BFD8-B83764C1ECBC"),
                "Name");
            A.CallTo(() => dataAccess.FetchCountryAsync(new Guid("1AF4BB2F-D2B0-41EA-BFD8-B83764C1ECBC")))
                .Returns(country);

            UpdateOrganisationContactDetailsHandler handler =
                new UpdateOrganisationContactDetailsHandler(authorization, dataAccess, weeeEmailService);

            // Act
            bool result = await handler.HandleAsync(request);

            // Assert
            A.CallTo(() => dataAccess.FetchOrganisationAsync(new Guid("93646500-85A1-4F9D-AE18-73265426EF40")))
                .MustHaveHappened(Repeated.Exactly.Once);

            Assert.Equal("FirstName", organisation.Contact.FirstName);
            Assert.Equal("LastName", organisation.Contact.LastName);
            Assert.Equal("Position", organisation.Contact.Position);
            Assert.Equal("Address1", organisation.OrganisationAddress.Address1);
            Assert.Equal("Address2", organisation.OrganisationAddress.Address2);
            Assert.Equal("Town", organisation.OrganisationAddress.TownOrCity);
            Assert.Equal("County", organisation.OrganisationAddress.CountyOrRegion);
            Assert.Equal("Postcode", organisation.OrganisationAddress.Postcode);
            Assert.Equal(new Guid("1AF4BB2F-D2B0-41EA-BFD8-B83764C1ECBC"), organisation.OrganisationAddress.Country.Id);
            Assert.Equal("012345678", organisation.OrganisationAddress.Telephone);
            Assert.Equal("*****@*****.**", organisation.OrganisationAddress.Email);

            A.CallTo(() => dataAccess.SaveAsync())
                .MustHaveHappened(Repeated.Exactly.Once);
        }
        public async Task HandleAsync_DetailsChanged_SendNotificationTrue_MatchingScheme_SendsChangeEmail()
        {
            // Arrange
            var authorization = A.Dummy<IWeeeAuthorization>();
            var dataAccess = A.Fake<IOrganisationDetailsDataAccess>();
            var weeeEmailService = A.Dummy<IWeeeEmailService>();

            var handler = new UpdateOrganisationContactDetailsHandler(authorization, dataAccess, weeeEmailService);

            var contact = new Contact("FirstName", "LastName", "Position");

            var countryId = Guid.NewGuid();
            var country = new Country(countryId, "Country");
            var organisationAddress = new Address("Address1", "Address2", "TownOrCity",
                "CountyOrRegion", "Postcode", country, "Telephone", "Email");

            var organisation = A.Fake<Organisation>();
            A.CallTo(() => organisation.Contact)
                .Returns(contact);

            A.CallTo(() => organisation.OrganisationAddress)
                .Returns(organisationAddress);

            A.CallTo(() => dataAccess.FetchOrganisationAsync(A<Guid>._))
                .Returns(organisation);

            A.CallTo(() => dataAccess.FetchCountryAsync(countryId))
                .Returns(country);

            var newContactDetails = new ContactData
            {
                FirstName = "FirstName",
                LastName = "LastName",
                Position = "Position"
            };

            var newOrganisationAddress = new AddressData
            {
                Address1 = "New Address1",
                Address2 = "New Address2",
                CountryId = countryId,
                CountyOrRegion = "CountyOrRegion",
                Email = "Email",
                Postcode = "Postcode",
                Telephone = "Telephone",
                TownOrCity = "TownOrCity"
            };

            var organisationId = Guid.NewGuid();

            var organisationData = new OrganisationData
            {
                Id = organisationId,
                Contact = newContactDetails,
                OrganisationAddress = newOrganisationAddress
            };

            var request = new UpdateOrganisationContactDetails(organisationData, true);

            var scheme = A.Fake<Scheme>();
            A.CallTo(() => scheme.SchemeName)
                .Returns("Test Scheme Name");

            var competentAuthority = A.Fake<UKCompetentAuthority>();
            A.CallTo(() => competentAuthority.Email)
                .Returns("*****@*****.**");

            A.CallTo(() => scheme.CompetentAuthority)
                .Returns(competentAuthority);

            A.CallTo(() => dataAccess.FetchSchemeAsync(organisationId))
                .Returns(scheme);

            // Act
            await handler.HandleAsync(request);

            // Assert
            A.CallTo(() => weeeEmailService.SendOrganisationContactDetailsChanged("*****@*****.**", "Test Scheme Name"))
                .MustHaveHappened();
        }
        public async Task HandleAsync_WithOrganisationAddressAndContactDetailsUnchanged_SendNotificationTrue_DoesNotSendChangeEmail()
        {
            // Arrange
            var authorization = A.Dummy<IWeeeAuthorization>();
            var dataAccess = A.Fake<IOrganisationDetailsDataAccess>();
            var weeeEmailService = A.Dummy<IWeeeEmailService>();

            var handler = new UpdateOrganisationContactDetailsHandler(authorization, dataAccess, weeeEmailService);

            var contact = new Contact("FirstName", "LastName", "Position");

            var countryId = Guid.NewGuid();
            var country = new Country(countryId, "Country");
            var organisationAddress = new Address("Address1", "Address2", "TownOrCity",
                "CountyOrRegion", "Postcode", country, "Telephone", "Email");

            var organisation = A.Fake<Organisation>();
            A.CallTo(() => organisation.Contact)
                .Returns(contact);

            A.CallTo(() => organisation.OrganisationAddress)
                .Returns(organisationAddress);

            A.CallTo(() => dataAccess.FetchOrganisationAsync(A<Guid>._))
                .Returns(organisation);

            A.CallTo(() => dataAccess.FetchCountryAsync(countryId))
                .Returns(country);

            var newContactDetails = new ContactData
            {
                FirstName = "FirstName",
                LastName = "LastName",
                Position = "Position"
            };

            var newOrganisationAddress = new AddressData
            {
                Address1 = "Address1",
                Address2 = "Address2",
                CountryId = countryId,
                CountyOrRegion = "CountyOrRegion",
                Email = "Email",
                Postcode = "Postcode",
                Telephone = "Telephone",
                TownOrCity = "TownOrCity"
            };

            var organisationData = new OrganisationData
            {
                Contact = newContactDetails,
                OrganisationAddress = newOrganisationAddress
            };

            var request = new UpdateOrganisationContactDetails(organisationData, true);

            // Act
            await handler.HandleAsync(request);

            // Assert
            A.CallTo(() => weeeEmailService.SendOrganisationContactDetailsChanged(A<string>._, A<string>._))
                .MustNotHaveHappened();
        }