public async Task UpdateOrganisationDetailsHandler_WithValidData_FetchesOrganisationAndUpdatesAndSaves()
        {
            // Arrange
            OrganisationData organisationData = new OrganisationData();
            organisationData.Id = new Guid("9a310218-311b-460d-bd50-9d246c237dcc");
            organisationData.OrganisationType = OrganisationType.RegisteredCompany;
            organisationData.Name = "CompanyName";
            organisationData.CompanyRegistrationNumber = "123456789";
            organisationData.OrganisationName = "CompanyName";
            organisationData.BusinessAddress = new Core.Shared.AddressData();
            organisationData.BusinessAddress.Address1 = "Address1";
            organisationData.BusinessAddress.Address2 = "Address2";
            organisationData.BusinessAddress.TownOrCity = "Town";
            organisationData.BusinessAddress.CountyOrRegion = "County";
            organisationData.BusinessAddress.Postcode = "Postcode";
            organisationData.BusinessAddress.CountryId = new Guid("79b70dfb-bbfd-4801-9849-880f66ee48e4");
            organisationData.BusinessAddress.Telephone = "012345678";
            organisationData.BusinessAddress.Email = "*****@*****.**";

            UpdateOrganisationDetails request = new UpdateOrganisationDetails(organisationData);

            IOrganisationDetailsDataAccess dataAccess = A.Fake<IOrganisationDetailsDataAccess>();
            IWeeeAuthorization weeeAuthorization = A.Fake<IWeeeAuthorization>();

            Organisation organisation = A.Dummy<Organisation>();
            A.CallTo(() => dataAccess.FetchOrganisationAsync(new Guid("9a310218-311b-460d-bd50-9d246c237dcc")))
                .Returns(organisation);

            Country country = new Country(
                new Guid("79b70dfb-bbfd-4801-9849-880f66ee48e4"),
                "Name");
            A.CallTo(() => dataAccess.FetchCountryAsync(new Guid("79b70dfb-bbfd-4801-9849-880f66ee48e4")))
                .Returns(country);

            UpdateOrganisationDetailsHandler handler = new UpdateOrganisationDetailsHandler(dataAccess, weeeAuthorization);

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

            // Assert
            A.CallTo(() => dataAccess.FetchOrganisationAsync(new Guid("9a310218-311b-460d-bd50-9d246c237dcc")))
                .MustHaveHappened(Repeated.Exactly.Once);

            Assert.Equal("CompanyName", organisation.Name);
            Assert.Equal("123456789", organisation.CompanyRegistrationNumber);
            Assert.Equal("Address1", organisation.BusinessAddress.Address1);
            Assert.Equal("Address2", organisation.BusinessAddress.Address2);
            Assert.Equal("Town", organisation.BusinessAddress.TownOrCity);
            Assert.Equal("County", organisation.BusinessAddress.CountyOrRegion);
            Assert.Equal("Postcode", organisation.BusinessAddress.Postcode);
            Assert.Equal(new Guid("79b70dfb-bbfd-4801-9849-880f66ee48e4"), organisation.BusinessAddress.Country.Id);
            Assert.Equal("012345678", organisation.BusinessAddress.Telephone);
            Assert.Equal("*****@*****.**", organisation.BusinessAddress.Email);

            A.CallTo(() => dataAccess.SaveAsync())
                .MustHaveHappened(Repeated.Exactly.Once);

            Assert.Equal(result, true);
        }
        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();
        }