public async Task ExpenditurePostTest_SaveForLater()
        {
            string id = Guid.NewGuid().ToString();

            this._controller.RouteData.Values.Add("id", id);
            this._portalSettings.Features.EnablePartialSave = true;

            ExpendituresVm       vm    = new ExpendituresVm();
            IncomeAndExpenditure iAndE = new IncomeAndExpenditure();

            this._sessionState.Setup(x => x.CheckSessionStatus(id));
            this._sessionState.Setup(x => x.GetIncomeAndExpenditure(Guid.Parse(id))).Returns(iAndE);
            this._mapper.Setup(x => x.Map(vm, iAndE)).Returns(iAndE);
            this._sessionState.Setup(x => x.SaveIncomeAndExpenditure(iAndE, Guid.Parse(id)));

            string lowellReference = "123456789";

            this._sessionState.Setup(x => x.GetLowellReferenceFromSurrogate(Guid.Parse(id)))
            .Returns(lowellReference);

            this._webActivityService.Setup(x => x.LogBudgetCalculatorCompleted(lowellReference, this._caseflowUserId))
            .Returns(Task.CompletedTask);

            this._budgetCalculatorService.Setup(x => x.PartiallySaveIncomeAndExpenditure(
                                                    iAndE, lowellReference, Guid.Parse(this._caseflowUserId))).Returns(Task.FromResult(true));

            ViewResult result = (ViewResult)await this._controller
                                .ExpenditurePost(vm, "saveforlater");

            Assert.IsTrue(vm.EnabledPartialSave);
            Assert.IsTrue(vm.PartialSavedIAndE);
            Assert.IsFalse(vm.HasErrorPartialSavedIAndE);
            Assert.AreEqual("Expenditure", result.ViewName);
            Assert.AreEqual(vm, result.Model);
        }
        public void ConvertTest_SourceNull()
        {
            ExpendituresVm       source      = null;
            IncomeAndExpenditure destination = Utilities.CreateDefaultTestIAndE();
            IncomeAndExpenditure expected    = Utilities.DeepCopy(destination);

            expected.Healthcare                    = 0;
            expected.HealthcareFrequency           = null;
            expected.Leisure                       = 0;
            expected.LeisureFrequency              = null;
            expected.Housekeeping                  = 0;
            expected.HousekeepingFrequency         = null;
            expected.OtherExpenditure              = 0;
            expected.OtherExpenditureFrequency     = null;
            expected.PensionInsurance              = 0;
            expected.PensionInsuranceFrequency     = null;
            expected.PersonalCosts                 = 0;
            expected.PersonalCostsFrequency        = null;
            expected.ProfessionalCosts             = 0;
            expected.ProfessionalCostsFrequency    = null;
            expected.SavingsContributions          = 0;
            expected.SavingsContributionsFrequency = null;
            expected.SchoolCosts                   = 0;
            expected.SchoolCostsFrequency          = null;
            expected.Travel          = 0;
            expected.TravelFrequency = null;

            IncomeAndExpenditure result = _converter.Convert(source, destination, null);

            //Check result is as expected
            Assert.IsTrue(Utilities.DeepCompare(expected, result));
        }
        public async Task ExpenditurePostTest_InvalidModelState()
        {
            string id = Guid.NewGuid().ToString();

            this._controller.RouteData.Values.Add("id", id);
            this._controller.ModelState.AddModelError("testing", "testing");
            this._portalSettings.Features.EnablePartialSave = true;

            ExpendituresVm       vm                 = new ExpendituresVm();
            IncomeAndExpenditure iAndE              = new IncomeAndExpenditure();
            MonthlyIncome        monthlyIncome      = new MonthlyIncome();
            MonthlyIncomeVm      monthlyIncomeVm    = new MonthlyIncomeVm();
            MonthlyOutgoings     monthlyOutgoings   = new MonthlyOutgoings();
            MonthlyOutgoingsVm   monthlyOutgoingsVm = new MonthlyOutgoingsVm();

            this._sessionState.Setup(x => x.CheckSessionStatus(id));
            this._sessionState.Setup(x => x.GetIncomeAndExpenditure(Guid.Parse(id))).Returns(iAndE);
            this._mapper.Setup(x => x.Map(vm, iAndE)).Returns(iAndE);
            this._sessionState.Setup(x => x.SaveIncomeAndExpenditure(iAndE, Guid.Parse(id)));

            this._calculatorService.Setup(x => x.CalculateMonthlyIncome(iAndE)).Returns(monthlyIncome);
            this._calculatorService.Setup(x => x.CalculateMonthlyOutgoings(iAndE)).Returns(monthlyOutgoings);
            this._mapper.Setup(x => x.Map <MonthlyIncome, MonthlyIncomeVm>(monthlyIncome))
            .Returns(monthlyIncomeVm);
            this._mapper.Setup(x => x.Map <MonthlyOutgoings, MonthlyOutgoingsVm>(monthlyOutgoings))
            .Returns(monthlyOutgoingsVm);

            ViewResult result = (ViewResult)await this._controller.ExpenditurePost(vm, "testing");

            Assert.AreEqual("Expenditure", result.ViewName);
            Assert.AreEqual(vm, result.Model);
            Assert.AreEqual(vm.IncomeVmSummary, monthlyIncomeVm);
            Assert.AreEqual(vm.OutgoingsVmSummary, monthlyOutgoingsVm);
            Assert.IsTrue(vm.EnabledPartialSave);
        }
        public async Task ExpenditurePostTest()
        {
            string id = Guid.NewGuid().ToString();

            this._controller.RouteData.Values.Add("id", id);
            this._portalSettings.Features.EnablePartialSave = true;

            ExpendituresVm       vm    = new ExpendituresVm();
            IncomeAndExpenditure iAndE = new IncomeAndExpenditure();

            this._sessionState.Setup(x => x.CheckSessionStatus(id));
            this._sessionState.Setup(x => x.GetIncomeAndExpenditure(Guid.Parse(id))).Returns(iAndE);
            this._mapper.Setup(x => x.Map(vm, iAndE)).Returns(iAndE);
            this._sessionState.Setup(x => x.SaveIncomeAndExpenditure(iAndE, Guid.Parse(id)));

            string lowellReference = "123456789";

            this._sessionState.Setup(x => x.GetLowellReferenceFromSurrogate(Guid.Parse(id)))
            .Returns(lowellReference);

            this._webActivityService.Setup(x => x.LogBudgetCalculatorCompleted(lowellReference, this._caseflowUserId))
            .Returns(Task.CompletedTask);

            RedirectToActionResult result = (RedirectToActionResult)await this._controller
                                            .ExpenditurePost(vm, "testing");

            Assert.IsTrue(vm.EnabledPartialSave);
            Assert.AreEqual("BudgetSummary", result.ActionName);
            Assert.AreEqual(id, result.RouteValues["id"]);
        }
        public void ConvertTest_SourceNull()
        {
            IncomeAndExpenditure source      = null;
            ExpendituresVm       destination = Utilities.CreateDefaultTestExpendituresVm();
            ExpendituresVm       expected    = Utilities.DeepCopy(destination);

            MonthlyIncome   monthlyIncome   = new MonthlyIncome();
            MonthlyIncomeVm monthlyIncomeVm = new MonthlyIncomeVm()
            {
                Benefits = 100,
                Other    = 200,
                Pension  = 300,
                Salary   = 400,
                Total    = 1000
            };

            MonthlyOutgoings   monthlyOutgoings   = new MonthlyOutgoings();
            MonthlyOutgoingsVm monthlyOutgoingsVm = new MonthlyOutgoingsVm()
            {
                Expenditures   = 1000,
                HouseholdBills = 2000,
                Total          = 3000
            };

            _calculatorService.Setup(x => x.CalculateMonthlyIncome(It.IsAny <IncomeAndExpenditure>()))
            .Returns(monthlyIncome);
            _mapper.Setup(x => x.Map <MonthlyIncomeVm>(monthlyIncome)).Returns(monthlyIncomeVm);
            _calculatorService.Setup(x => x.CalculateMonthlyOutgoings(It.IsAny <IncomeAndExpenditure>()))
            .Returns(monthlyOutgoings);
            _mapper.Setup(x => x.Map <MonthlyOutgoingsVm>(monthlyOutgoings)).Returns(monthlyOutgoingsVm);

            expected.CareAndHealthCosts.Amount          = 0;
            expected.CareAndHealthCosts.Frequency       = null;
            expected.CommunicationsAndLeisure.Amount    = 0;
            expected.CommunicationsAndLeisure.Frequency = null;
            expected.FoodAndHouseKeeping.Amount         = 0;
            expected.FoodAndHouseKeeping.Frequency      = null;
            expected.IncomeVmSummary                = monthlyIncomeVm;
            expected.Other.Amount                   = 0;
            expected.Other.Frequency                = null;
            expected.OutgoingsVmSummary             = monthlyOutgoingsVm;
            expected.PensionsAndInsurance.Amount    = 0;
            expected.PensionsAndInsurance.Frequency = null;
            expected.PersonalCosts.Amount           = 0;
            expected.PersonalCosts.Frequency        = null;
            expected.Professional.Amount            = 0;
            expected.Professional.Frequency         = null;
            expected.Savings.Amount                 = 0;
            expected.Savings.Frequency              = null;
            expected.SchoolCosts.Amount             = 0;
            expected.SchoolCosts.Frequency          = null;
            expected.TravelAndTransport.Amount      = 0;
            expected.TravelAndTransport.Frequency   = null;

            ExpendituresVm result = _converter.Convert(source, destination, null);

            //Check result is as expected
            Assert.IsTrue(Utilities.DeepCompare(expected, result));
        }
        public async Task <IActionResult> ExpenditurePost(ExpendituresVm viewModel, string submit)
        {
            if (submit == "saveforlater")
            {
                viewModel.PartialSavedEvent = true;
            }

            var id = RouteData.Values["id"];

            if (id == null)
            {
                return(RedirectToAction("Index", "MyAccounts"));
            }

            Guid guid = Guid.Parse(id.ToString());

            ApplicationSessionState.CheckSessionStatus(id.ToString());
            viewModel.EnabledPartialSave = _portalSettings.Features.EnablePartialSave && LoggedInUser.IsLoggedInUser;

            var incomeExpenditure = ApplicationSessionState.GetIncomeAndExpenditure(guid);

            incomeExpenditure = _mapper.Map(viewModel, incomeExpenditure);
            ApplicationSessionState.SaveIncomeAndExpenditure(incomeExpenditure, guid);

            if (!ModelState.IsValid)
            {
                MonthlyIncome    monthlyIncome    = _calculatorService.CalculateMonthlyIncome(incomeExpenditure);
                MonthlyOutgoings monthlyOutgoings = _calculatorService.CalculateMonthlyOutgoings(incomeExpenditure);

                viewModel.IncomeVmSummary    = _mapper.Map <MonthlyIncome, MonthlyIncomeVm>(monthlyIncome);
                viewModel.OutgoingsVmSummary = _mapper.Map <MonthlyOutgoings, MonthlyOutgoingsVm>(monthlyOutgoings);

                return(View("Expenditure", viewModel));
            }

            string lowellReference = ApplicationSessionState.GetLowellReferenceFromSurrogate(guid);

            await _webActivityService.LogBudgetCalculatorCompleted(lowellReference, LoggedInUserId);

            if (submit == "saveforlater" && LoggedInUser.IsLoggedInUser && _portalSettings.Features.EnablePartialSave)
            {
                bool isPartialSaved = await PartialSave(incomeExpenditure, lowellReference);

                viewModel.PartialSavedIAndE         = isPartialSaved;
                viewModel.HasErrorPartialSavedIAndE = !isPartialSaved;

                return(View("Expenditure", viewModel));
            }

            return(RedirectToAction("BudgetSummary", new { id }));
        }
        public async Task <IActionResult> Expenditure(ExpendituresVm viewModel)
        {
            var id = RouteData.Values["id"];

            if (id == null)
            {
                return(RedirectToAction("Index", "MyAccounts"));
            }

            Guid guid = Guid.Parse(id.ToString());

            ApplicationSessionState.CheckSessionStatus(id.ToString());
            viewModel.EnabledPartialSave = _portalSettings.Features.EnablePartialSave && LoggedInUser.IsLoggedInUser;

            IncomeAndExpenditure iAndE = ApplicationSessionState.GetIncomeAndExpenditure(guid);

            var guideLines = await _triggerFigureService.GetExpenditureMetrics(ApplicationSessionState);

            var foodAndHousekeepingTrigger      = _triggerFigureService.CalculateTriggerFigure(guideLines.FoodAndHousekeeping, iAndE.AdultsInHousehold, iAndE.ChildrenUnder16, iAndE.Children16to18);
            var personalCostsTrigger            = _triggerFigureService.CalculateTriggerFigure(guideLines.PersonalCosts, iAndE.AdultsInHousehold, iAndE.ChildrenUnder16, iAndE.Children16to18);
            var communicationsAndLeisureTrigger = _triggerFigureService.CalculateTriggerFigure(guideLines.CommsAndLeisure, iAndE.AdultsInHousehold, iAndE.ChildrenUnder16, iAndE.Children16to18);

            viewModel = _mapper.Map(iAndE, viewModel);

            viewModel.FoodAndHouseKeepingTriggerMin      = _triggerFigureService.CalculateMinTriggerValue(foodAndHousekeepingTrigger);
            viewModel.FoodAndHouseKeepingTriggerMax      = _triggerFigureService.CalculateMaxTriggerValue(foodAndHousekeepingTrigger);
            viewModel.PersonalCostsTriggerMin            = _triggerFigureService.CalculateMinTriggerValue(personalCostsTrigger);
            viewModel.PersonalCostsTriggerMax            = _triggerFigureService.CalculateMaxTriggerValue(personalCostsTrigger);
            viewModel.CommunicationsAndLeisureTriggerMin = _triggerFigureService.CalculateMinTriggerValue(communicationsAndLeisureTrigger);
            viewModel.CommunicationsAndLeisureTriggerMax = _triggerFigureService.CalculateMaxTriggerValue(communicationsAndLeisureTrigger);

            string  employmentStatus = iAndE.EmploymentStatus;
            string  housingStatus    = iAndE.HousingStatus;
            decimal income           = viewModel.IncomeVmSummary.Total;
            decimal totalExpenditure = viewModel.OutgoingsVmSummary.Total;
            decimal disposableIncome = _calculatorService.CalculateDisposableIncome(income, totalExpenditure);

            _gtmService.RaiseBudgetCalculatorExpenditureEvent(viewModel, LoggedInUserId, employmentStatus, housingStatus, income, totalExpenditure, disposableIncome);

            return(View(viewModel));
        }
        public void ConvertTest()
        {
            ExpendituresVm source = new ExpendituresVm()
            {
                CareAndHealthCosts = new ExpenditureSourceVm()
                {
                    Amount = 100, Frequency = "monthly"
                },
                CommunicationsAndLeisure = new ExpenditureSourceVm()
                {
                    Amount = 150, Frequency = "weekly"
                },
                FoodAndHouseKeeping = new ExpenditureSourceVm()
                {
                    Amount = 200, Frequency = "fortnightly"
                },
                Other = new ExpenditureSourceVm()
                {
                    Amount = 250, Frequency = "monthly"
                },
                PensionsAndInsurance = new ExpenditureSourceVm()
                {
                    Amount = 300, Frequency = "weekly"
                },
                PersonalCosts = new ExpenditureSourceVm()
                {
                    Amount = 350, Frequency = "fortnightly"
                },
                Professional = new ExpenditureSourceVm()
                {
                    Amount = 400, Frequency = "monthly"
                },
                Savings = new ExpenditureSourceVm()
                {
                    Amount = 450, Frequency = "weekly"
                },
                SchoolCosts = new ExpenditureSourceVm()
                {
                    Amount = 500, Frequency = "fortnightly"
                },
                TravelAndTransport = new ExpenditureSourceVm()
                {
                    Amount = 550, Frequency = "monthly"
                },
                EnabledPartialSave = true,
                GtmEvents          = new List <GtmEvent>()
                {
                    new GtmEvent()
                    {
                        account_ref = "123456789"
                    }
                },
                IncomeVmSummary = new MonthlyIncomeVm()
                {
                    Benefits = 100,
                    Other    = 200,
                    Pension  = 300,
                    Salary   = 400,
                    Total    = 1000
                },
                OutgoingsVmSummary = new MonthlyOutgoingsVm()
                {
                    Expenditures   = 1000,
                    HouseholdBills = 2000,
                    Total          = 3000
                },
                CommunicationsAndLeisureTriggerMax = 456,
                CommunicationsAndLeisureTriggerMin = 123,
                HasErrorPartialSavedIAndE          = true,
                FoodAndHouseKeepingTriggerMin      = 567,
                FoodAndHouseKeepingTriggerMax      = 789,
                PartialSavedEvent       = true,
                PartialSavedIAndE       = true,
                PersonalCostsTriggerMax = 234,
                PersonalCostsTriggerMin = 567
            };

            //Create a copy of source for later
            ExpendituresVm sourceCopy = Utilities.DeepCopy(source);

            IncomeAndExpenditure destination = Utilities.CreateDefaultTestIAndE();
            IncomeAndExpenditure expected    = Utilities.DeepCopy(destination);

            expected.Healthcare                    = 100;
            expected.HealthcareFrequency           = "monthly";
            expected.Leisure                       = 150;
            expected.LeisureFrequency              = "weekly";
            expected.Housekeeping                  = 200;
            expected.HousekeepingFrequency         = "fortnightly";
            expected.OtherExpenditure              = 250;
            expected.OtherExpenditureFrequency     = "monthly";
            expected.PensionInsurance              = 300;
            expected.PensionInsuranceFrequency     = "weekly";
            expected.PersonalCosts                 = 350;
            expected.PersonalCostsFrequency        = "fortnightly";
            expected.ProfessionalCosts             = 400;
            expected.ProfessionalCostsFrequency    = "monthly";
            expected.SavingsContributions          = 450;
            expected.SavingsContributionsFrequency = "weekly";
            expected.SchoolCosts                   = 500;
            expected.SchoolCostsFrequency          = "fortnightly";
            expected.Travel          = 550;
            expected.TravelFrequency = "monthly";

            IncomeAndExpenditure result = _converter.Convert(source, destination, null);

            //Check result is as expected
            Assert.IsTrue(Utilities.DeepCompare(expected, result));

            //Check that source hasn't been modified
            Assert.IsTrue(Utilities.DeepCompare(source, sourceCopy));
        }
        public async Task ExpendituresTest()
        {
            string id = Guid.NewGuid().ToString();

            this._controller.RouteData.Values.Add("id", id);
            this._portalSettings.Features.EnablePartialSave = true;

            this._sessionState.Setup(x => x.CheckSessionStatus(id));

            IncomeAndExpenditure iAndE = new IncomeAndExpenditure()
            {
                AdultsInHousehold = 1,
                Children16to18    = 2,
                ChildrenUnder16   = 3,
                EmploymentStatus  = "employment-status",
                HousingStatus     = "housing-status"
            };

            ExpendituresVm vm = new ExpendituresVm()
            {
                IncomeVmSummary = new MonthlyIncomeVm()
                {
                    Benefits = 100,
                    Other    = 200,
                    Pension  = 300,
                    Salary   = 400,
                    Total    = 1000
                },
                OutgoingsVmSummary = new MonthlyOutgoingsVm()
                {
                    Expenditures   = 1000,
                    HouseholdBills = 2000,
                    Total          = 3000
                }
            };

            ExpenditureMetrics expenditureMetrics = new ExpenditureMetrics()
            {
                CommsAndLeisure     = new ExpenditureMetric(),
                FoodAndHousekeeping = new ExpenditureMetric(),
                PersonalCosts       = new ExpenditureMetric()
            };

            this._sessionState.Setup(x => x.GetIncomeAndExpenditure(Guid.Parse(id))).Returns(iAndE);
            this._triggerFigureService.Setup(x => x.GetExpenditureMetrics(this._sessionState.Object))
            .Returns(Task.FromResult(expenditureMetrics));
            this._triggerFigureService.Setup(x => x.CalculateTriggerFigure(expenditureMetrics.FoodAndHousekeeping, 1, 3, 2))
            .Returns(100);
            this._triggerFigureService.Setup(x => x.CalculateTriggerFigure(expenditureMetrics.PersonalCosts, 1, 3, 2))
            .Returns(200);
            this._triggerFigureService.Setup(x => x.CalculateTriggerFigure(expenditureMetrics.CommsAndLeisure, 1, 3, 2))
            .Returns(300);

            this._mapper.Setup(x => x.Map(iAndE, vm)).Returns(vm);

            this._triggerFigureService.Setup(x => x.CalculateMinTriggerValue(100)).Returns(80);
            this._triggerFigureService.Setup(x => x.CalculateMaxTriggerValue(100)).Returns(120);
            this._triggerFigureService.Setup(x => x.CalculateMinTriggerValue(200)).Returns(160);
            this._triggerFigureService.Setup(x => x.CalculateMaxTriggerValue(200)).Returns(240);
            this._triggerFigureService.Setup(x => x.CalculateMinTriggerValue(300)).Returns(180);
            this._triggerFigureService.Setup(x => x.CalculateMaxTriggerValue(300)).Returns(360);

            this._calculatorService.Setup(x => x.CalculateDisposableIncome(1000, 3000)).Returns(1500);

            this._gtmService.Setup(x => x.RaiseBudgetCalculatorExpenditureEvent(
                                       vm, this._caseflowUserId, "employment-status", "housing-status", 1000, 3000, 1500));

            ViewResult result = (ViewResult)await this._controller.Expenditure(vm);

            Assert.AreEqual(vm, result.Model);

            Assert.IsTrue(vm.EnabledPartialSave);
            Assert.AreEqual(vm.FoodAndHouseKeepingTriggerMin, 80);
            Assert.AreEqual(vm.FoodAndHouseKeepingTriggerMax, 120);
            Assert.AreEqual(vm.PersonalCostsTriggerMin, 160);
            Assert.AreEqual(vm.PersonalCostsTriggerMax, 240);
            Assert.AreEqual(vm.CommunicationsAndLeisureTriggerMin, 180);
            Assert.AreEqual(vm.CommunicationsAndLeisureTriggerMax, 360);
        }
        public void ConvertTest()
        {
            IncomeAndExpenditure source = new IncomeAndExpenditure()
            {
                Mortgage             = 100,
                MortgageArrears      = 10,
                MortgageFrequency    = "monthly",
                Rental               = 150,
                RentalArrears        = 0,
                RentalFrequency      = "weekly",
                Electricity          = 200,
                ElectricityArrears   = 20,
                ElectricityFrequency = "fortnightly",
                CCJs                      = 250,
                CCJsArrears               = 0,
                CCJsFrequency             = "monthly",
                ChildMaintenance          = 300,
                ChildMaintenanceArrears   = 30,
                ChildMaintenanceFrequency = "weekly",
                CouncilTax                = 350,
                CouncilTaxArrears         = 0,
                CouncilTaxFrequency       = "fortnightly",
                CourtFines                = 400,
                CourtFinesArrears         = 40,
                CourtFinesFrequency       = "monthly",
                Gas                           = 450,
                GasArrears                    = 0,
                GasFrequency                  = "weekly",
                OtherUtilities                = 500,
                OtherUtilitiesArrears         = 50,
                OtherUtilitiesFrequency       = "fortnightly",
                Rent                          = 550,
                RentArrears                   = 0,
                RentFrequency                 = "monthly",
                SecuredLoans                  = 600,
                SecuredloansArrears           = 60,
                SecuredLoansFrequency         = "weekly",
                TvLicence                     = 650,
                TvLicenceArrears              = 0,
                TvLicenceFrequency            = "fortnightly",
                Water                         = 700,
                WaterArrears                  = 70,
                WaterFrequency                = "monthly",
                AdultsInHousehold             = 1,
                ChildrenUnder16               = 2,
                Children16to18                = 3,
                HasArrears                    = true,
                UtilitiesTotal                = 750,
                UtilitiesTotalArrears         = 0,
                UtilitiesTotalFrequency       = "weekly",
                User                          = "******",
                Created                       = DateTime.Now.Date,
                Healthcare                    = 800,
                HealthcareFrequency           = "fortnightly",
                HomeContents                  = 850,
                HomeContentsArrears           = 0,
                HomeContentsFrequency         = "monthly",
                EmploymentStatus              = "student",
                Housekeeping                  = 900,
                HousekeepingFrequency         = "monthly",
                HousingStatus                 = "homeowner",
                DisposableIncome              = 999.99M,
                BenefitsTotal                 = 888.88M,
                BenefitsTotalFrequency        = "monthly",
                Leisure                       = 50,
                LeisureFrequency              = "weekly",
                OtherDebts                    = new List <SaveOtherDebts>(),
                OtherExpenditure              = 60,
                OtherExpenditureFrequency     = "fortnightly",
                OtherIncome                   = 500,
                OtherincomeFrequency          = "monthly",
                LowellReference               = "123456789",
                EarningsTotal                 = 10000,
                EarningsTotalFrequency        = "monthly",
                PersonalCosts                 = 225,
                PersonalCostsFrequency        = "monthly",
                Pension                       = 400,
                PensionFrequency              = "monthly",
                Salary                        = 9999,
                SalaryFrequency               = "monthly",
                SavingsContributions          = 55,
                SavingsContributionsFrequency = "weekly",
                SchoolCosts                   = 5,
                SchoolCostsFrequency          = "weekly",
                Travel                        = 45,
                TravelFrequency               = "fortnightly",
                ProfessionalCosts             = 123,
                ProfessionalCostsFrequency    = "monthly",
                IncomeTotal                   = 1234.56M,
                PensionInsurance              = 75,
                PensionInsuranceFrequency     = "monthly",
                ExpenditureTotal              = 1000
            };

            //Create a copy of source for later
            IncomeAndExpenditure sourceCopy = Utilities.DeepCopy(source);

            ExpendituresVm destination = Utilities.CreateDefaultTestExpendituresVm();
            ExpendituresVm expected    = Utilities.DeepCopy(destination);

            MonthlyIncome   monthlyIncome   = new MonthlyIncome();
            MonthlyIncomeVm monthlyIncomeVm = new MonthlyIncomeVm()
            {
                Benefits = 100,
                Other    = 200,
                Pension  = 300,
                Salary   = 400,
                Total    = 1000
            };

            MonthlyOutgoings   monthlyOutgoings   = new MonthlyOutgoings();
            MonthlyOutgoingsVm monthlyOutgoingsVm = new MonthlyOutgoingsVm()
            {
                Expenditures   = 1000,
                HouseholdBills = 2000,
                Total          = 3000
            };

            _calculatorService.Setup(x => x.CalculateMonthlyIncome(source))
            .Returns(monthlyIncome);
            _mapper.Setup(x => x.Map <MonthlyIncomeVm>(monthlyIncome)).Returns(monthlyIncomeVm);
            _calculatorService.Setup(x => x.CalculateMonthlyOutgoings(source))
            .Returns(monthlyOutgoings);
            _mapper.Setup(x => x.Map <MonthlyOutgoingsVm>(monthlyOutgoings)).Returns(monthlyOutgoingsVm);

            expected.CareAndHealthCosts.Amount          = 800;
            expected.CareAndHealthCosts.Frequency       = "fortnightly";
            expected.CommunicationsAndLeisure.Amount    = 50;
            expected.CommunicationsAndLeisure.Frequency = "weekly";
            expected.FoodAndHouseKeeping.Amount         = 900;
            expected.FoodAndHouseKeeping.Frequency      = "monthly";
            expected.IncomeVmSummary                = monthlyIncomeVm;
            expected.Other.Amount                   = 60;
            expected.Other.Frequency                = "fortnightly";
            expected.OutgoingsVmSummary             = monthlyOutgoingsVm;
            expected.PensionsAndInsurance.Amount    = 75;
            expected.PensionsAndInsurance.Frequency = "monthly";
            expected.PersonalCosts.Amount           = 225;
            expected.PersonalCosts.Frequency        = "monthly";
            expected.Professional.Amount            = 123;
            expected.Professional.Frequency         = "monthly";
            expected.Savings.Amount                 = 55;
            expected.Savings.Frequency              = "weekly";
            expected.SchoolCosts.Amount             = 5;
            expected.SchoolCosts.Frequency          = "weekly";
            expected.TravelAndTransport.Amount      = 45;
            expected.TravelAndTransport.Frequency   = "fortnightly";

            ExpendituresVm result = _converter.Convert(source, destination, null);

            //Check that the result is as expected
            Assert.IsTrue(Utilities.DeepCompare(expected, result));

            //Check that source hasn't been modified
            Assert.IsTrue(Utilities.DeepCompare(source, sourceCopy));
        }