/lib/PuppeteerSharp.Tests/JSCoverageTests/JSCoverageTests.cs

https://github.com/kblok/puppeteer-sharp · C# · 175 lines · 164 code · 11 blank · 0 comment · 0 complexity · 7a3a4b63bdc8d4295eb2a1b38b8768bf MD5 · raw file

  1. using System;
  2. using System.Linq;
  3. using System.Text.RegularExpressions;
  4. using System.Threading.Tasks;
  5. using Newtonsoft.Json;
  6. using PuppeteerSharp.PageCoverage;
  7. using Xunit;
  8. using Xunit.Abstractions;
  9. namespace PuppeteerSharp.Tests.JSCoverageTests
  10. {
  11. [Collection(TestConstants.TestFixtureCollectionName)]
  12. public class JSCoverageTests : PuppeteerPageBaseTest
  13. {
  14. public JSCoverageTests(ITestOutputHelper output) : base(output)
  15. {
  16. }
  17. [Fact]
  18. public async Task ShouldWork()
  19. {
  20. await Page.Coverage.StartJSCoverageAsync();
  21. await Page.GoToAsync(TestConstants.ServerUrl + "/jscoverage/simple.html", WaitUntilNavigation.Networkidle0);
  22. var coverage = await Page.Coverage.StopJSCoverageAsync();
  23. Assert.Single(coverage);
  24. Assert.Contains("/jscoverage/simple.html", coverage[0].Url);
  25. Assert.Equal(new CoverageEntryRange[]
  26. {
  27. new CoverageEntryRange
  28. {
  29. Start = 0,
  30. End = 17
  31. },
  32. new CoverageEntryRange
  33. {
  34. Start = 35,
  35. End = 61
  36. },
  37. }, coverage[0].Ranges);
  38. }
  39. [Fact]
  40. public async Task ShouldReportSourceUrls()
  41. {
  42. await Page.Coverage.StartJSCoverageAsync();
  43. await Page.GoToAsync(TestConstants.ServerUrl + "/jscoverage/sourceurl.html");
  44. var coverage = await Page.Coverage.StopJSCoverageAsync();
  45. Assert.Single(coverage);
  46. Assert.Equal("nicename.js", coverage[0].Url);
  47. }
  48. [Fact]
  49. public async Task ShouldIgnoreEvalScriptsByDefault()
  50. {
  51. await Page.Coverage.StartJSCoverageAsync();
  52. await Page.GoToAsync(TestConstants.ServerUrl + "/jscoverage/eval.html");
  53. var coverage = await Page.Coverage.StopJSCoverageAsync();
  54. Assert.Single(coverage);
  55. }
  56. [Fact]
  57. public async Task ShouldntIgnoreEvalScriptsIfReportAnonymousScriptsIsTrue()
  58. {
  59. await Page.Coverage.StartJSCoverageAsync(new CoverageStartOptions
  60. {
  61. ReportAnonymousScripts = true
  62. });
  63. await Page.GoToAsync(TestConstants.ServerUrl + "/jscoverage/eval.html");
  64. var coverage = await Page.Coverage.StopJSCoverageAsync();
  65. Assert.NotNull(coverage.FirstOrDefault(entry => entry.Url.StartsWith("debugger://", StringComparison.Ordinal)));
  66. Assert.Equal(2, coverage.Count());
  67. }
  68. [Fact]
  69. public async Task ShouldIgnorePptrInternalScriptsIfReportAnonymousScriptsIsTrue()
  70. {
  71. await Page.Coverage.StartJSCoverageAsync(new CoverageStartOptions
  72. {
  73. ReportAnonymousScripts = true
  74. });
  75. await Page.GoToAsync(TestConstants.EmptyPage);
  76. await Page.EvaluateExpressionAsync("console.log('foo')");
  77. await Page.EvaluateFunctionAsync("() => console.log('bar')");
  78. var coverage = await Page.Coverage.StopJSCoverageAsync();
  79. Assert.Empty(coverage);
  80. }
  81. [Fact]
  82. public async Task ShouldReportMultipleScripts()
  83. {
  84. await Page.Coverage.StartJSCoverageAsync();
  85. await Page.GoToAsync(TestConstants.ServerUrl + "/jscoverage/multiple.html");
  86. var coverage = await Page.Coverage.StopJSCoverageAsync();
  87. Assert.Equal(2, coverage.Length);
  88. var orderedList = coverage.OrderBy(c => c.Url);
  89. Assert.Contains("/jscoverage/script1.js", orderedList.ElementAt(0).Url);
  90. Assert.Contains("/jscoverage/script2.js", orderedList.ElementAt(1).Url);
  91. }
  92. [Fact]
  93. public async Task ShouldReportRightRanges()
  94. {
  95. await Page.Coverage.StartJSCoverageAsync();
  96. await Page.GoToAsync(TestConstants.ServerUrl + "/jscoverage/ranges.html");
  97. var coverage = await Page.Coverage.StopJSCoverageAsync();
  98. Assert.Single(coverage);
  99. var entry = coverage[0];
  100. Assert.Single(entry.Ranges);
  101. var range = entry.Ranges[0];
  102. Assert.Equal("console.log('used!');", entry.Text.Substring(range.Start, range.End - range.Start));
  103. }
  104. [Fact]
  105. public async Task ShouldReportScriptsThatHaveNoCoverage()
  106. {
  107. await Page.Coverage.StartJSCoverageAsync();
  108. await Page.GoToAsync(TestConstants.ServerUrl + "/jscoverage/unused.html");
  109. var coverage = await Page.Coverage.StopJSCoverageAsync();
  110. Assert.Single(coverage);
  111. var entry = coverage[0];
  112. Assert.Contains("unused.html", entry.Url);
  113. Assert.Empty(entry.Ranges);
  114. }
  115. [Fact]
  116. public async Task ShouldWorkWithConditionals()
  117. {
  118. const string involved = @"[
  119. {
  120. ""Url"": ""http://localhost:<PORT>/jscoverage/involved.html"",
  121. ""Ranges"": [
  122. {
  123. ""Start"": 0,
  124. ""End"": 35
  125. },
  126. {
  127. ""Start"": 50,
  128. ""End"": 100
  129. },
  130. {
  131. ""Start"": 107,
  132. ""End"": 141
  133. },
  134. {
  135. ""Start"": 148,
  136. ""End"": 160
  137. },
  138. {
  139. ""Start"": 168,
  140. ""End"": 207
  141. }
  142. ],
  143. ""Text"": ""\nfunction foo() {\n if (1 > 2)\n console.log(1);\n if (1 < 2)\n console.log(2);\n let x = 1 > 2 ? 'foo' : 'bar';\n let y = 1 < 2 ? 'foo' : 'bar';\n let z = () => {};\n let q = () => {};\n q();\n}\n\nfoo();\n""
  144. }
  145. ]";
  146. await Page.Coverage.StartJSCoverageAsync();
  147. await Page.GoToAsync(TestConstants.ServerUrl + "/jscoverage/involved.html");
  148. var coverage = await Page.Coverage.StopJSCoverageAsync();
  149. Assert.Equal(
  150. TestUtils.CompressText(involved),
  151. Regex.Replace(TestUtils.CompressText(JsonConvert.SerializeObject(coverage)), @"\d{4}\/", "<PORT>/"));
  152. }
  153. [Fact(Skip = "Skipped in puppeteer")]
  154. public async Task ShouldNotHangWhenThereIsADebuggerStatement()
  155. {
  156. await Page.Coverage.StartJSCoverageAsync();
  157. await Page.GoToAsync(TestConstants.EmptyPage);
  158. await Page.EvaluateFunctionAsync(@"() => {
  159. debugger;
  160. }");
  161. await Page.Coverage.StopJSCoverageAsync();
  162. }
  163. }
  164. }