public async Task HandleAsync_GivenMandatoryParametersAndAllOptionalParameters_FileNameShouldBeCorrect(string expectedText, bool includeResubmissions, ReportReturnStatus status)
        {
            var request = new GetAatfAeReturnDataCsv(fixture.Create <int>(), fixture.Create <int>(), fixture.Create <FacilityType>(), status, fixture.Create <Guid>(), fixture.Create <Guid>(), fixture.Create <Guid>(), fixture.Create <string>(), includeResubmissions);

            var ca = fixture.Create <EA.Weee.Domain.UKCompetentAuthority>();

            A.CallTo(() => commonDataAccess.FetchCompetentAuthorityById(request.AuthorityId.Value)).Returns(ca);

            var localArea = fixture.Create <LocalArea>();

            A.CallTo(() => commonDataAccess.FetchLookup <LocalArea>(request.LocalArea.Value)).Returns(localArea);

            var panArea = fixture.Create <PanArea>();

            A.CallTo(() => commonDataAccess.FetchLookup <PanArea>(request.PanArea.Value)).Returns(panArea);

            var date = new DateTime(2019, 05, 18, 11, 12, 0);

            SystemTime.Freeze(date);

            var data = await handler.HandleAsync(request);

            data.FileName.Should().Be($"{request.ComplianceYear}_Q{request.Quarter}_{expectedText}_{request.FacilityType.ToString().ToUpper()}_{EnumHelper.GetDisplayName(status)}_{ca.Abbreviation}_{panArea.Name}_Summary of AATF-AE returns to date_{date:ddMMyyyy_HHmm}.csv");

            SystemTime.Unfreeze();
        }
        public async Task GetAatfAeReturnDataCSVHandler_Sets_URL()
        {
            var csvData1 = new AatfAeReturnData
            {
                Name                   = fixture.Create <string>(),
                ApprovalNumber         = fixture.Create <string>(),
                OrganisationName       = fixture.Create <string>(),
                ReturnStatus           = fixture.Create <string>(),
                CreatedDate            = fixture.Create <DateTime>(),
                SubmittedBy            = fixture.Create <string>(),
                SubmittedDate          = fixture.Create <DateTime>(),
                CompetentAuthorityAbbr = fixture.Create <string>(),
                ReSubmission           = fixture.Create <string>()
            };

            A.CallTo(() => storedProcedures
                     .GetAatfAeReturnDataCsvData(A <int> ._, A <int> ._, A <int> ._, A <int> ._, A <Guid> ._, A <Guid> ._, A <Guid> ._, A <bool> ._)).Returns(new List <AatfAeReturnData> {
                csvData1
            });

            var request = new GetAatfAeReturnDataCsv(fixture.Create <int>(), fixture.Create <int>(), fixture.Create <FacilityType>(), fixture.Create <ReportReturnStatus>(), fixture.Create <Guid>(), fixture.Create <Guid>(), fixture.Create <Guid>(), "https://*****:*****@"""=HYPERLINK(""""{request.AatfDataUrl}{csvData1.AatfId}#data"""", """"View AATF / AE data"""")";

            var data = await handler.HandleAsync(request);

            data.FileContent.Should().Contain($"{csvData1.Name},{csvData1.ApprovalNumber},{csvData1.OrganisationName},{csvData1.ReturnStatus},{csvData1.CreatedDate},{csvData1.SubmittedDate},{csvData1.SubmittedBy},{csvData1.CompetentAuthorityAbbr},{csvData1.ReSubmission},{url1}");
        }
        public async Task HandleAsync_VariousParameters_ReturnsFileContent()
        {
            var request = new GetAatfAeReturnDataCsv(fixture.Create <int>(), fixture.Create <int>(), fixture.Create <FacilityType>(), fixture.Create <ReportReturnStatus>(), fixture.Create <Guid>(), fixture.Create <Guid>(), fixture.Create <Guid>(), fixture.Create <string>(), fixture.Create <bool>());

            var data = await handler.HandleAsync(request);

            data.FileContent.Should().NotBeEmpty();
        }
        public async Task HandleAsync_NoComplianceYear_ThrowsArgumentException()
        {
            const int complianceYear = 0;

            var request = new GetAatfAeReturnDataCsv(complianceYear, fixture.Create <int>(), fixture.Create <FacilityType>(), fixture.Create <ReportReturnStatus>(), fixture.Create <Guid>(), fixture.Create <Guid>(), fixture.Create <Guid>(), fixture.Create <string>(), fixture.Create <bool>());

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

            await Assert.ThrowsAsync <ArgumentException>(action);
        }
        public async Task HandleAsync_NotInternalUser_ThrowsSecurityException()
        {
            var authorization = new AuthorizationBuilder().DenyInternalAreaAccess().Build();

            var handler = new GetAatfAeReturnDataCsvHandler(authorization, context, csvWriterFactory, commonDataAccess);
            var request = new GetAatfAeReturnDataCsv(fixture.Create <int>(), fixture.Create <int>(), fixture.Create <FacilityType>(), fixture.Create <ReportReturnStatus>(), fixture.Create <Guid>(), fixture.Create <Guid>(), fixture.Create <Guid>(), fixture.Create <string>(), fixture.Create <bool>());

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

            await Assert.ThrowsAsync <SecurityException>(action);
        }
        public async Task HandleAsync_GivenMandatoryParametersAndSubmissionStatus_FileNameShouldBeCorrect(string expectedText, bool includeResubmissions, ReportReturnStatus status)
        {
            var request = new GetAatfAeReturnDataCsv(fixture.Create <int>(), fixture.Create <int>(), fixture.Create <FacilityType>(), status, null, null, null, fixture.Create <string>(), includeResubmissions);

            var date = new DateTime(2019, 05, 18, 11, 12, 0);

            SystemTime.Freeze(date);

            var data = await handler.HandleAsync(request);

            data.FileName.Should().Be($"{request.ComplianceYear}_Q{request.Quarter}_{expectedText}_{request.FacilityType.ToString().ToUpper()}_{EnumHelper.GetDisplayName(status)}_Summary of AATF-AE returns to date_{date:ddMMyyyy_HHmm}.csv");

            SystemTime.Unfreeze();
        }
        public async Task HandleAsync_GivenMandatoryParameters_FileNameShouldBeCorrect()
        {
            var request = new GetAatfAeReturnDataCsv(fixture.Create <int>(), fixture.Create <int>(), fixture.Create <FacilityType>(), null, null, null, null, fixture.Create <string>(), false);

            var date = new DateTime(2019, 05, 18, 11, 12, 0);

            SystemTime.Freeze(date);

            var data = await handler.HandleAsync(request);

            data.FileName.Should().Be($"{request.ComplianceYear}_Q{request.Quarter}_Exclude resubmissions_{request.FacilityType.ToString().ToUpper()}_Summary of AATF-AE returns to date_{date:ddMMyyyy_HHmm}.csv");

            SystemTime.Unfreeze();
        }
        public async Task <ActionResult> DownloadAatfAeDataCsv(int complianceYear,
                                                               int quarter, FacilityType facilityType, ReportReturnStatus?submissionStatus, Guid?authority, Guid?pat, Guid?localArea, bool includeResubmissions)
        {
            using (var client = apiClient())
            {
                var aatfDataUrl = AatfDataUrl();

                var request = new GetAatfAeReturnDataCsv(complianceYear, quarter, facilityType, submissionStatus, authority, pat, localArea, aatfDataUrl, includeResubmissions);

                var fileData = await client.SendAsync(User.GetAccessToken(), request);

                var data = new UTF8Encoding().GetBytes(fileData.FileContent);
                return(File(data, "text/csv", CsvFilenameFormat.FormatFileName(fileData.FileName)));
            }
        }
        public async Task HandleAsync_GivenMandatoryParametersAndLocalArea_FileNameShouldNotContainLocalArea(string expectedText, bool includeResubmissions)
        {
            var request = new GetAatfAeReturnDataCsv(fixture.Create <int>(), fixture.Create <int>(), fixture.Create <FacilityType>(), null, null, null, fixture.Create <Guid>(), fixture.Create <string>(), includeResubmissions);

            var localArea = fixture.Create <LocalArea>();

            A.CallTo(() => commonDataAccess.FetchLookup <LocalArea>(request.LocalArea.Value)).Returns(localArea);

            var date = new DateTime(2019, 05, 18, 11, 12, 0);

            SystemTime.Freeze(date);

            var data = await handler.HandleAsync(request);

            data.FileName.Should().Be($"{request.ComplianceYear}_Q{request.Quarter}_{expectedText}_{request.FacilityType.ToString().ToUpper()}_Summary of AATF-AE returns to date_{date:ddMMyyyy_HHmm}.csv");

            SystemTime.Unfreeze();
        }
        public async Task HandleAsync_GivenStoredProcedureReturnItems_MatchingFileContent()
        {
            var complianceYear = fixture.Create <int>();
            var quarter        = fixture.Create <int>();
            var facilityType   = fixture.Create <FacilityType>();
            var returnStatus   = fixture.Create <ReportReturnStatus>();
            var authority      = fixture.Create <Guid>();
            var area           = fixture.Create <Guid>();
            var pat            = fixture.Create <Guid>();
            var resubmission   = fixture.Create <bool>();
            var aatf           = fixture.Create <string>();

            var csvData1 = new AatfAeReturnData
            {
                Name                   = fixture.Create <string>(),
                ApprovalNumber         = fixture.Create <string>(),
                OrganisationName       = fixture.Create <string>(),
                ReturnStatus           = fixture.Create <string>(),
                CreatedDate            = fixture.Create <DateTime>(),
                SubmittedBy            = fixture.Create <string>(),
                SubmittedDate          = fixture.Create <DateTime>(),
                CompetentAuthorityAbbr = fixture.Create <string>(),
                ReSubmission           = fixture.Create <string>()
            };

            var csvData2 = new AatfAeReturnData
            {
                Name                   = fixture.Create <string>(),
                ApprovalNumber         = fixture.Create <string>(),
                OrganisationName       = fixture.Create <string>(),
                ReturnStatus           = fixture.Create <string>(),
                CreatedDate            = fixture.Create <DateTime>(),
                SubmittedBy            = fixture.Create <string>(),
                SubmittedDate          = fixture.Create <DateTime>(),
                CompetentAuthorityAbbr = fixture.Create <string>(),
                ReSubmission           = fixture.Create <string>()
            };

            var csvData3 = new AatfAeReturnData
            {
                Name                   = fixture.Create <string>(),
                ApprovalNumber         = fixture.Create <string>(),
                OrganisationName       = fixture.Create <string>(),
                ReturnStatus           = fixture.Create <string>(),
                CreatedDate            = fixture.Create <DateTime>(),
                SubmittedBy            = fixture.Create <string>(),
                SubmittedDate          = fixture.Create <DateTime>(),
                CompetentAuthorityAbbr = fixture.Create <string>(),
                ReSubmission           = fixture.Create <string>()
            };

            A.CallTo(() => storedProcedures.GetAatfAeReturnDataCsvData(complianceYear, quarter, (int)facilityType, (int)returnStatus, authority, area, pat, resubmission))
            .Returns(new List <AatfAeReturnData> {
                csvData1, csvData2, csvData3
            });

            var request = new GetAatfAeReturnDataCsv(complianceYear, quarter, facilityType, returnStatus, authority, pat, area, aatf, resubmission);

            var data = await handler.HandleAsync(request);

            data.FileContent.Should().Contain("Name of AATF / AE,Approval number,Organisation name,Submission status,Date created (GMT),Date submitted (GMT),Submitted by,Appropriate authority,First submission / resubmission,");
            data.FileContent.Should().Contain($"{csvData1.Name},{csvData1.ApprovalNumber},{csvData1.OrganisationName},{csvData1.ReturnStatus},{csvData1.CreatedDate},{csvData1.SubmittedDate},{csvData1.SubmittedBy},{csvData1.CompetentAuthorityAbbr},{csvData1.ReSubmission}");
            data.FileContent.Should().Contain($"{csvData2.Name},{csvData2.ApprovalNumber},{csvData2.OrganisationName},{csvData2.ReturnStatus},{csvData2.CreatedDate},{csvData2.SubmittedDate},{csvData2.SubmittedBy},{csvData2.CompetentAuthorityAbbr},{csvData2.ReSubmission}");
            data.FileContent.Should().Contain($"{csvData3.Name},{csvData3.ApprovalNumber},{csvData3.OrganisationName},{csvData3.ReturnStatus},{csvData3.CreatedDate},{csvData3.SubmittedDate},{csvData3.SubmittedBy},{csvData3.CompetentAuthorityAbbr},{csvData3.ReSubmission}");
        }