public void GetOperationStatus_OnFailureOperation_ThrowsTheSameExceptionAsTheOperationsManagerThrows_Test()
        {
            var operationsManager         = new OperationsManagerMock();
            var service                   = new TestService(operationsManager);
            var operationStartInformation = service.DoOperationAsync(isFailure: true);

            Thread.Sleep(TestOperation.OperationDuration + TestOperation.SafeTimeToSetOperationResult);
            Exception exceptionFromOperationsManager = null;

            try
            {
                var operationStatusFromOperationsManager = operationsManager.GetOperationStatus(operationStartInformation.OperationId);
            }
            catch (Exception ex)
            {
                exceptionFromOperationsManager = ex;
            }

            Exception exceptionFromService = null;

            try
            {
                var operationStatusFromService = service.GetOperationStatus(operationStartInformation.OperationId);
            }
            catch (Exception ex)
            {
                exceptionFromService = ex;
            }

            Assert.IsNotNull(exceptionFromService);
            Assert.AreEqual(exceptionFromOperationsManager, exceptionFromService);
        }
        public void DoOperationAsync_OnCancelationRequstedButNotCompletedOperation_NotBlockExecutionAndReturnsOperationGuidWithAttributeInformationAndOperationsManagerStatusIsCompletedSuuccessfuly_Test()
        {
            var operationsManager = new OperationsManagerMock();
            var service           = new TestService(operationsManager);

            var startTime = DateTime.Now;
            var operationStartInformation = service.DoOperationAsync();
            var endTime = DateTime.Now;

            var beforeWaitOperationStatus = operationsManager.GetOperationStatus(operationStartInformation.OperationId);

            service.CancelOperation(operationStartInformation.OperationId);
            Thread.Sleep(TestOperation.OperationDuration + TestOperation.SafeTimeToSetOperationResult);
            var afterWaitOperationStatus = operationsManager.GetOperationStatus(operationStartInformation.OperationId);

            Assert.IsTrue(endTime - startTime < TestOperation.OperationDuration);
            Assert.AreEqual(TestOperation.IS_REPORTING_PROGRESS, operationStartInformation.IsReportingProgress);
            Assert.AreEqual(TestOperation.IS_SUPPORTING_CANCEL, operationStartInformation.IsSupportingCancel);
            Assert.AreEqual(TestOperation.SUGGESTED_POLLING_INTERVAL_MILLISECONDS, operationStartInformation.SuggestedPollingIntervalMilliseconds);
            Assert.AreEqual(TestOperation.EXPECTED_COMPLETION_TIME_MILLISECONDS, operationStartInformation.ExpectedCompletionTimeMilliseconds);
            Assert.AreEqual(OperationState.Started, beforeWaitOperationStatus.Info.State);
            Assert.IsNull(beforeWaitOperationStatus.Result);
            Assert.AreEqual(OperationState.CompletedSucessfully, afterWaitOperationStatus.Info.State);
            Assert.AreEqual(TestOperation.TEST_OPERATION_RESULT, afterWaitOperationStatus.Result);
        }
        public void DoOperationAsync_OnFailureOperation_NotBlockExecutionAndReturnsOperationGuidWithAttributeInformationAndOperationsManagerStatusThrows_Test()
        {
            var operationsManager = new OperationsManagerMock();
            var service           = new TestService(operationsManager);

            var startTime = DateTime.Now;
            var operationStartInformation = service.DoOperationAsync(isFailure: true);
            var endTime = DateTime.Now;

            var beforeWaitOperationStatus = operationsManager.GetOperationStatus(operationStartInformation.OperationId);

            Thread.Sleep(TestOperation.OperationDuration + TestOperation.SafeTimeToSetOperationResult);
            Exception exception = null;

            try
            {
                operationsManager.GetOperationStatus(operationStartInformation.OperationId);
            }
            catch (Exception ex)
            {
                exception = ex;
            }
            Assert.IsTrue(endTime - startTime < TestOperation.OperationDuration);
            Assert.AreEqual(TestOperation.IS_REPORTING_PROGRESS, operationStartInformation.IsReportingProgress);
            Assert.AreEqual(TestOperation.IS_SUPPORTING_CANCEL, operationStartInformation.IsSupportingCancel);
            Assert.AreEqual(TestOperation.SUGGESTED_POLLING_INTERVAL_MILLISECONDS, operationStartInformation.SuggestedPollingIntervalMilliseconds);
            Assert.AreEqual(TestOperation.EXPECTED_COMPLETION_TIME_MILLISECONDS, operationStartInformation.ExpectedCompletionTimeMilliseconds);
            Assert.AreEqual(OperationState.Started, beforeWaitOperationStatus.Info.State);
            Assert.IsNull(beforeWaitOperationStatus.Result);
            Assert.AreEqual(TestOperation.OperationException, exception);
        }
        public void CancelOperation_OperationStatusIsCancelationPendingInOperationsManager_Test()
        {
            var operationsManager         = new OperationsManagerMock();
            var service                   = new TestService(operationsManager);
            var operationStartInformation = service.DoOperationAsync();

            service.CancelOperation(operationStartInformation.OperationId);

            var operationStatus = operationsManager.GetOperationStatus(operationStartInformation.OperationId);

            Assert.AreEqual(OperationState.CancelationPending, operationStatus.Info.State);
        }
        public void GetOperationStatus_ReturnsTheSameStatusAsTheOperationsManagerStatus_Test()
        {
            var operationsManager         = new OperationsManagerMock();
            var service                   = new TestService(operationsManager);
            var operationStartInformation = service.DoOperationAsync();

            Thread.Sleep(TestOperation.OperationDuration + TestOperation.SafeTimeToSetOperationResult);
            var operationStatusFromOperationsManager = operationsManager.GetOperationStatus(operationStartInformation.OperationId);

            var operationStatusFromService = service.GetOperationStatus(operationStartInformation.OperationId);

            Assert.AreEqual(operationStatusFromOperationsManager.Result, operationStatusFromService.Result);
            Assert.AreEqual(operationStatusFromOperationsManager.Info.State, operationStatusFromService.Info.State);
            Assert.AreEqual(operationStatusFromOperationsManager.Info.Progress, operationStatusFromService.Info.Progress);
        }