using System.Collections.Generic;
using System.Security.Claims;
using Microsoft.AspNetCore.Http;
public static void Main()
new UnitTests().PerformUnitTest();
public void PerformUnitTest()
Mock<IHttpClient> httpClient = new Mock<IHttpClient>();
httpClient.Setup(o => o.Get<List<string>>(It.IsAny<string>())).Returns(new List<string>() {"12345"});
Mock<ICustomerRepository> customerRepository = new Mock<ICustomerRepository>();
customerRepository.Setup(o => o.UpdateZip(It.IsAny<int>(), It.IsAny<string>()));
var mockHttpContextAccessor = new Mock<IHttpContextAccessor>();
var context = new DefaultHttpContextBuilder().WithIdentity("1", "James").DefaultHttpContext;
mockHttpContextAccessor.Setup(o => o.HttpContext).Returns(context);
ICustomerManager sut = new CustomerManager(httpClient.Object, customerRepository.Object, mockHttpContextAccessor.Object);
var actual = sut.UpdateZip("12345");
var result = expected == actual ? "PASS" : "FAIL";
Console.WriteLine(result);
actual = sut.UpdateZip("9999");
result = expected == actual ? "PASS" : "FAIL";
Console.WriteLine(result);
public class DefaultHttpContextBuilder
private ClaimsIdentity _identity;
private ClaimsPrincipal _user;
internal DefaultHttpContext DefaultHttpContext
return new DefaultHttpContext {User = _user};
public DefaultHttpContextBuilder()
_identity = new ClaimsIdentity();
_user = new ClaimsPrincipal(_identity);
public DefaultHttpContextBuilder WithIdentity(string customerId, string customerName)
_identity.AddClaims(new[]
new Claim(ClaimTypes.NameIdentifier, customerId),
new Claim(ClaimTypes.Name, customerName)
public interface ICustomerManager
bool UpdateZip(string newZipCode);
public class CustomerManager : ICustomerManager
private IHttpClient _httpClient;
private ICustomerRepository _customerRepository;
private IHttpContextAccessor _httpContextAccessor;
public CustomerManager(IHttpClient httpClient, ICustomerRepository customerRepository, IHttpContextAccessor httpContextAccessor)
_httpClient = httpClient;
_customerRepository = customerRepository;
_httpContextAccessor = httpContextAccessor;
public bool UpdateZip(string newZipCode)
var allZipCodes = GetAllValidZipCodes();
if (allZipCodes.Contains(newZipCode))
int customerId = Convert.ToInt32(_httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value);
_customerRepository.UpdateZip(customerId, newZipCode);
private List<string> GetAllValidZipCodes()
return _httpClient.Get<List<string>>("http://somezipcodeapi.com/GetAll");
public interface ICustomerRepository
void UpdateZip(int customerId, string newZipCode);
public class CustomerRepository : ICustomerRepository
private DbContext _dbContext;
public CustomerRepository(DbContext dbContext)
this._dbContext = dbContext;
public void UpdateZip(int customerId, string newZipCode)
var customer = _dbContext.Customers.SingleOrDefault(i => i.ID == customerId);
customer.ZipCode = newZipCode;
public List<Customer> Customers
public interface IHttpClient
public T Get<T>(string url)