Nikita Sushkov
11/02/2024, 7:50 AMpact-broker publish --consumer-app-version=<<SHA goes here>> ...
command to publish the contract
2. Using the Webhook and passing the variable pactbroker.consumerVersionNumber from here https://github.com/pact-foundation/pact_broker/blob/master/lib/pact_broker/doc/views/webhooks.markdown#dynamic-variable-substitution
3. Retrieving the PACT using the Verifier from @pact-foundation/pact
So, I'm stuck at the first step, because I do not see any verifier option that I can use to fetch the PACT by the consumer version (neither top level parameters nor consumerVersionSelectors). So, my question is it possible to do in the first place? In the answer is no what is the recommended process here? In this scenario I'm trying to verify a consumer branch which is not yet published as a part of the healthy branch pattern. ThanksJulie Laursen
11/04/2024, 10:44 PMAsk and you shall receive v7.3.0 on the way out that both allows a dynamic port (see e2e and typescript examples) and will return the full complement of Pact options from setup().
Do I need to specifically call PactV3 to get dynamic ports? I have a config file:
import {
HttpLink,
InMemoryCache,
ApolloClient,
NormalizedCacheObject,
} from '@apollo/client';
import { PactTestServerConfig } from '@/utils/pact-constants';
import fetch from 'cross-fetch';
let client: ApolloClient<NormalizedCacheObject>;
global.fetch = fetch;
export const setupPactTests = () => {
const client = new ApolloClient({
cache: new InMemoryCache({ addTypename: false }),
link: new HttpLink({
uri: `<http://127.0.0.1>:${PactTestServerConfig.Port}/graphql`,
fetch,
}),
});
return client;
};
export function getApolloClient(): ApolloClient<NormalizedCacheObject> {
if (!client) {
client = setupPactTests();
}
return client;
}
I see a lot of examples in java but not js. I'm still new to playing around with env vars and its a weak pointАлександр Чепрасов
11/05/2024, 1:22 PMcan-i-merge
6) get the result "Computer says no ¯\\_(ツ)_/¯"
Why is this the result? I expected a positive result.Lachlan Newman
11/05/2024, 10:26 PMType mismatch: Expected '{"contractVersion":2,"status":{"code":"STUDY_NOT_APPLICABLE","text":"Study processing failed during looking up raw results"},"fhirJson":null,"study":{"uid":"65f4205422a8e1c5282a10278d82baf7aa692da6cd2f4474a1a591d491e14800","artifacts":[{"name":"Annalise-ctc-d6f80baf-c696-4e57-95db-43e0fe0b7a3d.log","documentType":"text/log","groupCode":"annalise-ctc-log","trackingUIDs":["262d7217-0f85-4b64-aebf-1bbaa6759701"]}],"series":null}}' (String) to be the same type as {"contractVersion":101,"fhirJson":null,"status":{"code":"some string","text":"some string"},"study":{"artifacts":[{"documentType":"some string","groupCode":"some string","name":"some string","trackingUIDs":["some string"]}],"series":null,"uid":"some string"}} (Object)
Daniel Barbu
11/06/2024, 4:02 PMSyntaxError: Cannot use import statement outside a module
4 |
5 | const nock = require('nock');
> 6 | const PactV3 = require('../../../node_modules/@pact-foundation/pact')
● Test suite failed to run
Jest encountered an unexpected token
Jest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.
Out of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.
By default "node_modules" folder is ignored by transformers.
Here's what you can do:
• If you are trying to use ECMAScript Modules, see <https://jestjs.io/docs/ecmascript-modules> for how to enable it.
• If you are trying to use TypeScript, see <https://jestjs.io/docs/getting-started#using-typescript>
• To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
• If you need a custom transformation specify a "transform" option in your config.
• If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.
You'll find more details and examples of these config options in the docs:
<https://jestjs.io/docs/configuration>
For information about custom transformations, see:
<https://jestjs.io/docs/code-transformation>
Details:
C:\Users\DanielB\source\repos\Core.Website.v2\node_modules\@pact-foundation\pact\node_modules\axios\index.js:1
({"Object.<anonymous>":function(module,exports,require,_dirname,_filename,jest){import axios from './lib/axios.js';
^^^^^^
The test file does not contain much else except the these lines. I will appreciate any hints as to how to approach this problem.John Nguyen
11/11/2024, 8:33 PMpact-js
, jest-pact
, and SuperTest
. I've got a simple consumer test written up, but at the verification stage I get an output that:
Pact between Jest-Consumer-Example and Provider
with 30000 ms timeout for Pact
Pact verification failed - expected interactions did not match actual.
with no additional information. Setting the logLevel in the configuration step to debug
or trace
doesn't give any useful information, and I can't find any log file saved elsewhere.
I've verified through debugging that my API call does return the expected response at the point of calling the API, so I was hoping for advice on how I can get Pact to output more useful information (e.g. a comparison of what was expected vs what was received) about where I've gone wrong. Or if I may have made any obvious implementation mistakes. Thanks in advance, and please let me know what additional information might be useful!
const url = '/path/to/endpoint'
pactWith(
{
consumer: "Jest-Consumer-Example",
provider: "Provider",
logLevel: LOG_LEVEL as LogLevel,
pactfileWriteMode: 'merge',
},
(provider) => {
describe('The API', () => {
const itemExample = {
"NumberField": 3,
}
const EXPECTED_BODY = {
results: eachLike(itemExample)
}
const itemSuccessResponse = {
status: 200,
body: EXPECTED_BODY,
}
const itemRequest = {
uponReceiving: 'a request for a thing',
withRequest: {
method: 'GET' as HTTPMethods,
path: url,
}
}
let agent: SuperAgentTest
beforeEach(async () => {
agent = await AuthHelper.createAgent()
const interaction: InteractionObject = {
state: 'I have a thing',
...itemRequest,
willRespondWith: itemSuccessResponse,
}
return provider.addInteraction(interaction)
})
it('returns a successful body', () => {
return agent.get(`${endpointPath}`)
.then((item) => {
console.log(item)
})
})
})
}
)
Damien Deloubes
11/18/2024, 10:44 PMmake ci PACT_BROKER_BASE_URL="..." PACT_BROKER_TOKEN="..." PACT_PROVIDER="..."
I get the following error:
Specified pact file 'pacts' does not exist. This sometimes indicates one of the arguments has been specified with the wrong name and has been incorrectly identified as a file path. If you are using Docker, check that you have mounted the pact file or directory into the container correctly using
-v`, and have specified the location of the pact file or directory in the Docker container, not the host.`
make: *** [publish_pacts] Error 1
Has anyone encountered the same issue? I am still trying to wrap my head around it all and would love to learn from you all!Andrei Enache
11/27/2024, 10:30 AMContent-Type: application/x-ndjson
header in the response. However, after adding this header in the willRespondWith
section, the response body format seems to be affected. We're seeing additional values like {\"value\":
, { \"value\": {}, \"pact:matcher:type\": \"type\" }
, and others being included in the response. It looks like the matchers might be influencing the JSON serialization when the Content-Type
is set to application/x-ndjson
. For application/json
, everything works as expected.
Could we get some help resolving this? Thanks!James P
11/28/2024, 3:53 PMMatchersV3
and has a property spec: 3
but when the test runs, the pact file specifies version 2. I’ve tried changing to use Matchers
but there is a eachLike
function which has different behaviour - on MatchersV3
it will allow 0 but on Matchers
is wont. So I have 2 questions:
1. Why is the specification coming out as Version 2 when I specify 3?
2. Why has the eachLike behaviour changed so that 0 is no longer a valid case?Val Kolovos
12/04/2024, 8:22 PMMatt (pactflow.io / pact-js / pact-go)
Yalim Yasaroglu
12/12/2024, 2:05 PMbody-parser
middleware, which has a default size limit of ~100KB.
Does anyone know if there’s a way to increase this limit or configure the verifier to handle larger payloads? Or am I missing something in the setup?
Any advice would be much appreciated! 🙏
Thanks!Jeu Manzo
12/16/2024, 11:03 PMClient error: 403 Forbidden Failed to create session
I have set the env variables, and even get the following output when running pactflow-ai status
Luis Nuño
12/23/2024, 9:14 PM15:08:15 [15:08:15.632] DEBUG (676): pact@13.2.0: mock service started on port: 8081
15:08:45 [15:08:45.635] ERROR (677): pact@13.2.0: The pact mock service doesn't appear to be running
15:08:45 - Please check the logs above to ensure that there are no pact service startup failures
15:08:45 - Please check that pact lifecycle methods are called in the correct order (setup() needs to be called before this method)
15:08:45 - Please check that your test code waits for the promises returned from lifecycle methods to complete before calling the next one
15:08:45 - To learn more about what is happening during your pact run, try setting logLevel: 'DEBUG'
We tried changing the port but it doesn't matter which port we use we always get the same error.
I also tried to run the tests locally and I also get the exact same errors, which is also weird since everything was working fine last week 🤔
Do you know what may be causing this error?Dmitry Munda
01/02/2025, 3:07 PM"@pact-foundation/pact": "13.2.0",
Abubakar Mehmood
01/06/2025, 4:08 PMthen
handler is never called. Similarly, if there's an error (e.g. I remove the broker token from the environment variables), the error
handler is never called.
Also, the finally
callback is never called in either case.
Here's my code.
pact.publishPacts(opts)
.then(function() {
console.log(`Published pact successfully. It should be updated on ${brokerUrl}.`);
})
.catch(function(err) {
console.error('Failed to publish pact:', err);
})
.finally(function() {
console.log('i am in finally');
});
I only see the following log messages:
[16:06:01.224] INFO (89029): pact-node@10.18.0: Publishing Pacts to Broker
[16:06:01.225] INFO (89029): pact-node@10.18.0: Publishing pacts to broker at: https://*****.<http://pactflow.io|pactflow.io>
Is this a known issue or am I doing something completely wrong?
(The reason for publishing in JS is that the logic of publishing the pact conditionally, and applying the right tags etc. is more readable and testable)Hernan Mateika
01/15/2025, 3:40 PMpact-js
(Using PactV4) with jest and i am having some issues when creating the contract since I have consumer tests splitted in diferent files and pact json file doesnt display all interactions, just the latest one.
is there any config that i am missing?
I have found some references to this but it seems its not there anymore.
https://github.com/pact-foundation/docs.pact.io/issues/155#:~:text=https%3A//docs.pact.io/implementati[…]litting%2Dtests%2Dacross%2Dmultiple%2DfilesVal Kolovos
02/06/2025, 7:58 PMBas Dijkstra
02/11/2025, 9:19 AMnode_modules
• Checking if there's something running on port 4010
- there isn't, or at least netstat
doesn't show it
Any ideas? I've attached the debug Pact log from their machine for more info.Spencer
02/11/2025, 3:34 PMFrank Rosner
02/24/2025, 2:57 PMexport interface V4ResponseBuilder {
headers(headers: TemplateHeaders): V4ResponseBuilder;
jsonBody(body: unknown): V4ResponseBuilder;
binaryFile(contentType: string, file: string): V4ResponseBuilder;
multipartBody(contentType: string, filename: string, mimePartName: string): V4ResponseBuilder;
body(contentType: string, body: Buffer): V4ResponseBuilder;
}
Martin Mineo
03/07/2025, 1:16 PMBertrand Ernst
03/13/2025, 1:25 PMpact-js
?
To be more precise, I would like to manage the mock server myself using the pact-cli
Docker image instead of having pact-js
launch a mock-server for me.
I looked at the options to setup the provider with the host
and port
of a running mock-server but couldn't find anything.
Is this at all possible?
Thanks in advance !Gabriel Vasconcelos
03/17/2025, 2:04 PMLachlan Newman
03/18/2025, 5:05 AMBertrand Ernst
03/28/2025, 11:05 AMpact-js
along with jest
.
Above every test suite that is executed, I have the following error message:
Failed to initialise global tracing subscriber - a global default trace dispatcher has already been set
As I understand, this comes from the reference implementation where there are several instance of such error message being sent:
https://github.com/search?q=repo%3Apact-foundation%2Fpact-reference%20set_global_default&type=code
I initialize my provider using new PactV3(...)
in a beforeEach
block within a setupFilesAfterEnv
file (is this best practice?).
https://jestjs.io/docs/configuration#setupfilesafterenv-array
What is the best way to get rid of this error?
Note that it's not blocking, my tests run just as well but it's annoying. 🙂Abubakar Mehmood
03/31/2025, 10:24 AM/_pactSetup
endpoint but I haven't set it up (neither does the above-mentioned example). Logs:
2025-03-31T07:33:34.581653Z DEBUG ThreadId(02) verify_interaction{interaction="a request to create a quote"}: hyper_util::client::legacy::connect::http: connecting to 127.0.0.1:51891
2025-03-31T07:33:34.581929Z DEBUG ThreadId(02) verify_interaction{interaction="a request to create a quote"}: hyper_util::client::legacy::connect::http: connected to 127.0.0.1:51891
[08:33:34.604] DEBUG (38248): pact@15.0.1: hooks state counter is 1 after receiving "setup" action
[08:33:34.605] DEBUG (38248): pact@15.0.1: incoming request: {"body":{"action":"setup","params":{},"state":"quote can be created"},"headers":{"content-type":"application/json","accept":"*/*","accept-encoding":"gzip, deflate","host":"127.0.0.1:51891","content-length":"61"},"method":"POST","path":"/_pactSetup"}
(followed by timeout)
2025-03-31T07:34:04.691883Z DEBUG ThreadId(02) verify_interaction{interaction="a request to create a quote"}: pact_verifier::provider_client: State change request failed with error error sending request for url (<http://127.0.0.1:51891/_pactSetup>)
While the docs here seem to mention that we need to set up an (or two, according to this old answer) HTTP endpoints for the states, I couldn't find any details of what the endpoints should look like, and how are the e2e tests working without setting up those endpoints.
2. pactjs seems to start its own mock server and call the endpoint to verify on that base URL instead of using the providerBaseUrl
I've specified. Excerpt of code:
const server = express();
server.use(cors());
const app = server.listen(53404, () => {
console.log(`Server listening on <http://localhost:53404>`);
});
server.post('/v3/forex/quote', (req, res) => {
res.append('Content-Type', 'application/json').status(200).send({
dummy: 123456789, // This is supposed to be replaced in the request filters
});
});
const opts = {
provider: 'MyProvider',
logLevel: "debug",
providerBaseUrl: `<http://localhost:53404>`,
stateHandlers: {
'quote can be created': async () => {
await redisClient.set("some data");
//console.log('handler finished');
return Promise.resolve();
},
},
// Override request handling to call the Lambda function directly
requestFilter: async (req, res, next) => {
// omitted for brevity
}
};
const verifier = new Verifier(opts);
Logs show a different port (53741), instead of 53404. It changes every time, though:
2025-03-31T08:39:11.753646Z INFO ThreadId(02) verify_interaction{interaction="a request to create a quote"}: pact_verifier::provider_client: Sending request to provider at <http://127.0.0.1:53741/>
2025-03-31T08:39:11.753655Z DEBUG ThreadId(02) verify_interaction{interaction="a request to create a quote"}: pact_verifier::provider_client: Provider details = ProviderInfo { name: "ForexV3-Funding", protocol: "http", host: "127.0.0.1", port: Some(53741), path: "/", transports: [ProviderTransport { transport: "http", port: Some(53741), path: Some("/"), scheme: Some("http") }] }
2025-03-31T08:39:11.753676Z INFO ThreadId(02) verify_interaction{interaction="a request to create a quote"}: pact_verifier::provider_client: Sending request HTTP Request ( method: POST, path: /v3/forex/quote, query: None, headers: Some({"Content-Type": ["application/json"]}), body: Present(115 bytes, application/json) )
2025-03-31T08:39:11.753689Z DEBUG ThreadId(02) verify_interaction{interaction="a request to create a quote"}: pact_verifier::provider_client: body:
{"buy_amount":"18.358","buy_currency":"GBP","customer":{"id":"C-98YE32ZY"},"sell_currency":"USD","type":"customer"}
2025-03-31T08:39:11.753743Z DEBUG ThreadId(02) verify_interaction{interaction="a request to create a quote"}: hyper_util::client::legacy::pool: reuse idle connection for ("http", 127.0.0.1:53741)
[09:39:11.756] DEBUG (40620): pact@15.0.1: incoming request: {"body":{"buy_amount":"18.358","buy_currency":"GBP","customer":{"id":"C-98YE32ZY"},"sell_currency":"USD","type":"customer"},"headers":{"content-type":"application/json","accept":"*/*","accept-encoding":"gzip, deflate","host":"127.0.0.1:53741","content-length":"115"},"method":"POST","path":"/v3/forex/quote"}
Ayoub BOULAHTAR
04/04/2025, 11:05 AMprovider
.addInteraction()
.given('one or more requested row exist')
.withRequest('GET', '/base/url', (builder) => {
builder.query({
ids: MatchersV3.eachLike(1),
});
builder.headers({
'Content-Type': 'application/json',
});
})
Ruud Welling
04/25/2025, 3:05 PMNeil McLaughlin
05/02/2025, 9:03 AMfromProviderState
using the V3Interaction
, but I can’t seem to
get it working with the V4Interaction
model.
The fromProviderState
call initially seems like its working in that the test passes, but the mock server
seems to match any path, not just the specified path.
Also, I’ve noticed that this method seems to have been dropped from the documentation in both the Java and JS versions
of the pact documentation.
The initial version (static path) is working, but it bakes a specific id into the contract.
v4InteractionWithResponse = mockServer
.addInteraction()
.uponReceiving("a request for an advert")
.given("basic car advert")
.withRequest(
"GET",
"/product-page/v1/advert/201602281465747",
(builder) => {
builder.query({ channel: "cars" });
},
)
So the next step was to parameterize the path using fromProviderState
.
v4InteractionWithResponse = mockServer
.addInteraction()
.uponReceiving("a request for an advert")
.given("basic car advert")
.withRequest(
"GET",
fromProviderState(
"/product-page/v1/advert/${advertId}",
"/product-page/v1/advert/201602281465747",
),
(builder) => {
builder.query({ channel: "cars" });
},
)