public async Task HandleAsync_ProvideOrganisationIdWithOutPreviousReturns_ReturnsEmptyList()
        {
            Organisation requestedOrganisation = fixture.Build <Organisation>().With(o => o.OrganisationStatus, OrganisationStatus.Complete).Create();
            Organisation otherOrganisation     = fixture.Build <Organisation>().With(o => o.OrganisationStatus, OrganisationStatus.Complete).Create();

            Quarter q1 = new Quarter(2019, QuarterType.Q1);
            Quarter q2 = new Quarter(2019, QuarterType.Q2);
            Quarter q3 = new Quarter(2019, QuarterType.Q3);

            List <Return> returns = new List <Return>()
            {
                A.Fake <Return>(),
                A.Fake <Return>()
            };

            Return currentReturn = A.Fake <Return>();

            A.CallTo(() => currentReturn.Id).Returns(Guid.NewGuid());
            A.CallTo(() => currentReturn.Quarter).Returns(q3);
            A.CallTo(() => currentReturn.Organisation).Returns(requestedOrganisation);
            A.CallTo(() => currentReturn.ReturnStatus).Returns(Domain.AatfReturn.ReturnStatus.Submitted);

            returns.Add(currentReturn);

            A.CallTo(() => returns.ElementAt(0).Id).Returns(Guid.NewGuid());
            A.CallTo(() => returns.ElementAt(0).Quarter).Returns(q1);
            A.CallTo(() => returns.ElementAt(0).Organisation).Returns(otherOrganisation);
            A.CallTo(() => returns.ElementAt(0).ReturnStatus).Returns(Domain.AatfReturn.ReturnStatus.Submitted);

            A.CallTo(() => returns.ElementAt(1).Id).Returns(Guid.NewGuid());
            A.CallTo(() => returns.ElementAt(1).Quarter).Returns(q2);
            A.CallTo(() => returns.ElementAt(1).Organisation).Returns(otherOrganisation);
            A.CallTo(() => returns.ElementAt(1).ReturnStatus).Returns(Domain.AatfReturn.ReturnStatus.Submitted);

            A.CallTo(() => dataAccess.GetAll <Return>()).Returns(returns);

            List <ReturnScheme> returnSchemes = new List <ReturnScheme>();

            A.CallTo(() => dataAccess.GetAll <ReturnScheme>()).Returns(returnSchemes);

            GetPreviousQuarterSchemes request = new GetPreviousQuarterSchemes(requestedOrganisation.Id, currentReturn.Id);

            PreviousQuarterReturnResult result = await handler.HandleAsync(request);

            Assert.Equal(0, result.PreviousSchemes.Count);

            A.CallTo(() => dataAccess.GetAll <Return>()).MustHaveHappened(Repeated.Exactly.Once);
            A.CallTo(() => dataAccess.GetAll <ReturnScheme>()).MustHaveHappened(Repeated.Exactly.Once);
        }
        public async void IndexGet_CopyPreviousIsTrue_ViewModelSelectedPcsSelectedAndViewReturned()
        {
            var returnId       = Guid.NewGuid();
            var organisationId = Guid.NewGuid();

            var schemeDatas = A.CollectionOfFake <SchemeData>(4).ToList();

            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetSchemesExternal> ._)).Returns(schemeDatas);

            var selectedSchemes = new List <Guid>()
            {
                schemeDatas.FirstOrDefault().Id
            };

            var q = new Quarter(2019, QuarterType.Q1);

            var previousQuarterReturnResult = new PreviousQuarterReturnResult()
            {
                PreviousSchemes = selectedSchemes,
                PreviousQuarter = q
            };

            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetPreviousQuarterSchemes> ._)).Returns(previousQuarterReturnResult);

            var result = await controller.Index(organisationId, returnId, false, true) as ViewResult;

            Assert.True(result.ViewName == "Index");

            var viewModel = result.Model as SelectYourPcsViewModel;

            Assert.Equal(returnId, viewModel.ReturnId);
            Assert.Equal(organisationId, viewModel.OrganisationId);
            viewModel.CopyPrevious.Should().Be(true);
            viewModel.SelectedSchemes.Should().Contain(selectedSchemes);
            viewModel.PreviousQuarterData.PreviousQuarter.Should().Be(q);
        }
        public async Task HandleAsync_ProvideOrganisationIdWithPreviousReturns_ReturnsPreviousSchemesForThatOrganisation()
        {
            Organisation requestedOrganisation = fixture.Build <Organisation>().With(o => o.OrganisationStatus, OrganisationStatus.Complete).Create();
            Organisation otherOrganisation     = fixture.Build <Organisation>().With(o => o.OrganisationStatus, OrganisationStatus.Complete).Create();

            Quarter q1 = new Quarter(2019, QuarterType.Q1);
            Quarter q2 = new Quarter(2019, QuarterType.Q2);
            Quarter q3 = new Quarter(2019, QuarterType.Q3);
            Quarter q4 = new Quarter(2019, QuarterType.Q4);

            Return previousReturn = A.Fake <Return>();

            A.CallTo(() => previousReturn.Id).Returns(Guid.NewGuid());
            A.CallTo(() => previousReturn.Quarter).Returns(q3);
            A.CallTo(() => previousReturn.Organisation).Returns(requestedOrganisation);
            A.CallTo(() => previousReturn.ReturnStatus).Returns(Domain.AatfReturn.ReturnStatus.Submitted);

            Return currentReturn = A.Fake <Return>();

            A.CallTo(() => currentReturn.Id).Returns(Guid.NewGuid());
            A.CallTo(() => currentReturn.Quarter).Returns(q4);
            A.CallTo(() => currentReturn.Organisation).Returns(requestedOrganisation);
            A.CallTo(() => currentReturn.ReturnStatus).Returns(Domain.AatfReturn.ReturnStatus.Submitted);

            List <Return> returns = new List <Return>()
            {
                A.Fake <Return>(),
                A.Fake <Return>(),
                A.Fake <Return>(),
                A.Fake <Return>()
            };

            A.CallTo(() => returns.ElementAt(0).Id).Returns(Guid.NewGuid());
            A.CallTo(() => returns.ElementAt(0).Quarter).Returns(q2);
            A.CallTo(() => returns.ElementAt(0).Organisation).Returns(requestedOrganisation);
            A.CallTo(() => returns.ElementAt(0).ReturnStatus).Returns(Domain.AatfReturn.ReturnStatus.Submitted);

            A.CallTo(() => returns.ElementAt(1).Id).Returns(Guid.NewGuid());
            A.CallTo(() => returns.ElementAt(1).Quarter).Returns(q1);
            A.CallTo(() => returns.ElementAt(1).Organisation).Returns(requestedOrganisation);
            A.CallTo(() => returns.ElementAt(1).ReturnStatus).Returns(Domain.AatfReturn.ReturnStatus.Submitted);

            A.CallTo(() => returns.ElementAt(2).Id).Returns(Guid.NewGuid());
            A.CallTo(() => returns.ElementAt(2).Quarter).Returns(q1);
            A.CallTo(() => returns.ElementAt(2).Organisation).Returns(otherOrganisation);
            A.CallTo(() => returns.ElementAt(2).ReturnStatus).Returns(Domain.AatfReturn.ReturnStatus.Submitted);

            A.CallTo(() => returns.ElementAt(3).Id).Returns(Guid.NewGuid());
            A.CallTo(() => returns.ElementAt(3).Quarter).Returns(q2);
            A.CallTo(() => returns.ElementAt(3).Organisation).Returns(otherOrganisation);
            A.CallTo(() => returns.ElementAt(3).ReturnStatus).Returns(Domain.AatfReturn.ReturnStatus.Submitted);

            returns.Add(previousReturn);
            returns.Add(currentReturn);

            A.CallTo(() => dataAccess.GetAll <Return>()).Returns(returns);

            List <ReturnScheme> returnSchemes = new List <ReturnScheme>()
            {
                A.Fake <ReturnScheme>(),
                A.Fake <ReturnScheme>(),
                A.Fake <ReturnScheme>()
            };

            A.CallTo(() => returnSchemes.ElementAt(0).SchemeId).Returns(Guid.NewGuid());
            A.CallTo(() => returnSchemes.ElementAt(0).Id).Returns(Guid.NewGuid());
            A.CallTo(() => returnSchemes.ElementAt(0).ReturnId).Returns(previousReturn.Id);

            A.CallTo(() => returnSchemes.ElementAt(1).SchemeId).Returns(Guid.NewGuid());
            A.CallTo(() => returnSchemes.ElementAt(1).Id).Returns(Guid.NewGuid());
            A.CallTo(() => returnSchemes.ElementAt(1).ReturnId).Returns(previousReturn.Id);

            A.CallTo(() => returnSchemes.ElementAt(2).SchemeId).Returns(Guid.NewGuid());
            A.CallTo(() => returnSchemes.ElementAt(2).Id).Returns(Guid.NewGuid());
            A.CallTo(() => returnSchemes.ElementAt(2).ReturnId).Returns(returns.FirstOrDefault(p => p.Organisation.Id == otherOrganisation.Id).Id);

            A.CallTo(() => dataAccess.GetAll <ReturnScheme>()).Returns(returnSchemes);

            GetPreviousQuarterSchemes request = new GetPreviousQuarterSchemes(requestedOrganisation.Id, currentReturn.Id);

            PreviousQuarterReturnResult result = await handler.HandleAsync(request);

            Assert.Equal(2, result.PreviousSchemes.Count);

            result.PreviousQuarter.Should().Be(new Core.DataReturns.Quarter(q3.Year, (Core.DataReturns.QuarterType)q3.Q));

            result.PreviousSchemes.Should().Contain(returnSchemes.Where(p => p.ReturnId == previousReturn.Id).Select(p => p.SchemeId));

            A.CallTo(() => dataAccess.GetAll <Return>()).MustHaveHappened(Repeated.Exactly.Once);
            A.CallTo(() => dataAccess.GetAll <ReturnScheme>()).MustHaveHappened(Repeated.Exactly.Once);
        }