public void TestAirConditioner_WithCorrectInput_ShouldAddCorrectReport()
        {
            Mock<IAirConditioner> fakeAC = new Mock<IAirConditioner>();
            fakeAC.Setup(x => x.Manufacturer).Returns("Toshiba");
            fakeAC.Setup(x => x.Model).Returns("EX200");
            fakeAC.Setup(x => x.Test()).Returns(false);
            Mock<IAirConditionerTesterDatabase> databaseMock = new Mock<IAirConditionerTesterDatabase>();
            Mock<IRepository<IAirConditioner>> fakeACrepository = new Mock<IRepository<IAirConditioner>>();
            Mock<IReportsRepository> fakeReportsRepository = new Mock<IReportsRepository>();

            databaseMock.Setup(x => x.AirConditioners).Returns(fakeACrepository.Object);
            databaseMock.Setup(x => x.Reports).Returns(fakeReportsRepository.Object);
            fakeACrepository.Setup(x => x.GetItem(It.IsAny<string>(), It.IsAny<string>())).Returns(fakeAC.Object);

            IReport report = null;
            fakeReportsRepository.Setup(x => x.Add(It.IsAny<IReport>())).Callback<IReport>(r => report = r);
            IAirConditionerTesterDatabase fakeDatabase = databaseMock.Object;
            var controller = new AirConditionerTesterSystem(fakeDatabase);

            controller.TestAirConditioner("Toshiba", "EX200");

            Assert.AreEqual("Toshiba", report.Manufacturer, "Manufacturer did not match!");
            Assert.AreEqual("EX200", report.Model, "Model did not match!");
            Assert.AreEqual(Mark.Failed, report.Mark, "Mark did not match!");
        }
        public void TestAirConditioner_WithCorrectInput_ShouldCallAirConditionerTestMethod()
        {
            Mock<IAirConditioner> fakeAC = new Mock<IAirConditioner>();
            Mock<IAirConditionerTesterDatabase> databaseMock = new Mock<IAirConditionerTesterDatabase>();
            Mock<IRepository<IAirConditioner>> fakeACrepository = new Mock<IRepository<IAirConditioner>>();
            Mock<IReportsRepository> fakeReportsRepository = new Mock<IReportsRepository>();

            databaseMock.Setup(x => x.AirConditioners).Returns(fakeACrepository.Object);
            databaseMock.Setup(x => x.Reports).Returns(fakeReportsRepository.Object);
            fakeACrepository.Setup(x => x.GetItem(It.IsAny<string>(), It.IsAny<string>())).Returns(fakeAC.Object);

            IAirConditionerTesterDatabase fakeDatabase = databaseMock.Object;
            var controller = new AirConditionerTesterSystem(fakeDatabase);

            controller.TestAirConditioner("Toshiba", "EX100");
            fakeAC.Verify(x => x.Test(), Times.Exactly(1));
        }
        public void TestAirConditioner_WithoutAlreadyExistingReport_ShouldThrowCorrectDuplicateEntryException()
        {
            Mock<IAirConditioner> fakeAC = new Mock<IAirConditioner>();
            fakeAC.Setup(x => x.Test()).Returns(true);
            Mock<IAirConditionerTesterDatabase> databaseMock = new Mock<IAirConditionerTesterDatabase>();
            Mock<IRepository<IAirConditioner>> fakeACrepository = new Mock<IRepository<IAirConditioner>>();
            Mock<IReportsRepository> fakeReportsRepository = new Mock<IReportsRepository>();

            databaseMock.Setup(x => x.AirConditioners).Returns(fakeACrepository.Object);
            databaseMock.Setup(x => x.Reports).Returns(fakeReportsRepository.Object);
            fakeACrepository.Setup(x => x.GetItem(It.IsAny<string>(), It.IsAny<string>())).Returns(fakeAC.Object);
            fakeReportsRepository.Setup(x => x.Add(It.IsAny<IReport>()))
                .Throws(new DuplicateEntryException(Constants.DuplicateEntry));

            IAirConditionerTesterDatabase fakeDatabase = databaseMock.Object;
            var controller = new AirConditionerTesterSystem(fakeDatabase);

            controller.TestAirConditioner("Toshiba", "EX100");

            try
            {
                controller.TestAirConditioner("Toshiba", "EX100");
            }
            catch (DuplicateEntryException ex)
            {
                Assert.AreEqual(string.Format(Constants.DuplicateEntry), ex.Message, "Expected message did not match!");
                throw new DuplicateEntryException(Constants.DuplicateEntry);
            }
        }
        public void TestAirConditioner_WithoutExistingEntry_ShouldThrowCorrectNonExistantEntryException()
        {
            Mock<IAirConditionerTesterDatabase> databaseMock = new Mock<IAirConditionerTesterDatabase>();
            Mock<IRepository<IAirConditioner>> fakeACrepository = new Mock<IRepository<IAirConditioner>>();

            databaseMock.Setup(x => x.AirConditioners).Returns(fakeACrepository.Object);
            fakeACrepository.Setup(x => x.GetItem(It.IsAny<string>(), It.IsAny<string>())).Throws(new NonExistantEntryException(Constants.NonExistantEntry));
            IAirConditionerTesterDatabase fakeDatabase = databaseMock.Object;
            var controller = new AirConditionerTesterSystem(fakeDatabase);

            try
            {
                controller.TestAirConditioner("Toshiba", "EX100");
            }
            catch (NonExistantEntryException ex)
            {
                Assert.AreEqual(Constants.NonExistantEntry, ex.Message, "Expected message did not match!");
                throw new NonExistantEntryException("");
            }
        }
        public void TestAirConditioner_WithCorrectInput_ShouldReturnSuccessMessage()
        {
            Mock<IAirConditioner> fakeAC = new Mock<IAirConditioner>();
            fakeAC.Setup(x => x.Manufacturer).Returns("Toshiba");
            fakeAC.Setup(x => x.Model).Returns("EX200");
            fakeAC.Setup(x => x.Test()).Returns(false);
            Mock<IAirConditionerTesterDatabase> databaseMock = new Mock<IAirConditionerTesterDatabase>();
            Mock<IRepository<IAirConditioner>> fakeACrepository = new Mock<IRepository<IAirConditioner>>();
            Mock<ReportsRepository> fakeReportsRepository = new Mock<ReportsRepository>();

            databaseMock.Setup(x => x.AirConditioners).Returns(fakeACrepository.Object);
            databaseMock.Setup(x => x.Reports).Returns(fakeReportsRepository.Object);
            fakeACrepository.Setup(x => x.GetItem(It.IsAny<string>(), It.IsAny<string>())).Returns(fakeAC.Object);

            IAirConditionerTesterDatabase fakeDatabase = databaseMock.Object;
            var controller = new AirConditionerTesterSystem(fakeDatabase);

            var result = controller.TestAirConditioner("Toshiba", "EX200");
            Assert.AreEqual("Air Conditioner model EX200 from Toshiba tested successfully.", result, "Expected messages did not match!");
        }