void Update_WithThreeSoccerEvents_ReturnsTrue()
        {
            // Arrange
            IEnumerable <SoccerEvent> threeSoccerEvents = new SoccerEvent[]
            {
                new SoccerEvent(eventId: 1, homeScore: 2, awayScore: 0, homeTeam: "Bayern Munich", awayTeam: "Arsenal F.C."),
                new SoccerEvent(eventId: 2, homeScore: 1, awayScore: 1, homeTeam: "Manchester United", awayTeam: "Juventus"),
                new SoccerEvent(eventId: 3, homeScore: 3, awayScore: 3, homeTeam: "Porto F.C.", awayTeam: "Barcelona")
            };

            Mock <ISoccerEventsProvider> mockProvider = new Mock <ISoccerEventsProvider>();

            mockProvider.Setup(m => m.GetAll()).Returns(threeSoccerEvents);
            Mock <ISoccerEventsStore> mockStore    = new Mock <ISoccerEventsStore>();
            Mock <INotifier>          mockNotifier = new Mock <INotifier>();

            string infoEmailAddress = "*****@*****.**", infoMessage = "Soccer events processed successfully",
                   alertEmailAddress = "*****@*****.**", alertSmsNumber = "6999999999",
                   alertMessage = "ALERT! No soccer events!";

            SoccerEventsTask sut = new SoccerEventsTask(mockProvider.Object, mockStore.Object, mockNotifier.Object,
                                                        infoEmailAddress, infoMessage, alertEmailAddress, alertSmsNumber, alertMessage);

            bool expected = true;

            // Act
            bool actual = sut.Update();

            // Assert
            Assert.Equal(expected, actual);
        }
        void Update_WithThreeSoccerEvents_ReturnsTrue()
        {
            // Arrange
            ISoccerEventsProvider provider = new StubThreeSoccerEventsProvider();
            ISoccerEventsStore    store    = new DummySoccerEventsStore();
            INotifier             notifier = new DummyNotifier();

            string infoEmailAddress = "*****@*****.**", infoMessage = "Soccer events processed successfully",
                   alertEmailAddress = "*****@*****.**", alertSmsNumber = "6999999999",
                   alertMessage = "ALERT! No soccer events!";

            SoccerEventsTask sut = new SoccerEventsTask(provider, store, notifier,
                                                        infoEmailAddress, infoMessage, alertEmailAddress, alertSmsNumber, alertMessage);

            bool expected = true;

            // Act
            bool actual = sut.Update();

            // Assert
            Assert.Equal(expected, actual);
        }
        void Update_WithThreeSoccerEvents_CallsNotifierSendEmailUsingCorrectInfoParametersOnce()
        {
            // Arrange
            StubThreeSoccerEventsProvider provider = new StubThreeSoccerEventsProvider();
            DummySoccerEventsStore        store    = new DummySoccerEventsStore();
            MockNotifier notifier = new MockNotifier();

            string infoEmailAddress = "*****@*****.**", infoMessage = "Soccer events processed successfully",
                   alertEmailAddress = "*****@*****.**", alertSmsNumber = "6999999999",
                   alertMessage = "ALERT! No soccer events!";

            SoccerEventsTask sut = new SoccerEventsTask(provider, store, notifier,
                                                        infoEmailAddress, infoMessage, alertEmailAddress, alertSmsNumber, alertMessage);

            int expectedTimesSendEmailWasCalled = 1;

            // Act
            sut.Update();

            // Assert
            notifier.SendEmailExpectation(infoEmailAddress, infoMessage, expectedTimesSendEmailWasCalled);
        }
        void Update_WithZeroSoccerEvents_CallsNotifierSendEmailAndSendSmsUsingCorrectAlertParametersOnce()
        {
            // Arrange
            Mock <ISoccerEventsProvider> mockProvider = new Mock <ISoccerEventsProvider>();

            mockProvider.Setup(m => m.GetAll()).Returns(Enumerable.Empty <SoccerEvent>());
            Mock <ISoccerEventsStore> mockStore    = new Mock <ISoccerEventsStore>();
            Mock <INotifier>          mockNotifier = new Mock <INotifier>();

            string infoEmailAddress = "*****@*****.**", infoMessage = "Soccer events processed successfully",
                   alertEmailAddress = "*****@*****.**", alertSmsNumber = "6999999999",
                   alertMessage = "ALERT! No soccer events!";

            SoccerEventsTask sut = new SoccerEventsTask(mockProvider.Object, mockStore.Object, mockNotifier.Object,
                                                        infoEmailAddress, infoMessage, alertEmailAddress, alertSmsNumber, alertMessage);

            // Act
            sut.Update();

            // Assert
            mockNotifier.Verify(m => m.SendEmail(alertEmailAddress, alertMessage), Times.Once);
            mockNotifier.Verify(m => m.SendSms(alertSmsNumber, alertMessage), Times.Once);
        }
        void Update_WithThreeSoccerEvents_CallsNotifierSendEmailOnce()
        {
            // Arrange
            StubThreeSoccerEventsProvider provider = new StubThreeSoccerEventsProvider();
            DummySoccerEventsStore        store    = new DummySoccerEventsStore();
            SpyNotifier notifier = new SpyNotifier();

            string infoEmailAddress = "*****@*****.**", infoMessage = "Soccer events processed successfully",
                   alertEmailAddress = "*****@*****.**", alertSmsNumber = "6999999999",
                   alertMessage = "ALERT! No soccer events!";

            SoccerEventsTask sut = new SoccerEventsTask(provider, store, notifier,
                                                        infoEmailAddress, infoMessage, alertEmailAddress, alertSmsNumber, alertMessage);

            int expectedTimesSendEmailWasCalled = 1;

            // Act
            sut.Update();
            int actualTimesSendEmailWasCalled = notifier.NumberOfTimesSendEmailWasCalled;

            // Assert
            Assert.Equal(expectedTimesSendEmailWasCalled, actualTimesSendEmailWasCalled);
        }
        void Update_WithZeroSoccerEvents_ReturnsFalse()
        {
            // Arrange
            Mock <ISoccerEventsProvider> mockProvider = new Mock <ISoccerEventsProvider>();

            mockProvider.Setup(m => m.GetAll()).Returns(Enumerable.Empty <SoccerEvent>());
            Mock <ISoccerEventsStore> mockStore    = new Mock <ISoccerEventsStore>();
            Mock <INotifier>          mockNotifier = new Mock <INotifier>();

            string infoEmailAddress = "*****@*****.**", infoMessage = "Soccer events processed successfully",
                   alertEmailAddress = "*****@*****.**", alertSmsNumber = "6999999999",
                   alertMessage = "ALERT! No soccer events!";

            SoccerEventsTask sut = new SoccerEventsTask(mockProvider.Object, mockStore.Object, mockNotifier.Object,
                                                        infoEmailAddress, infoMessage, alertEmailAddress, alertSmsNumber, alertMessage);

            bool expected = false;

            // Act
            bool actual = sut.Update();

            // Assert
            Assert.Equal(expected, actual);
        }