@pact-foundation/pact-core
Version:
Core of @pact-foundation/pact. You almost certainly don't want to depend on this directly.
235 lines • 11.4 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ffiFnMapping = exports.orderOfExecution = void 0;
const fs = require("fs");
const url = require("url");
const url_1 = require("url");
const logger_1 = __importDefault(require("../../logger"));
const types_1 = require("./types");
const DEFAULT_TIMEOUT = 30000;
const objArrayToStringArray = (obj) => obj.map((o) => JSON.stringify(o));
exports.orderOfExecution = {
pactffiVerifierSetProviderInfo: 1,
pactffiVerifierSetFilterInfo: 2,
pactffiVerifierSetProviderState: 3,
pactffiVerifierSetVerificationOptions: 4,
pactffiVerifierSetPublishOptions: 5,
pactffiVerifierSetConsumerFilters: 6,
pactffiVerifierSetFailIfNoPactsFound: 7,
pactffiVerifierAddCustomHeader: 8,
pactffiVerifierAddDirectorySource: 9,
pactffiVerifierBrokerSourceWithSelectors: 10,
pactffiVerifierAddProviderTransport: 11,
};
exports.ffiFnMapping = {
pactffiVerifierAddCustomHeader: {
validateAndExecute(ffi, handle, options) {
const messages = [];
if (options.customProviderHeaders) {
if (Array.isArray(options.customProviderHeaders)) {
options.customProviderHeaders.forEach((item) => {
const parts = item.split(':');
if (parts.length !== 2) {
messages.push(`${item} is not a valid custom header. Must be in the format 'Header-Name: Value'`);
}
else {
ffi.pactffiVerifierAddCustomHeader(handle, parts[0], parts[1]);
}
});
}
else if (options.customProviderHeaders) {
Object.entries(options.customProviderHeaders).forEach(([key, value]) => {
ffi.pactffiVerifierAddCustomHeader(handle, key, value);
});
}
if (messages.length > 0) {
return { status: types_1.FnValidationStatus.FAIL, messages };
}
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: ['No customProviderHeaders option provided'],
};
},
},
pactffiVerifierAddDirectorySource: {
validateAndExecute(ffi, handle, options) {
const messages = [];
if (options.pactUrls) {
options.pactUrls.forEach((file) => {
logger_1.default.debug(`checking source type of given pactUrl: ${file}`);
if (/https?:/.test(url.parse(file).protocol || '')) {
try {
const u = new url_1.URL(file);
if (u.hostname) {
logger_1.default.debug(`adding ${file} as a Url source`);
ffi.pactffiVerifierUrlSource(handle, file, options.pactBrokerUsername ||
process.env['PACT_BROKER_USERNAME'] ||
'', options.pactBrokerPassword ||
process.env['PACT_BROKER_PASSWORD'] ||
'', options.pactBrokerToken ||
process.env['PACT_BROKER_TOKEN'] ||
'');
}
}
catch {
messages.push(`${file} is not a valid URL`);
}
}
else {
try {
const f = fs.lstatSync(file);
if (f.isDirectory()) {
logger_1.default.debug(`adding ${file} as Directory source`);
ffi.pactffiVerifierAddDirectorySource(handle, file);
}
else if (f.isFile() || f.isSymbolicLink()) {
logger_1.default.debug(`adding ${file} as File source`);
ffi.pactffiVerifierAddFileSource(handle, file);
}
}
catch {
messages.push(`'${file}' does not exist, or is not a file or directory`);
}
}
});
if (messages.length > 0) {
return { status: types_1.FnValidationStatus.FAIL, messages };
}
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: ['No pactUrls option provided'],
};
},
},
pactffiVerifierBrokerSourceWithSelectors: {
validateAndExecute(ffi, handle, opts) {
const brokerUrl = opts.pactBrokerUrl || process.env['PACT_BROKER_BASE_URL'];
if (brokerUrl && opts.provider) {
ffi.pactffiVerifierBrokerSourceWithSelectors(handle, brokerUrl, opts.pactBrokerUsername || process.env['PACT_BROKER_USERNAME'] || '', opts.pactBrokerPassword || process.env['PACT_BROKER_PASSWORD'] || '', opts.pactBrokerToken || process.env['PACT_BROKER_TOKEN'] || '', opts.enablePending || false, opts.includeWipPactsSince || '', opts.providerVersionTags || [], opts.providerVersionBranch || opts.providerBranch || '', opts.consumerVersionSelectors
? objArrayToStringArray(opts.consumerVersionSelectors)
: [], opts.consumerVersionTags || []);
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: [
'No pactBrokerUrl option / PACT_BROKER_BASE_URL set, or no provider option set',
],
};
},
},
pactffiVerifierSetConsumerFilters: {
validateAndExecute(ffi, handle, options) {
if (options.consumerFilters && options.consumerFilters.length > 0) {
ffi.pactffiVerifierSetConsumerFilters(handle, options.consumerFilters);
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: [
'Either no consumerFilters option provided, or the array was empty',
],
};
},
},
pactffiVerifierSetFailIfNoPactsFound: {
validateAndExecute(ffi, handle, options) {
if (options.failIfNoPactsFound !== undefined) {
ffi.pactffiVerifierSetFailIfNoPactsFound(handle, options.failIfNoPactsFound);
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: ['No failIfNoPactsFound option provided'],
};
},
},
pactffiVerifierSetFilterInfo: {
validateAndExecute(ffi, handle) {
if (process.env['PACT_DESCRIPTION'] ||
process.env['PACT_PROVIDER_STATE'] ||
process.env['PACT_PROVIDER_NO_STATE']) {
const filterDescription = process.env['PACT_DESCRIPTION'] || '';
const filterState = process.env['PACT_PROVIDER_STATE'] || '';
const filterNoState = !!process.env['PACT_PROVIDER_NO_STATE'];
ffi.pactffiVerifierSetFilterInfo(handle, filterDescription, filterState, filterNoState);
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: [
'None of PACT_DESCRIPTION, PACT_PROVIDER_STATE or PACT_PROVIDER_NO_STATE were set in the environment',
],
};
},
},
pactffiVerifierSetProviderInfo: {
validateAndExecute(ffi, handle, options) {
const uri = new url_1.URL(options.providerBaseUrl);
ffi.pactffiVerifierSetProviderInfo(handle, options.provider || '', uri.protocol.split(':')[0], uri.hostname, parseInt(uri.port, 10), uri.pathname);
return { status: types_1.FnValidationStatus.SUCCESS };
},
},
pactffiVerifierSetProviderState: {
validateAndExecute(ffi, handle, options) {
if (options.providerStatesSetupUrl) {
ffi.pactffiVerifierSetProviderState(handle, options.providerStatesSetupUrl, true, true);
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: ['No failIfNoPactsFound option provided'],
};
},
},
pactffiVerifierSetPublishOptions: {
validateAndExecute(ffi, handle, options) {
if ((options.publishVerificationResult ||
process.env['PACT_BROKER_PUBLISH_VERIFICATION_RESULTS']) &&
options.providerVersion) {
ffi.pactffiVerifierSetPublishOptions(handle, options.providerVersion, options.buildUrl || '', options.providerVersionTags || [], options.providerVersionBranch || options.providerBranch || '');
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: [
'No publishVerificationResult option / PACT_BROKER_PUBLISH_VERIFICATION_RESULTS set, or no providerVersion option',
],
};
},
},
pactffiVerifierSetVerificationOptions: {
validateAndExecute(ffi, handle, opts) {
if (opts.disableSslVerification || opts.timeout) {
ffi.pactffiVerifierSetVerificationOptions(handle, opts.disableSslVerification || false, opts.timeout || DEFAULT_TIMEOUT);
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: ['No disableSslVerification or timeout set'],
};
},
},
pactffiVerifierAddProviderTransport: {
validateAndExecute(ffi, handle, options) {
if (Array.isArray(options.transports)) {
options.transports.forEach((transport) => {
ffi.pactffiVerifierAddProviderTransport(handle, transport.protocol, transport.port, transport.path || '', transport.scheme || '');
});
return { status: types_1.FnValidationStatus.SUCCESS };
}
return {
status: types_1.FnValidationStatus.IGNORE,
messages: ['No additional provider transports provided'],
};
},
},
};
//# sourceMappingURL=arguments.js.map