public async Task VerifyExceptionWhenCallHttpAsyncReturnsNonStatusOK()
        {
            FailureRequest mockFailureRequest = new FailureRequest
            {
                FailureTime = DateTime.UtcNow,
                InstanceId  = "TEST-INSTANCEID",
                RequestId   = "TEST-REQUESTID",
                ResourceId  = "TEST-RESOURCEID",
            };

            this.durableOrchestrationContextMock.Setup(client => client.GetInput <FailureRequest>()).Returns(mockFailureRequest);
            this.durableOrchestrationContextMock.Setup(client => client.CallHttpAsync(It.IsAny <DurableHttpRequest>())).Returns(Task.FromResult(new DurableHttpResponse(HttpStatusCode.BadRequest)));

            OpenCircuitOrchestrator function = new OpenCircuitOrchestrator();

            Func <Task> testCode = async() => await function.OpenCircuit(this.durableOrchestrationContextMock.Object, this.logger).ConfigureAwait(false);

            var ex = await Record.ExceptionAsync(testCode).ConfigureAwait(false);

            Assert.NotNull(ex);
            Assert.IsType <ApplicationException>(ex);

            string expectedLog = "Failed to stop Function App";

            Assert.Contains(expectedLog, ex.Message, StringComparison.OrdinalIgnoreCase);
        }
        public async Task ShouldThrowExceptionWhenContextIsNull()
        {
            OpenCircuitOrchestrator function = new OpenCircuitOrchestrator();
            Func <Task>             testCode = async() => await function.OpenCircuit(null, this.logger).ConfigureAwait(false);

            var ex = await Record.ExceptionAsync(testCode).ConfigureAwait(false);

            Assert.NotNull(ex);
            Assert.IsType <ArgumentNullException>(ex);
        }
        public async Task VerifyOpenCircuitFunctionInvokesCallHttpAsync()
        {
            FailureRequest mockFailureRequest = new FailureRequest
            {
                FailureTime = DateTime.UtcNow,
                InstanceId  = "TEST-INSTANCEID",
                RequestId   = "TEST-REQUESTID",
                ResourceId  = "TEST-RESOURCEID",
            };

            this.durableOrchestrationContextMock.Setup(client => client.GetInput <FailureRequest>()).Returns(mockFailureRequest);
            this.durableOrchestrationContextMock.Setup(client => client.CallHttpAsync(It.IsAny <DurableHttpRequest>())).Returns(Task.FromResult(new DurableHttpResponse(HttpStatusCode.OK)));

            OpenCircuitOrchestrator function = new OpenCircuitOrchestrator();

            await function.OpenCircuit(this.durableOrchestrationContextMock.Object, this.logger).ConfigureAwait(false);

            this.durableOrchestrationContextMock.Verify(service => service.CallHttpAsync(It.IsAny <DurableHttpRequest>()), Times.Once);

            string expectedLogText = "Successfully STOPPED Azure Function with Resource ID";

            Assert.Contains(expectedLogText, this.logger.Logs[1], StringComparison.OrdinalIgnoreCase);
        }