public async Task ExecuteAsync_ExecutionRequested_ShouldInvokeOnExecuting()
        {
            var mockJsonHttpClient         = new Mock <IJsonHttpClient>();
            var mockExecServiceProvider    = new Mock <IExecutionServiceProvider>();
            var mockInputAccessorProvider  = new Mock <IInputObjectAccessorProvider>();
            var mockOutputAccessorProvider = new Mock <IOutputObjectAccessorProvider>();
            var mockSigner = new Mock <ISigner <HttpExecutionRequest> >();
            var mockLogger = new Mock <ILogger <JsonHttpExecutionAdapter> >();

            var execAdapter = new JsonHttpExecutionAdapter(
                mockLogger.Object,
                mockJsonHttpClient.Object,
                mockExecServiceProvider.Object,
                mockInputAccessorProvider.Object,
                mockOutputAccessorProvider.Object,
                mockSigner.Object);

            var execRequest = CreateDefaultExecutionRequest();

            SetupDefaultMockExecutionServiceProvider(execRequest, mockExecServiceProvider);
            SetupDefaultMockInputObjectAccessorProvider(execRequest, mockInputAccessorProvider);
            SetupDefaultMockOutputObjectAccessorProvider(execRequest, mockOutputAccessorProvider);

            var httpExecResponse = new HttpExecutionResponse {
                ExecutionId = execRequest.ExecutionId
            };

            mockJsonHttpClient
            .Setup(hc => hc.PostAsync <HttpExecutionResponse>(defaultHttpExtensionSettings.ExecutionUrl, It.IsAny <HttpExecutionRequest>()))
            .Returns(Task.FromResult(new HttpResponse <HttpExecutionResponse>(HttpStatusCode.OK, httpExecResponse)));

            var execContext = await execAdapter.ExecuteAsync(execRequest, CancellationToken.None);

            mockExecServiceProvider.Verify(sp => sp.OnExecutingAsync(execRequest));
        }
        public async void ExecuteAsync_ValidateOnlyButExtensionDoesntSupportValidation_ShouldThrowException()
        {
            var mockJsonHttpClient         = new Mock <IJsonHttpClient>();
            var mockExecServiceProvider    = new Mock <IExecutionServiceProvider>();
            var mockInputAccessorProvider  = new Mock <IInputObjectAccessorProvider>();
            var mockOutputAccessorProvider = new Mock <IOutputObjectAccessorProvider>();
            var mockSigner = new Mock <ISigner <HttpExecutionRequest> >();
            var mockLogger = new Mock <ILogger <JsonHttpExecutionAdapter> >();

            var execAdapter = new JsonHttpExecutionAdapter(
                mockLogger.Object,
                mockJsonHttpClient.Object,
                mockExecServiceProvider.Object,
                mockInputAccessorProvider.Object,
                mockOutputAccessorProvider.Object,
                mockSigner.Object);

            var execRequest = CreateDefaultExecutionRequest();

            execRequest.ValidateOnly          = true;
            execRequest.IsValidationSupported = false;

            SetupDefaultMockExecutionServiceProvider(execRequest, mockExecServiceProvider);
            SetupDefaultMockInputObjectAccessorProvider(execRequest, mockInputAccessorProvider);
            SetupDefaultMockOutputObjectAccessorProvider(execRequest, mockOutputAccessorProvider);

            var execContext = await execAdapter.ExecuteAsync(execRequest, CancellationToken.None);

            execContext.Status.Should().Be(ExecutionStatus.Failed);
        }
        public async Task ExecuteAsync_ValidationRequested_StatusShouldBeValidationFailedIfBadRequestAndErrorsProvided()
        {
            var mockJsonHttpClient         = new Mock <IJsonHttpClient>();
            var mockExecServiceProvider    = new Mock <IExecutionServiceProvider>();
            var mockInputAccessorProvider  = new Mock <IInputObjectAccessorProvider>();
            var mockOutputAccessorProvider = new Mock <IOutputObjectAccessorProvider>();
            var mockSigner = new Mock <ISigner <HttpExecutionRequest> >();
            var mockLogger = new Mock <ILogger <JsonHttpExecutionAdapter> >();

            var execAdapter = new JsonHttpExecutionAdapter(
                mockLogger.Object,
                mockJsonHttpClient.Object,
                mockExecServiceProvider.Object,
                mockInputAccessorProvider.Object,
                mockOutputAccessorProvider.Object,
                mockSigner.Object);

            var execRequest = CreateDefaultExecutionRequest();

            execRequest.ValidateOnly          = true;
            execRequest.IsValidationSupported = true;

            SetupDefaultMockExecutionServiceProvider(execRequest, mockExecServiceProvider);
            SetupDefaultMockInputObjectAccessorProvider(execRequest, mockInputAccessorProvider);
            SetupDefaultMockOutputObjectAccessorProvider(execRequest, mockOutputAccessorProvider);

            var httpValidationError = new HttpExecutionValidationError
            {
                ErrorCode    = "Wrong",
                ErrorId      = CreateRandomId(),
                ErrorMessage = "You did it wrong."
            };

            var httpExecResponse = new HttpExecutionResponse
            {
                ExecutionId      = execRequest.ExecutionId,
                ValidationErrors = new List <HttpExecutionValidationError> {
                    httpValidationError
                }
            };

            mockJsonHttpClient
            .Setup(hc => hc.PostAsync <HttpExecutionResponse>(defaultHttpExtensionSettings.ValidationUrl, It.IsAny <HttpExecutionRequest>()))
            .Returns(Task.FromResult(new HttpResponse <HttpExecutionResponse>(HttpStatusCode.BadRequest, httpExecResponse)));

            var execContext = await execAdapter.ExecuteAsync(execRequest, CancellationToken.None);

            execContext.Status.Should().Be(ExecutionStatus.ValidationFailed);
            execContext.ValidationErrors.Should().HaveCount(1);

            var validationError = execContext.ValidationErrors[0];

            validationError.ErrorCode.Should().Be(httpValidationError.ErrorCode);
            validationError.ErrorId.Should().Be(httpValidationError.ErrorId);
            validationError.ErrorMessage.Should().Be(httpValidationError.ErrorMessage);
        }
        public async void ExecuteAsync_NullExecutionRequest_ShouldThrowException()
        {
            var mockJsonHttpClient         = new Mock <IJsonHttpClient>();
            var mockExecServiceProvider    = new Mock <IExecutionServiceProvider>();
            var mockInputAccessorProvider  = new Mock <IInputObjectAccessorProvider>();
            var mockOutputAccessorProvider = new Mock <IOutputObjectAccessorProvider>();
            var mockSigner = new Mock <ISigner <HttpExecutionRequest> >();
            var mockLogger = new Mock <ILogger <JsonHttpExecutionAdapter> >();

            var execAdapter = new JsonHttpExecutionAdapter(
                mockLogger.Object,
                mockJsonHttpClient.Object,
                mockExecServiceProvider.Object,
                mockInputAccessorProvider.Object,
                mockOutputAccessorProvider.Object,
                mockSigner.Object);

            Func <Task> act = async() => await execAdapter.ExecuteAsync(null, CancellationToken.None);

            await act.Should().ThrowAsync <ArgumentNullException>();
        }
        public async Task ExecuteAsync_ValidationRequested_StatusShouldBeFailedIfOtherStatusCode()
        {
            var mockJsonHttpClient         = new Mock <IJsonHttpClient>();
            var mockExecServiceProvider    = new Mock <IExecutionServiceProvider>();
            var mockInputAccessorProvider  = new Mock <IInputObjectAccessorProvider>();
            var mockOutputAccessorProvider = new Mock <IOutputObjectAccessorProvider>();
            var mockSigner = new Mock <ISigner <HttpExecutionRequest> >();
            var mockLogger = new Mock <ILogger <JsonHttpExecutionAdapter> >();

            var execAdapter = new JsonHttpExecutionAdapter(
                mockLogger.Object,
                mockJsonHttpClient.Object,
                mockExecServiceProvider.Object,
                mockInputAccessorProvider.Object,
                mockOutputAccessorProvider.Object,
                mockSigner.Object);

            var execRequest = CreateDefaultExecutionRequest();

            execRequest.ValidateOnly          = true;
            execRequest.IsValidationSupported = true;

            SetupDefaultMockExecutionServiceProvider(execRequest, mockExecServiceProvider);
            SetupDefaultMockInputObjectAccessorProvider(execRequest, mockInputAccessorProvider);
            SetupDefaultMockOutputObjectAccessorProvider(execRequest, mockOutputAccessorProvider);

            var httpExecResponse = new HttpExecutionResponse {
                ExecutionId = execRequest.ExecutionId
            };

            mockJsonHttpClient
            .Setup(hc => hc.PostAsync <HttpExecutionResponse>(defaultHttpExtensionSettings.ValidationUrl, It.IsAny <HttpExecutionRequest>()))
            .Returns(Task.FromResult(new HttpResponse <HttpExecutionResponse>(HttpStatusCode.InternalServerError, httpExecResponse)));

            var execContext = await execAdapter.ExecuteAsync(execRequest, CancellationToken.None);

            execContext.Status.Should().Be(ExecutionStatus.Failed);
            execContext.ValidationErrors.Should().BeEmpty();
        }
        public async Task ExecuteAsync_ExecutionRequested_StatusShouldBeSucceededIfOk()
        {
            var mockJsonHttpClient         = new Mock <IJsonHttpClient>();
            var mockExecServiceProvider    = new Mock <IExecutionServiceProvider>();
            var mockInputAccessorProvider  = new Mock <IInputObjectAccessorProvider>();
            var mockOutputAccessorProvider = new Mock <IOutputObjectAccessorProvider>();
            var mockSigner = new Mock <ISigner <HttpExecutionRequest> >();
            var mockLogger = new Mock <ILogger <JsonHttpExecutionAdapter> >();

            var execAdapter = new JsonHttpExecutionAdapter(
                mockLogger.Object,
                mockJsonHttpClient.Object,
                mockExecServiceProvider.Object,
                mockInputAccessorProvider.Object,
                mockOutputAccessorProvider.Object,
                mockSigner.Object);

            var execRequest = CreateDefaultExecutionRequest();

            SetupDefaultMockExecutionServiceProvider(execRequest, mockExecServiceProvider);
            SetupDefaultMockInputObjectAccessorProvider(execRequest, mockInputAccessorProvider);
            SetupDefaultMockOutputObjectAccessorProvider(execRequest, mockOutputAccessorProvider);

            var httpExecResponse = new HttpExecutionResponse
            {
                ExecutionId  = execRequest.ExecutionId,
                ResponseData = JObject.FromObject(execRequest)
            };

            mockJsonHttpClient
            .Setup(hc => hc.PostAsync <HttpExecutionResponse>(defaultHttpExtensionSettings.ExecutionUrl, It.IsAny <HttpExecutionRequest>()))
            .Returns(Task.FromResult(new HttpResponse <HttpExecutionResponse>(HttpStatusCode.OK, httpExecResponse)));

            var execContext = await execAdapter.ExecuteAsync(execRequest, CancellationToken.None);

            execContext.Status.Should().Be(ExecutionStatus.Succeeded);
            execContext.ResultData.Should().BeEquivalentTo(httpExecResponse.ResponseData);
        }
        public async void ExecuteAsync_ExecutionRequested_ShouldPostExecutionRequestToExtension()
        {
            var mockJsonHttpClient         = new Mock <IJsonHttpClient>();
            var mockExecServiceProvider    = new Mock <IExecutionServiceProvider>();
            var mockInputAccessorProvider  = new Mock <IInputObjectAccessorProvider>();
            var mockOutputAccessorProvider = new Mock <IOutputObjectAccessorProvider>();
            var mockSigner = new Mock <ISigner <HttpExecutionRequest> >();
            var mockLogger = new Mock <ILogger <JsonHttpExecutionAdapter> >();

            var execAdapter = new JsonHttpExecutionAdapter(
                mockLogger.Object,
                mockJsonHttpClient.Object,
                mockExecServiceProvider.Object,
                mockInputAccessorProvider.Object,
                mockOutputAccessorProvider.Object,
                mockSigner.Object);

            var execRequest = CreateDefaultExecutionRequest();

            SetupDefaultMockExecutionServiceProvider(execRequest, mockExecServiceProvider);
            SetupDefaultMockInputObjectAccessorProvider(execRequest, mockInputAccessorProvider);
            SetupDefaultMockOutputObjectAccessorProvider(execRequest, mockOutputAccessorProvider);

            string executionUrl = null;
            HttpExecutionRequest httpExecRequest = null;

            execRequest.ExecutionParameters = JObject.FromObject(execRequest);

            var httpExecResponse = new HttpExecutionResponse {
                ExecutionId = execRequest.ExecutionId
            };

            mockJsonHttpClient
            .Setup(hc => hc.PostAsync <HttpExecutionResponse>(defaultHttpExtensionSettings.ExecutionUrl, It.IsAny <HttpExecutionRequest>()))
            .Returns(Task.FromResult(new HttpResponse <HttpExecutionResponse>(HttpStatusCode.OK, httpExecResponse)))
            .Callback <string, object>((u, er) =>
            {
                executionUrl    = u;
                httpExecRequest = er as HttpExecutionRequest;
            });

            await execAdapter.ExecuteAsync(execRequest, CancellationToken.None);

            executionUrl.Should().NotBeNull();
            httpExecRequest.Should().NotBeNull();

            executionUrl.Should().Be(DefaultExtensionExecutionUrl);

            httpExecRequest.CreatedDateTimeUtc.Should().Be(execRequest.CreatedDateTimeUtc);
            httpExecRequest.ExecutionId.Should().Be(execRequest.ExecutionId);
            httpExecRequest.ExecutionProfileName.Should().Be(execRequest.ExecutionProfileName);
            httpExecRequest.Executor.Should().Be(execRequest.Executor);
            httpExecRequest.ExpirationDateTimeUtc.Should().Be(execRequest.ExecutionTimeoutDateTimeUtc);
            httpExecRequest.ExtensionId.Should().Be(execRequest.ExtensionId);
            httpExecRequest.ExtensionVersionId.Should().Be(execRequest.ExtensionVersionId);
            httpExecRequest.GetExecutionStatusUrl.Should().Be(execRequest.GetExecutionStatusUrl);
            httpExecRequest.Priority.Should().Be(execRequest.Priority);
            httpExecRequest.Services.Should().BeEquivalentTo(defaultExecutionServiceConfiguration);
            httpExecRequest.StatusUpdateKey.Should().Be(execRequest.StatusUpdateKey);
            httpExecRequest.UpdateExecutionStatusUrl.Should().Be(execRequest.UpdateExecutionStatusUrl);
            httpExecRequest.RequestParameters.Should().BeEquivalentTo(execRequest.ExecutionParameters);
        }