/// <summary>
        ///     Initializes a new instance of the <see cref="ExpenditureOrchestrator" /> class.
        /// </summary>
        /// <param name="assembler">The assembler.</param>
        /// <param name="dataAccess">The data access.</param>
        /// <param name="errorHelper">
        ///     The error helper.
        /// </param>
        /// <exception cref="System.ArgumentNullException">
        ///     Exception thrown when the assembler or data access objects are null.
        /// </exception>
        public ExpenditureOrchestrator(
            IExpenditureAssembler assembler,
            IExpenditureDataAccess dataAccess,
            IErrorHelper errorHelper)
            : base(errorHelper)
        {
            if (assembler == null)
            {
                throw new ArgumentNullException(nameof(assembler));
            }

            if (dataAccess == null)
            {
                throw new ArgumentNullException(nameof(dataAccess));
            }

            this.assembler  = assembler;
            this.dataAccess = dataAccess;
        }
 public void TearDown()
 {
     orchestrator                     = null;
     assembler                        = null;
     dataAccess                       = null;
     validViewModel                   = null;
     validAddExpenditureRequest       = null;
     validAddExpenditureResponse      = null;
     invalidAddExpenditureRequest     = null;
     invalidAddExpenditureResponse    = null;
     validDeleteExpenditureRequest    = null;
     validDeleteExpenditureResponse   = null;
     invalidDeleteExpenditureRequest  = null;
     invalidDeleteExpenditureResponse = null;
     validGetExpenditureRequest       = null;
     validGetExpenditureResponse      = null;
     invalidGetExpenditureRequest     = null;
     invalidGetExpenditureResponse    = null;
     validExpenditureProxy            = null;
     invalidExpenditureViewModel      = null;
 }
        public void SetUp()
        {
            validViewModel = new ExpenditureViewModel
            {
                Amount   = 10,
                Category = "TEST",
                Id       = Guid.NewGuid(),
                UserId   = Guid.NewGuid()
            };

            validExpenditureProxy = new ExpenditureProxy
            {
                Amount   = 10,
                Category =
                    new CategoryProxy
                {
                    Id   = Guid.NewGuid(),
                    Name = "TEST"
                },
                CategoryId = Guid.NewGuid(),
                Id         = Guid.NewGuid(),
                UserId     = Guid.NewGuid()
            };

            validTrackExpenditureViewModel = new TrackExpenditureViewModel();

            validDeleteExpenditureRequest = new DeleteExpenditureRequest {
                ExpenditureId = validExpenditureProxy.Id
            };
            validDeleteExpenditureResponse = new DeleteExpenditureResponse {
                DeleteSuccess = true
            };
            validAddExpenditureRequest = new AddExpenditureRequest {
                Expenditure = validExpenditureProxy
            };
            validAddExpenditureResponse = new AddExpenditureResponse {
                Expenditure = validExpenditureProxy
            };
            validGetExpenditureRequest = new GetExpenditureRequest {
                ExpenditureId = validExpenditureProxy.Id
            };
            validGetExpenditureResponse = new GetExpenditureResponse {
                Expenditure = validExpenditureProxy
            };
            validGetExpenditureForUserRequest = new GetExpenditureForUserRequest {
                UserId = validExpenditureProxy.Id
            };
            validGetExpenditureForUserResponse =
                new GetExpenditureForUserResponse
            {
                Expenditure = new List <ExpenditureProxy> {
                    validExpenditureProxy
                }
            };
            validEditExpenditureRequest = new EditExpenditureRequest {
                Expenditure = validExpenditureProxy
            };
            validEditExpenditureResponse = new EditExpenditureResponse {
                Expenditure = validExpenditureProxy
            };
            validGetExpenditureForUserForMonthRequest =
                new GetExpenditureForUserForMonthRequest {
                UserId = validExpenditureProxy.Id
            };
            validGetExpenditureForUserForMonthResponse =
                new GetExpenditureForUserForMonthResponse
            {
                Data =
                    new List <ExpenditureProxy> {
                    validExpenditureProxy
                }
            };

            invalidExpenditureViewModel = new ExpenditureViewModel {
                Id = Guid.NewGuid()
            };
            invalidAddExpenditureRequest  = new AddExpenditureRequest();
            invalidAddExpenditureResponse = new AddExpenditureResponse {
                Errors = { new ResponseErrorWrapper() }
            };
            invalidGetExpenditureRequest  = new GetExpenditureRequest();
            invalidGetExpenditureResponse = new GetExpenditureResponse {
                Errors = { new ResponseErrorWrapper() }
            };
            invalidDeleteExpenditureRequest  = new DeleteExpenditureRequest();
            invalidDeleteExpenditureResponse =
                new DeleteExpenditureResponse {
                Errors = { new ResponseErrorWrapper() }
            };
            invalidGetExpenditureForUserRequest  = new GetExpenditureForUserRequest();
            invalidGetExpenditureForUserResponse =
                new GetExpenditureForUserResponse {
                Errors = { new ResponseErrorWrapper() }
            };
            invalidEditExpenditureRequest  = new EditExpenditureRequest();
            invalidEditExpenditureResponse = new EditExpenditureResponse {
                Errors = { new ResponseErrorWrapper() }
            };
            invalidGetExpenditureForUserForMonthRequest  = new GetExpenditureForUserForMonthRequest();
            invalidGetExpenditureForUserForMonthResponse =
                new GetExpenditureForUserForMonthResponse {
                Errors = { new ResponseErrorWrapper() }
            };

            assembler   = Substitute.For <IExpenditureAssembler>();
            dataAccess  = Substitute.For <IExpenditureDataAccess>();
            errorHelper = Substitute.For <IErrorHelper>();

            errorHelper.Create(Arg.Any <Exception>(), Arg.Any <string>(), Arg.Any <Type>(), Arg.Any <string>())
            .Returns(new ResponseErrorWrapper());
            errorHelper.Create(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <Type>(), Arg.Any <string>())
            .Returns(new ResponseErrorWrapper());

            assembler.NewAddExpenditureRequest(validViewModel, validUsername).Returns(validAddExpenditureRequest);
            assembler.NewAddExpenditureRequest(invalidExpenditureViewModel, validUsername)
            .Returns(invalidAddExpenditureRequest);
            assembler.NewAddExpenditureRequest(null, validUsername).Throws(new Exception("TEST EXCEPTION"));
            assembler.NewExpenditureViewModel(validAddExpenditureResponse).Returns(validViewModel);
            assembler.NewExpenditureViewModel(validEditExpenditureResponse).Returns(validViewModel);
            assembler.NewDeleteExpenditureRequest(validViewModel.Id, validUsername)
            .Returns(validDeleteExpenditureRequest);
            assembler.NewDeleteExpenditureRequest(invalidExpenditureViewModel.Id, validUsername)
            .Returns(invalidDeleteExpenditureRequest);
            assembler.NewDeleteExpenditureRequest(Guid.Empty, validUsername).Throws(new Exception("TEST EXCEPTION"));
            assembler.NewGetExpenditureRequest(validViewModel.Id, validUsername).Returns(validGetExpenditureRequest);
            assembler.NewGetExpenditureRequest(invalidExpenditureViewModel.Id, validUsername)
            .Returns(invalidGetExpenditureRequest);
            assembler.NewGetExpenditureRequest(Guid.Empty, validUsername).Throws(new Exception("TEST EXCEPTION"));
            assembler.NewGetExpenditureForUserRequest(validViewModel.Id, validUsername)
            .Returns(validGetExpenditureForUserRequest);
            assembler.NewGetExpenditureForUserRequest(invalidExpenditureViewModel.Id, validUsername)
            .Returns(invalidGetExpenditureForUserRequest);
            assembler.NewGetExpenditureForUserRequest(Guid.Empty, validUsername)
            .Throws(new Exception("TEST EXCEPTION"));
            assembler.NewEditExpenditureRequest(validViewModel, validUsername).Returns(validEditExpenditureRequest);
            assembler.NewEditExpenditureRequest(invalidExpenditureViewModel, validUsername)
            .Returns(invalidEditExpenditureRequest);
            assembler.NewEditExpenditureRequest(null, validUsername).Throws(new Exception("TEST EXCEPTION"));
            assembler.NewGetExpenditureForUserForMonthRequest(1, validViewModel.Id, validUsername)
            .Returns(validGetExpenditureForUserForMonthRequest);
            assembler.NewGetExpenditureForUserForMonthRequest(1, invalidExpenditureViewModel.Id, validUsername)
            .Returns(invalidGetExpenditureForUserForMonthRequest);
            assembler.NewTrackExpenditureViewModel(validGetExpenditureForUserResponse)
            .Returns(validTrackExpenditureViewModel);
            assembler.NewExportViewModel(Arg.Any <IList <ExpenditureProxy> >(), ExportType.Json)
            .Throws(new Exception("TEST"));

            dataAccess.AddExpenditure(validAddExpenditureRequest).Returns(validAddExpenditureResponse);
            dataAccess.AddExpenditure(invalidAddExpenditureRequest).Returns(invalidAddExpenditureResponse);
            dataAccess.DeleteExpenditure(validDeleteExpenditureRequest).Returns(validDeleteExpenditureResponse);
            dataAccess.DeleteExpenditure(invalidDeleteExpenditureRequest).Returns(invalidDeleteExpenditureResponse);
            dataAccess.GetExpenditure(validGetExpenditureRequest).Returns(validGetExpenditureResponse);
            dataAccess.GetExpenditure(invalidGetExpenditureRequest).Returns(invalidGetExpenditureResponse);
            dataAccess.GetExpenditureForUser(validGetExpenditureForUserRequest)
            .Returns(validGetExpenditureForUserResponse);
            dataAccess.GetExpenditureForUser(invalidGetExpenditureForUserRequest)
            .Returns(invalidGetExpenditureForUserResponse);
            dataAccess.EditExpenditure(validEditExpenditureRequest).Returns(validEditExpenditureResponse);
            dataAccess.EditExpenditure(invalidEditExpenditureRequest).Returns(invalidEditExpenditureResponse);
            dataAccess.GetExpenditureForUserForMonth(validGetExpenditureForUserForMonthRequest)
            .Returns(validGetExpenditureForUserForMonthResponse);
            dataAccess.GetExpenditureForUserForMonth(invalidGetExpenditureForUserForMonthRequest)
            .Returns(invalidGetExpenditureForUserForMonthResponse);

            assembler.NewExportViewModel(new List <ExpenditureProxy> {
                validExpenditureProxy
            }, ExportType.Csv)
            .Returns(new ExportViewModel());

            orchestrator = new ExpenditureOrchestrator(assembler, dataAccess, errorHelper);
        }