using System;
using System.Linq;
using System.Threading.Tasks;
using Newtonsoft.Json;
using PuppeteerSharp.PageCoverage;
using Xunit;
using Xunit.Abstractions;
namespace PuppeteerSharp.Tests.CSSCoverageTests
{
[Collection("PuppeteerLoaderFixture collection")]
public class CSSResetOnNavigationTests : PuppeteerPageBaseTest
{
public CSSResetOnNavigationTests(ITestOutputHelper output) : base(output)
{
}
[Fact]
public async Task ShouldReportStylesheetsAcrossNavigationsWhenDisabled()
{
await Page.Coverage.StartCSSCoverageAsync(new CoverageStartOptions
{
ResetOnNavigation = false
});
await Page.GoToAsync(TestConstants.ServerUrl + "/csscoverage/multiple.html");
await Page.GoToAsync(TestConstants.EmptyPage);
var coverage = await Page.Coverage.StopCSSCoverageAsync();
Assert.Equal(2, coverage.Length);
}
[Fact]
public async Task ShouldNotReportScriptsAcrossNavigationsWhenEnabled()
{
await Page.Coverage.StartCSSCoverageAsync();
await Page.GoToAsync(TestConstants.ServerUrl + "/csscoverage/multiple.html");
await Page.GoToAsync(TestConstants.EmptyPage);
var coverage = await Page.Coverage.StopCSSCoverageAsync();
Assert.Empty(coverage);
}
}
}
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Newtonsoft.Json;
using PuppeteerSharp.PageCoverage;
using Xunit;
using Xunit.Abstractions;
namespace PuppeteerSharp.Tests.CSSCoverageTests
{
[Collection("PuppeteerLoaderFixture collection")]
public class CSSCoverageTests : PuppeteerPageBaseTest
{
public CSSCoverageTests(ITestOutputHelper output) : base(output)
{
}
[Fact]
public async Task ShouldWork()
{
await Page.Coverage.StartCSSCoverageAsync();
await Page.GoToAsync(TestConstants.ServerUrl + "/csscoverage/simple.html");
var coverage = await Page.Coverage.StopCSSCoverageAsync();
Assert.Single(coverage);
Assert.Contains("/csscoverage/simple.html", coverage[0].Url);
Assert.Equal(new CoverageEntryRange[]
{
new CoverageEntryRange
{
Start = 1,
End = 22
}
}, coverage[0].Ranges);
var range = coverage[0].Ranges[0];
Assert.Equal("div { color: green; }", coverage[0].Text.Substring(range.Start, range.End - range.Start));
}
[Fact]
public async Task ShouldReportSourceUrls()
{
await Page.Coverage.StartCSSCoverageAsync();
await Page.GoToAsync(TestConstants.ServerUrl + "/csscoverage/sourceurl.html");
var coverage = await Page.Coverage.StopCSSCoverageAsync();
Assert.Single(coverage);
Assert.Equal("nicename.css", coverage[0].Url);
}
[Fact]
public async Task ShouldReportMultipleStylesheets()
{
await Page.Coverage.StartCSSCoverageAsync();
await Page.GoToAsync(TestConstants.ServerUrl + "/csscoverage/multiple.html");
var coverage = await Page.Coverage.StopCSSCoverageAsync();
Assert.Equal(2, coverage.Length);
var orderedList = coverage.OrderBy(c => c.Url);
Assert.Contains("/csscoverage/stylesheet1.css", orderedList.ElementAt(0).Url);
Assert.Contains("/csscoverage/stylesheet2.css", orderedList.ElementAt(1).Url);
}
[Fact]
public async Task ShouldReportStylesheetsThatHaveNoCoverage()
{
await Page.Coverage.StartCSSCoverageAsync();
await Page.GoToAsync(TestConstants.ServerUrl + "/csscoverage/unused.html");
var coverage = await Page.Coverage.StopCSSCoverageAsync();
Assert.Single(coverage);
var entry = coverage[0];
Assert.Contains("unused.css", entry.Url);
Assert.Empty(entry.Ranges);
}
[Fact]
public async Task ShouldWorkWithMediaQueries()
{
await Page.Coverage.StartCSSCoverageAsync();
await Page.GoToAsync(TestConstants.ServerUrl + "/csscoverage/media.html");
var coverage = await Page.Coverage.StopCSSCoverageAsync();
Assert.Single(coverage);
var entry = coverage[0];
Assert.Contains("/csscoverage/media.html", entry.Url);
Assert.Equal(new CoverageEntryRange[]
{
new CoverageEntryRange
{
Start = 17,
End = 38
}
}, coverage[0].Ranges);
}
[Fact]
public async Task ShouldWorkWithComplicatedUsecases()
{
const string involved = @"[
{
""Url"": ""http://localhost:<PORT>/csscoverage/involved.html"",
""Ranges"": [
{
""Start"": 149,
""End"": 297
},
{
""Start"": 327,
""End"": 433
}
],
""Text"": ""\n @charset \""utf - 8\"";\[email protected] svg url(http://www.w3.org/2000/svg);\[email protected] {\n font-family: \""Example Font\"";\n src: url(\""./Dosis-Regular.ttf\"");\n}\n\n#fluffy {\n border: 1px solid black;\n z-index: 1;\n /* -webkit-disabled-property: rgb(1, 2, 3) */\n -lol-cats: \""dogs\"" /* non-existing property */\n}\n\[email protected] (min-width: 1px) {\n span {\n -webkit-border-radius: 10px;\n font-family: \""Example Font\"";\n animation: 1s identifier;\n }\n}\n""
}
]";
await Page.Coverage.StartCSSCoverageAsync();
await Page.GoToAsync(TestConstants.ServerUrl + "/csscoverage/involved.html");
var coverage = await Page.Coverage.StopCSSCoverageAsync();
Assert.Equal(
TestUtils.CompressText(involved),
Regex.Replace(TestUtils.CompressText(JsonConvert.SerializeObject(coverage)), @":\d{4}\/", ":<PORT>/"));
}
[Fact]
public async Task ShouldIgnoreInjectedStylesheets()
{
await Page.Coverage.StartCSSCoverageAsync();
await Page.AddStyleTagAsync(new AddTagOptions
{
Content = "body { margin: 10px;}"
});
// trigger style recalc
var margin = await Page.EvaluateExpressionAsync<string>("window.getComputedStyle(document.body).margin");
Assert.Equal("10px", margin);
var coverage = await Page.Coverage.StopCSSCoverageAsync();
Assert.Empty(coverage);
}
}
}