From 1069712350dcd60041ce4a47e9d137cb1175aa99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C5=BEe=20Vodovnik?= Date: Fri, 12 Mar 2021 18:37:47 +0100 Subject: [PATCH] release: roll drivers to 1.9.2 (#1279) * fix(postData): add more network tests and port postData fix * fix(tests): fixing broken tests after roll * release: rolling driver version to v1.9.2 * chore(build): support release branches --- .github/workflows/tests.yml | 4 +- src/Common/PackageInfo.props | 6 +- .../BeforeUnloadTests.cs | 4 +- .../BrowserContextExposeFunctionTests.cs | 3 +- ...sts.cs => BrowserContextPageEventTests.cs} | 4 +- src/PlaywrightSharp.Tests/HarTests.cs | 2 +- .../NetworkPostDataTests.cs | 120 ++++++++++++++++++ .../SelectorsTextTests.cs | 6 +- src/PlaywrightSharp/Request.cs | 7 +- .../DriverDownloader.cs | 2 +- 10 files changed, 139 insertions(+), 19 deletions(-) rename src/PlaywrightSharp.Tests/{BrowserContectPageEventTests.cs => BrowserContextPageEventTests.cs} (98%) create mode 100644 src/PlaywrightSharp.Tests/NetworkPostDataTests.cs diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9f71c75142..a1325322f4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -4,9 +4,11 @@ on: push: branches: - main + - release-* pull_request: branches: - main + - release-* jobs: test_net5: @@ -121,4 +123,4 @@ jobs: env: PRODUCT: CHROMIUM run: | - xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- bash -c "ulimit -c unlimited && dotnet test ./src/PlaywrightSharp.Tests/PlaywrightSharp.Tests.csproj -c Debug -f netcoreapp3.1 --logger \"trx\"" \ No newline at end of file + xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- bash -c "ulimit -c unlimited && dotnet test ./src/PlaywrightSharp.Tests/PlaywrightSharp.Tests.csproj -c Debug -f netcoreapp3.1 --logger \"trx\"" diff --git a/src/Common/PackageInfo.props b/src/Common/PackageInfo.props index fb9592e053..1cf55fd268 100644 --- a/src/Common/PackageInfo.props +++ b/src/Common/PackageInfo.props @@ -1,9 +1,9 @@ - 0.191.2 + 0.192.0 $(AssemblyVersion) - 1.9.1-1614225150000 + 1.9.2 $(AssemblyVersion) $(AssemblyVersion) true @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/src/PlaywrightSharp.Tests/BeforeUnloadTests.cs b/src/PlaywrightSharp.Tests/BeforeUnloadTests.cs index 1e288b526a..8c72884a8f 100644 --- a/src/PlaywrightSharp.Tests/BeforeUnloadTests.cs +++ b/src/PlaywrightSharp.Tests/BeforeUnloadTests.cs @@ -24,8 +24,10 @@ public async Task ShouldRunBeforeunloadIfAskedFor() // We have to interact with a page so that 'beforeunload' handlers // fire. await newPage.ClickAsync("body"); + + var dialogTask = newPage.WaitForEventAsync(PageEvent.Dialog); var pageClosingTask = newPage.CloseAsync(true); - var dialog = await newPage.WaitForEventAsync(PageEvent.Dialog).ContinueWith(task => task.Result.Dialog); + var dialog = await dialogTask.ContinueWith(task => task.Result.Dialog); Assert.Equal(DialogType.BeforeUnload, dialog.Type); Assert.Empty(dialog.DefaultValue); if (TestConstants.IsChromium) diff --git a/src/PlaywrightSharp.Tests/BrowserContextExposeFunctionTests.cs b/src/PlaywrightSharp.Tests/BrowserContextExposeFunctionTests.cs index 2761e7cfa0..51c6c42aef 100644 --- a/src/PlaywrightSharp.Tests/BrowserContextExposeFunctionTests.cs +++ b/src/PlaywrightSharp.Tests/BrowserContextExposeFunctionTests.cs @@ -91,7 +91,8 @@ public async Task ShouldBeCallableFromInsideAddInitScript() args.Clear(); await page.ReloadAsync(); - Assert.Equal(new List { "context", "page" }, args); + Assert.Contains("context", args); + Assert.Contains("page", args); } [PlaywrightTest("browsercontext-expose-function.spec.ts", "exposeBindingHandle should work")] diff --git a/src/PlaywrightSharp.Tests/BrowserContectPageEventTests.cs b/src/PlaywrightSharp.Tests/BrowserContextPageEventTests.cs similarity index 98% rename from src/PlaywrightSharp.Tests/BrowserContectPageEventTests.cs rename to src/PlaywrightSharp.Tests/BrowserContextPageEventTests.cs index 24e2efdef3..6e23d06eb2 100644 --- a/src/PlaywrightSharp.Tests/BrowserContectPageEventTests.cs +++ b/src/PlaywrightSharp.Tests/BrowserContextPageEventTests.cs @@ -11,10 +11,10 @@ namespace PlaywrightSharp.Tests { [Collection(TestConstants.TestFixtureBrowserCollectionName)] - public class BrowserContectPageEventTests : PlaywrightSharpBrowserBaseTest + public class BrowserContextPageEventTests : PlaywrightSharpBrowserBaseTest { /// - public BrowserContectPageEventTests(ITestOutputHelper output) : base(output) + public BrowserContextPageEventTests(ITestOutputHelper output) : base(output) { } diff --git a/src/PlaywrightSharp.Tests/HarTests.cs b/src/PlaywrightSharp.Tests/HarTests.cs index 245636c167..a0c44e53a1 100644 --- a/src/PlaywrightSharp.Tests/HarTests.cs +++ b/src/PlaywrightSharp.Tests/HarTests.cs @@ -93,7 +93,7 @@ public async Task ShouldHavePages() var pageEntry = log.Pages.First(); Assert.Equal("page_0", pageEntry.Id); Assert.Equal("Hello", pageEntry.Title); - Assert.True(pageEntry.StartedDateTime > DateTime.Now.AddMinutes(-1)); + Assert.True(pageEntry.StartedDateTime > DateTime.UtcNow.AddMinutes(-1)); Assert.True(pageEntry.PageTimings.OnContentLoad > 0); Assert.True(pageEntry.PageTimings.OnLoad > 0); } diff --git a/src/PlaywrightSharp.Tests/NetworkPostDataTests.cs b/src/PlaywrightSharp.Tests/NetworkPostDataTests.cs new file mode 100644 index 0000000000..f419a9e20d --- /dev/null +++ b/src/PlaywrightSharp.Tests/NetworkPostDataTests.cs @@ -0,0 +1,120 @@ +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Threading.Tasks; +using PlaywrightSharp.Tests.BaseTests; +using Xunit; +using Xunit.Abstractions; + + +namespace PlaywrightSharp.Tests +{ + /// network-post-data.spec.ts + [Collection(TestConstants.TestFixtureBrowserCollectionName)] + public sealed class NetworkPostDataTests : PlaywrightSharpPageBaseTest + { + + /// + public NetworkPostDataTests(ITestOutputHelper output) : + base(output) + { + } + + /// network-post-data.spec.ts + /// should return correct postData buffer for utf-8 body + [Fact(Timeout = PlaywrightSharp.Playwright.DefaultTimeout)] + public async Task ShouldReturnCorrectPostdataBufferForUtf8Body() + { + await Page.GoToAsync(TestConstants.EmptyPage); + string value = "baẞ"; + + var task = Page.WaitForEventAsync(PageEvent.Request, (r) => true); + var actualTask = Page.EvaluateAsync(@$"() => {{ + const request = new Request('{TestConstants.ServerUrl + "/title.html"}', {{ + method: 'POST', + body: JSON.stringify('{value}'), + }}); + request.headers.set('content-type', 'application/json;charset=UTF-8'); + return fetch(request); + }}"); + + Task.WaitAll(task, actualTask); + + string expectedJsonValue = JsonSerializer.Serialize(value, new JsonSerializerOptions + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + WriteIndented = true + }); + + var request = task.Result.Request; + Assert.Equal(expectedJsonValue, request.PostData); + Assert.Equal(value, request.GetPostDataJson().RootElement.GetString()); + } + + /// network-post-data.spec.ts + /// should return post data w/o content-type + [Fact(Timeout = PlaywrightSharp.Playwright.DefaultTimeout)] + public async Task ShouldReturnPostDataWOContentType() + { + await Page.GoToAsync(TestConstants.EmptyPage); + + var task = Page.WaitForEventAsync(PageEvent.Request, (r) => true); + var actualTask = Page.EvaluateAsync(@"(url) => { + const request = new Request(url, { + method: 'POST', + body: JSON.stringify({ value: 42 }), + }); + request.headers.set('content-type', ''); + return fetch(request); + }", TestConstants.ServerUrl + "/title.html"); + + Task.WaitAll(task, actualTask); + + var request = task.Result.Request; + Assert.Equal(42, request.GetPostDataJson().RootElement.GetProperty("value").GetInt32()); + } + + /// network-post-data.spec.ts + /// should throw on invalid JSON in post data + [Fact(Timeout = PlaywrightSharp.Playwright.DefaultTimeout)] + public async Task ShouldThrowOnInvalidJSONInPostData() + { + await Page.GoToAsync(TestConstants.EmptyPage); + + var task = Page.WaitForEventAsync(PageEvent.Request, (r) => true); + var actualTask = Page.EvaluateAsync(@"(url) => { + const request = new Request(url, { + method: 'POST', + body: '', + }); + return fetch(request); + }", TestConstants.ServerUrl + "/title.html"); + + Task.WaitAll(task, actualTask); + + var request = task.Result.Request; + Assert.ThrowsAny(() => request.GetPostDataJson()); + } + + /// network-post-data.spec.ts + /// should return post data for PUT requests + [Fact(Timeout = PlaywrightSharp.Playwright.DefaultTimeout)] + public async Task ShouldReturnPostDataForPUTRequests() + { + await Page.GoToAsync(TestConstants.EmptyPage); + + var task = Page.WaitForEventAsync(PageEvent.Request, (r) => true); + var actualTask = Page.EvaluateAsync(@"(url) => { + const request = new Request(url, { + method: 'PUT', + body: JSON.stringify({ value: 42 }), + }); + return fetch(request); + }", TestConstants.ServerUrl + "/title.html"); + + Task.WaitAll(task, actualTask); + + var request = task.Result.Request; + Assert.Equal(42, request.GetPostDataJson().RootElement.GetProperty("value").GetInt32()); + } + } +} diff --git a/src/PlaywrightSharp.Tests/SelectorsTextTests.cs b/src/PlaywrightSharp.Tests/SelectorsTextTests.cs index 664711904f..909a0baf8c 100644 --- a/src/PlaywrightSharp.Tests/SelectorsTextTests.cs +++ b/src/PlaywrightSharp.Tests/SelectorsTextTests.cs @@ -113,13 +113,13 @@ public async Task ShouldBeCaseSensitiveIfQuotesAreSpecified() Assert.Null(await Page.QuerySelectorAsync("text=\"yA\"")); } - [PlaywrightTest("selectors-text.spec.ts", "should search for a substring")] + [PlaywrightTest("selectors-text.spec.ts", "should search for a substring without quotes")] [Fact(Timeout = TestConstants.DefaultTestTimeout)] - public async Task ShouldSearchForASubstring() + public async Task ShouldSearchForASubstringWithoutQuotes() { await Page.SetContentAsync("
textwithsubstring
"); Assert.Equal("
textwithsubstring
", await Page.EvalOnSelectorAsync("text=with", "e => e.outerHTML")); - Assert.Equal("
textwithsubstring
", await Page.EvalOnSelectorAsync("text=\"with\"", "e => e.outerHTML")); + Assert.Null(await Page.QuerySelectorAsync("text=\"with\"")); } [PlaywrightTest("selectors-text.spec.ts", "should skip head, script and style")] diff --git a/src/PlaywrightSharp/Request.cs b/src/PlaywrightSharp/Request.cs index 0c8de7a208..6877e348c3 100644 --- a/src/PlaywrightSharp/Request.cs +++ b/src/PlaywrightSharp/Request.cs @@ -107,12 +107,7 @@ private string GetRequestForJson() return null; } - if (Headers.TryGetValue("content-type", out string contentType) && string.IsNullOrEmpty(contentType)) - { - return null; - } - - if (contentType == "application/x-www-form-urlencoded") + if (Headers.TryGetValue("content-type", out string contentType) && contentType == "application/x-www-form-urlencoded") { var parsed = HttpUtility.ParseQueryString(PostData); var dictionary = new Dictionary(); diff --git a/src/tools/PlaywrightSharp.Tooling/DriverDownloader.cs b/src/tools/PlaywrightSharp.Tooling/DriverDownloader.cs index c65fb364b6..839c9b8c2e 100644 --- a/src/tools/PlaywrightSharp.Tooling/DriverDownloader.cs +++ b/src/tools/PlaywrightSharp.Tooling/DriverDownloader.cs @@ -93,7 +93,7 @@ private static Task GetUpstreamReadmeAsync(string playwrightVersion) private async Task DownloadDriverAsync(DirectoryInfo destinationDirectory, string driverVersion, string platform, string runtime) { Console.WriteLine("Downloading driver for " + platform); - string cdn = "https://playwright.azureedge.net/builds/driver/next"; + string cdn = "https://playwright.azureedge.net/builds/driver"; using var client = new HttpClient(); string url = $"{cdn}/playwright-{driverVersion}-{platform}.zip";