diff --git a/__tests__/integration/core-api/v2/handlers/peers.test.ts b/__tests__/integration/core-api/v2/handlers/peers.test.ts index 7953f5a2e3..155e314611 100644 --- a/__tests__/integration/core-api/v2/handlers/peers.test.ts +++ b/__tests__/integration/core-api/v2/handlers/peers.test.ts @@ -4,18 +4,31 @@ import "../../../../utils"; import { setUp, tearDown } from "../../__support__/setup"; import { utils } from "../utils"; -const mockAddress = "1.0.0.99"; -const mockPort = 4002; +const peers = [ + { + ip: "1.0.0.99", + port: 4002, + version: "2.2.0-beta.3", + }, + { + ip: "1.0.0.98", + port: 4002, + version: "2.2.0-beta.1", + }, +]; beforeAll(async () => { await setUp(); - const peerMock = new Peer(mockAddress, mockPort); - peerMock.setStatus("OK"); + const peerMocks = peers.map(mock => { + const peerMock = new Peer(mock.ip, mock.port); + peerMock.setStatus("OK"); + peerMock.version = mock.version; + return peerMock; + }); const monitor = app.resolvePlugin("p2p"); - monitor.peers = {}; - monitor.peers[peerMock.ip] = peerMock; + monitor.peers = peerMocks.reduce((result, mock) => ({ ...result, [mock.ip]: mock }), {}); }); afterAll(async () => { @@ -36,6 +49,24 @@ describe("API 2.0 - Peers", () => { expect(response.data.data).toBeArray(); expect(response.data.data[0]).toBeObject(); }); + + it("should GET all the peers sorted by version,asc", async () => { + const response = await utils[request]("GET", "peers", { orderBy: "version:asc" }); + expect(response).toBeSuccessfulResponse(); + expect(response.data.data).toBeArrayOfSize(peers.length); + expect(response.data.data[0]).toBeObject(); + expect(response.data.data[0].ip).toBe(peers[1].ip); + expect(response.data.data[1].ip).toBe(peers[0].ip); + }); + + it("should GET all the peers sorted by version,desc", async () => { + const response = await utils[request]("GET", "peers", { orderBy: "version:desc" }); + expect(response).toBeSuccessfulResponse(); + expect(response.data.data).toBeArrayOfSize(peers.length); + expect(response.data.data[0]).toBeObject(); + expect(response.data.data[0].ip).toBe(peers[0].ip); + expect(response.data.data[1].ip).toBe(peers[1].ip); + }); }, ); }); @@ -45,11 +76,11 @@ describe("API 2.0 - Peers", () => { "using the %s header", (_, request) => { it("should GET a peer by the given ip", async () => { - const response = await utils[request]("GET", `peers/${mockAddress}`); + const response = await utils[request]("GET", `peers/${peers[0].ip}`); expect(response).toBeSuccessfulResponse(); expect(response.data.data).toBeObject(); - expect(response.data.data.ip).toBe(mockAddress); - expect(response.data.data.port).toBe(mockPort); + expect(response.data.data.ip).toBe(peers[0].ip); + expect(response.data.data.port).toBe(peers[0].port); }); }, ); diff --git a/packages/core-api/package.json b/packages/core-api/package.json index d9f6c75c70..c670ab4293 100644 --- a/packages/core-api/package.json +++ b/packages/core-api/package.json @@ -46,7 +46,8 @@ "joi": "^14.3.1", "lodash.orderby": "^4.6.0", "lodash.partition": "^4.6.0", - "lodash.snakecase": "^4.1.1" + "lodash.snakecase": "^4.1.1", + "semver": "^5.6.0" }, "devDependencies": { "@types/boom": "^7.2.1", @@ -54,7 +55,8 @@ "@types/joi": "^14.3.2", "@types/lodash.orderby": "^4.6.6", "@types/lodash.partition": "^4.6.6", - "@types/lodash.snakecase": "^4.1.6" + "@types/lodash.snakecase": "^4.1.6", + "@types/semver": "^5.5.0" }, "publishConfig": { "access": "public" diff --git a/packages/core-api/src/versions/2/peers/controller.ts b/packages/core-api/src/versions/2/peers/controller.ts index ddf74a28c5..4e7be9f88f 100644 --- a/packages/core-api/src/versions/2/peers/controller.ts +++ b/packages/core-api/src/versions/2/peers/controller.ts @@ -2,6 +2,7 @@ import { app } from "@arkecosystem/core-container"; import { P2P } from "@arkecosystem/core-interfaces"; import Boom from "boom"; import Hapi from "hapi"; +import semver from "semver"; import { Controller } from "../shared/controller"; export class PeersController extends Controller { @@ -38,12 +39,19 @@ export class PeersController extends Controller { // @ts-ignore const order = request.query.orderBy.split(":"); - if (["port", "status", "os", "version"].includes(order[0])) { + if (["port", "status", "os"].includes(order[0])) { result = order[1].toUpperCase() === "ASC" ? result.sort((a, b) => a[order[0]] - b[order[0]]) : result.sort((a, b) => a[order[0]] + b[order[0]]); } + + if (order[0] === "version") { + result = + order[1].toUpperCase() === "ASC" + ? result.sort((a, b) => semver.compare(a[order[0]], b[order[0]])) + : result.sort((a, b) => semver.rcompare(a[order[0]], b[order[0]])); + } } return super.toPagination(request, { rows: result, count: allPeers.length }, "peer");