public async Task GetMembersDetailsCSVHandler_WithBrandNamesLongerThanMaxLength_ThrowsException()
        {
            // Arrange
            var complianceYear = 2016;

            var authorization    = new AuthorizationBuilder().AllowInternalAreaAccess().Build();
            var context          = A.Fake <WeeeContext>();
            var storedProcedures = A.Fake <IStoredProcedures>();
            var csvWriter        = A.Fake <ICsvWriter <MembersDetailsCsvData> >();

            A.CallTo(() => context.StoredProcedures)
            .Returns(storedProcedures);

            var csvData1 = new MembersDetailsCsvData
            {
                ProducerName = "Producer1",
                BrandNames   = new string('A', GetMembersDetailsCsvHandler.MaxBrandNamesLength + 1)
            };

            var csvData2 = new MembersDetailsCsvData
            {
                ProducerName = "Producer2",
                BrandNames   = "BrandName2"
            };

            var csvData3 = new MembersDetailsCsvData
            {
                ProducerName = "Producer3",
                BrandNames   = new string('A', GetMembersDetailsCsvHandler.MaxBrandNamesLength + 1)
            };

            A.CallTo(() => storedProcedures
                     .SpgCSVDataBySchemeComplianceYearAndAuthorisedAuthority(A <int> ._, A <bool> ._, A <bool> ._, A <Guid> ._, A <Guid> ._))
            .Returns(new List <MembersDetailsCsvData> {
                csvData1, csvData2, csvData3
            });

            var handler = new GetMembersDetailsCsvHandler(authorization, context, csvWriter);
            var request = new GetMemberDetailsCsv(complianceYear, false, Guid.NewGuid(), Guid.NewGuid(), true);

            // Act
            var exception = await Record.ExceptionAsync(() => handler.HandleAsync(request));

            // Assert
            Assert.NotNull(exception);
            Assert.Contains("Producer1", exception.Message);
            Assert.Contains("Producer3", exception.Message);
            Assert.Contains("brand names", exception.Message);
        }
        public async Task GetMembersDetailsCSVHandler_ComplianceYear_ReturnsFileContent()
        {
            // Arrange
            var complianceYear = 2016;

            var authorization = new AuthorizationBuilder().AllowInternalAreaAccess().Build();
            var context       = A.Fake <WeeeContext>();
            var csvWriter     = new CsvWriter <MembersDetailsCsvData>(A.Dummy <IExcelSanitizer>());

            var handler = new GetMembersDetailsCsvHandler(authorization, context, csvWriter);
            var request = new GetMemberDetailsCsv(complianceYear);

            // Act
            CSVFileData data = await handler.HandleAsync(request);

            // Assert
            Assert.NotEmpty(data.FileContent);
        }
        public async Task GetMembersDetailsCSVHandler_NoComplianceYear_ThrowsArgumentException()
        {
            // Arrange
            var complianceYear = 0;

            var authorization = new AuthorizationBuilder().AllowInternalAreaAccess().Build();
            var context       = A.Fake <WeeeContext>();
            var csvWriter     = A.Fake <ICsvWriter <MembersDetailsCsvData> >();

            var handler = new GetMembersDetailsCsvHandler(authorization, context, csvWriter);
            var request = new GetMemberDetailsCsv(complianceYear);

            // Act
            Func <Task> action = async() => await handler.HandleAsync(request);

            // Assert
            await Assert.ThrowsAsync <ArgumentException>(action);
        }
        public async Task GetMembersDetailsCSVHandler_ComplianceYear_ReturnsFileContent()
        {
            // Arrange
            var complianceYear = 2016;

            var authorization = new AuthorizationBuilder().AllowInternalAreaAccess().Build();
            var context = A.Fake<WeeeContext>();
            var csvWriter = new CsvWriter<MembersDetailsCsvData>(A.Dummy<IExcelSanitizer>());

            var handler = new GetMembersDetailsCsvHandler(authorization, context, csvWriter);
            var request = new GetMemberDetailsCsv(complianceYear);

            // Act
            CSVFileData data = await handler.HandleAsync(request);

            // Assert
            Assert.NotEmpty(data.FileContent);
        }
        public async Task GetMembersDetailsCSVHandler_NoComplianceYear_ThrowsArgumentException()
        {
            // Arrange
            var complianceYear = 0;

            var authorization = new AuthorizationBuilder().AllowInternalAreaAccess().Build();
            var context = A.Fake<WeeeContext>();
            var csvWriter = A.Fake<ICsvWriter<MembersDetailsCsvData>>();

            var handler = new GetMembersDetailsCsvHandler(authorization, context, csvWriter);
            var request = new GetMemberDetailsCsv(complianceYear);

            // Act
            Func<Task> action = async () => await handler.HandleAsync(request);

            // Assert
            await Assert.ThrowsAsync<ArgumentException>(action);
        }
        public async Task <ActionResult> DownloadProducerDetailsCsv(int complianceYear, Guid?schemeId, Guid?authorityId,
                                                                    bool includeRemovedProducers, bool includeBrandNames)
        {
            var fileName = new StringBuilder();

            fileName.AppendFormat("{0:D4}", complianceYear);

            if (schemeId != null)
            {
                using (var client = apiClient())
                {
                    var requestScheme = new GetSchemeById(schemeId.Value);
                    var scheme        = await client.SendAsync(User.GetAccessToken(), requestScheme);

                    fileName.AppendFormat("_{0}", scheme.ApprovalName);
                }
            }

            if (authorityId != null)
            {
                using (var client = apiClient())
                {
                    var requestAuthority = new GetUKCompetentAuthorityById(authorityId.Value);
                    var authorityData    = await client.SendAsync(User.GetAccessToken(), requestAuthority);

                    fileName.AppendFormat("_{0}", authorityData.Abbreviation);
                }
            }

            fileName.AppendFormat("_producerdetails_{0:ddMMyyyy_HHmm}.csv", SystemTime.UtcNow);

            CSVFileData membersDetailsCsvData;

            using (var client = apiClient())
            {
                var request =
                    new GetMemberDetailsCsv(complianceYear, includeRemovedProducers, schemeId, authorityId, includeBrandNames);
                membersDetailsCsvData = await client.SendAsync(User.GetAccessToken(), request);
            }

            var data = new UTF8Encoding().GetBytes(membersDetailsCsvData.FileContent);

            return(File(data, "text/csv", CsvFilenameFormat.FormatFileName(fileName.ToString())));
        }
        public async Task GetMembersDetailsCSVHandler_WithoutBrandNames_DoesNotIncludeBrandNamesColumn()
        {
            // Arrange
            var complianceYear = 2016;

            var authorization = new AuthorizationBuilder().AllowInternalAreaAccess().Build();
            var context       = A.Fake <WeeeContext>();
            var csvWriter     = A.Fake <ICsvWriter <MembersDetailsCsvData> >();

            var handler = new GetMembersDetailsCsvHandler(authorization, context, csvWriter);
            var request = new GetMemberDetailsCsv(complianceYear, includeBrandNames: false);

            // Act
            await handler.HandleAsync(request);

            // Assert
            A.CallTo(() => csvWriter.DefineColumn("Brand names", A <Func <MembersDetailsCsvData, object> > ._, A <bool> ._))
            .MustNotHaveHappened();
        }
        public async Task GetMembersDetailsCSVHandler_WithoutBrandNames_DoesNotIncludeBrandNamesColumn()
        {
            // Arrange
            var complianceYear = 2016;

            var authorization = new AuthorizationBuilder().AllowInternalAreaAccess().Build();
            var context = A.Fake<WeeeContext>();
            var csvWriter = A.Fake<ICsvWriter<MembersDetailsCsvData>>();

            var handler = new GetMembersDetailsCsvHandler(authorization, context, csvWriter);
            var request = new GetMemberDetailsCsv(complianceYear, includeBrandNames: false);

            // Act
            await handler.HandleAsync(request);

            // Assert
            A.CallTo(() => csvWriter.DefineColumn("Brand names", A<Func<MembersDetailsCsvData, object>>._, A<bool>._))
                .MustNotHaveHappened();
        }
        public async Task GetMembersDetailsCSVHandler_WithBrandNamesLongerThanMaxLength_ThrowsException()
        {
            // Arrange
            var complianceYear = 2016;

            var authorization = new AuthorizationBuilder().AllowInternalAreaAccess().Build();
            var context = A.Fake<WeeeContext>();
            var storedProcedures = A.Fake<IStoredProcedures>();
            var csvWriter = A.Fake<ICsvWriter<MembersDetailsCsvData>>();

            A.CallTo(() => context.StoredProcedures)
                .Returns(storedProcedures);

            var csvData1 = new MembersDetailsCsvData
            {
                ProducerName = "Producer1",
                BrandNames = new string('A', GetMembersDetailsCsvHandler.MaxBrandNamesLength + 1)
            };

            var csvData2 = new MembersDetailsCsvData
            {
                ProducerName = "Producer2",
                BrandNames = "BrandName2"
            };

            var csvData3 = new MembersDetailsCsvData
            {
                ProducerName = "Producer3",
                BrandNames = new string('A', GetMembersDetailsCsvHandler.MaxBrandNamesLength + 1)
            };

            A.CallTo(() => storedProcedures
            .SpgCSVDataBySchemeComplianceYearAndAuthorisedAuthority(A<int>._, A<bool>._, A<bool>._, A<Guid>._, A<Guid>._))
            .Returns(new List<MembersDetailsCsvData> { csvData1, csvData2, csvData3 });

            var handler = new GetMembersDetailsCsvHandler(authorization, context, csvWriter);
            var request = new GetMemberDetailsCsv(complianceYear, false, Guid.NewGuid(), Guid.NewGuid(), true);

            // Act
            var exception = await Record.ExceptionAsync(() => handler.HandleAsync(request));

            // Assert
            Assert.NotNull(exception);
            Assert.Contains("Producer1", exception.Message);
            Assert.Contains("Producer3", exception.Message);
            Assert.Contains("brand names", exception.Message);
        }
        public async Task<ActionResult> DownloadProducerDetailsCsv(int complianceYear, Guid? schemeId, Guid? authorityId,
            bool includeRemovedProducers, bool includeBrandNames)
        {
            StringBuilder fileName = new StringBuilder();

            fileName.AppendFormat("{0:D4}", complianceYear);

            if (schemeId != null)
            {
                using (IWeeeClient client = apiClient())
                {
                    GetSchemeById requestScheme = new GetSchemeById(schemeId.Value);
                    SchemeData scheme = await client.SendAsync(User.GetAccessToken(), requestScheme);

                    fileName.AppendFormat("_{0}", scheme.ApprovalName);
                }
            }

            if (authorityId != null)
            {
                using (IWeeeClient client = apiClient())
                {
                    GetUKCompetentAuthorityById requestAuthority = new GetUKCompetentAuthorityById(authorityId.Value);
                    UKCompetentAuthorityData authorityData = await client.SendAsync(User.GetAccessToken(), requestAuthority);

                    fileName.AppendFormat("_{0}", authorityData.Abbreviation);
                }
            }

            fileName.AppendFormat("_producerdetails_{0:ddMMyyyy_HHmm}.csv", SystemTime.UtcNow);

            CSVFileData membersDetailsCsvData;
            using (IWeeeClient client = apiClient())
            {
                GetMemberDetailsCsv request = 
                    new GetMemberDetailsCsv(complianceYear, includeRemovedProducers, schemeId, authorityId, includeBrandNames);
                membersDetailsCsvData = await client.SendAsync(User.GetAccessToken(), request);
            }

            byte[] data = new UTF8Encoding().GetBytes(membersDetailsCsvData.FileContent);

            return File(data, "text/csv", CsvFilenameFormat.FormatFileName(fileName.ToString()));
        }