Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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();
}
}
}
4 changes: 0 additions & 4 deletions eCommerce.WebService/Controllers/ProductController.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
using eCommerce.WebService.Models;
using eCommerce.ApplicationLayer.Products;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace eCommerce.WebService.Controllers
Expand Down
Loading