Merge branch 'spencer/meta-cicd' into 'master'
Refactor meta ci-cd pipeline. See merge request grassrootseconomics/cic-internal-integration!171
This commit is contained in:
commit
e5b1352970
3
.gitignore
vendored
3
.gitignore
vendored
@ -8,3 +8,6 @@ gmon.out
|
|||||||
*.egg-info
|
*.egg-info
|
||||||
dist/
|
dist/
|
||||||
build/
|
build/
|
||||||
|
**/*sqlite
|
||||||
|
**/.nyc_output
|
||||||
|
**/coverage
|
||||||
|
2
apps/cic-meta/.gitignore
vendored
2
apps/cic-meta/.gitignore
vendored
@ -3,3 +3,5 @@ dist
|
|||||||
dist-web
|
dist-web
|
||||||
dist-server
|
dist-server
|
||||||
scratch
|
scratch
|
||||||
|
coverage
|
||||||
|
.nyc_output
|
||||||
|
@ -3,17 +3,38 @@
|
|||||||
variables:
|
variables:
|
||||||
APP_NAME: cic-meta
|
APP_NAME: cic-meta
|
||||||
DOCKERFILE_PATH: $APP_NAME/docker/Dockerfile
|
DOCKERFILE_PATH: $APP_NAME/docker/Dockerfile
|
||||||
|
IMAGE_TAG: $CI_REGISTRY_IMAGE/$APP_NAME:unittest-$CI_COMMIT_SHORT_SHA
|
||||||
|
|
||||||
.cic_meta_changes_target:
|
.cic_meta_changes_target:
|
||||||
rules:
|
rules:
|
||||||
- changes:
|
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||||
- $CONTEXT/$APP_NAME/*
|
# - changes:
|
||||||
|
# - $CONTEXT/$APP_NAME/*
|
||||||
|
- when: always
|
||||||
|
|
||||||
build-mr-cic-meta:
|
cic-meta-build-mr:
|
||||||
|
stage: build
|
||||||
|
extends:
|
||||||
|
- .cic_meta_variables
|
||||||
|
- .cic_meta_changes_target
|
||||||
|
script:
|
||||||
|
- mkdir -p /kaniko/.docker
|
||||||
|
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > "/kaniko/.docker/config.json"
|
||||||
|
# - /kaniko/executor --context $CONTEXT --dockerfile $DOCKERFILE_PATH $KANIKO_CACHE_ARGS --destination $IMAGE_TAG
|
||||||
|
- /kaniko/executor --context $CONTEXT --dockerfile $DOCKERFILE_PATH $KANIKO_CACHE_ARGS --destination $IMAGE_TAG
|
||||||
|
|
||||||
|
test-mr-cic-meta:
|
||||||
extends:
|
extends:
|
||||||
- .cic_meta_changes_target
|
|
||||||
- .py_build_merge_request
|
|
||||||
- .cic_meta_variables
|
- .cic_meta_variables
|
||||||
|
- .cic_meta_changes_target
|
||||||
|
stage: test
|
||||||
|
image: $IMAGE_TAG
|
||||||
|
script:
|
||||||
|
- cd /tmp/src/cic-meta
|
||||||
|
- npm install --dev
|
||||||
|
- npm run test
|
||||||
|
- npm run test:coverage
|
||||||
|
needs: ["cic-meta-build-mr"]
|
||||||
|
|
||||||
build-push-cic-meta:
|
build-push-cic-meta:
|
||||||
extends:
|
extends:
|
||||||
|
@ -4,29 +4,28 @@ WORKDIR /tmp/src/cic-meta
|
|||||||
|
|
||||||
RUN apk add --no-cache postgresql bash
|
RUN apk add --no-cache postgresql bash
|
||||||
|
|
||||||
COPY cic-meta/package.json \
|
# required to build the cic-client-meta module
|
||||||
./
|
|
||||||
|
|
||||||
COPY cic-meta/src/ src/
|
COPY cic-meta/src/ src/
|
||||||
COPY cic-meta/tests/ tests/
|
|
||||||
COPY cic-meta/scripts/ scripts/
|
COPY cic-meta/scripts/ scripts/
|
||||||
|
|
||||||
|
# copy the dependencies
|
||||||
|
COPY cic-meta/package.json .
|
||||||
|
COPY cic-meta/tsconfig.json .
|
||||||
|
COPY cic-meta/webpack.config.js .
|
||||||
|
|
||||||
RUN npm install
|
RUN npm install
|
||||||
|
|
||||||
# see exports_dir gpg.ini
|
COPY cic-meta/tests/ tests/
|
||||||
COPY cic-meta/tests/*.asc /root/pgp/
|
COPY cic-meta/tests/*.asc /root/pgp/
|
||||||
RUN alias tsc=node_modules/typescript/bin/tsc
|
|
||||||
|
|
||||||
|
|
||||||
|
# copy runtime configs
|
||||||
COPY cic-meta/.config/ /usr/local/etc/cic-meta/
|
COPY cic-meta/.config/ /usr/local/etc/cic-meta/
|
||||||
# COPY cic-meta/scripts/server/initdb/server.postgres.sql /usr/local/share/cic-meta/sql/server.sql
|
|
||||||
|
|
||||||
|
# db migrations
|
||||||
COPY cic-meta/docker/db.sh ./db.sh
|
COPY cic-meta/docker/db.sh ./db.sh
|
||||||
RUN chmod 755 ./db.sh
|
RUN chmod 755 ./db.sh
|
||||||
|
|
||||||
#RUN alias ts-node=/tmp/src/cic-meta/node_modules/ts-node/dist/bin.js
|
RUN alias tsc=node_modules/typescript/bin/tsc
|
||||||
#ENTRYPOINT [ "./node_modules/ts-node/dist/bin.js", "./scripts/server/server.ts" ]
|
|
||||||
|
|
||||||
COPY cic-meta/docker/start_server.sh ./start_server.sh
|
COPY cic-meta/docker/start_server.sh ./start_server.sh
|
||||||
RUN chmod 755 ./start_server.sh
|
RUN chmod 755 ./start_server.sh
|
||||||
ENTRYPOINT ["sh", "./start_server.sh"]
|
ENTRYPOINT ["sh", "./start_server.sh"]
|
||||||
|
2362
apps/cic-meta/package-lock.json
generated
2362
apps/cic-meta/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -11,6 +11,7 @@
|
|||||||
"preferGlobal": true,
|
"preferGlobal": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "mocha -r node_modules/node-localstorage/register -r ts-node/register tests/*.ts",
|
"test": "mocha -r node_modules/node-localstorage/register -r ts-node/register tests/*.ts",
|
||||||
|
"test:coverage": "nyc mocha tests/*.ts --timeout 3000 --check-coverage=true",
|
||||||
"build": "node_modules/typescript/bin/tsc -d --outDir dist src/index.ts",
|
"build": "node_modules/typescript/bin/tsc -d --outDir dist src/index.ts",
|
||||||
"build-server": "tsc -d --outDir dist-server scripts/server/*.ts",
|
"build-server": "tsc -d --outDir dist-server scripts/server/*.ts",
|
||||||
"pack": "node_modules/typescript/bin/tsc -d --outDir dist && webpack",
|
"pack": "node_modules/typescript/bin/tsc -d --outDir dist && webpack",
|
||||||
@ -34,7 +35,9 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/mocha": "^8.0.3",
|
"@types/mocha": "^8.0.3",
|
||||||
"mocha": "^8.2.0",
|
"mocha": "^8.2.0",
|
||||||
|
"nock": "^13.1.0",
|
||||||
"node-localstorage": "^2.1.6",
|
"node-localstorage": "^2.1.6",
|
||||||
|
"nyc": "^15.1.0",
|
||||||
"ts-node": "^9.0.0",
|
"ts-node": "^9.0.0",
|
||||||
"typescript": "^4.0.5",
|
"typescript": "^4.0.5",
|
||||||
"webpack": "^5.4.0",
|
"webpack": "^5.4.0",
|
||||||
@ -50,5 +53,26 @@
|
|||||||
"license": "GPL-3.0-or-later",
|
"license": "GPL-3.0-or-later",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=14.16.1"
|
"node": ">=14.16.1"
|
||||||
|
},
|
||||||
|
"nyc": {
|
||||||
|
"include": [
|
||||||
|
"src/**/*.ts"
|
||||||
|
],
|
||||||
|
"extension": [
|
||||||
|
".ts"
|
||||||
|
],
|
||||||
|
"require": [
|
||||||
|
"ts-node/register"
|
||||||
|
],
|
||||||
|
"reporter": [
|
||||||
|
"text",
|
||||||
|
"html"
|
||||||
|
],
|
||||||
|
"sourceMap": true,
|
||||||
|
"instrument": true,
|
||||||
|
"branches": ">80",
|
||||||
|
"lines": ">80",
|
||||||
|
"functions": ">80",
|
||||||
|
"statements": ">80"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -204,7 +204,7 @@ async function processRequest(req, res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (content === undefined) {
|
if (content === undefined) {
|
||||||
console.error('empty onctent', data);
|
console.error('empty content', data);
|
||||||
res.writeHead(400, {"Content-Type": "text/plain"});
|
res.writeHead(400, {"Content-Type": "text/plain"});
|
||||||
res.end();
|
res.end();
|
||||||
return;
|
return;
|
||||||
|
@ -9,7 +9,7 @@ class Custom extends Syncable implements Addressable {
|
|||||||
super('', v);
|
super('', v);
|
||||||
Custom.toKey(name).then((cid) => {
|
Custom.toKey(name).then((cid) => {
|
||||||
this.id = cid;
|
this.id = cid;
|
||||||
this.value = v;
|
this.name = name;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,13 +100,15 @@ class Meta {
|
|||||||
identifier = await User.toKey(name);
|
identifier = await User.toKey(name);
|
||||||
} else if (type === 'phone') {
|
} else if (type === 'phone') {
|
||||||
identifier = await Phone.toKey(name);
|
identifier = await Phone.toKey(name);
|
||||||
} else {
|
} else if (type === 'custom') {
|
||||||
identifier = await Custom.toKey(name);
|
identifier = await Custom.toKey(name);
|
||||||
|
} else {
|
||||||
|
identifier = await Custom.toKey(name, type);
|
||||||
}
|
}
|
||||||
return identifier;
|
return identifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
private wrap(syncable: Syncable): Promise<Envelope> {
|
wrap(syncable: Syncable): Promise<Envelope> {
|
||||||
return new Promise<Envelope>(async (resolve, reject) => {
|
return new Promise<Envelope>(async (resolve, reject) => {
|
||||||
syncable.setSigner(this.signer);
|
syncable.setSigner(this.signer);
|
||||||
syncable.onwrap = async (env) => {
|
syncable.onwrap = async (env) => {
|
||||||
|
49
apps/cic-meta/tests/custom.ts
Normal file
49
apps/cic-meta/tests/custom.ts
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import * as assert from 'assert';
|
||||||
|
import {Custom} from "../src";
|
||||||
|
|
||||||
|
const testName = 'areas';
|
||||||
|
const testObject = {
|
||||||
|
area: ['Nairobi', 'Mombasa', 'Kilifi']
|
||||||
|
}
|
||||||
|
const testNameKey = '8f3da0c90ba2b89ff217da96f6088cbaf987a1b58bc33c3a5e526e53cec7cfed';
|
||||||
|
const testIdentifier = ':cic.area'
|
||||||
|
const testIdentifierKey = 'da6194e6f33726546e82c328df4c120b844d6427859156518bd600765bf8b2b7';
|
||||||
|
|
||||||
|
describe('custom', () => {
|
||||||
|
|
||||||
|
context('with predefined data', () => {
|
||||||
|
it('should create a custom object', () => {
|
||||||
|
const custom = new Custom(testName, testObject);
|
||||||
|
setTimeout(() => {
|
||||||
|
assert.strictEqual(custom.name, testName);
|
||||||
|
assert.deepStrictEqual(custom.m.data, testObject);
|
||||||
|
assert.strictEqual(custom.key(), testNameKey)
|
||||||
|
}, 0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('without predefined data', () => {
|
||||||
|
it('should create a custom object', () => {
|
||||||
|
const custom = new Custom(testName);
|
||||||
|
setTimeout(() => {
|
||||||
|
assert.strictEqual(custom.name, testName);
|
||||||
|
assert.deepStrictEqual(custom.m.data, {});
|
||||||
|
assert.strictEqual(custom.key(), testNameKey)
|
||||||
|
}, 0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#toKey()', () => {
|
||||||
|
context('without a custom identifier', () => {
|
||||||
|
it('should generate a key from the custom name', async () => {
|
||||||
|
assert.strictEqual(await Custom.toKey(testName), testNameKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('with a custom identifier', () => {
|
||||||
|
it('should generate a key from the custom name with a custom identifier', async () => {
|
||||||
|
assert.strictEqual(await Custom.toKey(testName, testIdentifier), testIdentifierKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
176
apps/cic-meta/tests/meta.ts
Normal file
176
apps/cic-meta/tests/meta.ts
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
import * as assert from 'assert';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
const nock = require('nock');
|
||||||
|
import {Meta} from "../src";
|
||||||
|
import {getResponse, metaData, networkErrorResponse, notFoundResponse, putResponse} from "./response";
|
||||||
|
import {Syncable} from "@cicnet/crdt-meta";
|
||||||
|
|
||||||
|
const metaUrl = 'https://meta.dev.grassrootseconomics.net';
|
||||||
|
const testAddress = '0xc1912fee45d61c87cc5ea59dae31190fffff232d';
|
||||||
|
const testAddressKey = 'a51472cb4df63b199a4de01335b1b4d1bbee27ff4f03340aa1d592f26c6acfe2';
|
||||||
|
const testPhone = '+254123456789';
|
||||||
|
const testPhoneKey = 'be3cc8212b7eb57c6217ddd42230bd8ccd2f01382bf8c1c77d3a683fa5a9bb16';
|
||||||
|
const testName = 'areas'
|
||||||
|
const testNameKey = '8f3da0c90ba2b89ff217da96f6088cbaf987a1b58bc33c3a5e526e53cec7cfed';
|
||||||
|
const testIdentifier = ':cic.area'
|
||||||
|
const testIdentifierKey = 'da6194e6f33726546e82c328df4c120b844d6427859156518bd600765bf8b2b7';
|
||||||
|
|
||||||
|
function readFile(filename) {
|
||||||
|
if(!fs.existsSync(filename)) {
|
||||||
|
console.error(`File ${filename} not found`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return fs.readFileSync(filename, {encoding: 'utf8', flag: 'r'});
|
||||||
|
}
|
||||||
|
|
||||||
|
const privateKey = readFile('./privatekeys.asc');
|
||||||
|
|
||||||
|
describe('meta', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
nock(metaUrl)
|
||||||
|
.get(`/${testAddressKey}`)
|
||||||
|
.reply(200, getResponse);
|
||||||
|
|
||||||
|
nock(metaUrl)
|
||||||
|
.get(`/${testPhoneKey}`)
|
||||||
|
.reply(200, getResponse);
|
||||||
|
|
||||||
|
nock(metaUrl)
|
||||||
|
.get(`/${testAddress}`)
|
||||||
|
.reply(404);
|
||||||
|
|
||||||
|
nock(metaUrl)
|
||||||
|
.get(`/${testIdentifier}`)
|
||||||
|
.replyWithError(networkErrorResponse);
|
||||||
|
|
||||||
|
nock(metaUrl)
|
||||||
|
.put(`/${testAddressKey}`)
|
||||||
|
.reply(200, putResponse);
|
||||||
|
|
||||||
|
nock(metaUrl)
|
||||||
|
.put(`/${testAddress}`)
|
||||||
|
.reply(404);
|
||||||
|
|
||||||
|
nock(metaUrl)
|
||||||
|
.post('/post')
|
||||||
|
.reply(500);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#get()', () => {
|
||||||
|
it('should fetch data from the meta service', async () => {
|
||||||
|
const account = await Meta.get(testAddressKey, metaUrl);
|
||||||
|
assert.strictEqual(account.toJSON(account), getResponse.payload);
|
||||||
|
});
|
||||||
|
|
||||||
|
context('if item is not found', () => {
|
||||||
|
it('should respond with an error', async () => {
|
||||||
|
const account = await Meta.get(testAddress, metaUrl);
|
||||||
|
assert.strictEqual(account, `404: Not Found`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('in case of network error', () => {
|
||||||
|
it('should respond with an error', async () => {
|
||||||
|
const account = await Meta.get(testIdentifier, metaUrl);
|
||||||
|
assert.strictEqual(account, `Request to ${metaUrl}/${testIdentifier} failed. Connection error.`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('#set()', () => {
|
||||||
|
context('object data', () => {
|
||||||
|
it('should set data to the meta server', () => {
|
||||||
|
const meta = new Meta(metaUrl, privateKey);
|
||||||
|
meta.onload = async (status) => {
|
||||||
|
const response = await meta.set(testAddressKey, metaData);
|
||||||
|
assert.strictEqual(response, `${putResponse.status}: ${putResponse.statusText}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('string data', () => {
|
||||||
|
it('should set data to the meta server', () => {
|
||||||
|
const meta = new Meta(metaUrl, privateKey);
|
||||||
|
meta.onload = async (status) => {
|
||||||
|
const response = await meta.set(testPhoneKey, testAddress);
|
||||||
|
assert.strictEqual(response, `${putResponse.status}: ${putResponse.statusText}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('in case of network error', () => {
|
||||||
|
it('should respond with an error', () => {
|
||||||
|
const meta = new Meta(metaUrl, privateKey);
|
||||||
|
meta.onload = async (status) => {
|
||||||
|
const response = await meta.set(testIdentifier, metaData);
|
||||||
|
assert.strictEqual(response, `Request to ${metaUrl}/${testIdentifier} failed. Connection error.`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#updateMeta()', () => {
|
||||||
|
it('should update data in the meta server', async () => {
|
||||||
|
const syncable = new Syncable(testAddressKey, metaData);
|
||||||
|
const meta = new Meta(metaUrl, privateKey);
|
||||||
|
meta.onload = async (status) => {
|
||||||
|
const response = await meta.updateMeta(syncable, testAddressKey);
|
||||||
|
assert.strictEqual(response, putResponse);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
context('if item is not found', () => {
|
||||||
|
it('should respond with an error', () => {
|
||||||
|
const syncable = new Syncable(testAddress, metaData);
|
||||||
|
const meta = new Meta(metaUrl, privateKey);
|
||||||
|
meta.onload = async (status) => {
|
||||||
|
const response = await meta.updateMeta(syncable, testAddress);
|
||||||
|
assert.strictEqual(response, notFoundResponse);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#wrap()', () => {
|
||||||
|
it('should sign a syncable object', function () {
|
||||||
|
const syncable = new Syncable(testAddressKey, metaData);
|
||||||
|
const meta = new Meta(metaUrl, privateKey);
|
||||||
|
meta.onload = async (status) => {
|
||||||
|
const response = await meta.wrap(syncable);
|
||||||
|
assert.strictEqual(response.toJSON(), getResponse);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('#getIdentifier()', () => {
|
||||||
|
context('without type', () => {
|
||||||
|
it('should return an identifier', async () => {
|
||||||
|
assert.strictEqual(await Meta.getIdentifier(testName), testNameKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('with user type', () => {
|
||||||
|
it('should return an identifier', async () => {
|
||||||
|
assert.strictEqual(await Meta.getIdentifier(testAddress, 'user'), testAddressKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('with phone type', () => {
|
||||||
|
it('should return an identifier', async () => {
|
||||||
|
assert.strictEqual(await Meta.getIdentifier(testPhone, 'phone'), testPhoneKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('with custom type', () => {
|
||||||
|
it('should return an identifier', async () => {
|
||||||
|
assert.strictEqual(await Meta.getIdentifier(testName, 'custom'), testNameKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('with unrecognised type', () => {
|
||||||
|
it('should return an identifier', async () => {
|
||||||
|
assert.strictEqual(await Meta.getIdentifier(testName, testIdentifier), testIdentifierKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
24
apps/cic-meta/tests/phone.ts
Normal file
24
apps/cic-meta/tests/phone.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import * as assert from 'assert';
|
||||||
|
import {Phone} from "../src";
|
||||||
|
|
||||||
|
const testAddress = '0xc1912fee45d61c87cc5ea59dae31190fffff232d';
|
||||||
|
const testPhone = '+254123456789';
|
||||||
|
const testPhoneKey = 'be3cc8212b7eb57c6217ddd42230bd8ccd2f01382bf8c1c77d3a683fa5a9bb16';
|
||||||
|
|
||||||
|
describe('phone', () => {
|
||||||
|
|
||||||
|
it('should create a phone object', () => {
|
||||||
|
const phone = new Phone(testAddress, testPhone);
|
||||||
|
setTimeout(() => {
|
||||||
|
assert.strictEqual(phone.address, testAddress);
|
||||||
|
assert.strictEqual(phone.m.data.msisdn, testPhone);
|
||||||
|
assert.strictEqual(phone.key(), testPhoneKey)
|
||||||
|
}, 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#toKey()', () => {
|
||||||
|
it('should generate a key from the phone number', async () => {
|
||||||
|
assert.strictEqual(await Phone.toKey(testPhone), testPhoneKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
79
apps/cic-meta/tests/response.ts
Normal file
79
apps/cic-meta/tests/response.ts
Normal file
File diff suppressed because one or more lines are too long
54
apps/cic-meta/tests/user.ts
Normal file
54
apps/cic-meta/tests/user.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import * as assert from 'assert';
|
||||||
|
|
||||||
|
import { User } from "../src";
|
||||||
|
|
||||||
|
const testAddress = '0xc1912fee45d61c87cc5ea59dae31190fffff232d';
|
||||||
|
const testAddressKey = 'a51472cb4df63b199a4de01335b1b4d1bbee27ff4f03340aa1d592f26c6acfe2';
|
||||||
|
const testUser = {
|
||||||
|
user: {
|
||||||
|
firstName: 'Test',
|
||||||
|
lastName: 'User'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('user', () => {
|
||||||
|
|
||||||
|
context('without predefined data', () => {
|
||||||
|
it('should create a user object', () => {
|
||||||
|
const user = new User(testAddress);
|
||||||
|
setTimeout(() => {
|
||||||
|
assert.strictEqual(user.address, testAddress);
|
||||||
|
assert.strictEqual(user.key(), testAddressKey);
|
||||||
|
assert.strictEqual(user.m.data.user.firstName, '');
|
||||||
|
assert.strictEqual(user.m.data.user.lastName, '');
|
||||||
|
}, 0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('with predefined data', () => {
|
||||||
|
it('should create a user object', () => {
|
||||||
|
const user = new User(testAddress, testUser);
|
||||||
|
setTimeout(() => {
|
||||||
|
assert.strictEqual(user.address, testAddress);
|
||||||
|
assert.strictEqual(user.key(), testAddressKey);
|
||||||
|
assert.strictEqual(user.m.data.user.firstName, testUser.user.firstName);
|
||||||
|
assert.strictEqual(user.m.data.user.lastName, testUser.user.lastName);
|
||||||
|
}, 0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#setName()', () => {
|
||||||
|
it('should set user\'s names to metadata', () => {
|
||||||
|
const user = new User(testAddress);
|
||||||
|
user.setName(testUser.user.firstName, testUser.user.lastName);
|
||||||
|
assert.strictEqual(user.m.data.user.firstName, testUser.user.firstName);
|
||||||
|
assert.strictEqual(user.m.data.user.lastName, testUser.user.lastName);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#toKey()', () => {
|
||||||
|
it('should generate a key from the user\'s address', async () => {
|
||||||
|
assert.strictEqual(await User.toKey(testAddress), testAddressKey);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -2,7 +2,7 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"outDir": "./dist.browser",
|
"outDir": "./dist.browser",
|
||||||
"target": "es5",
|
"target": "es2015",
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
"moduleResolution": "node",
|
"moduleResolution": "node",
|
||||||
"lib": ["es2016", "dom", "es5"],
|
"lib": ["es2016", "dom", "es5"],
|
||||||
|
Loading…
Reference in New Issue
Block a user