diff --git a/readme.md b/readme.md index bfc789d9..fb586f30 100644 --- a/readme.md +++ b/readme.md @@ -111,7 +111,6 @@ public async Task HttpResponse() Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, @@ -151,7 +150,7 @@ SOFTWARE. } } ``` -snippet source | anchor +snippet source | anchor @@ -268,7 +267,6 @@ await Verify(recording.Sends); Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization|Accept-Encoding, @@ -303,7 +301,7 @@ SOFTWARE. } ] ``` -snippet source | anchor +snippet source | anchor There a Pause/Resume semantics: @@ -432,7 +430,6 @@ The requests/response pairs will be appended to the verified file. Headers: { Access-Control-Allow-Origin: , Cache-Control: no-cache, - Content-Security-Policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com wss://alive-staging.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com marketplace-screenshots.githubusercontent.com/ copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com github.githubassets.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/, Location: https://raw.githubusercontent.com/VerifyTests/Verify.Http/main/src/global.json, Referrer-Policy: no-referrer-when-downgrade, Strict-Transport-Security: max-age=31536000; includeSubdomains; preload, @@ -460,7 +457,6 @@ The requests/response pairs will be appended to the verified file. Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, @@ -492,7 +488,6 @@ The requests/response pairs will be appended to the verified file. Headers: { Access-Control-Allow-Origin: , Cache-Control: no-cache, - Content-Security-Policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com wss://alive-staging.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com marketplace-screenshots.githubusercontent.com/ copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com github.githubassets.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/, Location: https://raw.githubusercontent.com/VerifyTests/Verify.Http/main/src/appveyor.yml, Referrer-Policy: no-referrer-when-downgrade, Strict-Transport-Security: max-age=31536000; includeSubdomains; preload, @@ -520,7 +515,6 @@ The requests/response pairs will be appended to the verified file. Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, @@ -554,7 +548,7 @@ artifacts: ] } ``` -snippet source | anchor +snippet source | anchor @@ -666,28 +660,29 @@ public async Task DefaultContent() Request-Response pairs can be verified using `MockHttpClient.Calls` - - + + ```cs [Fact] -public async Task RecordedCalls() +public async Task ExplicitContent() { - using var client = new MockHttpClient(); + using var client = new MockHttpClient( + content: """{ "a": "b" }""", + mediaType: "application/json"); - await client.GetAsync("https://fake/get1"); - await client.GetAsync("https://fake/get2"); + var result = await client.GetAsync("https://fake/get"); - await Verify(client.Calls); + await Verify(result); } ``` -snippet source | anchor +snippet source | anchor #### Resulting verified file - - + + ```txt [ { @@ -700,7 +695,7 @@ public async Task RecordedCalls() } ] ``` -snippet source | anchor +snippet source | anchor @@ -837,16 +832,15 @@ Use custom code to create a `HttpResponseMessage` base on a `HttpRequestMessage` [Fact] public async Task ResponseBuilder() { - using var client = new MockHttpClient( - request => + using var client = new MockHttpClient(request => + { + var content = $"Hello to {request.RequestUri}"; + var response = new HttpResponseMessage(HttpStatusCode.OK) { - var content = $"Hello to {request.RequestUri}"; - var response = new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent(content), - }; - return response; - }); + Content = new StringContent(content), + }; + return response; + }); var result1 = await client.GetAsync("https://fake/get1"); var result2 = await client.GetAsync("https://fake/get2"); @@ -858,7 +852,7 @@ public async Task ResponseBuilder() }); } ``` -snippet source | anchor +snippet source | anchor @@ -956,6 +950,52 @@ public async Task EnumerableResponses() + +### Recording Mock Interactions + +Interactions with MockHttpClient (in the form of Request and repsponse pairs) can optionally be included in [Recording](https://github.com/VerifyTests/Verify/blob/main/docs/recording.md). + + + +```cs +[Fact] +public async Task RecordingMockInteractions() +{ + using var client = new MockHttpClient(recording: true); + + Recording.Start(); + await client.GetStringAsync("https://fake/getOne"); + await client.GetStringAsync("https://fake/getTwo"); + + await Verify(); +} +``` +snippet source | anchor + + + +#### Resulting verified file + + + +```txt +{ + httpCall: [ + { + Request: https://fake/getOne, + Response: 200 Ok + }, + { + Request: https://fake/getTwo, + Response: 200 Ok + } + ] +} +``` +snippet source | anchor + + + ## Icon [Spider](https://thenounproject.com/term/spider/904683/) designed by [marialuisa iborra](https://thenounproject.com/marialuisa.iborra/) from [The Noun Project](https://thenounproject.com). diff --git a/src/Directory.Build.props b/src/Directory.Build.props index f7ec6ec7..e6ae0737 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,7 +2,7 @@ CS1591;CS0649;CS8632;NU1608;NU1109 - 7.0.0 + 7.1.0 preview 1.0.0 Http, Verify diff --git a/src/Tests/MockHttpClientTests.RecordingMockInteractions.verified.txt b/src/Tests/MockHttpClientTests.RecordingMockInteractions.verified.txt new file mode 100644 index 00000000..f692bfef --- /dev/null +++ b/src/Tests/MockHttpClientTests.RecordingMockInteractions.verified.txt @@ -0,0 +1,12 @@ +{ + httpCall: [ + { + Request: https://fake/getOne, + Response: 200 Ok + }, + { + Request: https://fake/getTwo, + Response: 200 Ok + } + ] +} \ No newline at end of file diff --git a/src/Tests/MockHttpClientTests.RecordedCalls.verified.txt b/src/Tests/MockHttpClientTests.TrackedCalls.verified.txt similarity index 100% rename from src/Tests/MockHttpClientTests.RecordedCalls.verified.txt rename to src/Tests/MockHttpClientTests.TrackedCalls.verified.txt diff --git a/src/Tests/MockHttpClientTests.cs b/src/Tests/MockHttpClientTests.cs index e2305541..761e4c4d 100644 --- a/src/Tests/MockHttpClientTests.cs +++ b/src/Tests/MockHttpClientTests.cs @@ -48,10 +48,10 @@ public async Task DefaultContent() #endregion - #region RecordedCalls + #region TrackedCalls [Fact] - public async Task RecordedCalls() + public async Task TrackedCalls() { using var client = new MockHttpClient(); @@ -127,16 +127,15 @@ await Verify(new [Fact] public async Task ResponseBuilder() { - using var client = new MockHttpClient( - request => + using var client = new MockHttpClient(request => + { + var content = $"Hello to {request.RequestUri}"; + var response = new HttpResponseMessage(HttpStatusCode.OK) { - var content = $"Hello to {request.RequestUri}"; - var response = new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent(content), - }; - return response; - }); + Content = new StringContent(content), + }; + return response; + }); var result1 = await client.GetAsync("https://fake/get1"); var result2 = await client.GetAsync("https://fake/get2"); @@ -288,4 +287,20 @@ await Verify( }) .UniqueForRuntimeAndVersion(); } + + #region RecordingMockInteractions + + [Fact] + public async Task RecordingMockInteractions() + { + using var client = new MockHttpClient(recording: true); + + Recording.Start(); + await client.GetStringAsync("https://fake/getOne"); + await client.GetStringAsync("https://fake/getTwo"); + + await Verify(); + } + + #endregion } \ No newline at end of file diff --git a/src/Tests/Tests.HttpClientRecording.verified.txt b/src/Tests/Tests.HttpClientRecording.verified.txt index 8c6850a5..a822136c 100644 --- a/src/Tests/Tests.HttpClientRecording.verified.txt +++ b/src/Tests/Tests.HttpClientRecording.verified.txt @@ -8,7 +8,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization|Accept-Encoding, diff --git a/src/Tests/Tests.HttpClientRecordingGlobal.verified.txt b/src/Tests/Tests.HttpClientRecordingGlobal.verified.txt index 8c6850a5..a822136c 100644 --- a/src/Tests/Tests.HttpClientRecordingGlobal.verified.txt +++ b/src/Tests/Tests.HttpClientRecordingGlobal.verified.txt @@ -8,7 +8,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization|Accept-Encoding, diff --git a/src/Tests/Tests.HttpResponse.verified.txt b/src/Tests/Tests.HttpResponse.verified.txt index c402de60..5ac06fa4 100644 --- a/src/Tests/Tests.HttpResponse.verified.txt +++ b/src/Tests/Tests.HttpResponse.verified.txt @@ -5,7 +5,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, diff --git a/src/Tests/Tests.HttpResponseNested.verified.txt b/src/Tests/Tests.HttpResponseNested.verified.txt index 60a29814..0af2541d 100644 --- a/src/Tests/Tests.HttpResponseNested.verified.txt +++ b/src/Tests/Tests.HttpResponseNested.verified.txt @@ -6,7 +6,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, diff --git a/src/Tests/Tests.IgnoreAuth.verified.txt b/src/Tests/Tests.IgnoreAuth.verified.txt index 9077d7ac..b6f9763b 100644 --- a/src/Tests/Tests.IgnoreAuth.verified.txt +++ b/src/Tests/Tests.IgnoreAuth.verified.txt @@ -14,7 +14,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, diff --git a/src/Tests/Tests.IgnoreHeader.verified.txt b/src/Tests/Tests.IgnoreHeader.verified.txt index c402de60..5ac06fa4 100644 --- a/src/Tests/Tests.IgnoreHeader.verified.txt +++ b/src/Tests/Tests.IgnoreHeader.verified.txt @@ -5,7 +5,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, diff --git a/src/Tests/Tests.ImageHttpResponse.verified.txt b/src/Tests/Tests.ImageHttpResponse.verified.txt index f5d74822..30eb22fd 100644 --- a/src/Tests/Tests.ImageHttpResponse.verified.txt +++ b/src/Tests/Tests.ImageHttpResponse.verified.txt @@ -6,7 +6,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, diff --git a/src/Tests/Tests.JsonGet.verified.txt b/src/Tests/Tests.JsonGet.verified.txt index 47617955..d2927493 100644 --- a/src/Tests/Tests.JsonGet.verified.txt +++ b/src/Tests/Tests.JsonGet.verified.txt @@ -17,7 +17,6 @@ Headers: { Access-Control-Allow-Origin: , Cache-Control: no-cache, - Content-Security-Policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com wss://alive-staging.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com marketplace-screenshots.githubusercontent.com/ copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com github.githubassets.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/, Location: https://raw.githubusercontent.com/VerifyTests/Verify.Http/main/src/global.json, Referrer-Policy: no-referrer-when-downgrade, Strict-Transport-Security: max-age=31536000; includeSubdomains; preload, @@ -45,7 +44,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, diff --git a/src/Tests/Tests.PauseResume.verified.txt b/src/Tests/Tests.PauseResume.verified.txt index 8c6850a5..a822136c 100644 --- a/src/Tests/Tests.PauseResume.verified.txt +++ b/src/Tests/Tests.PauseResume.verified.txt @@ -8,7 +8,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization|Accept-Encoding, diff --git a/src/Tests/Tests.RecordingFullControl.verified.txt b/src/Tests/Tests.RecordingFullControl.verified.txt index 8c6850a5..a822136c 100644 --- a/src/Tests/Tests.RecordingFullControl.verified.txt +++ b/src/Tests/Tests.RecordingFullControl.verified.txt @@ -8,7 +8,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization|Accept-Encoding, diff --git a/src/Tests/Tests.ScrubHttpTextResponse.verified.txt b/src/Tests/Tests.ScrubHttpTextResponse.verified.txt index 581f37e4..743eb488 100644 --- a/src/Tests/Tests.ScrubHttpTextResponse.verified.txt +++ b/src/Tests/Tests.ScrubHttpTextResponse.verified.txt @@ -5,7 +5,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, diff --git a/src/Tests/Tests.TestHttpRecording.verified.txt b/src/Tests/Tests.TestHttpRecording.verified.txt index a0400c6b..873e51f7 100644 --- a/src/Tests/Tests.TestHttpRecording.verified.txt +++ b/src/Tests/Tests.TestHttpRecording.verified.txt @@ -14,7 +14,6 @@ Headers: { Access-Control-Allow-Origin: , Cache-Control: no-cache, - Content-Security-Policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com wss://alive-staging.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com marketplace-screenshots.githubusercontent.com/ copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com github.githubassets.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/, Location: https://raw.githubusercontent.com/VerifyTests/Verify.Http/main/src/global.json, Referrer-Policy: no-referrer-when-downgrade, Strict-Transport-Security: max-age=31536000; includeSubdomains; preload, @@ -42,7 +41,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, @@ -74,7 +72,6 @@ Headers: { Access-Control-Allow-Origin: , Cache-Control: no-cache, - Content-Security-Policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com wss://alive-staging.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com marketplace-screenshots.githubusercontent.com/ copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com github.githubassets.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/, Location: https://raw.githubusercontent.com/VerifyTests/Verify.Http/main/src/appveyor.yml, Referrer-Policy: no-referrer-when-downgrade, Strict-Transport-Security: max-age=31536000; includeSubdomains; preload, @@ -102,7 +99,6 @@ Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, diff --git a/src/Tests/Tests.TestHttpRecordingWithResponse.verified.txt b/src/Tests/Tests.TestHttpRecordingWithResponse.verified.txt index 4b559505..7d0c8876 100644 --- a/src/Tests/Tests.TestHttpRecordingWithResponse.verified.txt +++ b/src/Tests/Tests.TestHttpRecordingWithResponse.verified.txt @@ -35,7 +35,6 @@ SOFTWARE. Access-Control-Allow-Origin: *, Cache-Control: max-age=300, Connection: keep-alive, - Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox, Cross-Origin-Resource-Policy: cross-origin, Strict-Transport-Security: max-age=31536000, Vary: Authorization,Accept-Encoding, diff --git a/src/Verify.Http/HttpRecording/HttpListener.cs b/src/Verify.Http/HttpRecording/HttpListener.cs index 6f0640c5..b9ceba6b 100644 --- a/src/Verify.Http/HttpRecording/HttpListener.cs +++ b/src/Verify.Http/HttpRecording/HttpListener.cs @@ -1,4 +1,5 @@ -#pragma warning disable CA1822 +// ReSharper disable UnusedParameter.Global +#pragma warning disable CA1822 class HttpListener : IObserver, IDisposable diff --git a/src/Verify.Http/HttpRecording/MockHttpClient.cs b/src/Verify.Http/MockHttpClient/MockHttpClient.cs similarity index 53% rename from src/Verify.Http/HttpRecording/MockHttpClient.cs rename to src/Verify.Http/MockHttpClient/MockHttpClient.cs index 8b084958..9fe820e7 100644 --- a/src/Verify.Http/HttpRecording/MockHttpClient.cs +++ b/src/Verify.Http/MockHttpClient/MockHttpClient.cs @@ -5,13 +5,13 @@ public class MockHttpClient : { MockHttpHandler handler; - public MockHttpClient(Func responseBuilder) : - this(new MockHttpHandler(responseBuilder)) + public MockHttpClient(Func responseBuilder, bool recording = false) : + this(new MockHttpHandler(responseBuilder, recording)) { } - public MockHttpClient(IEnumerable responses) : - this(new MockHttpHandler(responses)) + public MockHttpClient(IEnumerable responses, bool recording = false) : + this(new MockHttpHandler(responses, recording)) { } @@ -20,18 +20,18 @@ public MockHttpClient(params HttpResponseMessage[] responses) : { } - public MockHttpClient(HttpResponseMessage response) : - this(new MockHttpHandler(response)) + public MockHttpClient(HttpResponseMessage response, bool recording = false) : + this(new MockHttpHandler(response, recording)) { } - public MockHttpClient(HttpStatusCode status = HttpStatusCode.OK) : - this(new MockHttpHandler(status)) + public MockHttpClient(HttpStatusCode status = HttpStatusCode.OK, bool recording = false) : + this(new MockHttpHandler(status, recording)) { } - public MockHttpClient(string content, string mediaType) : - this(new MockHttpHandler(content, mediaType)) + public MockHttpClient(string content, string mediaType, bool recording = false) : + this(new MockHttpHandler(content, mediaType, recording)) { } diff --git a/src/Verify.Http/HttpRecording/MockHttpClientConverter.cs b/src/Verify.Http/MockHttpClient/MockHttpClientConverter.cs similarity index 100% rename from src/Verify.Http/HttpRecording/MockHttpClientConverter.cs rename to src/Verify.Http/MockHttpClient/MockHttpClientConverter.cs diff --git a/src/Verify.Http/HttpRecording/MockHttpHandler.cs b/src/Verify.Http/MockHttpClient/MockHttpHandler.cs similarity index 72% rename from src/Verify.Http/HttpRecording/MockHttpHandler.cs rename to src/Verify.Http/MockHttpClient/MockHttpHandler.cs index 6d4555ad..476e7297 100644 --- a/src/Verify.Http/HttpRecording/MockHttpHandler.cs +++ b/src/Verify.Http/MockHttpClient/MockHttpHandler.cs @@ -3,11 +3,15 @@ public class MockHttpHandler : DelegatingHandler { + bool recording; ConcurrentQueue calls = []; Func builder; - public MockHttpHandler(Func responseBuilder) => + public MockHttpHandler(Func responseBuilder, bool recording = false) + { builder = responseBuilder; + this.recording = recording; + } ConcurrentBag disposables = []; @@ -21,8 +25,9 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } - public MockHttpHandler(IEnumerable responses) + public MockHttpHandler(IEnumerable responses, bool recording = false) { + this.recording = recording; var enumerator = responses.GetEnumerator(); disposables.Add(enumerator); builder = _ => @@ -37,24 +42,39 @@ public MockHttpHandler(IEnumerable responses) }; } - public MockHttpHandler(HttpStatusCode status = HttpStatusCode.OK) => + public MockHttpHandler(HttpStatusCode status = HttpStatusCode.OK, bool recording = false) + { + this.recording = recording; builder = _ => new(status); + } - public MockHttpHandler(HttpResponseMessage response) => + public MockHttpHandler(HttpResponseMessage response, bool recording = false) + { + this.recording = recording; builder = _ => response; + } - public MockHttpHandler(string content, string mediaType) => + public MockHttpHandler(string content, string mediaType, bool recording = false) + { + this.recording = recording; builder = _ => new(HttpStatusCode.OK) { Content = new StringContent(content, Encoding.UTF8, mediaType) }; + } public IReadOnlyCollection Calls => calls; protected override Task SendAsync(HttpRequestMessage request, Cancel cancel) { var response = Add(request); + if (recording && Recording.IsRecording()) + { + Recording.Add( + "httpCall", + new HttpCall(request, response, TimeSpan.Zero)); + } return Task.FromResult(response); } diff --git a/src/Verify.Http/HttpRecording/MockHttpHandlerConverter.cs b/src/Verify.Http/MockHttpClient/MockHttpHandlerConverter.cs similarity index 100% rename from src/Verify.Http/HttpRecording/MockHttpHandlerConverter.cs rename to src/Verify.Http/MockHttpClient/MockHttpHandlerConverter.cs