public IActionResult Post([FromBody] SubmittedCardModel card)
        {
            if (card == null || card.CardNumber == null || String.IsNullOrEmpty(card.CardNumber))
            {
                return(StatusCode(422));
            }

            if (!_numberService.IsDigitsOnly(card.CardNumber))
            {
                return(StatusCode(422));
            }

            var validationResult = _cardValidator.ValidateCard(new Card(card.CardNumber));

            return(new JsonResult(new ValidationResultModel(validationResult.CardType, validationResult.ValidationResult), jsonSerializerSettings));
        }
        public void CardNumberIsEmpty()
        {
            var cardValidator = new Mock <ICardValidator>();
            var numberService = new Mock <INumberService>();

            var controller = new CardsValidationController(cardValidator.Object, numberService.Object);

            var model = new SubmittedCardModel()
            {
                CardNumber = ""
            };

            var result = controller.Post(model);

            Assert.IsInstanceOfType(result, typeof(StatusCodeResult));
            Assert.AreEqual(422, (result as StatusCodeResult).StatusCode);
        }
        public void CardNumberWithDigitsOnly()
        {
            var cardValidationResult = new Mock <ICardValidationResult>();

            var cardValidator = new Mock <ICardValidator>();

            cardValidator.Setup(cv => cv.ValidateCard(It.IsAny <Card>())).Returns(cardValidationResult.Object);

            var numberService = new Mock <INumberService>();

            numberService.Setup(s => s.IsDigitsOnly(It.IsAny <string>())).Returns(true);

            var controller = new CardsValidationController(cardValidator.Object, numberService.Object);

            var model = new SubmittedCardModel()
            {
                CardNumber = "123"
            };

            var result = controller.Post(model);

            numberService.Verify(mock => mock.IsDigitsOnly(It.IsAny <string>()), Times.Once());
        }
        public void CardNumberWithChar()
        {
            var cardValidator = new Mock <ICardValidator>();

            cardValidator.Setup(cv => cv.ValidateCard(It.IsAny <Card>()));

            var numberService = new Mock <INumberService>();

            numberService.Setup(s => s.IsDigitsOnly(It.IsAny <string>())).Returns(false);

            var controller = new CardsValidationController(cardValidator.Object, numberService.Object);

            var model = new SubmittedCardModel()
            {
                CardNumber = "asd"
            };

            var result = controller.Post(model);

            numberService.Verify(mock => mock.IsDigitsOnly(It.IsAny <string>()), Times.Once());

            Assert.IsInstanceOfType(result, typeof(StatusCodeResult));
            Assert.AreEqual(422, (result as StatusCodeResult).StatusCode);
        }