public void Tests_SendClassEvaluation_1_API_Call()
        {
            //Arrange
            ClassEvaluation classEvaluation = new ClassEvaluation
            {
                Class = "7b",
                StudentEvaluations = new List <string> {
                    "Passed", "Passed", "Failed", "Passed"
                }
            };

            var mockLog = new Mock <ILogService>();

            var mockApi = new Mock <IEducationMinistryApiHandler>();
            HttpResponseMessage responseMessage = new HttpResponseMessage(HttpStatusCode.Accepted)
            {
                Content = new StringContent("")
            };

            mockApi.Setup(api => api.PostClassEvaluation(It.IsAny <ClassEvaluation>())).Returns(Task.FromResult <HttpResponseMessage>(responseMessage));

            int expectedNoOfApiCalls = 1;

            //Act
            EvaluationService evaluationService = new EvaluationService(mockLog.Object, mockApi.Object);

            evaluationService.SendClassEvaluation(classEvaluation);

            //Assert
            mockApi.Verify(api => api.PostClassEvaluation(classEvaluation), Times.Exactly(expectedNoOfApiCalls),
                           "The API wasn't called the expected number of times.");
            mockApi.VerifyNoOtherCalls();

            mockLog.VerifyNoOtherCalls();
        }
        public void Tests_SendClassEvaluation_4_API_Calls()
        {
            //Arrange
            ClassEvaluation classEvaluation = new ClassEvaluation
            {
                Class = "7b",
                StudentEvaluations = new List <string> {
                    "Passed", "Passed", "Failed", "Passed"
                }
            };

            var mockLog = new Mock <ILogService>();

            var mockApi = new Mock <IEducationMinistryApiHandler>();

            HttpResponseMessage responseRequestTimeout1 = new HttpResponseMessage(HttpStatusCode.RequestTimeout)
            {
                Content = new StringContent("")
            };
            HttpResponseMessage responseRequestTimeout2 = new HttpResponseMessage(HttpStatusCode.RequestTimeout)
            {
                Content = new StringContent("")
            };
            HttpResponseMessage responseRequestTimeout3 = new HttpResponseMessage(HttpStatusCode.RequestTimeout)
            {
                Content = new StringContent("")
            };
            HttpResponseMessage responseRequestTimeout4 = new HttpResponseMessage(HttpStatusCode.RequestTimeout)
            {
                Content = new StringContent("")
            };

            mockApi.SetupSequence(api => api.PostClassEvaluation(It.IsAny <ClassEvaluation>()))
            .Returns(Task.FromResult <HttpResponseMessage>(responseRequestTimeout1))
            .Returns(Task.FromResult <HttpResponseMessage>(responseRequestTimeout2))
            .Returns(Task.FromResult <HttpResponseMessage>(responseRequestTimeout3))
            .Returns(Task.FromResult <HttpResponseMessage>(responseRequestTimeout4));

            int    expectedNoOfApiCalls = 3;
            string expectedLogMessage   = "Could not send class evaluation because of request timeout.";

            //Act
            EvaluationService evaluationService = new EvaluationService(mockLog.Object, mockApi.Object);

            evaluationService.SendClassEvaluation(classEvaluation);

            //Assert
            mockApi.Verify(api 8u => api.PostClassEvaluation(classEvaluation), Times.Exactly(expectedNoOfApiCalls),
                           "The API wasn't called the expected number of times.");
            mockApi.VerifyNoOtherCalls();

            mockLog.Verify(log => log.Log(expectedLogMessage), "The expected message wasn't logged.");
            mockLog.VerifyNoOtherCalls();
        }