public async Task ProvisionDeferred()
        {
            var request = new ServiceInstanceProvisionRequest
            {
                ServiceId = "abc",
                PlanId    = "xyz"
            };
            var response = new ServiceInstanceAsyncOperation
            {
                Operation    = "my operation",
                DashboardUrl = new Uri("http://example.com")
            };
            var operation = new LastOperationResource
            {
                State       = LastOperationResourceState.Succeeded,
                Description = "done"
            };
            var syntheticResponse = new ServiceInstanceProvision
            {
                DashboardUrl = response.DashboardUrl
            };

            SetupMock(x => x.ProvisionAsync(new ServiceInstanceContext("123"), request), response);
            SetupMock(x => x.GetLastOperationAsync(new ServiceInstanceContext("123"), "abc", "xyz", "my operation"), operation);
            var result = await Client.ServiceInstancesPolling["123"].ProvisionAsync(request);

            result.Should().BeEquivalentTo(syntheticResponse);
        }
        public async Task BindAsyncError()
        {
            var request = new ServiceBindingRequest
            {
                ServiceId = "abc",
                PlanId    = "xyz"
            };
            var response = new ServiceBindingAsyncOperation
            {
                Operation = "my operation"
            };
            var operation = new LastOperationResource
            {
                State       = LastOperationResourceState.Failed,
                Description = "custom message"
            };

            Mock.Setup(x => x.BindAsync(new("123", "456"), request))
            .ReturnsAsync(response);
            Mock.Setup(x => x.GetLastOperationAsync(new("123", "456"), "abc", "xyz", "my operation"))
            .ReturnsAsync(operation);
            await Client.ServiceInstancesPolling["123"].ServiceBindings["456"]
            .Awaiting(x => x.BindAsync(request))
            .Should().ThrowAsync <BrokerException>().WithMessage("custom message");
        }
        public async Task GetLastOperation()
        {
            var response = new LastOperationResource
            {
                State = LastOperationResourceState.InProgress
            };

            SetupMock(x => x.GetLastOperationAsync(new ServiceBindingContext("123", "456"), "abc", "xyz", "my operation"), response);
            var result = await Client.ServiceInstancesDeferred["123"].ServiceBindings["456"].LastOperation("abc", "xyz", "my operation").ReadAsync();

            result.Should().BeEquivalentTo(response);
        }
        public async Task GetLastOperation()
        {
            var response = new LastOperationResource
            {
                State = LastOperationResourceState.InProgress
            };

            Mock.Setup(x => x.GetLastOperationAsync(new("123"), "abc", "xyz", "my operation"))
            .ReturnsAsync(response);
            var result = await Client.ServiceInstancesDeferred["123"].LastOperation("abc", "xyz", "my operation").ReadAsync();

            result.Should().BeEquivalentTo(response);
        }
        public async Task DeprovisionDeferred()
        {
            var response = new AsyncOperation
            {
                Operation = "my operation"
            };
            var operation = new LastOperationResource
            {
                State       = LastOperationResourceState.Succeeded,
                Description = "done"
            };

            SetupMock(x => x.DeprovisionAsync(new ServiceInstanceContext("123"), "abc", "xyz"), response);
            SetupMock(x => x.GetLastOperationAsync(new ServiceInstanceContext("123"), "abc", "xyz", "my operation"), operation);
            await Client.ServiceInstancesPolling["123"].DeprovisionAsync("abc", "xyz");
        }
        public async Task UnbindDeferred()
        {
            var response = new AsyncOperation
            {
                Operation = "my operation"
            };
            var operation = new LastOperationResource
            {
                State       = LastOperationResourceState.Succeeded,
                Description = "done"
            };

            Mock.Setup(x => x.UnbindAsync(new("123", "456"), "abc", "xyz"))
            .ReturnsAsync(response);
            Mock.Setup(x => x.GetLastOperationAsync(new("123", "456"), "abc", "xyz", "my operation"))
            .ReturnsAsync(operation);
            await Client.ServiceInstancesPolling["123"].ServiceBindings["456"].UnbindAsync("abc", "xyz");
        }
        public async Task UpdateDeferred()
        {
            var request = new ServiceInstanceUpdateRequest
            {
                ServiceId = "abc",
                PlanId    = "xyz"
            };
            var response = new ServiceInstanceAsyncOperation
            {
                Operation = "my operation"
            };
            var operation = new LastOperationResource
            {
                State       = LastOperationResourceState.Succeeded,
                Description = "done"
            };

            SetupMock(x => x.UpdateAsync(new ServiceInstanceContext("123"), request), response);
            SetupMock(x => x.GetLastOperationAsync(new ServiceInstanceContext("123"), "abc", "xyz", "my operation"), operation);
            await Client.ServiceInstancesPolling["123"].UpdateAsync(request);
        }
        public void ProvisionAsyncError()
        {
            var request = new ServiceInstanceProvisionRequest
            {
                ServiceId = "abc",
                PlanId    = "xyz"
            };
            var response = new ServiceInstanceAsyncOperation
            {
                Operation = "my operation"
            };
            var operation = new LastOperationResource
            {
                State       = LastOperationResourceState.Failed,
                Description = "custom message"
            };

            SetupMock(x => x.ProvisionAsync(new ServiceInstanceContext("123"), request), response);
            SetupMock(x => x.GetLastOperationAsync(new ServiceInstanceContext("123"), "abc", "xyz", "my operation"), operation);
            Client.ServiceInstancesPolling["123"].Awaiting(x => x.ProvisionAsync(request)).Should().Throw <BrokerException>().WithMessage("custom message");
        }
        public async Task BindDeferred()
        {
            var request = new ServiceBindingRequest
            {
                ServiceId    = "abc",
                PlanId       = "xyz",
                BindResource = new()
                {
                    AppGuid = "123-456"
                }
            };
            var response = new ServiceBindingAsyncOperation
            {
                Operation = "my operation"
            };
            var operation = new LastOperationResource
            {
                State       = LastOperationResourceState.Succeeded,
                Description = "done"
            };
            var resource = new ServiceBindingResource
            {
                RouteServiceUrl = new Uri("http://example.com")
            };
            var syntheticResponse = new ServiceBinding
            {
                RouteServiceUrl = new Uri("http://example.com")
            };

            Mock.Setup(x => x.BindAsync(new("123", "456"), request))
            .ReturnsAsync(response);
            Mock.Setup(x => x.GetLastOperationAsync(new("123", "456"), "abc", "xyz", "my operation"))
            .ReturnsAsync(operation);
            Mock.Setup(x => x.FetchAsync("123", "456"))
            .ReturnsAsync(resource);
            var result = await Client.ServiceInstancesPolling["123"].ServiceBindings["456"].BindAsync(request);

            result.Should().BeEquivalentTo(syntheticResponse);
        }