Skip to content

Commit

Permalink
test: add RequestHeaderHenerator tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Blackfaded committed Aug 12, 2024
1 parent 844cf64 commit bb7187d
Show file tree
Hide file tree
Showing 9 changed files with 631 additions and 176 deletions.
507 changes: 507 additions & 0 deletions example-app/package-lock.json

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions example-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
"type": "module",
"main": "index.js",
"scripts": {
"dev": "ts-node-esm ./src/index.ts"
"dev": "tsx ./src/index.ts"
},
"author": "",
"license": "MIT",
"devDependencies": {
"ts-node": "10.9.2",
"typescript": "5.5.4",
"pcp-server-nodejs-sdk": "0.0.1"
"pcp-server-nodejs-sdk": "0.0.1",
"tsx": "4.17.0",
"typescript": "5.5.4"
}
}
2 changes: 1 addition & 1 deletion example-app/src/examples/CommerceCaseApiExample.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export class CommerceCaseApiExample {
}

async runPostOne() {
const payload = new CreateCommerceCaseRequest();
const payload: CreateCommerceCaseRequest = {};
const res = await this.client.createCommerceCaseRequest(this.merchantId, payload);
console.log(res);
}
Expand Down
4 changes: 2 additions & 2 deletions example-app/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ const run = async () => {
const commerceCaseApiClientExample = new CommerceCaseApiExample(communicatorConfiguration);

// await commerceCaseApiClientExample.runPostOne();
// await commerceCaseApiClientExample.runGetAll();
await commerceCaseApiClientExample.runGetAll();

// await commerceCaseApiClientExample.runGetOne();

await commerceCaseApiClientExample.runUpdateOne();
// await commerceCaseApiClientExample.runUpdateOne();
};

run();
162 changes: 0 additions & 162 deletions example-app/yarn.lock

This file was deleted.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"format:check": "prettier --check \"src/**/!(*.d).ts\"",
"format:write": "prettier --write \"src/**/!(*.d).ts\"",
"test": "vitest",
"coverage": "vitest run --coverage",
"test:coverage": "vitest run --coverage",
"changelog": "conventional-changelog -i CHANGELOG.md -s -r 0 --config ./changelog.config.cjs"
},
"keywords": [
Expand Down
110 changes: 110 additions & 0 deletions src/RequestHeaderGenerator.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import { expect, describe, test } from 'vitest';
import { RequestHeaderGenerator } from './RequestHeaderGenerator.js';
import { CommunicatorConfiguration } from './CommunicatorConfiguration.js';
import { Headers, type RequestInit } from 'node-fetch';
import { ServerMetaInfo } from './utils/ServerMetaInfo.js';

describe('RequestHeaderGenerator', () => {
const TEST_API_KEY = 'KEY';
const TEST_API_SECRET = 'Super duper Ethan Hunt level secret';
const TEST_HOST = 'awesome-api.com';
const communicatorConfiguration = new CommunicatorConfiguration(TEST_API_KEY, TEST_API_SECRET, TEST_HOST);
test('constructs', () => {
const requestHeaderGenerator = new RequestHeaderGenerator(communicatorConfiguration);
expect(requestHeaderGenerator).toBeDefined();
});
test('testSignatureGenerationForGet', () => {
const requestHeaderGenerator = new RequestHeaderGenerator(communicatorConfiguration);
const date = new Date(1720520499000);
const headers = new Headers();
headers.set(RequestHeaderGenerator.DATE_HEADER_NAME, date.toUTCString());
headers.set(RequestHeaderGenerator.SERVER_META_INFO_HEADER_NAME, 'server fixed');
headers.set(RequestHeaderGenerator.CLIENT_META_INFO_HEADER_NAME, 'client fixed');
const request: RequestInit = {
method: 'GET',
headers,
};
const updatedRequest = requestHeaderGenerator.generateAdditionalRequestHeaders(
'http://awesome-api.com/v1/commerce_cases',
request,
);
const updatedHeaders: Headers = new Headers(updatedRequest.headers!);
const authHeader = updatedHeaders.get(RequestHeaderGenerator.AUTHORIZATION_HEADER_NAME);
expect(authHeader).toEqual('GCS v1HMAC:KEY:ZSq7H19dyhyNGSPY5UgyPwITc5n4QG+zHnNDExIa6A8=');
});

test('testSignatureGenerationWithContentType', () => {
const requestHeaderGenerator = new RequestHeaderGenerator(communicatorConfiguration);
const date = new Date(1720520499000);
const headers = new Headers();
headers.set(RequestHeaderGenerator.CONTENT_TYPE_HEADER_NAME, 'application/json; charset=utf-8');
headers.set(RequestHeaderGenerator.DATE_HEADER_NAME, date.toUTCString());
headers.set(RequestHeaderGenerator.SERVER_META_INFO_HEADER_NAME, 'server fixed');
headers.set(RequestHeaderGenerator.CLIENT_META_INFO_HEADER_NAME, 'client fixed');
const request: RequestInit = {
method: 'POST',
headers,
};
const updatedRequest = requestHeaderGenerator.generateAdditionalRequestHeaders(
'http://awesome-api.com/v1/commerce_cases',
request,
);
const updatedHeaders: Headers = new Headers(updatedRequest.headers!);
const authHeader = updatedHeaders.get(RequestHeaderGenerator.AUTHORIZATION_HEADER_NAME);
expect(authHeader).toEqual('GCS v1HMAC:KEY:c5aNDw4AUxRChugRyN0OmTCs38YLA9E/tR+k0bOQzyk=');
});

test('addADateHeaderIfMissingTest', () => {
const requestHeaderGenerator = new RequestHeaderGenerator(communicatorConfiguration);
const headers = new Headers();
const request: RequestInit = {
method: 'GET',
headers,
};
const updatedRequest = requestHeaderGenerator.generateAdditionalRequestHeaders(
'http://awesome-api.com/v1/commerce_cases',
request,
);
const updatedHeaders: Headers = new Headers(updatedRequest.headers!);
const dateHeader = updatedHeaders.get(RequestHeaderGenerator.DATE_HEADER_NAME);
expect(dateHeader).not.toBeNull();
expect(dateHeader).not.toBe('');
});

test('addServerMetaInfoIfMissingTest', () => {
const requestHeaderGenerator = new RequestHeaderGenerator(communicatorConfiguration);
const headers = new Headers();
const request: RequestInit = {
method: 'GET',
headers,
};
const updatedRequest = requestHeaderGenerator.generateAdditionalRequestHeaders(
'http://awesome-api.com/v1/commerce_cases',
request,
);
const updatedHeaders: Headers = new Headers(updatedRequest.headers!);
const serverMetaInfoHeaderBase64 = updatedHeaders.get(RequestHeaderGenerator.SERVER_META_INFO_HEADER_NAME);
const meta = new ServerMetaInfo();
const jsonString = JSON.stringify(meta);
const expectedAsBase64 = Buffer.from(jsonString, 'utf-8').toString('base64');
expect(serverMetaInfoHeaderBase64).toEqual(expectedAsBase64);
});

test('addServerClientInfoIfMissingTest', () => {
const requestHeaderGenerator = new RequestHeaderGenerator(communicatorConfiguration);
const headers = new Headers();
const request: RequestInit = {
method: 'GET',
headers,
};
const updatedRequest = requestHeaderGenerator.generateAdditionalRequestHeaders(
'http://awesome-api.com/v1/commerce_cases',
request,
);
const updatedHeaders: Headers = new Headers(updatedRequest.headers!);
const clientMetaInfoHeaderBase64 = updatedHeaders.get(RequestHeaderGenerator.CLIENT_META_INFO_HEADER_NAME);
const jsonString = JSON.stringify('[]');
const expectedAsBase64 = Buffer.from(jsonString, 'utf-8').toString('base64');
expect(clientMetaInfoHeaderBase64).toEqual(expectedAsBase64);
});
});
6 changes: 3 additions & 3 deletions src/RequestHeaderGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import { ServerMetaInfo } from './utils/ServerMetaInfo.js';
export class RequestHeaderGenerator {
public static readonly SERVER_META_INFO_HEADER_NAME = 'X-GCS-ServerMetaInfo';
public static readonly CLIENT_META_INFO_HEADER_NAME = 'X-GCS-ClientMetaInfo';
public static readonly AUTHORIZATION_HEADER_NAME = 'Authorization';
public static readonly DATE_HEADER_NAME = 'Date';
public static readonly CONTENT_TYPE_HEADER_NAME = 'Content-Type';
private static readonly ALGORITHM = 'sha256';
private static readonly WHITESPACE_REGEX = /\r?\n[h]*/g;
private static readonly DATE_HEADER_NAME = 'Date';
private static readonly AUTHORIZATION_HEADER_NAME = 'Authorization';
private static readonly CONTENT_TYPE_HEADER_NAME = 'Content-Type';

private readonly config: CommunicatorConfiguration;

Expand Down
6 changes: 3 additions & 3 deletions src/utils/ServerMetaInfo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ export class ServerMetaInfo {
public platformIdentifier: string;
public sdkIdentifier: string;
public sdkCreator: string;
public integrator: string;

constructor() {
constructor(integrator?: string) {
this.platformIdentifier = `${os.platform()}, node version is: ${process.version}`;
this.sdkIdentifier = 'JavaServerSDK/v0.0.2'; // version gets updated with the prepare-release.sh script
this.sdkCreator = 'PAYONE GmbH';

// TODO: what about integrator?
this.integrator = integrator || '';
}
}

0 comments on commit bb7187d

Please sign in to comment.