public BaseTransactionsApiTests()
        {
            _transactionsResourceUri = _baseAddress + "api/transactions";
            _transactionResourceUri = _transactionsResourceUri + "/1";

            _dummyTransaction = new Transaction { Id = 1, Amount = 123, CurrencyCode = "JPY" };
            _dummyEmptyListOfTransactions = new List<Transaction>();
            _dummyListOfTransactionsWithADummyTransaction = new List<Transaction> { _dummyTransaction };
        }
        public void When_save_succeeds_should_return_http_staus_ok()
        {
            //Arrange
            var transactionToUpdate = new Transaction { Id = 1, Amount = 123, CurrencyCode = "JPY" };
            var updatedTransaction = new Transaction { Id = 1, Amount = 321, CurrencyCode = "GBP" };

            var transactionRepoMock = NinjectBootstrap.KernelInstance.Get<ITransactionRepository>();
            transactionRepoMock.Stub(_ => _.GetAll()).Return(new List<Transaction>() { transactionToUpdate });
            transactionRepoMock.Stub(_ => _.SaveOrUpdate(Arg<Transaction>.Is.Anything)).Return(true);

            var response = _client.PutAsJsonAsync(_transactionResourceUri, updatedTransaction).Result;

            Assert.IsTrue(
                response.IsSuccessStatusCode,
                String.Format("Actual {0}", response.StatusCode));
        }
        internal TransactionModel CreateNew(Transaction transaction)
        {
            return new TransactionModel
            {
                Url = _urlHelper.Link("TransactionsApi", new { Id = transaction.Id }),

                TransactionId = transaction.Id,
                TransactionAmount = transaction.Amount,
                CurrencyCode = transaction.CurrencyCode,
                Description = transaction.Description,
                Merchant = transaction.Merchant,
                TransactionDate = transaction.TransactedOn,
                CreatedDate = transaction.CreatedOn,
                ModifiedDate = transaction.ModifiedOn
            };
        }
        internal bool Update(Transaction transactionToUpdate, TransactionModel model)
        {
            var modified = false;
            //NOTE: Id, CreatedOn, and ModifiedOn modifications are owned by system only
            if (model.TransactionAmount != 0 &&
                model.TransactionAmount != transactionToUpdate.Amount)
            {
                transactionToUpdate.Amount = model.TransactionAmount;
                modified = true;
            }
            if (string.IsNullOrWhiteSpace(model.CurrencyCode) == false &&
                model.CurrencyCode != transactionToUpdate.CurrencyCode)
            {
                transactionToUpdate.CurrencyCode = model.CurrencyCode;
                modified = true;
            }
            if (model.TransactionDate != DateTime.MinValue &&
                model.TransactionDate != transactionToUpdate.TransactedOn)
            {
                transactionToUpdate.TransactedOn = model.TransactionDate;
                modified = true;
            }
            if (string.IsNullOrWhiteSpace(model.Description) == false &&
                model.Description != transactionToUpdate.Description)
            {
                transactionToUpdate.Description = model.Description;
                modified = true;
            }
            if (string.IsNullOrWhiteSpace(model.Merchant) == false &&
                model.Merchant != transactionToUpdate.Merchant)
            {
                transactionToUpdate.Merchant = model.Merchant;
                modified = true;
            }

            return modified;
        }
        public bool SaveOrUpdate(Transaction transaction)
        {
            try
            {
                if (transaction.Id == 0)
                {
                    //Id, CreatedOn, and ModifiedOn are owned by system only
                    transaction.Id = Transactions.Any() ? Transactions.Max(t => t.Id) + 1 : 1; //seed at one
                    transaction.CreatedOn = DateTime.Now;
                    transaction.ModifiedOn = DateTime.MinValue;

                    _transactions.Add(transaction);
                }
                else
                {
                    var transactionToUpdate = _transactions.Where(t => t.Id == transaction.Id).FirstOrDefault();
                    if (transactionToUpdate == null)
                        throw new ArgumentException("No transaction to update. Concurrency issue.");
                    _transactions.Remove(transactionToUpdate);

                    //Id, CreatedOn, and ModifiedOn are owned by system only
                    transaction.ModifiedOn = DateTime.Now;
                    _transactions.Add(transaction);
                }
            }
            catch (Exception)
            {
                //log error
                return false;
            }
            return true;
        }