@entangle-labs/udf-sdk
Version:
SDK for interacting with UDF Oracle
117 lines (116 loc) • 6.42 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const sinon_1 = __importDefault(require("sinon"));
const sdk_1 = __importDefault(require("./sdk"));
describe("UdfSdk", () => {
let sdk;
let fetchStub;
const mockResponse = {
update_call_data: "0x55444646024e474c2f555344000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000001ac168f5571b70300000000000000000000000000000000000000000000000000000000676bf5177cfce9425e6b3969ecc44b4270e729212e9decc7f79d57822da90491e3922daa4eedfb9ce49fdb01b52147ef89e425c24328cb87e2ed5e8d802f3cff719c15441b00000000000000000000000000000000000000000000000001ac168f5571b70300000000000000000000000000000000000000000000000000000000676bf50efdbab27df5b290476721d1441ad2737a15188f5fa9c241d35038f3afd288ec780d5d10898fcf1e547523652e6448692deee42a783a7a55ce310903e1bda0ea741b00000000000000000000000000000000000000000000000001ac168f5571b70300000000000000000000000000000000000000000000000000000000676bf51af433b2c959268c83354f4283fd1643a04c844640956d95c3fc8a8532363ed3035973edb54ea4cdfc2b943f89907172b59bd2ff6fafcce544a07e3091e35c24141b4554482f55534400000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000bbc3abdf2b4c38918400000000000000000000000000000000000000000000000000000000676bf51a353a8411801893d6944ac2d12a05f49655d43803382b87edbf4d08b555ce4d6f33faf5f0bd29e3ea1c2c6df7c6130e50be8f88e1639cb001fe21ddd258dd4c7c1c0000000000000000000000000000000000000000000000bbc8d768ae124885a600000000000000000000000000000000000000000000000000000000676bf517edc279536ed2be6c35d3e81caa815cc6aaec96cb97f3ec0ce9c6c739cf4eeb687477c07fdd3bafe3640026ef4f13f222866ec2df202bbe606898d27739112f691b0000000000000000000000000000000000000000000000bbd843133296b9cee400000000000000000000000000000000000000000000000000000000676bf50e6356fafa76ad053de2e5908af6806055b0a5553588fcc9b10463e57db20b46b42941a8cdcceab230a764d4918af097020857481f3ce1672102fde4ff34b132ea1b",
feeds: [
{
feed_key: "NGL/USD",
votes: [
{
Value: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAawWj1VxtwM=",
Timestamp: 1735128343,
Publisher: "0x2e1f4AE4195f25bA62351f9Dc8A7F7D65743B196",
Signature: {
R: "0x7cfce9425e6b3969ecc44b4270e729212e9decc7f79d57822da90491e3922daa",
S: "0x4eedfb9ce49fdb01b52147ef89e425c24328cb87e2ed5e8d802f3cff719c1544",
V: 27,
},
},
{
Value: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAawWj1VxtwM=",
Timestamp: 1735128334,
Publisher: "0x5a598D1d71b932ed3bF880AE00c9d44494bd75d0",
Signature: {
R: "0xfdbab27df5b290476721d1441ad2737a15188f5fa9c241d35038f3afd288ec78",
S: "0x0d5d10898fcf1e547523652e6448692deee42a783a7a55ce310903e1bda0ea74",
V: 27,
},
},
{
Value: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAawWj1VxtwM=",
Timestamp: 1735128346,
Publisher: "0x6d5da0218C26E4B9cec27931ECC3D7DF58cC7750",
Signature: {
R: "0xf433b2c959268c83354f4283fd1643a04c844640956d95c3fc8a8532363ed303",
S: "0x5973edb54ea4cdfc2b943f89907172b59bd2ff6fafcce544a07e3091e35c2414",
V: 27,
},
},
],
},
],
};
beforeEach(() => {
sdk = new sdk_1.default("https://test.com");
// Setup fetch stub
global.fetch = global.fetch || (() => Promise.resolve());
fetchStub = sinon_1.default.stub(global, "fetch").callsFake(() => Promise.resolve({
ok: true,
json: () => Promise.resolve(mockResponse),
}));
});
afterEach(() => {
sinon_1.default.restore();
});
describe("getCallData", () => {
it("should return call data", async () => {
const callData = await sdk.getCallData(["ENGL/USD"]);
(0, chai_1.expect)(callData).to.equal(mockResponse.update_call_data);
});
});
describe("getVotes", () => {
it("should return decoded votes", async () => {
const votes = await sdk.getVotes(["NGL/USD"]);
(0, chai_1.expect)(votes).to.have.lengthOf(3);
(0, chai_1.expect)(votes[0].value).to.equal(120496094901810947n);
});
});
describe("getMedian", () => {
it("should calculate median correctly", async () => {
const median = await sdk.getMedian("NGL/USD");
(0, chai_1.expect)(median).to.equal(120496094901810947n);
});
it("should throw error when no votes available", async () => {
fetchStub.callsFake(() => Promise.resolve({
ok: true,
json: () => Promise.resolve({
...mockResponse,
feeds: [{ feed_key: "NGL/USD", votes: [] }],
}),
}));
try {
await sdk.getMedian("NGL/USD");
chai_1.expect.fail("Should have thrown an error");
}
catch (error) {
///@ts-ignore
(0, chai_1.expect)(error.message).to.include("No votes provided for median calculation");
}
});
});
describe("Error handling", () => {
it("should handle fetch errors", async () => {
fetchStub.callsFake(() => Promise.resolve({
ok: false,
status: 404,
}));
try {
await sdk.getCallData(["ETH/USD"]);
chai_1.expect.fail("Should have thrown an error");
}
catch (error) {
///@ts-ignore
(0, chai_1.expect)(error.message).to.include("HTTP error! status: 404");
}
});
});
});