177 lines
6.5 KiB
TypeScript
177 lines
6.5 KiB
TypeScript
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);
|
|
});
|
|
});
|
|
});
|
|
});
|