Skip to content

Commit

Permalink
fix(core-api): properly sort semver versions (#2229)
Browse files Browse the repository at this point in the history
  • Loading branch information
luciorubeens authored and faustbrian committed Mar 12, 2019
1 parent 9ca8f61 commit c123959
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 12 deletions.
49 changes: 40 additions & 9 deletions __tests__/integration/core-api/v2/handlers/peers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand All @@ -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);
});
},
);
});
Expand All @@ -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);
});
},
);
Expand Down
6 changes: 4 additions & 2 deletions packages/core-api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,17 @@
"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",
"@types/ip": "^1.1.0",
"@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"
Expand Down
10 changes: 9 additions & 1 deletion packages/core-api/src/versions/2/peers/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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");
Expand Down

0 comments on commit c123959

Please sign in to comment.