From 173f268fd9d3ebb4f10ff05a8e772fc0ec9ed447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Kr=C3=BDda?= Date: Sun, 29 Sep 2024 14:39:36 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9E=95=20Added=20Ookla=20test=20servers=20se?= =?UTF-8?q?arch=20functionality?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 17 ++++++++++++++--- src/tests/ookla.ts | 29 +++++++++++++++++++++++++++++ tests/convert.test.ts | 8 ++++---- tests/ookla.test.ts | 20 +++++++++++++++++++- 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6f3bb68..db1fc38 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { DistanceUnits, OAResult, SpeedUnits, USOptions } from "./interfaces/index.js"; +import { DistanceUnits, OAMeasurementServer, OAResult, SpeedUnits, USOptions } from "./interfaces/index.js"; import { convertSpeedUnit } from "./utils/index.js"; import { Ookla } from "./tests/index.js"; @@ -37,8 +37,19 @@ export class UniversalSpeedTest { } /** - * Performs measurements using speedtest.net - * @returns {Promise} Ookla Speedtest test result. + * Searches Ookla test servers based on search term. + * @param searchTerm - Search term + * @param serversToFetch - Number of test servers to fetch + * @returns {Promise} Ookla test servers + */ + public searchOoklaServers(searchTerm: string, serversToFetch?: number): Promise { + const ooklaTest = new Ookla(this.options); + return ooklaTest.searchServers(searchTerm, serversToFetch); + } + + /** + * Performs speedtest using Ookla servers. + * @returns {Promise} Ookla test result */ public performOoklaTest(): Promise { const ooklaTest = new Ookla(this.options); diff --git a/src/tests/ookla.ts b/src/tests/ookla.ts index 81e2629..c4de8b4 100644 --- a/src/tests/ookla.ts +++ b/src/tests/ookla.ts @@ -37,6 +37,35 @@ export class Ookla { this.options = options; } + /** + * Searches Ookla test servers based on search term. + * @param searchTerm - Search term + * @param serversToFetch - Number of test servers to fetch + * @returns {Promise} Ookla test servers + */ + public async searchServers(searchTerm: string, serversToFetch?: number): Promise { + const serversUrl = `https://www.speedtest.net/api/js/servers?engine=js&search=${ searchTerm }&limit=${ serversToFetch || 100 }&https_functional=true`; + try { + const response = await createGetRequest(serversUrl); + const body = await response.text(); + + const servers: OAMeasurementServer[] = JSON.parse(body); + servers.forEach(server => { + // Convert info to correct types + server.id = Number(server.id); + server.lat = Number(server.lat); + server.lon = Number(server.lon); + if (this.options.units.distanceUnit === DistanceUnits.km) { + server.distance = convertMilesToKilometers(server.distance); + } + }); + + return servers; + } catch { + throw new Error("An error occurred while retrieving the server list from speedtest.net."); + } + } + /** * Performs the Ookla Speedtest measurement. * @returns {Promise} Results of the Ookla test diff --git a/tests/convert.test.ts b/tests/convert.test.ts index fa3fbda..d57960e 100644 --- a/tests/convert.test.ts +++ b/tests/convert.test.ts @@ -6,19 +6,19 @@ describe("convertSpeedUnit test", () => { const speedInKbps = convertSpeedUnit(SpeedUnits.Mbps, SpeedUnits.Kbps, 10); expect(speedInKbps).toEqual(10_000); - }, 2000); + }, 2_000); it("Run convertSpeedUnit test #2", () => { const speedInKbps = convertSpeedUnit(SpeedUnits.MBps, SpeedUnits.Kbps, 1); expect(speedInKbps).toEqual(8_000); - }, 2000); + }, 2_000); it("Run convertSpeedUnit test #3", () => { const speedInMBps = convertSpeedUnit(SpeedUnits.Mbps, SpeedUnits.MBps, 1); expect(speedInMBps).toEqual(0.125000); - }, 2000); + }, 2_000); }); describe("convertMilesToKilometers test", () => { @@ -26,5 +26,5 @@ describe("convertMilesToKilometers test", () => { const distanceInKilometers = convertMilesToKilometers(10); expect(distanceInKilometers).toEqual(16.09); - }, 2000); + }, 2_000); }); diff --git a/tests/ookla.test.ts b/tests/ookla.test.ts index 3ea65d7..d7f4a6e 100644 --- a/tests/ookla.test.ts +++ b/tests/ookla.test.ts @@ -1,6 +1,24 @@ import { UniversalSpeedTest } from "../src/index.js"; -describe("Ookla test", () => { +describe("Ookla search test", () => { + it("Run Ookla search test #1", async () => { + const test = new UniversalSpeedTest(); + const servers = await test.searchOoklaServers("czechia", 14); + + expect(servers.length).toEqual(14); + expect(typeof servers.at(5).id).toBe("number"); + }, 4_000); + + it("Run Ookla search test #2", async () => { + const test = new UniversalSpeedTest(); + const servers = await test.searchOoklaServers("czechia"); + + expect(servers.length).toBeGreaterThan(40); + expect(typeof servers.at(28).id).toBe("number"); + }, 4_000); +}); + +describe("Ookla measurement test", () => { it("Run Ookla speed test without measuring", async () => { const test = new UniversalSpeedTest({ tests: {