/// <summary> /// Call api/converter/convert endpoint to convert a number to its textual representation /// </summary> /// <param name="detail">A number detail view model</param> /// <returns>A processed number detail</returns> public NumberDetail ConvertNumebrDetail(NumberDetailViewModel detail) { NumberDetail result = null; HttpResponseMessage response = null; try { using (HttpClient client = new HttpClient()) { ConfigureHttpClient(client); response = client.PostAsync("api/converter/convert", detail, new JsonMediaTypeFormatter()).Result; response.EnsureSuccessStatusCode(); result = response.Content.ReadAsAsync <NumberDetail>().Result; } } catch (Exception) { throw new ApplicationException(response.ReasonPhrase); } return(result); }
public void ProcessNumber_NegativeNumber_ReturnException() { var numberDetail = new NumberDetail { Name = "Behnam Karimi", Number = -100.12m }; var bc = new ConverterComponent(); var exception = Assert.Throws <ArgumentException>(() => bc.ProccesNumber(numberDetail)); Assert.AreEqual("The number should be positive.", exception.Message); }
public ActionResult Index(NumberDetailViewModel numberDetailViewModel) { try { ConverterProcess process = new ConverterProcess(); // calls UI process to converts the number NumberDetail result = process.ConvertNumebrDetail(numberDetailViewModel); return(View("Result", result)); } catch (Exception) { ModelState.AddModelError("Number", "Unable to process the request."); return(View("Index")); } }
/// <summary> /// Processes a number detail and converts the number to its textual representation /// </summary> /// <param name="numberDetail"></param> /// <returns></returns> public NumberDetail ProccesNumber(NumberDetail numberDetail) { if (numberDetail.Number < 0) { throw new ArgumentException("The number should be positive."); } ulong integer = (ulong)Truncate(numberDetail.Number); // extracts the integer part of the numebr ulong decimals = (ulong)((numberDetail.Number - integer) * 100); // extracts the decimals of the number and converts it to integer // generates a text for the response // format: [integer] dollar(s) and [decimals] cent(s) numberDetail.ConvertedNumber = ($"{integer.ToText()} dollar{(integer > 1 ? "s" : "")}" + $"{(decimals > 0 ? $" and {decimals.ToText()} cent{(decimals > 1 ? "s" : "")}" : "")}"); return(numberDetail); }
public HttpResponseMessage Convert(NumberDetailRequest request) { try { // maps the reqeust data contract to entity to be passed to business layer NumberDetail numberDetail = Mapper.Map <NumberDetailRequest, NumberDetail>(request); ConverterComponent converter = new ConverterComponent(); NumberDetail result = converter.ProccesNumber(numberDetail); // creates a response with 200 status code and passes the result. return(Request.CreateResponse(HttpStatusCode.OK, result)); } catch (Exception ex) { return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message)); } }
public void ProccesNumberTest(decimal number, string expected) { var numberDetail = new NumberDetail { Name = "Behnam Karimi", Number = number }; var bc = new ConverterComponent(); var result = bc.ProccesNumber(numberDetail); TestContext.Out.WriteLine(numberDetail.ToString()); Assert.AreNotEqual(numberDetail.Id, Guid.Empty); Assert.AreEqual(numberDetail.DateCreated.Date, DateTime.UtcNow.Date); Assert.IsFalse(string.IsNullOrWhiteSpace(numberDetail.ConvertedNumber)); Assert.IsFalse(string.IsNullOrWhiteSpace(numberDetail.Name)); Assert.AreEqual(expected, numberDetail.ConvertedNumber); }