Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Commit

Permalink
refactor: hydrate wallets to respect the data structure contract
Browse files Browse the repository at this point in the history
  • Loading branch information
faustbrian committed Oct 8, 2020
1 parent 2ba53d4 commit 85020cd
Show file tree
Hide file tree
Showing 12 changed files with 117 additions and 99 deletions.
18 changes: 9 additions & 9 deletions .yarn/build-state.yml
Expand Up @@ -3,36 +3,36 @@

# bcrypto@npm:5.2.0
"2fca13eaee5dbfea710f72fc3af34b3de0a5985299e62164df6711ed1c71fbb66d3b3372f4e67787a9ac681d2ad1a0e9b24857296d3e9c18b9211a258efd0bb2":
6e7ef8ccb7dadbba890616264b1656ce4c94de3ddd5ecc0b4e47dae5c006b701f3f84135df32a6b83654f25d1a2699394f5b78e0eeee271b505e5c8eba1dd6d9
64f5cbc9ef9f2622e7a7abf50c6eae4a63fe4f40fdac0952fa1a1cd70da643f45208d2c71cf1ff8363d058ba1b5ed75d8c9e2ecc7158760dc47c418ff3e05ce7

# bstring@npm:0.3.9
"91054b6d6c04ebf395afb088712f69a7ceb6f388f062c5abd398ff5b8719ad9c3296be153310112c2c35b315920e77d35df52917ef0ec6775fff148a7ec9453f":
4947ff45bf7ea33d12424df94ed47922e4f78eab3c39def8310baef12c329fb86896bb19dcf0510affc338d1462507c98e1f99fc2ca7a300e15790045cfc38c5
f4e95a3499883a0ea109e81ca2e9ad3db54ebcbcf445855db1a1b007ff41a8bc5f606693fd77451d77dc4de0a72585f22e14380f5d52036462ad2531a5aff159

# core-js@npm:2.6.11
"15178ded27ab674ae2054269453d809bdb1d00b98392a34947b5d43ea7a5811e5674c2fda7d48bb653b24a3506b0a8aa126bbac861bdeba93438ec6c7efb2d9d":
c03af6105f0a3fd4609bb2d7d1f175299139b459955b23ed05bc176d8251a3cff4d1852e7990d4d8dcd9a783ca5059ce97fce767cc815f66dcec56b3cb5ceee3
870043b730c71d247e2d408cab63011895f735f98a76887cd2edf359c942f43caab048df8c926561c641e29af77ff5f4ec74e0487d7fa5054c04ca0996572f8e

# core-js@npm:3.6.5
"5941340066f775d2694fe1955bef9a66af767bfade2eca6ca442d82a68a5c999e76165c38ab532c125bf81c66c151d83d8e96f86a3f7af2d755000b3e2d48171":
28ee847d6f12c6f1c4ebcf29f581e3620f7e36c2272814a662ad30f592af69c9ab3d57dab7d73b293747fd0c4fa232ccf81138a41f087b5cc179ecccdf4222e4
8390f4497d6434f39aaaff95557a33cd979bdb3236132c911c21d343c5d4243063d3431bf2d5301cfdf5ae3be9030322f46cd2513010269c0981e6674ee93f0b

# cypress@npm:3.8.3
"888da081fda658ac50266db73a07c293fbca62ee7aa9813d75c746c25dbe0ef15b34498ad5b632cd3542dad28f3aa9ca7c6f9e10635ec320f51376d0249e8b53":
341c76d9e7a90c2170159147b328654c0a731f16d3a319e7baece7d13a2b28f01c51e3b7cc49c96fe05f18f1dd1b5d8b0567c88bc96795f466ba5d2987e7f5dc
9cc7455fced2d80f2a4ebd93d631c0245066209f2b8afa3dcb1d899b7cbac309c5e64c8cb730590747017222ac13c7c392d1b1c6546d3df230fdbe8da5a077cb

# ejs@npm:2.7.4
"879ed38a4e6f542ab08c36367888dd2c675bef03e81327d75da644a9795ff2d91c34d3cc00a725a6332b56c51ff7cd6a6c5e8c9f9411e6c41bf42b356e1e2417":
f9584a3ce6e872ff18cdc13a88e374589a7d0e726e2b94ab16529c2120a8afc06909466272ad774ae84f558c09a4a38bb82aa42e84d103908312c62a930e2909
032538de0b5206bbc8d2f52a51ab4c5ab979d889d4c66eece741bcb289e5ec49b6f0e01a88b7659917e2c69eb157de1ca97bcc84df88d890409bbe646f93e535

# fsevents@patch:fsevents@npm%3A1.2.13#builtin<compat/fsevents>::version=1.2.13&hash=495457
"1813f6d75e288a7ebd0106bb7acab950ec90204d19a24473dd0127b528a56df374472ac3f50424fede32ab04d2e2817efe102003592a6d3fef9d20451a34de48":
7598a52ac8ec4fdcb3311c5ed4183f78bda17b30056131c874f992d7e3112f6f632600af26b18746a40d0891d7c5781f0668335c04cd1e6f06c3086bf7721015
1cfe1c3c4d04eecbc2e635613a5239e9cd07589fe8fff588189e7d20f7cdcd2b0c11cd643894ba99901fae03d26526b28c40a1222e8f67c9eda34161947186bb

# tiny-secp256k1@npm:1.1.5
"c0c5f382590403f321556a245a5cd31bf04275e1d74145326637f959aefbecf140dd0b6113777ff571864e1b8427618a7610e8549de86ff0fa8593658f992d13":
19671d452eedcff9836e1aa927f6bdeff36d92580443a0551537fb98f0f30d9be9b5eb7e4ba0587a195c2a2cb434357e98b1f40e987c759899575f0d1628dd00
85692bb8ba0867204e1a8f64cc64e08c640691f3e437b06ef75bb79ee782f5acd77d0cbf495f54a00e2a3ba49c70a2f7f03262f1b9e3554b8a18c48c5eb9c720

# yorkie@npm:2.0.0
"90a2c44491603d8abc64958df6cb3953fed067e47c862d5de6bfa981036615c4ca5f9a35456b35547d446eaa0a7ca942052f034a125463af0d56b74101a96fe3":
04f8603e6678b7b1ad60352b12474ee1a5ef8ca8348de2021d65740f46f2af880918938f0b31ef2441d922f97252aea7a18152b05326e14496319d63c273eadd
e88622296f7243bd23677fd7b04e8e83e346632b5eed7b643447d073a5143186f07643fa26c30710c60c586817ddb959497a162c474a8d60cd933fed9116e737
Binary file added .yarn/cache/dot-prop-npm-6.0.0-e91c0e6710-3.zip
Binary file not shown.
Binary file modified .yarn/install-state.gz
Binary file not shown.
26 changes: 18 additions & 8 deletions __tests__/unit/specs/services/wallet.spec.ts
@@ -1,7 +1,17 @@
import WalletService from "@/services/wallet";
import store from "@/store";

const walletPropertyArray = ["address", "balance", "isDelegate"].sort();
const walletPropertyArray = [
"address",
"isDelegate",
"isResigned",
"lockedBalance",
"multiSignature",
"publicKey",
"secondPublicKey",
"username",
"vote",
].sort();
// Note: publicKey, secondPublicKey, username and vote can also be returned, but are optional

describe("Services > Wallet", () => {
Expand All @@ -21,15 +31,15 @@ describe("Services > Wallet", () => {
it("should return a list of top wallet accounts", async () => {
const { data } = await WalletService.top();
expect(data).toHaveLength(25);
data.forEach(wallet => {
data.forEach((wallet) => {
expect(Object.keys(wallet).sort()).toEqual(expect.arrayContaining(walletPropertyArray));
});
});

it("should return top wallets with page offset", async () => {
const { data } = await WalletService.top(1);
expect(data).toHaveLength(25);
data.forEach(wallet => {
data.forEach((wallet) => {
expect(Object.keys(wallet).sort()).toEqual(expect.arrayContaining(walletPropertyArray));
});
expect(data.sort((a, b) => a.balance > b.balance)).toEqual(data);
Expand All @@ -38,18 +48,18 @@ describe("Services > Wallet", () => {
it("should return top wallets with page offset and given limit", async () => {
const { data } = await WalletService.top(2, 20);
expect(data).toHaveLength(20);
data.forEach(wallet => {
data.forEach((wallet) => {
expect(Object.keys(wallet).sort()).toEqual(expect.arrayContaining(walletPropertyArray));
});
expect(data.sort((a, b) => a.balance > b.balance)).toEqual(data);
});

it("should return all wallets that vote for '020431436cf94f3c6a6ba566fe9e42678db8486590c732ca6c3803a10a86f50b92'", async () => {
const { data } = await WalletService.search({
vote: "020431436cf94f3c6a6ba566fe9e42678db8486590c732ca6c3803a10a86f50b92",
attributes: { vote: "020431436cf94f3c6a6ba566fe9e42678db8486590c732ca6c3803a10a86f50b92" },
});
expect(data).toHaveLength(25);
data.forEach(wallet => {
data.forEach((wallet) => {
expect(wallet.vote).toBe("020431436cf94f3c6a6ba566fe9e42678db8486590c732ca6c3803a10a86f50b92");
expect(Object.keys(wallet).sort()).toEqual(expect.arrayContaining(walletPropertyArray));
});
Expand All @@ -59,7 +69,7 @@ describe("Services > Wallet", () => {
const minBalance = 100000 * 1e8;
const { data } = await WalletService.search({ balance: { from: minBalance } });
expect(data).toHaveLength(25);
data.forEach(wallet => {
data.forEach((wallet) => {
expect(parseInt(wallet.balance)).toBeGreaterThanOrEqual(minBalance);
expect(Object.keys(wallet).sort()).toEqual(expect.arrayContaining(walletPropertyArray));
});
Expand All @@ -68,7 +78,7 @@ describe("Services > Wallet", () => {
it("should return the latest wallets when no arguments are passed", async () => {
const { data } = await WalletService.search();
expect(data).toHaveLength(25);
data.forEach(wallet => {
data.forEach((wallet) => {
expect(Object.keys(wallet).sort()).toEqual(expect.arrayContaining(walletPropertyArray));
});
});
Expand Down
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -32,6 +32,7 @@
"chart.js": "^2.9.3",
"connect-history-api-fallback": "^1.6.0",
"core-js": "^3.6.5",
"dot-prop": "^6.0.0",
"express": "^4.17.1",
"lodash": "^4.17.15",
"moment": "^2.25.3",
Expand Down
4 changes: 2 additions & 2 deletions src/components/search/WalletSearchForm.vue
Expand Up @@ -6,15 +6,15 @@
<div class="w-full lg:w-1/4">
<InputText
:label="$t('WALLET.DELEGATE.USERNAME')"
name="username"
name="attributes.delegate.username"
@input="onInputChange"
@keyup.enter.native="onEnterKey"
/>
</div>
<div class="w-full lg:w-1/4">
<InputText
:label="$t('WALLET.VOTING_FOR')"
name="vote"
name="attributes.vote"
class="pt-0"
@input="onInputChange"
@keyup.enter.native="onEnterKey"
Expand Down
7 changes: 6 additions & 1 deletion src/interfaces.ts
Expand Up @@ -119,6 +119,11 @@ export interface IWallet {
isDelegate: boolean;
isResigned?: boolean;
lockedBalance?: BigNumber;
secondPublicKey?: string;
multiSignature?: {
min: number;
publicKeys: string[];
};
}

export interface IApiResponse {
Expand Down Expand Up @@ -303,6 +308,6 @@ export interface IBlockSearchParams {
export interface IWalletSearchParams {
address?: string;
username?: string;
vote?: string;
attributes?: { vote?: string };
balance?: { from?: number; to?: number };
}
117 changes: 42 additions & 75 deletions src/mirage/index.js
Expand Up @@ -150,6 +150,18 @@ export function makeServer({ environment = "development" } = {}) {
response.data = response.data.slice(0, request.queryParams.limit);
}

if (request.queryParams.totalFee) {
return loadFixture("api/blocks/search/by-total-fee");
}

if (request.queryParams.generatorPublicKey) {
return loadFixture("api/blocks/search/by-generator-public-key");
}

if (request.queryParams.id) {
return loadFixture("api/blocks/search/by-id");
}

return response;
});

Expand All @@ -169,27 +181,6 @@ export function makeServer({ environment = "development" } = {}) {
return loadFixture("api/blocks/last");
});

this.post("/blocks/search", (schema, request) => {
const requestBody = JSON.parse(request.requestBody);

if (requestBody.totalFee) {
return loadFixture("api/blocks/search/by-total-fee");
}

if (requestBody.generatorPublicKey) {
return loadFixture("api/blocks/search/by-generator-public-key");
}

if (requestBody.id) {
return loadFixture("api/blocks/search/by-id");
}

return {
meta: {},
data: [],
};
});

let delegatesRequestedBefore = false;
this.get("/delegates", (schema, request) => {
let page = request.queryParams.page || 1;
Expand Down Expand Up @@ -234,13 +225,6 @@ export function makeServer({ environment = "development" } = {}) {
return response;
});

this.post("/delegates/search", (schema, request) => {
return {
meta: {},
data: [],
};
});

this.get("/locks", (schema, request) => {
return {
meta: {},
Expand Down Expand Up @@ -339,46 +323,37 @@ export function makeServer({ environment = "development" } = {}) {
return response;
});

// this.post("/transactions", (schema, request) => {
// return {
// meta: {},
// data: [],
// };
// });
this.get("/transactions", (schema, request) => {
if (request.queryParams.amount && request.queryParams.fee) {
return loadFixture("api/transactions/search/by-amount-and-fee");
}

this.get("/transactions/:id", (schema, request) => {
return loadFixture(`api/transactions/${request.params.id}`);
});
if (!request.queryParams.id) {
return loadFixture("api/transactions/search/transactions");
}

if (request.queryParams.id !== "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") {
return loadFixture("api/transactions/search/by-id");
}

this.get("/transactions/fees", (schema, request) => {
return {
meta: {},
data: [],
};
});

this.get("/transactions/schemas", (schema, request) => {
this.get("/transactions/:id", (schema, request) => {
return loadFixture(`api/transactions/${request.params.id}`);
});

this.get("/transactions/fees", (schema, request) => {
return {
meta: {},
data: [],
};
});

this.post("/transactions/search", (schema, request) => {
const requestBody = JSON.parse(request.requestBody);

if (requestBody.amount && requestBody.fee) {
return loadFixture("api/transactions/search/by-amount-and-fee");
}

if (!requestBody.id) {
return loadFixture("api/transactions/search/transactions");
}

if (requestBody.id !== "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") {
return loadFixture("api/transactions/search/by-id");
}

this.get("/transactions/schemas", (schema, request) => {
return {
meta: {},
data: [],
Expand Down Expand Up @@ -421,6 +396,19 @@ export function makeServer({ environment = "development" } = {}) {
});

this.get("/wallets", (schema, request) => {
console.log("wuts");
if (request.queryParams["attributes.vote"]) {
return loadFixture("api/wallets/search/by-vote");
}

if (request.queryParams["attributes.username"]) {
return loadFixture("api/wallets/search/by-username");
}

if (request.queryParams.address) {
return loadFixture("api/wallets/search/by-address");
}

return {
meta: {},
data: [],
Expand Down Expand Up @@ -459,27 +447,6 @@ export function makeServer({ environment = "development" } = {}) {
return loadFixture(`api/wallets/${request.params.id}/votes`);
});

this.post("/wallets/search", (schema, request) => {
const requestBody = JSON.parse(request.requestBody);

if (requestBody.vote) {
return loadFixture("api/wallets/search/by-vote");
}

if (requestBody.username) {
return loadFixture("api/wallets/search/by-username");
}

if (requestBody.address) {
return loadFixture("api/wallets/search/by-address");
}

return {
meta: {},
data: [],
};
});

this.get("/wallets/top", (schema, request) => {
const response = loadFixture("api/wallets/top");

Expand Down
1 change: 1 addition & 0 deletions src/pages/AdvancedSearch.vue
Expand Up @@ -229,6 +229,7 @@ export default class AdvancedSearchPage extends Vue {
try {
const { meta, data } = await this.searchService(this.searchParams);
this.setMeta(meta);
this.setData(data);
} catch {
Expand Down
2 changes: 1 addition & 1 deletion src/services/delegate.ts
Expand Up @@ -54,7 +54,7 @@ class DelegateService {
public async voterCount(publicKey: string, excludeLowBalances = true): Promise<number> {
const response = (await WalletService.search(
{
vote: publicKey,
attributes: { vote: publicKey },
balance: {
from: excludeLowBalances ? 1e7 : 0,
},
Expand Down

0 comments on commit 85020cd

Please sign in to comment.