PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-api/dist/test/unit
Просмотр файла: api.js
"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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const assert = __importStar(require("assert"));
const src_1 = require("../../src");
describe('bitgo:api unit tests', function () {
describe('handleResponseResult', function () {
it('should return text for text-based responses', function () {
const csvText = `transactionId,date,amount,currency,status
12345,2025-01-15,100.00,USD,completed
67890,2025-01-22,50.50,EUR,completed
13579,2025-02-10,200.00,USD,pending
24680,2025-02-28,75.25,BTC,completed`;
const response = {
status: 200,
header: { 'content-type': 'text/csv' },
text: csvText,
};
const result = (0, src_1.handleResponseResult)()(response);
assert.strictEqual(result, response.text);
});
it('should parse JSON response and return the entire body if no field is specified', function () {
const response = {
status: 200,
header: { 'content-type': 'application/json' },
body: { foo: 'bar', baz: 123 },
};
const result = (0, src_1.handleResponseResult)()(response);
assert.deepStrictEqual(result, response.body);
});
it('should parse JSON response and return the specified field if provided', function () {
const response = {
status: 200,
header: { 'content-type': 'application/json' },
body: { foo: 'bar', baz: 123 },
};
const result = (0, src_1.handleResponseResult)('foo')(response);
assert.strictEqual(result, 'bar');
});
it('should return the entire response for non-JSON and non-text responses', function () {
const response = {
status: 200,
header: { 'content-type': 'image/png' },
blob: 'abcdefghijk',
};
const result = (0, src_1.handleResponseResult)()(response);
assert.strictEqual(result, response);
});
it('should return the full body if this field exists', function () {
const response = {
status: 200,
header: { 'content-type': 'application/octet-stream' },
body: { irrelevant: true },
};
const result = (0, src_1.handleResponseResult)()(response);
assert.strictEqual(result, response.body);
});
});
describe('handleResponseError', function () {
it('should re-throw an error without response property', function () {
const originalError = new Error('Han shot first');
assert.throws(() => (0, src_1.handleResponseError)(originalError), { name: 'Error', message: 'Han shot first' });
});
it('should use the status code if the response has no error text', function () {
const originalError = new Error();
originalError.response = { status: 400 };
assert.throws(() => (0, src_1.handleResponseError)(originalError), {
name: 'ApiResponseError',
message: '400',
invalidToken: false,
needsOTP: false,
result: undefined,
status: 400,
});
});
it('should use the response body.error text', function () {
const originalError = new Error();
originalError.response = { status: 400, body: { error: 'Han shot first' } };
assert.throws(() => (0, src_1.handleResponseError)(originalError), {
name: 'ApiResponseError',
message: 'Han shot first',
invalidToken: false,
needsOTP: false,
result: originalError.response.body,
status: 400,
});
});
it('should parse HTML code from the response text', function () {
const originalError = new Error();
originalError.response = { status: 400, text: ' <b> Han shot first </b>' };
assert.throws(() => (0, src_1.handleResponseError)(originalError), {
name: 'ApiResponseError',
message: '400\nHan shot first',
invalidToken: false,
needsOTP: false,
result: undefined,
status: 400,
});
});
it('should annotate invalidToken property', function () {
const originalError = new Error();
originalError.response = { status: 400, header: { 'x-auth-required': 'true' } };
assert.throws(() => (0, src_1.handleResponseError)(originalError), {
name: 'ApiResponseError',
message: '400',
invalidToken: true,
needsOTP: false,
result: undefined,
status: 400,
});
});
it('should annotate needsOTP property', function () {
const originalError = new Error();
originalError.response = { status: 400, body: { needsOTP: true } };
assert.throws(() => (0, src_1.handleResponseError)(originalError), {
name: 'ApiResponseError',
message: '400',
invalidToken: false,
needsOTP: true,
result: originalError.response.body,
status: 400,
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxtQ0FBc0U7QUFFdEUsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtRQUMvQixFQUFFLENBQUMsNkNBQTZDLEVBQUU7WUFDaEQsTUFBTSxPQUFPLEdBQUc7Ozs7NkNBSXVCLENBQUM7WUFFeEMsTUFBTSxRQUFRLEdBQVE7Z0JBQ3BCLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUU7Z0JBQ3RDLElBQUksRUFBRSxPQUFPO2FBQ2QsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLElBQUEsMEJBQW9CLEdBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0ZBQWdGLEVBQUU7WUFDbkYsTUFBTSxRQUFRLEdBQVE7Z0JBQ3BCLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtnQkFDOUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO2FBQy9CLENBQUM7WUFFRixNQUFNLE1BQU0sR0FBRyxJQUFBLDBCQUFvQixHQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVFQUF1RSxFQUFFO1lBQzFF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QUc7YUFDWixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtZQUN0QyxNQUFNLGFBQWEsR0FBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ25FLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSx5QkFBbUIsRUFBQyxhQUFhLENBQUMsRUFBRTtnQkFDdEQsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxJQUFJO2dCQUNkLE1BQU0sRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUk7Z0JBQ25DLE1BQU0sRUFBRSxHQUFHO2FBQ1osQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBoYW5kbGVSZXNwb25zZUVycm9yLCBoYW5kbGVSZXNwb25zZVJlc3VsdCB9IGZyb20gJy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdiaXRnbzphcGkgdW5pdCB0ZXN0cycsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2hhbmRsZVJlc3BvbnNlUmVzdWx0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRleHQgZm9yIHRleHQtYmFzZWQgcmVzcG9uc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY3N2VGV4dCA9IGB0cmFuc2FjdGlvbklkLGRhdGUsYW1vdW50LGN1cnJlbmN5LHN0YXR1c1xuICAgICAgICAxMjM0NSwyMDI1LTAxLTE1LDEwMC4wMCxVU0QsY29tcGxldGVkXG4gICAgICAgIDY3ODkwLDIwMjUtMDEtMjIsNTAuNTAsRVVSLGNvbXBsZXRlZFxuICAgICAgICAxMzU3OSwyMDI1LTAyLTEwLDIwMC4wMCxVU0QscGVuZGluZ1xuICAgICAgICAyNDY4MCwyMDI1LTAyLTI4LDc1LjI1LEJUQyxjb21wbGV0ZWRgO1xuXG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0ge1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgaGVhZGVyOiB7ICdjb250ZW50LXR5cGUnOiAndGV4dC9jc3YnIH0sXG4gICAgICAgIHRleHQ6IGNzdlRleHQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHJlc3BvbnNlLnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBKU09OIHJlc3BvbnNlIGFuZCByZXR1cm4gdGhlIGVudGlyZSBib2R5IGlmIG5vIGZpZWxkIGlzIHNwZWNpZmllZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBoZWFkZXI6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiB7IGZvbzogJ2JhcicsIGJhejogMTIzIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0LCByZXNwb25zZS5ib2R5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgSlNPTiByZXNwb25zZSBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgZmllbGQgaWYgcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0ge1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgaGVhZGVyOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogeyBmb286ICdiYXInLCBiYXo6IDEyMyB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlUmVzcG9uc2VSZXN1bHQoJ2ZvbycpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsICdiYXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBlbnRpcmUgcmVzcG9uc2UgZm9yIG5vbi1KU09OIGFuZCBub24tdGV4dCByZXNwb25zZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogYW55ID0ge1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgaGVhZGVyOiB7ICdjb250ZW50LXR5cGUnOiAnaW1hZ2UvcG5nJyB9LFxuICAgICAgICBibG9iOiAnYWJjZGVmZ2hpamsnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlUmVzcG9uc2VSZXN1bHQoKShyZXNwb25zZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCByZXNwb25zZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgZnVsbCBib2R5IGlmIHRoaXMgZmllbGQgZXhpc3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIGhlYWRlcjogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSxcbiAgICAgICAgYm9keTogeyBpcnJlbGV2YW50OiB0cnVlIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVSZXNwb25zZVJlc3VsdCgpKHJlc3BvbnNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHJlc3BvbnNlLmJvZHkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGFuZGxlUmVzcG9uc2VFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlLXRocm93IGFuIGVycm9yIHdpdGhvdXQgcmVzcG9uc2UgcHJvcGVydHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yID0gbmV3IEVycm9yKCdIYW4gc2hvdCBmaXJzdCcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKG9yaWdpbmFsRXJyb3IpLCB7IG5hbWU6ICdFcnJvcicsIG1lc3NhZ2U6ICdIYW4gc2hvdCBmaXJzdCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgc3RhdHVzIGNvZGUgaWYgdGhlIHJlc3BvbnNlIGhhcyBubyBlcnJvciB0ZXh0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvcjogYW55ID0gbmV3IEVycm9yKCk7XG4gICAgICBvcmlnaW5hbEVycm9yLnJlc3BvbnNlID0geyBzdGF0dXM6IDQwMCB9O1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKG9yaWdpbmFsRXJyb3IpLCB7XG4gICAgICAgIG5hbWU6ICdBcGlSZXNwb25zZUVycm9yJyxcbiAgICAgICAgbWVzc2FnZTogJzQwMCcsXG4gICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXG4gICAgICAgIG5lZWRzT1RQOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVzcG9uc2UgYm9keS5lcnJvciB0ZXh0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvcjogYW55ID0gbmV3IEVycm9yKCk7XG4gICAgICBvcmlnaW5hbEVycm9yLnJlc3BvbnNlID0geyBzdGF0dXM6IDQwMCwgYm9keTogeyBlcnJvcjogJ0hhbiBzaG90IGZpcnN0JyB9IH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnSGFuIHNob3QgZmlyc3QnLFxuICAgICAgICBpbnZhbGlkVG9rZW46IGZhbHNlLFxuICAgICAgICBuZWVkc09UUDogZmFsc2UsXG4gICAgICAgIHJlc3VsdDogb3JpZ2luYWxFcnJvci5yZXNwb25zZS5ib2R5LFxuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBIVE1MIGNvZGUgZnJvbSB0aGUgcmVzcG9uc2UgdGV4dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3I6IGFueSA9IG5ldyBFcnJvcigpO1xuICAgICAgb3JpZ2luYWxFcnJvci5yZXNwb25zZSA9IHsgc3RhdHVzOiA0MDAsIHRleHQ6ICcgPGI+IEhhbiBzaG90IGZpcnN0IDwvYj4nIH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnNDAwXFxuSGFuIHNob3QgZmlyc3QnLFxuICAgICAgICBpbnZhbGlkVG9rZW46IGZhbHNlLFxuICAgICAgICBuZWVkc09UUDogZmFsc2UsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbm5vdGF0ZSBpbnZhbGlkVG9rZW4gcHJvcGVydHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yOiBhbnkgPSBuZXcgRXJyb3IoKTtcbiAgICAgIG9yaWdpbmFsRXJyb3IucmVzcG9uc2UgPSB7IHN0YXR1czogNDAwLCBoZWFkZXI6IHsgJ3gtYXV0aC1yZXF1aXJlZCc6ICd0cnVlJyB9IH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhhbmRsZVJlc3BvbnNlRXJyb3Iob3JpZ2luYWxFcnJvciksIHtcbiAgICAgICAgbmFtZTogJ0FwaVJlc3BvbnNlRXJyb3InLFxuICAgICAgICBtZXNzYWdlOiAnNDAwJyxcbiAgICAgICAgaW52YWxpZFRva2VuOiB0cnVlLFxuICAgICAgICBuZWVkc09UUDogZmFsc2UsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbm5vdGF0ZSBuZWVkc09UUCBwcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3I6IGFueSA9IG5ldyBFcnJvcigpO1xuICAgICAgb3JpZ2luYWxFcnJvci5yZXNwb25zZSA9IHsgc3RhdHVzOiA0MDAsIGJvZHk6IHsgbmVlZHNPVFA6IHRydWUgfSB9O1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKG9yaWdpbmFsRXJyb3IpLCB7XG4gICAgICAgIG5hbWU6ICdBcGlSZXNwb25zZUVycm9yJyxcbiAgICAgICAgbWVzc2FnZTogJzQwMCcsXG4gICAgICAgIGludmFsaWRUb2tlbjogZmFsc2UsXG4gICAgICAgIG5lZWRzT1RQOiB0cnVlLFxuICAgICAgICByZXN1bHQ6IG9yaWdpbmFsRXJyb3IucmVzcG9uc2UuYm9keSxcbiAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!