A saved sign-in whose session expired landed on the login page and every route its persona opened timed out; both the desktop and the phone sign-in now see that and sign in afresh. A route that fails to open leaves its screenshot and text, as a failed sign-in does. A target's probes stay inside what its scroller shows (a card half under the feed's top edge was failed for the part out of sight), a failed probe names what it hit, and the element blamed for sideways scroll is never one inside a nested clipping box, which can't widen the page. The desktop guard reads its probe sizes as a list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
41 lines
1.5 KiB
C#
41 lines
1.5 KiB
C#
using decePubClient.E2E.Support;
|
|
|
|
using Microsoft.Playwright;
|
|
|
|
namespace decePubClient.E2E.Mobile
|
|
{
|
|
// What phones get stays on phones: at 1440x900 with a mouse the controls keep daisyUI's sizes, measured on probes made
|
|
// with the app's own classes, and the nav menu stays open beside the feed.
|
|
[Trait("Category", "Mobile")]
|
|
public sealed class DesktopUnchangedTests(Browser browser)
|
|
{
|
|
const string Probe = """
|
|
() => ["btn", "btn btn-sm", "btn btn-xs", "input", "input input-sm"].map(classes => {
|
|
const el = document.createElement(classes.startsWith("input") ? "input" : "button")
|
|
el.className = classes
|
|
document.body.append(el)
|
|
const height = el.getBoundingClientRect().height
|
|
el.remove()
|
|
return height
|
|
})
|
|
""";
|
|
|
|
[Fact]
|
|
public async Task Desktop_keeps_its_sizes()
|
|
{
|
|
var persona = Pasture.Personas().GroupBy(p => p.Root).OrderByDescending(g => g.Count()).First().First();
|
|
await using var session = await SignIn.As(browser, persona);
|
|
var page = session.Page;
|
|
await Results.Cell("client.mobile.desktop", "privapub", "desktop", async () =>
|
|
{
|
|
Assert.False(await page.EvaluateAsync<bool>("() => matchMedia('(pointer: coarse)').matches"), "the desktop session has a coarse pointer");
|
|
// btn, btn btn-sm, btn btn-xs, input, input input-sm
|
|
var heights = await page.EvaluateAsync<double[]>(Probe);
|
|
Assert.Equal([40, 32, 24, 40, 32], heights.Select(h => Math.Round(h)).ToArray());
|
|
await Assertions.Expect(page.Locator("nav a.btn").First).ToBeVisibleAsync();
|
|
await session.AssertGuards();
|
|
}, page);
|
|
}
|
|
}
|
|
}
|