/* tslint:disable:no-multiline-string*/
/**
* PseGateway test unit file
*/
import { KushkiError } from "@kushki/core";
import { expect, use } from "chai";
import { IDENTIFIERS } from "constant/Identifiers";
import * as faker from "faker";
import { CONTAINER } from "infrastructure/Container";
import { ProcessorTypeEnum } from "infrastructure/ProcessorTypeEnum";
import { PseErrorEnum } from "infrastructure/PseErrorEnum";
import * as jsf from "json-schema-faker";
import * as path from "path";
import { ILambdaGateway } from "repository/ILambdaGateway";
import { IPseGateway } from "repository/IPseGateway";
import { of, throwError } from "rxjs";
import { createSandbox, SinonSandbox, SinonStub } from "sinon";
import * as sinonChai from "sinon-chai";
import * as soap from "soap";
import { Mock } from "ts-mockery";
import { PseCreateTransaction } from "types/pse_create_transaction";
import { PseCreateTransactionRequest } from "types/pse_create_transaction_request";
import { PseFinalizeTransaction } from "types/pse_finalize_transaction";
import { PseGetBankList } from "types/pse_get_bank_list";
import { PseGetTransactionInformationRequest } from "types/pse_get_transaction_information_request";
import { PseGetTransactionInformationResponse } from "types/pse_get_transaction_information_response";
use(sinonChai);
let gateway: IPseGateway;
let gPseGetBankList: PseGetBankList;
let gPseCreateTransactionRequest: PseCreateTransactionRequest;
let gPseCreateTransactionResponse: PseCreateTransaction;
let gGetTransactionInfoRequest: PseGetTransactionInformationRequest;
let gGetTransactionInfoResponse: PseGetTransactionInformationResponse;
let gFinalizeTransaction: PseFinalizeTransaction;
let gSandbox: SinonSandbox;
let gMethodStub: SinonStub;
const SCHEMA_PATH: string = "src/schema";
const ERROR_MESSAGE: string = "this must throw an error";
const XML: string = `
1HolliWeichhweich0@oakley.comFemale
131.241.254.201
2MarchallEasdonmeasdon1@studiopress.comMale
198.209.110.0
3SusannahJanodetsjanodet2@free.frFemale
244.176.41.51
4ElHarwickeharwick3@paypal.comMale31.54.251.93
`;
describe("Pse Gateway", () => {
beforeEach(async () => {
CONTAINER.snapshot();
process.env.PSE_STAGE = "test";
gPseCreateTransactionResponse = await jsf.resolve(
{
$ref: "pse_create_transaction.json",
},
null,
path.resolve(SCHEMA_PATH)
);
gPseCreateTransactionRequest = await jsf.resolve(
{
$ref: "pse_create_transaction_request.json",
},
null,
path.resolve(SCHEMA_PATH)
);
gGetTransactionInfoRequest = await jsf.resolve(
{
$ref: "pse_get_transaction_information_request.json",
},
null,
path.resolve(SCHEMA_PATH)
);
gGetTransactionInfoResponse = await jsf.resolve(
{
$ref: "pse_get_transaction_information_response.json",
},
null,
path.resolve(SCHEMA_PATH)
);
gFinalizeTransaction = await jsf.resolve(
{
$ref: "pse_finalize_transaction.json",
},
null,
path.resolve(SCHEMA_PATH)
);
gSandbox = createSandbox();
gMethodStub = gSandbox.stub();
});
afterEach(() => {
gSandbox.restore();
CONTAINER.restore();
});
it("test getTransactionInformation - successful response", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gGetTransactionInfoResponse.getTransactionInformationResponseBody.transactionState =
"OK";
gMethodStub.returns(of([gGetTransactionInfoResponse]));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.getTransactionInformation(
gGetTransactionInfoRequest,
ProcessorTypeEnum.AGGREGATOR
)
.subscribe(
(data: PseGetTransactionInformationResponse) => {
expect(gGetTransactionInfoResponse).to.be.eql(data);
},
done,
done
);
});
it("test getTransactionInformation - fail", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gGetTransactionInfoResponse.getTransactionInformationResponseBody.transactionState =
"OK";
gMethodStub.returns(throwError("error"));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.getTransactionInformation(
gGetTransactionInfoRequest,
ProcessorTypeEnum.GATEWAY
)
.subscribe(
() => {
done(ERROR_MESSAGE);
},
(error: KushkiError) => {
expect(error.code).to.be.eq("T006");
done();
},
done
);
});
it("test finalizeTransactionPayment - successful response aggregator", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gFinalizeTransaction.finalizeTransactionPaymentResponseInformation.returnCode =
"SUCCESS";
gMethodStub.returns(of(gFinalizeTransaction));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.finalizeTransactionPayment(
{ entityCode: "", trazabilityCode: "" },
ProcessorTypeEnum.AGGREGATOR
)
.subscribe(
(data: boolean) => {
expect(data).to.be.true;
},
done,
done
);
});
it("test finalizeTransactionPayment - successful response gateway", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gFinalizeTransaction.finalizeTransactionPaymentResponseInformation.returnCode =
"SUCCESS";
gMethodStub.returns(of(gFinalizeTransaction));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.finalizeTransactionPayment(
{ entityCode: "", trazabilityCode: "" },
ProcessorTypeEnum.GATEWAY
)
.subscribe(
(data: boolean) => {
expect(data).to.be.true;
},
done,
done
);
});
});
describe("Pse Gateway - call", () => {
beforeEach(async () => {
CONTAINER.snapshot();
process.env.PSE_STAGE = "test";
gFinalizeTransaction = await jsf.resolve(
{
$ref: "pse_finalize_transaction.json",
},
null,
path.resolve(SCHEMA_PATH)
);
gSandbox = createSandbox();
gMethodStub = gSandbox.stub();
});
afterEach(() => {
gSandbox.restore();
CONTAINER.restore();
});
it("test call - successful response gateway", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gSandbox.stub(soap, "createClientAsync").returns(
Promise.resolve({
setSecurity: gSandbox.stub(),
on: gSandbox.stub().callsArgWith(1, XML),
queryAsync: gSandbox.stub().returns(
Promise.resolve({
lorem: "ipsum",
})
),
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.call("query", { lorem: "123" }, ProcessorTypeEnum.GATEWAY)
.subscribe(
(data: object) => {
expect(data).to.have.property("lorem", "ipsum");
},
done,
done
);
});
it("test call - successful response aggregator", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gFinalizeTransaction.finalizeTransactionPaymentResponseInformation.returnCode =
"SUCCESS";
gSandbox.stub(soap, "createClientAsync").returns(
Promise.resolve({
setSecurity: gSandbox.stub(),
on: gSandbox.stub().callsArgWith(1, XML),
queryAsync: gSandbox.stub().returns(
Promise.resolve({
lorem: "ipsum",
})
),
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.call("query", { lorem: "123" }, ProcessorTypeEnum.AGGREGATOR)
.subscribe(
(data: object) => {
expect(data).to.have.property("lorem", "ipsum");
},
done,
done
);
});
it("test call - error response", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gSandbox.stub(soap, "createClientAsync").returns(
Promise.resolve({
setSecurity: gSandbox.stub(),
on: gSandbox.stub().callsArgWith(1, XML),
queryAsync: gSandbox.stub().returns(Promise.reject("error")),
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.call("query", { lorem: "123" }, ProcessorTypeEnum.AGGREGATOR)
.subscribe(
() => {
done("next should not be called");
},
(error: KushkiError) => {
expect(error.code).to.be.eq("T006");
expect(error.getMessage()).to.be.eq(PseErrorEnum.FAIL);
done();
}
);
});
});
describe("Pse Gateway - CreateTransaction", () => {
beforeEach(async () => {
CONTAINER.snapshot();
process.env.PSE_STAGE = "test";
gPseCreateTransactionResponse = await jsf.resolve(
{
$ref: "pse_create_transaction.json",
},
null,
path.resolve(SCHEMA_PATH)
);
gPseCreateTransactionRequest = await jsf.resolve(
{
$ref: "pse_create_transaction_request.json",
},
null,
path.resolve(SCHEMA_PATH)
);
gSandbox = createSandbox();
gMethodStub = gSandbox.stub();
});
afterEach(() => {
gSandbox.restore();
CONTAINER.restore();
});
it("test createTransaction - successful response", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gPseCreateTransactionResponse.createTransactionPaymentResponseInformation.returnCode =
"SUCCESS";
gMethodStub.returns(of([gPseCreateTransactionResponse]));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.createTransactionRequest(
gPseCreateTransactionRequest,
ProcessorTypeEnum.AGGREGATOR
)
.subscribe(
(data: PseCreateTransaction) => {
expect(gPseCreateTransactionResponse).to.be.eql(data);
},
done,
done
);
});
it("test createTransaction - error response FAIL_ENTITYNOTEXISTSORDISABLED", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gPseCreateTransactionResponse.createTransactionPaymentResponseInformation.returnCode =
"FAIL_ENTITYNOTEXISTSORDISABLED";
gMethodStub.returns(of([gPseCreateTransactionResponse]));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.createTransactionRequest(
gPseCreateTransactionRequest,
ProcessorTypeEnum.GATEWAY
)
.subscribe(
() => {
done(ERROR_MESSAGE);
},
(error: KushkiError) => {
expect(error.code).to.be.eq("T006");
expect(error.getMessage()).to.be.eq(
PseErrorEnum.FAIL_ENTITYNOTEXISTSORDISABLED
);
done();
},
done
);
});
it("test createTransaction - error response FAIL_EXCEEDEDLIMIT", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gPseCreateTransactionResponse.createTransactionPaymentResponseInformation.returnCode =
"FAIL_EXCEEDEDLIMIT";
gMethodStub.returns(of([gPseCreateTransactionResponse]));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.createTransactionRequest(
gPseCreateTransactionRequest,
ProcessorTypeEnum.GATEWAY
)
.subscribe(
() => {
done(ERROR_MESSAGE);
},
(error: KushkiError) => {
expect(error.code).to.be.eq("T006");
expect(error.getMessage()).to.be.eq(PseErrorEnum.FAIL_EXCEEDEDLIMIT);
done();
},
done
);
});
it("test createTransaction - error response NOT_AUTHORIZED", (done: Mocha.Done) => {
process.env.PSE_URL = "pse-url";
gPseCreateTransactionResponse.createTransactionPaymentResponseInformation.returnCode =
"SUCCESS";
gPseCreateTransactionResponse.createTransactionPaymentResponseInformation.transactionState =
"NOT_AUTHORIZED";
gMethodStub.returns(of([gPseCreateTransactionResponse]));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.createTransactionRequest(
gPseCreateTransactionRequest,
ProcessorTypeEnum.AGGREGATOR
)
.subscribe(
() => {
done(ERROR_MESSAGE);
},
(error: KushkiError) => {
expect(error.code).to.be.eq("T006");
expect(error.getMessage()).to.be.eq(PseErrorEnum.NOT_AUTHORIZED);
done();
},
done
);
});
});
describe("Pse Gateway - BankList", () => {
beforeEach(async () => {
process.env.PSE_STAGE = "test";
gPseGetBankList = await jsf.resolve(
{
$ref: "pse_get_bank_list.json",
},
null,
path.resolve(SCHEMA_PATH)
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gSandbox = createSandbox();
gMethodStub = gSandbox.stub();
});
afterEach(() => {
gSandbox.restore();
});
it("test getBankList - successful response aggregator", (done: Mocha.Done) => {
const entity_code: string = faker.random
.number({ min: 100000, max: 999999 })
.toString();
process.env.PSE_URL = "pse-url";
gMethodStub.returns(of([gPseGetBankList]));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.getBankListRequest(entity_code, ProcessorTypeEnum.AGGREGATOR)
.subscribe(
(data: PseGetBankList) => {
expect(gPseGetBankList).to.be.eql(data);
},
done,
done
);
});
it("test getBankList - successful response gateway", (done: Mocha.Done) => {
const entity_code: string = faker.random
.number({ min: 100000, max: 999999 })
.toString();
process.env.PSE_URL = "pse-url";
gMethodStub.returns(of([gPseGetBankList]));
CONTAINER.unbind(IDENTIFIERS.LambdaGateway);
CONTAINER.bind(IDENTIFIERS.LambdaGateway).toConstantValue(
Mock.of({
invokeFunction: gMethodStub,
})
);
gateway = CONTAINER.get(IDENTIFIERS.PseGateway);
gateway
.getBankListRequest(entity_code, ProcessorTypeEnum.GATEWAY)
.subscribe(
(data: PseGetBankList) => {
expect(gPseGetBankList).to.be.eql(data);
},
done,
done
);
});
});