public void ReturnJsonWithCorrectSuccessMessage_IfAddingFishNotFailed_AndAddFishToLake()
        {
            // Arrange
            var lakeName              = "Lake";
            var expectedMessage       = string.Format(GlobalMessages.AddingFishSuccessMessageFormat, lakeName);
            var mockedLakeFactory     = new Mock <ILakeFactory>();
            var mockedLocationFactory = new Mock <ILocationFactory>();

            var mockedFish        = new Fish();
            var mockedLake        = new Lake();
            var mockedLakeService = new Mock <ILakeService>();

            mockedLakeService.Setup(s => s.FindByName(It.IsAny <string>())).Returns(mockedLake).Verifiable();
            mockedLakeService.Setup(s => s.Save()).Verifiable();

            var mockedLocationService = new Mock <ILocationService>();

            mockedLocationService.Setup(s => s.FindByName(It.IsAny <string>())).Verifiable();

            var mockedFishService = new Mock <IFishService>();

            mockedFishService.Setup(s => s.FindByName(It.IsAny <string>())).Returns(mockedFish).Verifiable();

            var controller = new LakeController(mockedLakeFactory.Object, mockedLocationFactory.Object, mockedLakeService.Object, mockedLocationService.Object, mockedFishService.Object);

            var selectedFish = Enumerable.Repeat <string>("", 1);
            var model        = new UpdateFishViewModel()
            {
                SelectedFish = selectedFish, SelectedLake = lakeName
            };

            // Act
            var     result  = controller.AddFish(model) as JsonResult;
            dynamic dResult = result.Data;

            // Assert
            Assert.AreEqual("success", dResult.status);
            Assert.AreEqual(expectedMessage, dResult.message);
            Assert.IsTrue(mockedLake.Fish.Contains(mockedFish));

            mockedLakeService.Verify(s => s.FindByName(It.IsAny <string>()), Times.Once);
            mockedLakeService.Verify(s => s.Save(), Times.Once);

            mockedFishService.Verify(s => s.FindByName(It.IsAny <string>()), Times.Once);
        }
        public void ReturnJsonWithCorrectErrorMessage_IfAddingFishFailed()
        {
            // Arrange
            var mockedLakeFactory     = new Mock <ILakeFactory>();
            var mockedLocationFactory = new Mock <ILocationFactory>();

            var mockedLakeService = new Mock <ILakeService>();

            mockedLakeService.Setup(s => s.FindByName(It.IsAny <string>())).Verifiable();
            mockedLakeService.Setup(s => s.Save()).Throws <Exception>();

            var mockedLocationService = new Mock <ILocationService>();

            mockedLocationService.Setup(s => s.FindByName(It.IsAny <string>())).Verifiable();

            var mockedFishService = new Mock <IFishService>();

            mockedFishService.Setup(s => s.FindByName(It.IsAny <string>())).Verifiable();

            var controller = new LakeController(mockedLakeFactory.Object, mockedLocationFactory.Object, mockedLakeService.Object, mockedLocationService.Object, mockedFishService.Object);

            // Act
            var selectedFish = Enumerable.Empty <string>();
            var result       = controller.AddFish(new UpdateFishViewModel()
            {
                SelectedFish = selectedFish
            }) as JsonResult;
            dynamic dResult = result.Data;

            // Assert
            Assert.AreEqual("error", dResult.status);
            Assert.AreEqual(GlobalMessages.AddingFishErrorMessage, dResult.message);

            mockedLakeService.Verify(s => s.FindByName(It.IsAny <string>()), Times.Once);

            mockedFishService.Verify(s => s.FindByName(It.IsAny <string>()), Times.Never);
        }
        public void ReturnJsonWithAllModelErrors_IfModelStateIsNotValid()
        {
            // Arrange
            var mockedLakeFactory     = new Mock <ILakeFactory>();
            var mockedLocationFactory = new Mock <ILocationFactory>();

            var mockedLakeService = new Mock <ILakeService>();

            mockedLakeService.Setup(s => s.FindByName(It.IsAny <string>())).Verifiable();
            mockedLakeService.Setup(s => s.Save()).Verifiable();

            var mockedLocationService = new Mock <ILocationService>();

            mockedLocationService.Setup(s => s.FindByName(It.IsAny <string>())).Verifiable();

            var mockedFishService = new Mock <IFishService>();

            mockedFishService.Setup(s => s.FindByName(It.IsAny <string>())).Verifiable();

            var controller = new LakeController(mockedLakeFactory.Object, mockedLocationFactory.Object, mockedLakeService.Object, mockedLocationService.Object, mockedFishService.Object);

            controller.ModelState.AddModelError("Name", "Test error!");

            // Act
            var     result  = controller.AddFish(new UpdateFishViewModel()) as JsonResult;
            dynamic dResult = result.Data;

            // Assert
            Assert.AreEqual("error", dResult.status);
            StringAssert.Contains("Test error!", dResult.message);

            mockedLakeService.Verify(s => s.FindByName(It.IsAny <string>()), Times.Never);
            mockedLakeService.Verify(s => s.Save(), Times.Never);

            mockedFishService.Verify(s => s.FindByName(It.IsAny <string>()), Times.Never);
        }