using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;
using Microsoft.VisualStudio.TestTools.UnitTesting;
public static void Main()
new UnitTests().PerformUnitTest();
public void PerformUnitTest()
var fakeHttpContextAccessor = Substitute.For<IHttpContextAccessor>();
var fakeCustomerRepository = Substitute.For<ICustomerRepository>();
var fakeZipCodeService = Substitute.For<IZipCodeService>();
var sut = new CustomerManager(fakeHttpContextAccessor, fakeZipCodeService, fakeCustomerRepository);
var claim = new Claim("CustomerId", "1");
var claimsList = new List<Claim>() { claim };
var validZipCodes = new List<string>() { "12345" };
fakeHttpContextAccessor.HttpContext.User.Claims.Returns(claimsList);
fakeZipCodeService.GetAllValidZipCodes().Returns(validZipCodes);
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 CustomerManager
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IZipCodeService _zipCodeService;
private readonly ICustomerRepository _customerRepository;
public CustomerManager(IHttpContextAccessor httpContextAccessor, IZipCodeService zipCodeService, ICustomerRepository customerRepository) {
_httpContextAccessor = httpContextAccessor;
_zipCodeService = zipCodeService;
_customerRepository = customerRepository;
public bool UpdateZip(string newZipCode)
var allZipCodes = _zipCodeService.GetAllValidZipCodes();
if (allZipCodes.Contains(newZipCode))
var claim = _httpContextAccessor.HttpContext.User.Claims.Where(c => c.Type == "CustomerId").FirstOrDefault();
var customerId = Convert.ToInt32(claim.Value);
_customerRepository.UpdateZip(customerId, newZipCode);
public interface IZipCodeService {
public List<string> GetAllValidZipCodes();
public class ZipCodeService : IZipCodeService {
private readonly string _apiEndpointUrl;
private readonly IHttpClient _httpClient;
public ZipCodeService(string apiEndpointUrl, IHttpClient httpClient) {
_apiEndpointUrl = apiEndpointUrl;
_httpClient = httpClient;
public List<string> GetAllValidZipCodes() {
return _httpClient.Get<List<string>>(_apiEndpointUrl);
public interface ICustomerRepository {
public void UpdateZip(int customerId, string newZipCode);
public class CustomerRepository : ICustomerRepository
private readonly IDbContext _db;
public CustomerRepository(IDbContext dbContext) {
public void UpdateZip(int customerId, string newZipCode)
var customer = _db.Customers.SingleOrDefault(i => i.ID == customerId);
customer.ZipCode = newZipCode;
public interface IDbContext {
public List<Customer> Customers {
public class DbContext : IDbContext
public List<Customer> Customers
public interface IHttpClient {
public T Get<T>(string url);
public class HttpClient : IHttpClient
public T Get<T>(string url)