Skip to content

Commit

Permalink
➕ Added Ookla test servers search functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
karelkryda committed Sep 29, 2024
1 parent 39861a1 commit 173f268
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 8 deletions.
17 changes: 14 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -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";

Expand Down Expand Up @@ -37,8 +37,19 @@ export class UniversalSpeedTest {
}

/**
* Performs measurements using speedtest.net
* @returns {Promise<OAResult>} 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<OAMeasurementServer[]>} Ookla test servers
*/
public searchOoklaServers(searchTerm: string, serversToFetch?: number): Promise<OAMeasurementServer[]> {
const ooklaTest = new Ookla(this.options);
return ooklaTest.searchServers(searchTerm, serversToFetch);
}

/**
* Performs speedtest using Ookla servers.
* @returns {Promise<OAResult>} Ookla test result
*/
public performOoklaTest(): Promise<OAResult> {
const ooklaTest = new Ookla(this.options);
Expand Down
29 changes: 29 additions & 0 deletions src/tests/ookla.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<OAMeasurementServer[]>} Ookla test servers
*/
public async searchServers(searchTerm: string, serversToFetch?: number): Promise<OAMeasurementServer[]> {
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<OAResult>} Results of the Ookla test
Expand Down
8 changes: 4 additions & 4 deletions tests/convert.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,25 @@ 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", () => {
it("Run convertMilesToKilometers test", () => {
const distanceInKilometers = convertMilesToKilometers(10);

expect(distanceInKilometers).toEqual(16.09);
}, 2000);
}, 2_000);
});
20 changes: 19 additions & 1 deletion tests/ookla.test.ts
Original file line number Diff line number Diff line change
@@ -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: {
Expand Down

0 comments on commit 173f268

Please sign in to comment.