diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 80734df..e040a26 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -26,6 +26,10 @@ jobs: uses: actions/setup-dotnet@v1 with: dotnet-version: '5.0.x' + - name: Setup .NET Core 6.0 + uses: actions/setup-dotnet@v1 + with: + dotnet-version: '6.0.x' - name: Initialize CodeQL uses: github/codeql-action/init@v1 with: diff --git a/.github/workflows/dotnet-core.yml b/.github/workflows/dotnet-core.yml index ead8c3d..0d27ca5 100644 --- a/.github/workflows/dotnet-core.yml +++ b/.github/workflows/dotnet-core.yml @@ -24,6 +24,10 @@ jobs: uses: actions/setup-dotnet@v1 with: dotnet-version: '5.0.x' + - name: Setup .NET Core 6.0 + uses: actions/setup-dotnet@v1 + with: + dotnet-version: '6.0.x' - name: Clean run: dotnet clean --configuration Release && dotnet nuget locals all --clear - name: Install dependencies diff --git a/.github/workflows/sonarqube-analysis.yml b/.github/workflows/sonarqube-analysis.yml index da534ce..e477e33 100644 --- a/.github/workflows/sonarqube-analysis.yml +++ b/.github/workflows/sonarqube-analysis.yml @@ -20,8 +20,12 @@ jobs: uses: actions/setup-dotnet@v1 with: dotnet-version: '5.0.x' + - name: Setup .NET Core 6.0 + uses: actions/setup-dotnet@v1 + with: + dotnet-version: '6.0.x' - name: SonarScanner for .NET Core with pull request decoration support - uses: highbyte/sonarscan-dotnet@2.0 + uses: highbyte/sonarscan-dotnet@v2.1.2 with: sonarProjectKey: qatoolkit_qatoolkit-engine-httptester-net sonarProjectName: qatoolkit_qatoolkit-engine-httptester-net diff --git a/Directory.Build.props b/Directory.Build.props index 83b1ab4..8f6c07a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - 0.3.4 + 0.3.5 \ No newline at end of file diff --git a/README.md b/README.md index 7391949..8a2cfeb 100644 --- a/README.md +++ b/README.md @@ -287,7 +287,7 @@ using (var client = new HttpTesterClient()) MIT License -Copyright (c) 2020-2021 Miha Jakovac +Copyright (c) 2020-2022 Miha Jakovac Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/src/QAToolKit.Engine.HttpTester.Test/HttpTesterClientTests.cs b/src/QAToolKit.Engine.HttpTester.Test/HttpTesterClientTests.cs index 7441686..5120dbf 100644 --- a/src/QAToolKit.Engine.HttpTester.Test/HttpTesterClientTests.cs +++ b/src/QAToolKit.Engine.HttpTester.Test/HttpTesterClientTests.cs @@ -31,27 +31,27 @@ public async Task HttpTesterClientWithSwagger_Success() options.UseSwaggerExampleValues = true; }); - var requests = await urlSource.Load(new Uri[] { + var requests = await urlSource.Load(new Uri[] + { new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v1/swagger.json") }); - var replacementValues = new Dictionary { - { "api-version", 1} - }; - - var urlGenerator = new HttpRequestUrlGenerator(requests.FirstOrDefault(), options => + var replacementValues = new Dictionary { - options.AddReplacementValues(replacementValues); - }); + { "api-version", 1 } + }; + + var urlGenerator = new HttpRequestUrlGenerator(requests.FirstOrDefault(), + options => { options.AddReplacementValues(replacementValues); }); using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri(urlGenerator.GetUrl())) - .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) - .WithMethod(HttpMethod.Post) - .WithJsonBody(BicycleFixture.Get()) - .Start(); + .CreateHttpRequest(new Uri(urlGenerator.GetUrl())) + .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) + .WithMethod(HttpMethod.Post) + .WithJsonBody(BicycleFixture.Get()) + .Start(); var msg = await response.GetResponseJsonBody(); @@ -67,11 +67,11 @@ public async Task HttpTesterClientSimple_Success() using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Get) - .WithPath("/api/bicycles") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Get) + .WithPath("/api/bicycles") + .Start(); var msg = await response.GetResponseJsonBody>(); @@ -89,11 +89,11 @@ public async Task HttpTesterClientSimpleGet_Success() using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Get) - .WithPath("/api/bicycles/1") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Get) + .WithPath("/api/bicycles/1") + .Start(); var msg = await response.GetResponseJsonBody(); @@ -112,12 +112,12 @@ public async Task HttpTesterClientWithoutHeaders_Success() using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Post) - .WithJsonBody(BicycleFixture.GetCfr()) - .WithPath("/api/bicycles") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Post) + .WithJsonBody(BicycleFixture.GetCfr()) + .WithPath("/api/bicycles") + .Start(); var msg = await response.GetResponseJsonBody(); @@ -136,12 +136,12 @@ public async Task HttpTesterClientWithoutQueryParams_Success() using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) - .WithMethod(HttpMethod.Post) - .WithJsonBody(BicycleFixture.Get()) - .WithPath("/api/bicycles") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) + .WithMethod(HttpMethod.Post) + .WithJsonBody(BicycleFixture.Get()) + .WithPath("/api/bicycles") + .Start(); Assert.True(client.Duration < 2000); Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); @@ -154,12 +154,12 @@ public async Task HttpTesterClientWithoutPath_Success() using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Post) - .WithJsonBody(BicycleFixture.Get()) - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Post) + .WithJsonBody(BicycleFixture.Get()) + .Start(); Assert.True(client.Duration < 2000); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); @@ -172,10 +172,10 @@ public async Task HttpTesterClientWithoutMethod_Exception() using (var client = new HttpTesterClient()) { var response = client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithJsonBody(BicycleFixture.Get()); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithJsonBody(BicycleFixture.Get()); await Assert.ThrowsAsync(async () => await client.Start()); } @@ -187,11 +187,11 @@ public async Task HttpTesterClientGetWithBody_Exception() using (var client = new HttpTesterClient()) { var response = client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Get) - .WithJsonBody(BicycleFixture.Get()); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithHeaders(new Dictionary() { { "Content-Type", "application/json" } }) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Get) + .WithJsonBody(BicycleFixture.Get()); await Assert.ThrowsAsync(async () => await client.Start()); } @@ -203,7 +203,7 @@ public async Task HttpTesterClientOnlyBaseUrl_Exception() using (var client = new HttpTesterClient()) { var response = client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")); await Assert.ThrowsAsync(async () => await client.Start()); } @@ -224,11 +224,11 @@ public async Task HttpTesterClientGetWithBodyDisableSSLValidationWithValidCert_S using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net"), false) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Get) - .WithPath("/api/bicycles/1") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net"), false) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Get) + .WithPath("/api/bicycles/1") + .Start(); var msg = await response.GetResponseJsonBody(); @@ -247,11 +247,11 @@ public async Task HttpTesterClientGetWithBodyDisableSSLValidationWithInvalidCert using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://swagger-demo.qatoolkit.io/"), false) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Get) - .WithPath("/api/bicycles/1") - .Start(); + .CreateHttpRequest(new Uri("https://swagger-demo.qatoolkit.io/"), false) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Get) + .WithPath("/api/bicycles/1") + .Start(); var msg = await response.GetResponseJsonBody(); @@ -263,7 +263,7 @@ public async Task HttpTesterClientGetWithBodyDisableSSLValidationWithInvalidCert Assert.Equal("Scott", msg.Brand); } } - + [Fact] public async Task HttpTesterClientGetWithBodyDisableSSLValidationWithInvalidCertAndResponseBody_Success() { @@ -306,18 +306,18 @@ public async Task HttpTesterClientGetWithBodyDisableSSLValidationWithInvalidCert Assert.True(response.IsSuccessStatusCode); } } - + [Fact] public async Task HttpTesterClientGetWithBodyDisableSSLValidationWithHttpUrl_Exception() { using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("http://swagger-demo.qatoolkit.io/"), false) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Get) - .WithPath("/api/bicycles/1") - .Start(); + .CreateHttpRequest(new Uri("http://swagger-demo.qatoolkit.io/"), false) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Get) + .WithPath("/api/bicycles/1") + .Start(); var msg = await response.GetResponseJsonBody(); @@ -329,17 +329,17 @@ public async Task HttpTesterClientGetWithBodyDisableSSLValidationWithHttpUrl_Exc Assert.Equal("Scott", msg.Brand); } } - + [Fact] public async Task HttpTesterClientGetWithBodyDisableSSLValidationWithInvalidCertAndUrl2_Exception() { using (var client = new HttpTesterClient()) { var response = client - .CreateHttpRequest(new Uri("http://swagger-demo.qatoolkit.io/"), true) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Get) - .WithPath("/api/bicycles/1"); + .CreateHttpRequest(new Uri("http://swagger-demo.qatoolkit.io/"), true) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Get) + .WithPath("/api/bicycles/1"); await Assert.ThrowsAsync(async () => await client.Start()); } @@ -351,12 +351,12 @@ public async Task HttpTesterClientReturnDynamic_Success() using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithQueryParams(new Dictionary() { { "api-version", "1" } }) - .WithMethod(HttpMethod.Post) - .WithJsonBody(BicycleFixture.GetCfr()) - .WithPath("/api/bicycles") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Post) + .WithJsonBody(BicycleFixture.GetCfr()) + .WithPath("/api/bicycles") + .Start(); var msg = await response.GetResponseJsonBody(); @@ -372,10 +372,10 @@ public async Task HttpTesterClientPostStringBodyWithFulUrl_Success() using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) - .WithJsonBody("{\"id\": 5,\"name\":\"EXCEED CFR\",\"brand\":\"Giant\",\"type\":2}") - .WithMethod(HttpMethod.Post) - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) + .WithJsonBody("{\"id\": 5,\"name\":\"EXCEED CFR\",\"brand\":\"Giant\",\"type\":2}") + .WithMethod(HttpMethod.Post) + .Start(); var msg = await response.GetResponseBodyString(); @@ -390,10 +390,10 @@ public async Task HttpTesterClientPostObjectBodyWithFulUrl_Success() using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) - .WithJsonBody(BicycleFixture.GetCfr()) - .WithMethod(HttpMethod.Post) - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) + .WithJsonBody(BicycleFixture.GetCfr()) + .WithMethod(HttpMethod.Post) + .Start(); var msg = await response.GetResponseJsonBody(); @@ -409,11 +409,11 @@ public async Task HttpTesterClientPostObjectBodyWithFulUrlWithBasicAuthorization using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) - .WithJsonBody(BicycleFixture.GetCfr()) - .WithMethod(HttpMethod.Post) - .WithBasicAuthentication("user", "pass") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) + .WithJsonBody(BicycleFixture.GetCfr()) + .WithMethod(HttpMethod.Post) + .WithBasicAuthentication("user", "pass") + .Start(); var msg = await response.GetResponseJsonBody(); @@ -430,11 +430,11 @@ public async Task HttpTesterClientPostObjectBodyWithFulUrlWithBearerAuthorizatio using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) - .WithJsonBody(BicycleFixture.GetCfr()) - .WithMethod(HttpMethod.Post) - .WithBearerAuthentication("123") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) + .WithJsonBody(BicycleFixture.GetCfr()) + .WithMethod(HttpMethod.Post) + .WithBearerAuthentication("123") + .Start(); var msg = await response.GetResponseJsonBody(); @@ -451,11 +451,11 @@ public async Task HttpTesterClientPostObjectBodyWithFulUrlWithNTLMDefaultAuthori using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) - .WithJsonBody(BicycleFixture.GetCfr()) - .WithMethod(HttpMethod.Post) - .WithNTLMAuthentication() - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) + .WithJsonBody(BicycleFixture.GetCfr()) + .WithMethod(HttpMethod.Post) + .WithNTLMAuthentication() + .Start(); var msg = await response.GetResponseJsonBody(); @@ -471,11 +471,11 @@ public async Task HttpTesterClientPostObjectBodyWithFulUrlWithNTLMAuthorization_ using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) - .WithJsonBody(BicycleFixture.GetCfr()) - .WithMethod(HttpMethod.Post) - .WithNTLMAuthentication("user", "pass") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1")) + .WithJsonBody(BicycleFixture.GetCfr()) + .WithMethod(HttpMethod.Post) + .WithNTLMAuthentication("user", "pass") + .Start(); var msg = await response.GetResponseJsonBody(); @@ -493,13 +493,13 @@ public async Task HttpTesterClientFileUpload_Success() var image = new WebClient().DownloadData("https://qatoolkit.io/assets/logo.png"); var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithQueryParams(new Dictionary() { { "api-version", "2" } }) - .WithMethod(HttpMethod.Post) - .WithPath("/api/bicycles/1/images") - .WithMultipart(image, "FileContent", "logo.png") - .WithMultipart("FileName", "miha.txt") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithQueryParams(new Dictionary() { { "api-version", "2" } }) + .WithMethod(HttpMethod.Post) + .WithPath("/api/bicycles/1/images") + .WithMultipart(image, "FileContent", "logo.png") + .WithMultipart("FileName", "miha.txt") + .Start(); var msg = await response.GetResponseBodyString(); @@ -516,13 +516,13 @@ public async Task HttpTesterClientFileUpload2_Success() byte[] image = new WebClient().DownloadData("https://qatoolkit.io/assets/logo.png"); var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithQueryParams(new Dictionary() { { "api-version", "2" } }) - .WithMethod(HttpMethod.Post) - .WithPath("/api/bicycles/1/images") - .WithMultipart(image, "FileContent", "logo.png") - .WithMultipart("FileName", "miha.txt") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithQueryParams(new Dictionary() { { "api-version", "2" } }) + .WithMethod(HttpMethod.Post) + .WithPath("/api/bicycles/1/images") + .WithMultipart(image, "FileContent", "logo.png") + .WithMultipart("FileName", "miha.txt") + .Start(); var msg = await response.GetResponseBodyString(); @@ -539,15 +539,15 @@ public async Task HttpTesterClientBrochureUpload_Success() byte[] image = new WebClient().DownloadData("https://qatoolkit.io/assets/logo.png"); var response = await client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithQueryParams(new Dictionary() { { "api-version", "2" } }) - .WithMethod(HttpMethod.Post) - .WithPath("/api/bicycles/1/brochures") - .WithMultipart(image, "Image.FileContent", "logo.png") - .WithMultipart("Image.FileName", "miha.txt") - .WithMultipart("Metadata.Year", "2000") - .WithMultipart("Metadata.Name", "Brochure 2000") - .Start(); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithQueryParams(new Dictionary() { { "api-version", "2" } }) + .WithMethod(HttpMethod.Post) + .WithPath("/api/bicycles/1/brochures") + .WithMultipart(image, "Image.FileContent", "logo.png") + .WithMultipart("Image.FileName", "miha.txt") + .WithMultipart("Metadata.Year", "2000") + .WithMultipart("Metadata.Name", "Brochure 2000") + .Start(); var msg = await response.GetResponseBodyString(); @@ -564,13 +564,14 @@ public void HttpTesterClientBrochureUploadBodyPresent_Fails() byte[] image = new WebClient().DownloadData("https://qatoolkit.io/assets/logo.png"); var response = client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithQueryParams(new Dictionary() { { "api-version", "2" } }) - .WithMethod(HttpMethod.Post) - .WithPath("/api/bicycles/1/brochures") - .WithJsonBody("1234"); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithQueryParams(new Dictionary() { { "api-version", "2" } }) + .WithMethod(HttpMethod.Post) + .WithPath("/api/bicycles/1/brochures") + .WithJsonBody("1234"); - var exception = Assert.Throws(() => client.WithMultipart(image, "Image.FileContent", "logo.png")); + var exception = Assert.Throws(() => + client.WithMultipart(image, "Image.FileContent", "logo.png")); Assert.StartsWith("Body application/json already defined on", exception.Message); } } @@ -583,16 +584,17 @@ public void HttpTesterClientBrochureUploadMultipartPresent_Fails() byte[] image = new WebClient().DownloadData("https://qatoolkit.io/assets/logo.png"); var response = client - .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) - .WithQueryParams(new Dictionary() { { "api-version", "2" } }) - .WithMethod(HttpMethod.Post) - .WithPath("/api/bicycles/1/brochures") - .WithMultipart(image, "Image.FileContent", "logo.png") - .WithMultipart("Image.FileName", "miha.txt") - .WithMultipart("Metadata.Year", "2000") - .WithMultipart("Metadata.Name", "Brochure 2000"); - - var exception = Assert.Throws(() => client.WithJsonBody("1234")); + .CreateHttpRequest(new Uri("https://qatoolkitapi.azurewebsites.net")) + .WithQueryParams(new Dictionary() { { "api-version", "2" } }) + .WithMethod(HttpMethod.Post) + .WithPath("/api/bicycles/1/brochures") + .WithMultipart(image, "Image.FileContent", "logo.png") + .WithMultipart("Image.FileName", "miha.txt") + .WithMultipart("Metadata.Year", "2000") + .WithMultipart("Metadata.Name", "Brochure 2000"); + + var exception = + Assert.Throws(() => client.WithJsonBody("1234")); Assert.StartsWith("Body multipart/form-data already defined", exception.Message); } } @@ -610,16 +612,17 @@ public async Task HttpTesterClientAddPostHttpRequest_Success() options.UseSwaggerExampleValues = true; }); - var requests = await urlSource.Load(new Uri[] { + var requests = await urlSource.Load(new Uri[] + { new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json") }); using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(requests.FirstOrDefault()) - .WithJsonBody(BicycleFixture.Get()) - .Start(); + .CreateHttpRequest(requests.FirstOrDefault()) + .WithJsonBody(BicycleFixture.Get()) + .Start(); var msg = await response.GetResponseJsonBody(); @@ -642,15 +645,16 @@ public async Task HttpTesterClientAddGetHttpRequest_Success() options.UseSwaggerExampleValues = true; }); - var requests = await urlSource.Load(new Uri[] { + var requests = await urlSource.Load(new Uri[] + { new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json") }); using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(requests.FirstOrDefault()) - .Start(); + .CreateHttpRequest(requests.FirstOrDefault()) + .Start(); var msg = await response.GetResponseJsonBody>(); @@ -675,17 +679,18 @@ public async Task HttpTesterClientGetBikeByIdRequest_Success() options.UseSwaggerExampleValues = true; }); - var requests = await urlSource.Load(new Uri[] { + var requests = await urlSource.Load(new Uri[] + { new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json") }); using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(requests.FirstOrDefault()) - .WithPathReplacementValues(new Dictionary() { { "id", "2" } }) - .WithQueryParams(new Dictionary() { { "api-version", "2" } }) - .Start(); + .CreateHttpRequest(requests.FirstOrDefault()) + .WithPathReplacementValues(new Dictionary() { { "id", "2" } }) + .WithQueryParams(new Dictionary() { { "api-version", "2" } }) + .Start(); var msg = await response.GetResponseJsonBody(); @@ -710,16 +715,18 @@ public async Task HttpTesterClientGetBikesByTypeHttpRequest_Success() options.UseSwaggerExampleValues = true; }); - var requests = await urlSource.Load(new Uri[] { + var requests = await urlSource.Load(new Uri[] + { new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json") }); using (var client = new HttpTesterClient()) { var response = await client - .CreateHttpRequest(requests.FirstOrDefault()) - .WithQueryParams(new Dictionary() { { "api-version", "2" }, {"bicycleType", "1" } }) - .Start(); + .CreateHttpRequest(requests.FirstOrDefault()) + .WithQueryParams( + new Dictionary() { { "api-version", "2" }, { "bicycleType", "1" } }) + .Start(); var msg = await response.GetResponseJsonBody>(); @@ -730,7 +737,7 @@ public async Task HttpTesterClientGetBikesByTypeHttpRequest_Success() Assert.True(response.IsSuccessStatusCode); } } - + [Fact] public async Task HttpTesterClientPostObjectBodyWithBlankCertificateDefaultAuthorization_Success() { @@ -744,5 +751,41 @@ await Assert.ThrowsAsync(async () => await client .Start()); } } + + [Fact] + public async Task HttpTesterMultipleHeaders_Success() + { + using (var client = new HttpTesterClient()) + { + client + .CreateHttpRequest(new Uri("http://swagger-demo.qatoolkit.io/"), true) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Get) + .WithHeaders(new Dictionary() { { "ApiKey", "1234" } }) + .WithPath("/api/bicycles/1"); + + client.WithHeaders(new Dictionary() { { "Test", "1234" } }); + + Assert.True(client.GetRequestHeaders().Count == 2); + } + } + + [Fact] + public async Task HttpTesterMultipleHeadersAlreadyExist_Success() + { + using (var client = new HttpTesterClient()) + { + client + .CreateHttpRequest(new Uri("http://swagger-demo.qatoolkit.io/"), true) + .WithQueryParams(new Dictionary() { { "api-version", "1" } }) + .WithMethod(HttpMethod.Get) + .WithHeaders(new Dictionary() { { "ApiKey", "1234" } }) + .WithPath("/api/bicycles/1"); + + client.WithHeaders(new Dictionary() { { "ApiKey", "1234" } }); + + Assert.True(client.GetRequestHeaders().Count == 1); + } + } } -} +} \ No newline at end of file diff --git a/src/QAToolKit.Engine.HttpTester.Test/QAToolKit.Engine.HttpTester.Test.csproj b/src/QAToolKit.Engine.HttpTester.Test/QAToolKit.Engine.HttpTester.Test.csproj index 4ed442e..573bc1d 100644 --- a/src/QAToolKit.Engine.HttpTester.Test/QAToolKit.Engine.HttpTester.Test.csproj +++ b/src/QAToolKit.Engine.HttpTester.Test/QAToolKit.Engine.HttpTester.Test.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 latest false @@ -12,11 +12,11 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + all diff --git a/src/QAToolKit.Engine.HttpTester/HttpTesterClient.cs b/src/QAToolKit.Engine.HttpTester/HttpTesterClient.cs index f8fa60f..e9fbcae 100644 --- a/src/QAToolKit.Engine.HttpTester/HttpTesterClient.cs +++ b/src/QAToolKit.Engine.HttpTester/HttpTesterClient.cs @@ -168,8 +168,26 @@ public IHttpTesterClient WithPathReplacementValues(Dictionary pa /// public IHttpTesterClient WithHeaders(Dictionary headers) { - _headers = headers ?? throw new ArgumentException($"{nameof(headers)} is null."); - + if (headers == null) + { + throw new ArgumentException($"{nameof(headers)} is null."); + } + + if (_headers == null || _headers.Count == 0) + { + _headers = headers; + } + else + { + foreach (var header in headers) + { + if (!_headers.ContainsKey(header.Key)) + { + _headers.Add(header.Key, header.Value); + } + } + } + return this; } @@ -427,6 +445,16 @@ public async Task Start() return _responseMessage; } + public Dictionary GetRequestHeaders() + { + return _headers; + } + + public Dictionary GetQueryParameters() + { + return _queryParameters; + } + /// /// Dispose the object ///