public async Task RestApiIntegration_StubGeneration_HappyFlow_OnlyReturnStub()
    {
        // Arrange
        ClientDataResolverMock
        .Setup(m => m.GetClientIp())
        .Returns("127.0.0.1");

        ClientDataResolverMock
        .Setup(m => m.GetHost())
        .Returns("localhost");

        // Do a call to a non-existent stub
        var response = await Client.SendAsync(CreateTestStubRequest());

        var correlationId = response.Headers.Single(h => h.Key == "X-HttPlaceholder-Correlation").Value.Single();

        // Register a new stub for the failed request
        var url        = $"{BaseAddress}ph-api/requests/{correlationId}/stubs";
        var apiRequest = new HttpRequestMessage
        {
            RequestUri = new Uri(url),
            Method     = HttpMethod.Post,
            Content    = new StringContent(JsonConvert.SerializeObject(new CreateStubForRequestInputDto {
                DoNotCreateStub = true
            }), Encoding.UTF8, Constants.JsonMime)
        };

        response = await Client.SendAsync(apiRequest);

        response.EnsureSuccessStatusCode();

        // Check that the stub is not added to the stub source.
        Assert.AreEqual(0, StubSource.StubModels.Count);
    }
    public async Task RestApiIntegration_StubGeneration_HappyFlow()
    {
        // Arrange
        ClientDataResolverMock
        .Setup(m => m.GetClientIp())
        .Returns("127.0.0.1");

        ClientDataResolverMock
        .Setup(m => m.GetHost())
        .Returns("localhost");

        // Do a call to a non-existent stub
        var response = await Client.SendAsync(CreateTestStubRequest());

        var correlationId = response.Headers.Single(h => h.Key == "X-HttPlaceholder-Correlation").Value.Single();

        // Register a new stub for the failed request
        var url        = $"{BaseAddress}ph-api/requests/{correlationId}/stubs";
        var apiRequest = new HttpRequestMessage
        {
            RequestUri = new Uri(url),
            Method     = HttpMethod.Post,
            Content    = new StringContent("{}", Encoding.UTF8, Constants.JsonMime)
        };

        response = await Client.SendAsync(apiRequest);

        response.EnsureSuccessStatusCode();

        // Do the original stub request again; it should succeed now
        response = await Client.SendAsync(CreateTestStubRequest());

        response.EnsureSuccessStatusCode();

        // Check the actual added stub
        var addedStub = StubSource.StubModels.Single();

        Assert.AreEqual("/test123", addedStub.Conditions.Url.Path);

        Assert.AreEqual("val1", addedStub.Conditions.Url.Query["query1"]);
        Assert.AreEqual("val2", addedStub.Conditions.Url.Query["query2"]);

        Assert.AreEqual("POST", addedStub.Conditions.Method);

        var formDict = addedStub.Conditions.Form.ToDictionary(f => f.Key, f => f.Value);

        Assert.AreEqual("val1", formDict["form1"]);
        Assert.AreEqual("val2", formDict["form2"]);

        Assert.AreEqual("abc123", addedStub.Conditions.Headers["X-Api-Key"]);

        Assert.AreEqual("127.0.0.1", addedStub.Conditions.ClientIp);

        Assert.IsFalse(addedStub.Conditions.Url.IsHttps.HasValue && addedStub.Conditions.Url.IsHttps.Value);

        Assert.AreEqual("localhost", addedStub.Conditions.Host);

        Assert.AreEqual("duco", addedStub.Conditions.BasicAuthentication.Username);
        Assert.AreEqual("pass", addedStub.Conditions.BasicAuthentication.Password);
    }