PHP WebShell

Текущая директория: /opt/BitGoJS/modules/express/dist/test/unit/clientRoutes

Просмотр файла: index.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("should");
const sinon = require("sinon");
const bitgo_1 = require("bitgo");
const clientRoutes_1 = require("../../../src/clientRoutes");
describe('common methods', () => {
    const sandbox = sinon.createSandbox();
    describe('redirectRequest', () => {
        let bitgo;
        let req;
        let next;
        beforeEach(() => {
            bitgo = new bitgo_1.BitGo({ env: 'test' });
            req = {
                body: {},
                params: {},
                bitgo,
            };
            next = () => undefined;
        });
        afterEach(() => {
            sandbox.verifyAndRestore();
        });
        it('should handle GET request and return status and body', async () => {
            const url = 'https://example.com/api';
            const response = { res: { statusCode: 200 }, result: async () => ({ success: true }) };
            sandbox
                .stub(bitgo, 'get')
                .withArgs(url)
                .returns(response);
            const result = await (0, clientRoutes_1.redirectRequest)(bitgo, 'GET', url, req, next);
            result.status.should.equal(200);
            result.body.should.deepEqual({ success: true });
        });
        it('should handle POST request and return status and body', async () => {
            const url = 'https://example.com/api';
            req.body = { data: 'test' };
            const response = { res: { statusCode: 201 }, result: async () => ({ success: true }) };
            sandbox
                .stub(bitgo, 'post')
                .withArgs(url)
                .returns({ send: () => response });
            const result = await (0, clientRoutes_1.redirectRequest)(bitgo, 'POST', url, req, next);
            result.status.should.equal(201);
            result.body.should.deepEqual({ success: true });
        });
        it('should handle error response and return status and body', async () => {
            const url = 'https://example.com/api';
            const response = {
                result: async () => {
                    throw new bitgo_1.ApiResponseError('Bad Request', 400);
                },
            };
            sandbox
                .stub(bitgo, 'get')
                .withArgs(url)
                .returns(response);
            await (0, clientRoutes_1.redirectRequest)(bitgo, 'GET', url, req, next).should.be.rejectedWith(bitgo_1.ApiResponseError, {
                message: 'Bad Request',
                status: 400,
            });
        });
    });
    describe('promiseWrapper', () => {
        afterEach(() => {
            sandbox.restore();
        });
        it('should handle successful request', async () => {
            const handler = sandbox.stub().resolves({ status: 200, body: { success: true } });
            const req = {};
            const res = {
                status: sandbox.stub().returnsThis(),
                send: sandbox.stub().returnsThis(),
            };
            const next = sandbox.stub();
            await (0, clientRoutes_1.promiseWrapper)(handler)(req, res, next);
            res.status.calledWith(200).should.be.true();
            res.send.calledWith({ success: true }).should.be.true();
        });
        it('should handle successful request with status 202', async () => {
            const handler = sandbox.stub().resolves({ status: 202, body: { success: true } });
            const req = {};
            const res = {
                status: sandbox.stub().returnsThis(),
                send: sandbox.stub().returnsThis(),
            };
            const next = sandbox.stub();
            await (0, clientRoutes_1.promiseWrapper)(handler)(req, res, next);
            res.status.calledWith(202).should.be.true();
            res.send.calledWith({ success: true }).should.be.true();
        });
        it('should handle successful request with default status', async () => {
            const handler = sandbox.stub().resolves({ success: true });
            const req = {};
            const res = {
                status: sandbox.stub().returnsThis(),
                send: sandbox.stub().returnsThis(),
            };
            const next = sandbox.stub();
            await (0, clientRoutes_1.promiseWrapper)(handler)(req, res, next);
            res.status.calledWith(200).should.be.true();
            res.send.calledWith({ success: true }).should.be.true();
        });
        it('should handle error request', async () => {
            const handler = sandbox.stub().rejects(new Error('Test error'));
            const req = {};
            const res = {
                status: sandbox.stub().returnsThis(),
                send: sandbox.stub().returnsThis(),
            };
            const next = sandbox.stub();
            await (0, clientRoutes_1.promiseWrapper)(handler)(req, res, next);
            res.status.calledWith(500).should.be.true();
            res.send.calledWithMatch((result) => result.message === 'Test error').should.be.true();
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvY2xpZW50Um91dGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0JBQWdCO0FBQ2hCLCtCQUErQjtBQUUvQixpQ0FBZ0Q7QUFDaEQsNERBQTRFO0FBRTVFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7SUFDOUIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsSUFBSSxLQUFZLENBQUM7UUFDakIsSUFBSSxHQUFvQixDQUFDO1FBQ3pCLElBQUksSUFBMEIsQ0FBQztRQUUvQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsS0FBSyxHQUFHLElBQUksYUFBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbkMsR0FBRyxHQUFHO2dCQUNKLElBQUksRUFBRSxFQUFFO2dCQUNSLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUs7YUFDYSxDQUFDO1lBQ3JCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2IsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0RBQXNELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEUsTUFBTSxHQUFHLEdBQUcseUJBQXlCLENBQUM7WUFDdEMsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkYs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LE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDM0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sR0FBRyxHQUFRLEVBQUUsQ0FBQztZQUNwQixNQUFNLEdBQUcsR0FBUTtnQkFDZixNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtnQkFDcEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDbkMsQ0FBQztZQUNGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUU1QixNQUFNLElBQUEsNkJBQWMsRUFBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTlDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgKiBhcyBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VFcnJvciwgQml0R28gfSBmcm9tICdiaXRnbyc7XG5pbXBvcnQgeyBwcm9taXNlV3JhcHBlciwgcmVkaXJlY3RSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NsaWVudFJvdXRlcyc7XG5cbmRlc2NyaWJlKCdjb21tb24gbWV0aG9kcycsICgpID0+IHtcbiAgY29uc3Qgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgZGVzY3JpYmUoJ3JlZGlyZWN0UmVxdWVzdCcsICgpID0+IHtcbiAgICBsZXQgYml0Z286IEJpdEdvO1xuICAgIGxldCByZXE6IGV4cHJlc3MuUmVxdWVzdDtcbiAgICBsZXQgbmV4dDogZXhwcmVzcy5OZXh0RnVuY3Rpb247XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGJpdGdvID0gbmV3IEJpdEdvKHsgZW52OiAndGVzdCcgfSk7XG4gICAgICByZXEgPSB7XG4gICAgICAgIGJvZHk6IHt9LFxuICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICBiaXRnbyxcbiAgICAgIH0gYXMgZXhwcmVzcy5SZXF1ZXN0O1xuICAgICAgbmV4dCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICBzYW5kYm94LnZlcmlmeUFuZFJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIEdFVCByZXF1ZXN0IGFuZCByZXR1cm4gc3RhdHVzIGFuZCBib2R5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vZXhhbXBsZS5jb20vYXBpJztcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0geyByZXM6IHsgc3RhdHVzQ29kZTogMjAwIH0sIHJlc3VsdDogYXN5bmMgKCkgPT4gKHsgc3VjY2VzczogdHJ1ZSB9KSB9O1xuICAgICAgc2FuZGJveFxuICAgICAgICAuc3R1YihiaXRnbywgJ2dldCcpXG4gICAgICAgIC53aXRoQXJncyh1cmwpXG4gICAgICAgIC5yZXR1cm5zKHJlc3BvbnNlIGFzIGFueSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlyZWN0UmVxdWVzdChiaXRnbywgJ0dFVCcsIHVybCwgcmVxLCBuZXh0KTtcbiAgICAgIHJlc3VsdC5zdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICByZXN1bHQuYm9keS5zaG91bGQuZGVlcEVxdWFsKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIFBPU1QgcmVxdWVzdCBhbmQgcmV0dXJuIHN0YXR1cyBhbmQgYm9keScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2V4YW1wbGUuY29tL2FwaSc7XG4gICAgICByZXEuYm9keSA9IHsgZGF0YTogJ3Rlc3QnIH07XG4gICAgICBjb25zdCByZXNwb25zZSA9IHsgcmVzOiB7IHN0YXR1c0NvZGU6IDIwMSB9LCByZXN1bHQ6IGFzeW5jICgpID0+ICh7IHN1Y2Nlc3M6IHRydWUgfSkgfTtcbiAgICAgIHNhbmRib3hcbiAgICAgICAgLnN0dWIoYml0Z28sICdwb3N0JylcbiAgICAgICAgLndpdGhBcmdzKHVybClcbiAgICAgICAgLnJldHVybnMoeyBzZW5kOiAoKSA9PiByZXNwb25zZSB9IGFzIGFueSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlyZWN0UmVxdWVzdChiaXRnbywgJ1BPU1QnLCB1cmwsIHJlcSwgbmV4dCk7XG4gICAgICByZXN1bHQuc3RhdHVzLnNob3VsZC5lcXVhbCgyMDEpO1xuICAgICAgcmVzdWx0LmJvZHkuc2hvdWxkLmRlZXBFcXVhbCh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlcnJvciByZXNwb25zZSBhbmQgcmV0dXJuIHN0YXR1cyBhbmQgYm9keScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2V4YW1wbGUuY29tL2FwaSc7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgcmVzdWx0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFwaVJlc3BvbnNlRXJyb3IoJ0JhZCBSZXF1ZXN0JywgNDAwKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBzYW5kYm94XG4gICAgICAgIC5zdHViKGJpdGdvLCAnZ2V0JylcbiAgICAgICAgLndpdGhBcmdzKHVybClcbiAgICAgICAgLnJldHVybnMocmVzcG9uc2UgYXMgYW55KTtcblxuICAgICAgYXdhaXQgcmVkaXJlY3RSZXF1ZXN0KGJpdGdvLCAnR0VUJywgdXJsLCByZXEsIG5leHQpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoQXBpUmVzcG9uc2VFcnJvciwge1xuICAgICAgICBtZXNzYWdlOiAnQmFkIFJlcXVlc3QnLFxuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJvbWlzZVdyYXBwZXInLCAoKSA9PiB7XG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIHN1Y2Nlc3NmdWwgcmVxdWVzdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBzYW5kYm94LnN0dWIoKS5yZXNvbHZlcyh7IHN0YXR1czogMjAwLCBib2R5OiB7IHN1Y2Nlc3M6IHRydWUgfSB9KTtcbiAgICAgIGNvbnN0IHJlcTogYW55ID0ge307XG4gICAgICBjb25zdCByZXM6IGFueSA9IHtcbiAgICAgICAgc3RhdHVzOiBzYW5kYm94LnN0dWIoKS5yZXR1cm5zVGhpcygpLFxuICAgICAgICBzZW5kOiBzYW5kYm94LnN0dWIoKS5yZXR1cm5zVGhpcygpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG5leHQgPSBzYW5kYm94LnN0dWIoKTtcblxuICAgICAgYXdhaXQgcHJvbWlzZVdyYXBwZXIoaGFuZGxlcikocmVxLCByZXMsIG5leHQpO1xuXG4gICAgICByZXMuc3RhdHVzLmNhbGxlZFdpdGgoMjAwKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgcmVzLnNlbmQuY2FsbGVkV2l0aCh7IHN1Y2Nlc3M6IHRydWUgfSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHN1Y2Nlc3NmdWwgcmVxdWVzdCB3aXRoIHN0YXR1cyAyMDInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gc2FuZGJveC5zdHViKCkucmVzb2x2ZXMoeyBzdGF0dXM6IDIwMiwgYm9keTogeyBzdWNjZXNzOiB0cnVlIH0gfSk7XG4gICAgICBjb25zdCByZXE6IGFueSA9IHt9O1xuICAgICAgY29uc3QgcmVzOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogc2FuZGJveC5zdHViKCkucmV0dXJuc1RoaXMoKSxcbiAgICAgICAgc2VuZDogc2FuZGJveC5zdHViKCkucmV0dXJuc1RoaXMoKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBuZXh0ID0gc2FuZGJveC5zdHViKCk7XG5cbiAgICAgIGF3YWl0IHByb21pc2VXcmFwcGVyKGhhbmRsZXIpKHJlcSwgcmVzLCBuZXh0KTtcblxuICAgICAgcmVzLnN0YXR1cy5jYWxsZWRXaXRoKDIwMikuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJlcy5zZW5kLmNhbGxlZFdpdGgoeyBzdWNjZXNzOiB0cnVlIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzdWNjZXNzZnVsIHJlcXVlc3Qgd2l0aCBkZWZhdWx0IHN0YXR1cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBzYW5kYm94LnN0dWIoKS5yZXNvbHZlcyh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICBjb25zdCByZXE6IGFueSA9IHt9O1xuICAgICAgY29uc3QgcmVzOiBhbnkgPSB7XG4gICAgICAgIHN0YXR1czogc2FuZGJveC5zdHViKCkucmV0dXJuc1RoaXMoKSxcbiAgICAgICAgc2VuZDogc2FuZGJveC5zdHViKCkucmV0dXJuc1RoaXMoKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBuZXh0ID0gc2FuZGJveC5zdHViKCk7XG5cbiAgICAgIGF3YWl0IHByb21pc2VXcmFwcGVyKGhhbmRsZXIpKHJlcSwgcmVzLCBuZXh0KTtcblxuICAgICAgcmVzLnN0YXR1cy5jYWxsZWRXaXRoKDIwMCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJlcy5zZW5kLmNhbGxlZFdpdGgoeyBzdWNjZXNzOiB0cnVlIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlcnJvciByZXF1ZXN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHNhbmRib3guc3R1YigpLnJlamVjdHMobmV3IEVycm9yKCdUZXN0IGVycm9yJykpO1xuICAgICAgY29uc3QgcmVxOiBhbnkgPSB7fTtcbiAgICAgIGNvbnN0IHJlczogYW55ID0ge1xuICAgICAgICBzdGF0dXM6IHNhbmRib3guc3R1YigpLnJldHVybnNUaGlzKCksXG4gICAgICAgIHNlbmQ6IHNhbmRib3guc3R1YigpLnJldHVybnNUaGlzKCksXG4gICAgICB9O1xuICAgICAgY29uc3QgbmV4dCA9IHNhbmRib3guc3R1YigpO1xuXG4gICAgICBhd2FpdCBwcm9taXNlV3JhcHBlcihoYW5kbGVyKShyZXEsIHJlcywgbmV4dCk7XG5cbiAgICAgIHJlcy5zdGF0dXMuY2FsbGVkV2l0aCg1MDApLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICByZXMuc2VuZC5jYWxsZWRXaXRoTWF0Y2goKHJlc3VsdDogYW55KSA9PiByZXN1bHQubWVzc2FnZSA9PT0gJ1Rlc3QgZXJyb3InKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19

Выполнить команду


Для локальной разработки. Не используйте в интернете!