Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,4 @@ build/
*.pidb
*.log
*.scc
*.vs
1,038 changes: 0 additions & 1,038 deletions .vs/config/applicationhost.config

This file was deleted.

229 changes: 185 additions & 44 deletions eCommerce.Tests/DomainModelLayer/CartTest.cs
Original file line number Diff line number Diff line change
@@ -1,88 +1,229 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using FluentAssertions;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using eCommerce.DomainModelLayer.Carts;
using eCommerce.DomainModelLayer.Countries;
using eCommerce.DomainModelLayer.Customers;
using eCommerce.DomainModelLayer.Products;
using eCommerce.DomainModelLayer.Services;
using eCommerce.Helpers.Domain;

namespace eCommerce.Tests.DomainModelLayer
{
[TestClass]
public class CartTest
{
[TestMethod, TestCategory("Unit")]
public void TotalCost_TwoProductsOneQuantitySummedUp_ReturnsCorrectSum()
public void SharedCart_SharingACart_ReturnsCorrectCustomerId()
{
decimal expected = 100;
var cart = CreateCart();
var recipient = CreateCustomer("receiver");

Mock<CartProduct> cartProduct = new Mock<CartProduct>();
cartProduct.CallBase = true;
cartProduct.SetupGet(x => x.Quantity).Returns(1);
cartProduct.SetupGet(x => x.Cost).Returns(50);
var sharedCart = cart.Share(recipient);

Mock<Cart> cart = new Mock<Cart>();
cart.CallBase = true;
cart.SetupGet(x => x.Products)
.Returns(new ReadOnlyCollection<CartProduct>(new List<CartProduct>()
{
cartProduct.Object,
cartProduct.Object
}));
recipient.Id.Should().Equals(sharedCart.CustomerId);
}

decimal actual = cart.Object.TotalCost;
[TestMethod, TestCategory("Unit")]
public void TotalCost_TwoProductsOneQuantitySummedUp_ReturnsCorrectSum()
{
var cart = CreateCart();

var expected = 200;
var actual = cart.TotalCost;
actual.ShouldBeEquivalentTo(expected);
}

[TestMethod, TestCategory("Unit")]
public void TotalCost_TwoProductsTwoQuantitiesSummedUp_ReturnsCorrectTotalCostSum()
{
decimal expected = 200;
var cart = CreateCart();

Mock<CartProduct> cartProduct = new Mock<CartProduct>();
cartProduct.CallBase = true;
cartProduct.SetupGet(x => x.Quantity).Returns(2);
cartProduct.SetupGet(x => x.Cost).Returns(50);
var expected = 200;
var actual = cart.TotalCost;
actual.ShouldBeEquivalentTo(expected);
}

Mock<Cart> cart = new Mock<Cart>();
cart.CallBase = true;
cart.SetupGet(x => x.Products)
.Returns(new ReadOnlyCollection<CartProduct>(new List<CartProduct>()
{
cartProduct.Object,
cartProduct.Object
}));
[TestMethod, TestCategory("Unit")]
public void TotalCost_TwoSingleProductsTaxSummedUp_ReturnsCorrectTotalTaxSum()
{
var cart = CreateCart();

var expected = 20;
var actual = cart.TotalTax;
actual.ShouldBeEquivalentTo(expected);
}

[TestMethod, TestCategory("Unit")]
public void SharedCart_SharingACart_ReturnsCorrectProducts()
{
var cart = CreateCart();
var recipient = CreateCustomer("receiver");

decimal actual = cart.Object.TotalCost;
var sharedCart = cart.Share(recipient);

var subjectProductIds = cart.Products.Select(x => x.ProductId).ToList();
var sharedCartIds = sharedCart.Products.Select(x => x.ProductId).ToList();
subjectProductIds.ForEach(id => Assert.IsTrue(sharedCartIds.Contains(id)));
}


[TestMethod, TestCategory("Unit")]
public void SharedCart_SharingACart_ReturnsCorrectTotalTax()
{
var cart = CreateCart();
var recipient = Customer.Create("receiver", "v", "c@c.com", new Mock<Country>().Object);

var sharedCart = cart.Share(recipient);

var expected = 20;
var actual = sharedCart.TotalTax;
actual.ShouldBeEquivalentTo(expected);
}

[TestMethod, TestCategory("Unit")]
public void TotalCost_TwoSingleProductsTaxSummedUp_ReturnsCorrectTotalTaxSum()
public void SharedCart_SharingACart_ReturnsCorrectTotalCost()
{
decimal expected = 20;
var cart = CreateCart();
var recipient = CreateCustomer("recipient");

Mock<CartProduct> cartProduct = new Mock<CartProduct>();
cartProduct.CallBase = true;
cartProduct.SetupGet(x => x.Quantity).Returns(1);
cartProduct.SetupGet(x => x.Tax).Returns(10);
cartProduct.SetupGet(x => x.Cost).Returns(100);
var sharedCart = cart.Share(recipient);

var expected = 200;
var actual = sharedCart.TotalCost;
actual.ShouldBeEquivalentTo(expected);
}

[TestMethod, TestCategory("Unit")]
public void Add_AddingACartProduct_UpdatesCartProductsCorrectly()
{
var customer = CreateCustomer("customer");
var cart = Cart.Create(customer);
var product = Product.Create("Cheese Slices", 1, 99, ProductCode.Create("CheeseAbc"));
var expectedCartProduct = CartProduct.Create(customer, cart, product, 1, new Mock<ITaxService>().Object);

cart.Add(expectedCartProduct);

var contains = cart.Products.Any(p => p.ProductId == product.Id);
contains.Should().BeTrue();
}


[TestMethod, TestCategory("Unit")]
public void Add_AddingACartProduct_RaisesProductAddedEvent()
{

var cart = CreateCart();
var cartProduct = CreateCartProduct();
var expectedEvent = new ProductAddedCart {CartProduct = cartProduct};
ProductAddedCart actualEvent = null;
DomainEvents.Register<ProductAddedCart>(addedCart => actualEvent = addedCart);

cart.Add(cartProduct);

actualEvent.Should().NotBeNull().And.Equals(expectedEvent);
}


[TestMethod, TestCategory("Unit")]
public void Remove_RemovingACartProduct_RemovesCartProductsCorrectly()
{
var customer = CreateCustomer("receiver");
var cart = Cart.Create(customer);
var product = Product.Create("Cheese Slices", 1, 99, ProductCode.Create("CheeseAbc"));
var cartProduct = CartProduct.Create(customer, cart, product, 1, new Mock<ITaxService>().Object);
cart.Add(cartProduct);
cart.Remove(product);

var contains = cart.Products.Contains(cartProduct);

contains.Should().BeFalse();
}

[TestMethod, TestCategory("Unit")]
public void Clear_ClearingACart_ClearsAllProducts()
{
var customer = Customer.Create("receiver", "v", "c@c.com", new Mock<Country>().Object);
var cart = Cart.Create(customer);
var product = CreateCartProduct();
cart.Add(product);

cart.Clear();

cart.Products.Count.Should().Be(0);
}

[TestMethod, TestCategory("Unit")]
public void Create_CreatingANewCart_ReturnsACorrectCart()
{
var customer = Customer.Create("receiver", "v", "c@c.com", new Mock<Country>().Object);

var cart = Cart.Create(customer);

cart.Should().NotBeNull();
}

[TestMethod, TestCategory("Unit")]
[ExpectedException(typeof(ArgumentNullException))]
public void Create_CreatingANewCart_ThrowsExceptionOnNullCustomer()
{
Customer customer = null;
var cart = Cart.Create(customer);
}

[TestMethod, TestCategory("Unit")]
[ExpectedException(typeof(ArgumentNullException))]
public void Remove_RemovingACartProduct_ThrowsExceptionOnNullProduct()
{
var cart = CreateCart();
Product nullProduct = null;
cart.Remove(nullProduct);
}

[TestMethod, TestCategory("Unit")]
[ExpectedException(typeof(ArgumentNullException))]
public void Add_AddingACartProduct_ThrowsExceptionOnNullProduct()
{
var customer = Customer.Create("receiver", "v", "c@c.com", new Mock<Country>().Object);
var cart = Cart.Create(customer);
CartProduct cartProduct = null;
cart.Add(cartProduct);
}

private static Cart CreateCart()
{
var product1 = CreateCartProduct();
var product2 = CreateCartProduct();

Mock<Cart> cart = new Mock<Cart>();
cart.CallBase = true;
cart.SetupGet(x => x.Products)
.Returns(new ReadOnlyCollection<CartProduct>(new List<CartProduct>()
{
cartProduct.Object,
cartProduct.Object
}));
{
product1,
product2
}));

decimal actual = cart.Object.TotalTax;
return cart.Object;
}

actual.ShouldBeEquivalentTo(expected);
private static CartProduct CreateCartProduct()
{
Mock<CartProduct> cartProduct = new Mock<CartProduct>();
var productId = Guid.NewGuid();
cartProduct.CallBase = true;
cartProduct.SetupGet(x => x.Quantity).Returns(1);
cartProduct.SetupGet(x => x.Tax).Returns(10);
cartProduct.SetupGet(x => x.Cost).Returns(100);
cartProduct.SetupGet(x => x.ProductId).Returns(productId);
return cartProduct.Object;
}

private static Customer CreateCustomer(string name)
=> Customer.Create(name, name.Reverse().ToString(), $"{name}@email.com", new Mock<Country>().Object);
}
}
}
9 changes: 2 additions & 7 deletions eCommerce.Tests/DomainModelLayer/TaxServiceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,13 @@
using eCommerce.DomainModelLayer.Customers;
using Moq;
using FluentAssertions;
using eCommerce.DomainModelLayer.Purchases;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using FluentAssertions.Equivalency;
using eCommerce.Helpers.Domain;
using eCommerce.DomainModelLayer.Services;
using eCommerce.DomainModelLayer;
using eCommerce.Helpers.Repository;
using eCommerce.DomainModelLayer.Tax;
using eCommerce.DomainModelLayer.Countries;
using eCommerce.DomainModelLayer.Products;
using eCommerce.DomainModelLayer.Customers.Spec;
using eCommerce.DomainModelLayer.Services;

namespace eCommerce.Tests.DomainModelLayer
{
Expand Down Expand Up @@ -48,7 +43,7 @@ public void Calculate_OverallProductTax_ReturnsCorrectTax()
product.SetupGet(x => x.Code).Returns(new ProductCode());

//call method
TaxService taxService = new TaxService(settings.Object, repositoryCountryTax.Object);
ITaxService taxService = new TaxService(settings.Object, repositoryCountryTax.Object);

decimal actual = taxService.Calculate(customer.Object, product.Object);

Expand Down
21 changes: 16 additions & 5 deletions eCommerce.WebService/App_Start/WebApiConfig.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq;
using System.Web.Http;

namespace eCommerce.WebService
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
MapRoutes(config);
SetJsonToDefaultFormatter(config);
config.EnableSystemDiagnosticsTracing();
}

private static void SetJsonToDefaultFormatter(HttpConfiguration config)
{
var appXmlType =
config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t =>
t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}

private static void MapRoutes(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "get", id = RouteParameter.Optional }
);

config.EnableSystemDiagnosticsTracing();
}
}
}
Loading