Skip to content

Commit

Permalink
Merge pull request #4 from CMS18/feature/2-deposit-withdraw
Browse files Browse the repository at this point in the history
Did the things and the whatnot
  • Loading branch information
Albinlj committed Nov 13, 2019
2 parents 129fe9f + c1f3b3b commit 7b8ad2c
Show file tree
Hide file tree
Showing 16 changed files with 318 additions and 29 deletions.
5 changes: 5 additions & 0 deletions ALM.Test/ALM.Test.csproj
Expand Up @@ -8,9 +8,14 @@

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
<PackageReference Include="Shouldly" Version="3.0.2" />
<PackageReference Include="xunit" Version="2.4.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
<PackageReference Include="coverlet.collector" Version="1.0.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\ALM.Web\ALM.Web.csproj" />
</ItemGroup>

</Project>
70 changes: 70 additions & 0 deletions ALM.Test/TransactionTests.cs
@@ -0,0 +1,70 @@
using ALM.Web;
using ALM.Web.Models;
using Shouldly;
using System;
using Xunit;

namespace ALM.Test
{
//public class Fixture
//{
// public BankRepository Repository { get; set; }
// public Transactioner TransactionManager { get; set; }

// public Fixture()
// {
// Repository = new BankRepository();
// Repository.Initialize();
// TransactionManager = new Transactioner(Repository);
// }
//}

public class TransactionTests
{
[Theory]
[InlineData(1337)]
[InlineData(9000)]
[InlineData(80085)]
public void DepositTest(decimal amount)
{
var account = new Account();
var transactioner = new Transactioner();
decimal originalBalance = account.Balance;

transactioner.Deposit(account, amount);

account.Balance.ShouldBe(originalBalance + amount);
}

[Theory]
[InlineData(1337, 500)]
[InlineData(9000, 100)]
[InlineData(80085, 80085)]
public void WithdrawTest(decimal initial, decimal amount)
{
var account = new Account();
account.Credit(initial);
var transactioner = new Transactioner();
decimal originalBalance = account.Balance;

transactioner.Deposit(account, amount);

account.Balance.ShouldBe(originalBalance + amount);
}

[Theory]
[InlineData(1337, 1338)]
[InlineData(1111.111, 9999.999)]
[InlineData(1, 1.000000001)]
[InlineData(0, 1)]
public void WithdrawMoreThanBalance(decimal initial, decimal amount)
{
var account = new Account();
account.Credit(initial);
var transactioner = new Transactioner();
decimal originalBalance = account.Balance;

Should.Throw<InvalidTransactionException>(() => transactioner.Withdraw(account, amount));
}
}
}
14 changes: 0 additions & 14 deletions ALM.Test/UnitTest1.cs

This file was deleted.

8 changes: 7 additions & 1 deletion ALM.Web/ALM.Web.csproj
Expand Up @@ -4,8 +4,14 @@
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>


<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.0.0" />
</ItemGroup>

</Project>
10 changes: 10 additions & 0 deletions ALM.Web/BankRepository.cs
Expand Up @@ -41,5 +41,15 @@ public Account AddAccount(Customer owner)
return account;
}

public Account GetAccount(int accountId)
{
var account = Accounts.FirstOrDefault(a => a.AccountId == accountId);
if (account == null)
{
throw new AccountNotFoundException(accountId);
}
return account;
}

}
}
5 changes: 0 additions & 5 deletions ALM.Web/Controllers/HomeController.cs
Expand Up @@ -28,11 +28,6 @@ public IActionResult Index()
return View(model);
}

public IActionResult Privacy()
{
return View();
}

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
Expand Down
72 changes: 72 additions & 0 deletions ALM.Web/Controllers/TransactionController.cs
@@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ALM.Web.Models;
using Microsoft.AspNetCore.Mvc;

namespace ALM.Web.Controllers
{
public class TransactionController : Controller
{
private readonly Transactioner _transactioner;
private readonly BankRepository _repository;

public TransactionController(Transactioner transactioner, BankRepository repository)
{
_transactioner = transactioner;
_repository = repository;
}

[HttpGet]
public IActionResult Index()
{
return RedirectToAction("Transact");
}

[HttpGet]
public IActionResult Transact()
{
var model = new TransactionViewModel();
return View(model);
}

[HttpPost]
public IActionResult Transact(TransactionViewModel model, TransactionType type)
{
if (!ModelState.IsValid)
{
return View(model);
}
try
{
var account = _repository.GetAccount(model.AccountId);
model.Account = account;
switch (type)
{
case TransactionType.Deposit:
_transactioner.Deposit(account, model.Amount);
break;
case TransactionType.Withdrawal:
_transactioner.Withdraw(account, model.Amount);
break;
default:
break;
}
}
catch (AccountNotFoundException ex)
{
ModelState.AddModelError("account", ex.Message);
return View(model);
}
catch (InvalidTransactionException ex)
{
ModelState.AddModelError("balance", ex.Message);
return View(model);
}

return View(model);
}

}
}
14 changes: 14 additions & 0 deletions ALM.Web/Exceptions/AccountNotFoundException.cs
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ALM.Web
{
public class AccountNotFoundException : Exception
{
public AccountNotFoundException(int accountId) : base($"Account #{accountId} not found")
{
}
}
}
14 changes: 14 additions & 0 deletions ALM.Web/Exceptions/InvalidTransactionException.cs
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ALM.Web
{
public class InvalidTransactionException:Exception
{
public InvalidTransactionException(string message) : base(message)
{
}
}
}
22 changes: 22 additions & 0 deletions ALM.Web/Models/TransactionViewModel.cs
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace ALM.Web.Models
{
public class TransactionViewModel
{
[Required]
[Display(Name = "Account ID")]
public int AccountId { get; set; } = 0;

[Required]
[Display(Name = "Amount")]
[DataType(DataType.Currency)]
public decimal Amount { get; set; } = 0;

public Account Account { get; set; }
}
}
1 change: 1 addition & 0 deletions ALM.Web/Startup.cs
Expand Up @@ -25,6 +25,7 @@ public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddSingleton<BankRepository>();
services.AddScoped<Transactioner>();

}

Expand Down
13 changes: 13 additions & 0 deletions ALM.Web/TransactionType.cs
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ALM.Web
{
public enum TransactionType
{
Deposit,
Withdrawal
}
}
62 changes: 62 additions & 0 deletions ALM.Web/Transactioner.cs
@@ -0,0 +1,62 @@
using ALM.Web.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ALM.Web
{
public class Transactioner
{
private readonly BankRepository _repository;

public Transactioner(BankRepository repository)
{
_repository = repository;
}

public Transactioner()
{

}

public decimal Deposit(Account account, decimal amount)
{
account.Credit(amount);
return account.Balance;
}

public decimal Deposit(int accountId, decimal amount)
{
var account = _repository.GetAccount(accountId);
if (account == null)
{
throw new AccountNotFoundException(accountId);
}
return Deposit(account, amount);
}


public decimal Withdraw(Account account, decimal amount)
{
if (account.Balance < amount)
{
throw new InvalidTransactionException($"Cant Withdraw {amount} from account #{account.AccountId}. Balance is only {account.Balance}.");
}
account.Debit(amount);
return account.Balance;
}

public decimal Withdraw(int accountId, decimal amount)
{
var account = _repository.GetAccount(accountId);
if (account == null)
{
throw new AccountNotFoundException(accountId);
}
return Withdraw(account, amount);
}


}
}
6 changes: 0 additions & 6 deletions ALM.Web/Views/Home/Privacy.cshtml

This file was deleted.

7 changes: 4 additions & 3 deletions ALM.Web/Views/Shared/_Layout.cshtml
Expand Up @@ -18,11 +18,12 @@
</button>
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">

<li>
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
<li>
<a class="nav-link text-dark" asp-area="" asp-controller="Transaction" asp-action="Transact">Transact</a>
</li>
</ul>
</div>
Expand Down

0 comments on commit 7b8ad2c

Please sign in to comment.