import { expect } from 'chai'; import * as sinon from 'sinon'; const sandbox = sinon.createSandbox(); import * as requestPost from '../../src/request/post'; import * as requestPut from '../../src/request/put'; import * as requestGet from '../../src/request/get'; import * as requestHead from '../../src/request/head'; import * as requestDelete from '../../src/request/delete'; import { Base } from '../../src/base'; import { TestConfiguration } from '../../src/configuration'; describe('Base SDK ', () => { let requestPostStub: any; let requestPutStub: any; let requestGetStub: any; let requestHeadStub: any; let requestDeleteStub: any; let config; let base: any; let baseWithAdvancedTracing: any; describe('Tracing headers', () => { async function testRequestMethod(base: any, wrapperFunction: any, stub: any, expectedTracingHeaders: any, customOption?: any) { const wrappedFunction = stub.returns(Promise.resolve(true)); const originalHttpOptions = customOption ? customOption : { url: 'http://www.ft.com', key: 'SomeKey', body: `Somebody for ${wrapperFunction}` }; const expectedEnrichedOptions = Object.assign({}, originalHttpOptions, expectedTracingHeaders); await base[wrapperFunction](originalHttpOptions); const actual = wrappedFunction.getCall(0).args[0]; expect(actual).to.deep.eq(expectedEnrichedOptions); } beforeEach(() => { requestPostStub = sandbox.stub(requestPost, 'post'); requestPutStub = sandbox.stub(requestPut, 'put'); requestGetStub = sandbox.stub(requestGet, 'get'); requestHeadStub = sandbox.stub(requestHead, 'head'); requestDeleteStub = sandbox.stub(requestDelete, 'requestDelete'); config = new TestConfiguration({ originSystemId: 'n-membership-sdk-tests', }); base = new Base(config); baseWithAdvancedTracing = new Base(config, { xRequestId: '123ABC' }); baseWithAdvancedTracing.setOriginUser('uuid123'); }); afterEach(function () { sandbox.restore(); }); context('are added to track the Origin System', () => { const expectedTracingHeaders = { additionalHeaders: { 'X-Origin-System-Id': 'n-membership-sdk-tests', } }; it('for requestPost', async () => { await testRequestMethod(base, 'requestPost', requestPostStub, expectedTracingHeaders); }); it('for requestPut', async () => { await testRequestMethod(base, 'requestPut', requestPutStub, expectedTracingHeaders); }); it('for requestGet', async () => { await testRequestMethod(base, 'requestGet', requestGetStub, expectedTracingHeaders); }); it('for requestHead', async () => { await testRequestMethod(base, 'requestHead', requestHeadStub, expectedTracingHeaders); }); it('for requestDelete', async () => { await testRequestMethod(base, 'requestDelete', requestDeleteStub, expectedTracingHeaders); }); }); context('are added to track User ID and X-Request-Id (generated by the CDN for every request)', () => { const expectedTracingHeaders = { additionalHeaders: { 'X-Origin-System-Id': 'n-membership-sdk-tests', 'X-Origin-User': 'uuid123', 'X-Request-Id': '123ABC' } }; it('for requestPost', async () => { await testRequestMethod(baseWithAdvancedTracing, 'requestPost', requestPostStub, expectedTracingHeaders); }); it('for requestPut', async () => { await testRequestMethod(baseWithAdvancedTracing, 'requestPut', requestPutStub, expectedTracingHeaders); }); it('for requestGet', async () => { await testRequestMethod(baseWithAdvancedTracing, 'requestGet', requestGetStub, expectedTracingHeaders); }); it('for requestHead', async () => { await testRequestMethod(baseWithAdvancedTracing, 'requestHead', requestHeadStub, expectedTracingHeaders); }); it('for requestDelete', async () => { await testRequestMethod(baseWithAdvancedTracing, 'requestDelete', requestDeleteStub, expectedTracingHeaders); }); }); context('can be overwritten via additional Headers', () => { const expectedTracingHeaders = { additionalHeaders: { 'X-Origin-System-Id': 'override the system!', 'X-Origin-User': 'I own you', 'X-Request-Id': 'Your system is exploited' } }; const customOptions = { url: 'http://www.ft.com', key: 'SomeKey', body: 'Custom options', additionalHeaders: expectedTracingHeaders.additionalHeaders }; it('for requestPost', async () => { await testRequestMethod(baseWithAdvancedTracing, 'requestPost', requestPostStub, expectedTracingHeaders, customOptions); }); }); }); });