mobile-gauge-visibility.spec.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. const { test, expect } = require("@playwright/test");
  2. const { modernStartButton } = require("./helpers/ui");
  3. test.use({ viewport: { width: 390, height: 560 } });
  4. test.describe("Mobile gauge visibility", () => {
  5. test("keeps the active gauge visible after pressing Start", async ({ page }) => {
  6. await page.route("**/speedtest.js", async (route) => {
  7. await route.fulfill({
  8. contentType: "text/javascript; charset=utf-8",
  9. body: `
  10. class Speedtest {
  11. constructor() {
  12. this.selectedServer = null;
  13. this.onupdate = null;
  14. this.onend = null;
  15. }
  16. start() {
  17. this.onupdate?.({
  18. dlProgress: 0.1,
  19. ulProgress: 0,
  20. dlStatus: "123.45",
  21. ulStatus: "0",
  22. pingStatus: "10.5",
  23. jitterStatus: "0.9",
  24. testState: 1
  25. });
  26. }
  27. abort() {
  28. this.onend?.(true);
  29. }
  30. setParameter() {}
  31. addTestPoints() {}
  32. selectServer(callback) {
  33. callback(this.selectedServer);
  34. }
  35. setSelectedServer(server) {
  36. this.selectedServer = server;
  37. }
  38. getSelectedServer() {
  39. return this.selectedServer;
  40. }
  41. }
  42. window.Speedtest = Speedtest;
  43. `,
  44. });
  45. });
  46. await page.route("**/settings.json", async (route) => {
  47. await route.fulfill({
  48. contentType: "application/json; charset=utf-8",
  49. body: JSON.stringify({ telemetry_level: "off" }),
  50. });
  51. });
  52. await page.route("**/server-list.json", async (route) => {
  53. await route.fulfill({
  54. contentType: "application/json; charset=utf-8",
  55. body: JSON.stringify([
  56. {
  57. name: "Test Server",
  58. server: "http://127.0.0.1:18184/backend/",
  59. },
  60. ]),
  61. });
  62. });
  63. await page.goto("http://127.0.0.1:18184/index-modern.html");
  64. const startButton = modernStartButton(page);
  65. const downloadGauge = page.locator("#download-gauge");
  66. await expect(startButton).toHaveText("Let's start", { timeout: 10_000 });
  67. await page.evaluate(() => window.scrollTo(0, 0));
  68. const gaugeStartsBelowFold = await downloadGauge.evaluate((element) => {
  69. const { top, bottom } = element.getBoundingClientRect();
  70. return bottom > window.innerHeight || top < 0;
  71. });
  72. expect(gaugeStartsBelowFold).toBe(true);
  73. await startButton.click();
  74. await expect(startButton).toHaveText("Abort");
  75. await expect
  76. .poll(() =>
  77. downloadGauge.evaluate((element) => {
  78. const { top, bottom } = element.getBoundingClientRect();
  79. return top >= 0 && bottom <= window.innerHeight;
  80. })
  81. )
  82. .toBe(true);
  83. });
  84. });