trustwallet-assets/script/action/validators.ts
Adam R 102f2b88d4
[Internal] New infra for runnig checks (not as jest tests) (#2938)
* CMC mapping update.

* New check infrastructure, move root folder test to new infra.

* Move list of allowed files to config.

* Include new check in other tests.

* More generic way to call checks.

* Organize fix and update actions behind interfaces.

* Organize checks into steps, multiple steps per action.

* Simplify checkStep class/instance creation.

* Migrate chain logo checks.

* Migrate asset folder check.

* Migrate further chain checks.

* Migrate eth fork folder checks.

* Migrate binance chain check.

* Extra output.

* Output improvements.

* Async fix.

* Migrate Tron check.

* Add Tron check.

* Remove Tron check from old.

* White/blacklist check in new intra, combined with fix.

* Refine ETH checks.

* Remove from old infra.

* Migrate CMC check to new infra.

* Migrate validator tests to new check infra.

* Migrate Json files validity check to new check infra.

* Whitelist check fix.

* Cleanup helpers.ts.

* Move helpers.ts.

* Cleanup of models.ts.

* Move models.ts.

* Move index.test.ts.

* Update with BEP8 support.

* Descriptive names for jobs within the builds.

Co-authored-by: Catenocrypt <catenocrypt@users.noreply.github.com>
2020-08-06 21:17:38 +02:00

103 lines
4.1 KiB
TypeScript

import { stakingChains } from "../common/blockchains";
import {
getChainValidatorsListPath,
getChainValidatorAssetLogoPath,
getChainValidatorsAssets
} from "../common/repo-structure";
import { isPathExistsSync } from "../common/filesystem";
import { formatSortJsonFile, readJsonFile } from "../common/json";
import { ActionInterface, CheckStepInterface } from "./interface";
import { isValidJSON } from "../common/json";
import { ValidatorModel } from "../common/validator-models";
import { isLogoOK } from "../common/image";
import * as bluebird from "bluebird";
function formatValidators() {
stakingChains.forEach(chain => {
const validatorsPath = getChainValidatorsListPath(chain);
formatSortJsonFile(validatorsPath);
})
}
function getChainValidatorsList(chain: string): ValidatorModel[] {
return readJsonFile(getChainValidatorsListPath(chain));
}
function isValidatorHasAllKeys(val: ValidatorModel): boolean {
return typeof val.id === "string"
&& typeof val.name === "string"
&& typeof val.description === "string"
&& typeof val.website === "string";
}
export class Validators implements ActionInterface {
getName(): string { return "Validators"; }
getChecks(): CheckStepInterface[] {
var steps = [
{
getName: () => { return "Make sure tests added for new staking chain"},
check: async () => {
if (stakingChains.length != 7) {
return `Wrong number of staking chains ${stakingChains.length}`;
}
return "";
}
},
];
stakingChains.forEach(chain => {
steps.push(
{
getName: () => { return `Make sure chain ${chain} has valid list file, has logo`},
check: async () => {
const validatorsListPath = getChainValidatorsListPath(chain);
if (!isValidJSON(validatorsListPath)) {
return `Not valid Json file at path ${validatorsListPath}`;
}
var error: string = "";
const validatorsList = getChainValidatorsList(chain);
const chainValidatorsAssetsList = getChainValidatorsAssets(chain);
await bluebird.each(validatorsList, async (val: ValidatorModel) => {
if (!isValidatorHasAllKeys(val)) {
error += `Some key and/or type missing for validator ${JSON.stringify(val)}\n`;
}
const id = val.id;
const path = getChainValidatorAssetLogoPath(chain, id);
if (!isPathExistsSync(path)) {
error += `Chain ${chain} asset ${id} logo must be present at path ${path}\n`;
}
const [isOk, logoMsg] = await isLogoOK(path);
if (!isOk) {
error += logoMsg + "\n";
}
// Make sure validator has corresponding logo
if (!(chainValidatorsAssetsList.indexOf(id) >= 0)) {
error += `Expecting image asset for validator ${id} on chain ${chain}\n`;
}
});
// Make sure validator asset logo has corresponding info
chainValidatorsAssetsList.forEach(valAssetLogoID => {
if (validatorsList.filter(v => v.id === valAssetLogoID).length != 1) {
error += `Expect validator logo ${valAssetLogoID} to have info\n`;
}
});
return error;
}
}
);
});
return steps;
}
async fix(): Promise<void> {
formatValidators();
}
update = null;
}