@helium/http
Version:
HTTP library for interacting with the Helium blockchain API
190 lines • 10.2 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.challengeJson = exports.mockPathData = exports.mockGeocode = exports.mockWitness = exports.mockLegacyWitness = exports.mockReceipt = void 0;
const Challenge_1 = __importStar(require("../Challenge"));
exports.mockReceipt = {
timestamp: 1602014780715326200,
snr: 0,
signal: 0,
origin: 'p2p',
gateway: 'fake-gateway',
frequency: 0,
datarate: [],
data: 'i0E',
channel: 0,
};
// pre POCv10
const mockLegacyWitness = () => ({
timestamp: 1602013549762689800,
packet_hash: 'fake-packet_hash',
owner: 'fake-owner',
location: 'fake-location',
gateway: 'fake-witness-gateway',
channel: 4,
});
exports.mockLegacyWitness = mockLegacyWitness;
const mockWitness = (isValid = true) => (Object.assign(Object.assign({ timestamp: 1602013549762689800, snr: 7, signal: -103, packet_hash: 'fake-packet_hash', owner: 'fake-owner', location: 'fake-location', location_hex: 'fake-location_hex', is_valid: isValid }, (!isValid && { invalid_reason: 'fake_invalid_reason' })), { gateway: 'fake-witness-gateway', frequency: 904.7000122070312, datarate: [83, 70, 56, 66, 87, 49, 50, 53], channel: 4 }));
exports.mockWitness = mockWitness;
exports.mockGeocode = {
short_street: 'fake-short_street',
short_state: 'fake-short_state',
short_country: 'fake-short_country',
short_city: 'fake-short_city',
long_street: 'fake-long_street',
long_state: 'fake-long_state',
long_country: 'fake-long_country',
long_city: 'fake-long_city',
city_id: 'fake-city_id',
};
exports.mockPathData = {
challengee_owner: 'fake-challengee_owner',
challengee_lon: -123.1234567890,
challengee_location: 'fake-challengee_location',
challengee_location_hex: 'fake-challengee_location_hex',
challengee_lat: 12.1234567890,
challengee: 'fake-challengee',
};
const challengeJson = (path, v2) => ({
type: v2 ? 'poc_receipts_v2' : 'poc_receipts_v1',
time: 1589918979,
secret: 'fake-secret',
request_block_hash: 'fake-request-block-hash',
path,
onion_key_hash: 'fake-onion-key-hash',
height: 339367,
hash: 'fake-hash',
fee: 0,
challenger_owner: 'fake-challenger-owner',
challenger_lon: -123.1234567890,
challenger_location: 'fake-challenger_location',
challenger_location_hex: 'fake-challenger_location_hex',
challenger_lat: 12.1234567890,
challenger: 'fake-challenger',
});
exports.challengeJson = challengeJson;
describe('Challenge Model', () => {
it('handles empty witness, receipt, and geocode', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [] }, exports.mockPathData),
]));
expect(challenge.path[0].geocode).not.toBeDefined();
expect(challenge.path[0].receipt).not.toBeDefined();
expect(challenge.path[0].witnesses.length).toBe(0);
});
it('handles legacy poc data (pre POCv10)', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [(0, exports.mockLegacyWitness)()] }, exports.mockPathData),
]));
expect(challenge.path.length).toBe(1);
expect(challenge.path[0].witnesses[0].isValid).toBe(true);
});
it('handles valid witness, receipt, and geocode', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [(0, exports.mockWitness)()], receipt: exports.mockReceipt, geocode: exports.mockGeocode }, exports.mockPathData),
]));
expect(challenge.path[0].geocode).toBeDefined();
expect(challenge.path[0].geocode.shortCity).toBe('fake-short_city');
expect(challenge.path[0].witnesses.length).toBe(1);
expect(challenge.path[0].receipt.gateway).toBe('fake-gateway');
});
it('is invalid if witness is not valid', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [(0, exports.mockWitness)(false)], receipt: exports.mockReceipt, geocode: exports.mockGeocode }, exports.mockPathData),
]));
expect(challenge.path[0].result).toBe(Challenge_1.PathResult.FAILURE);
});
it('has invalid reason when witness is not valid', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [(0, exports.mockWitness)(false)], receipt: exports.mockReceipt, geocode: exports.mockGeocode }, exports.mockPathData),
]));
expect(challenge.path[0].witnesses[0].invalidReason).not.toBeUndefined();
expect(challenge.path[0].witnesses[0].invalidReason).toBe('fake_invalid_reason');
});
describe('successful beacon', () => {
it('challenge has challenger and challengee location data', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [(0, exports.mockWitness)()], receipt: exports.mockReceipt, geocode: exports.mockGeocode }, exports.mockPathData),
]));
expect(challenge.challengerLocation).toBe('fake-challenger_location');
expect(challenge.challengerLocationHex).toBe('fake-challenger_location_hex');
expect(challenge.path[0].challengeeLocationHex).toBe('fake-challengee_location_hex');
expect(challenge.path[0].challengeeLocation).toBe('fake-challengee_location');
});
it('first element has witness && receipt', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [(0, exports.mockWitness)()], receipt: exports.mockReceipt, geocode: exports.mockGeocode }, exports.mockPathData),
]));
expect(challenge.path[0].result).toBe(Challenge_1.PathResult.SUCCESS);
});
it('first element has witness but no receipt', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [(0, exports.mockWitness)()], geocode: exports.mockGeocode }, exports.mockPathData),
]));
expect(challenge.path[0].result).toBe(Challenge_1.PathResult.SUCCESS);
});
it('second element has witness', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [], geocode: exports.mockGeocode }, exports.mockPathData),
Object.assign({ witnesses: [(0, exports.mockWitness)()], geocode: exports.mockGeocode }, exports.mockPathData),
]));
expect(challenge.path[0].result).toBe(Challenge_1.PathResult.SUCCESS);
expect(challenge.path[1].result).toBe(Challenge_1.PathResult.SUCCESS);
});
it('second element has receipt', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [], receipt: exports.mockReceipt, geocode: exports.mockGeocode }, exports.mockPathData),
Object.assign({ witnesses: [], receipt: exports.mockReceipt, geocode: exports.mockGeocode }, exports.mockPathData),
]));
expect(challenge.path[0].result).toBe(Challenge_1.PathResult.SUCCESS);
expect(challenge.path[1].result).toBe(Challenge_1.PathResult.SUCCESS);
});
it('valid path then skip then witness', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [(0, exports.mockWitness)()], receipt: exports.mockReceipt, geocode: exports.mockGeocode }, exports.mockPathData),
Object.assign({ witnesses: [], geocode: exports.mockGeocode }, exports.mockPathData),
Object.assign({ witnesses: [(0, exports.mockWitness)()], receipt: exports.mockReceipt, geocode: exports.mockGeocode }, exports.mockPathData),
]));
expect(challenge.path[0].result).toBe(Challenge_1.PathResult.SUCCESS);
expect(challenge.path[1].result).toBe(Challenge_1.PathResult.SUCCESS);
expect(challenge.path[2].result).toBe(Challenge_1.PathResult.SUCCESS);
});
});
describe('failed beacon', () => {
it('no witness', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [], geocode: exports.mockGeocode, receipt: exports.mockReceipt }, exports.mockPathData),
]));
expect(challenge.path[0].result).toBe(Challenge_1.PathResult.FAILURE);
});
it('no witness or receipt', () => {
const challenge = new Challenge_1.default((0, exports.challengeJson)([
Object.assign({ witnesses: [], geocode: exports.mockGeocode, receipt: exports.mockReceipt }, exports.mockPathData),
]));
expect(challenge.path[0].result).toBe(Challenge_1.PathResult.FAILURE);
});
});
});
//# sourceMappingURL=Challenge.spec.js.map