Skip to content

Commit c1e02e4

Browse files
SNOW-1883649 - wiremock integration
1 parent 0f08c61 commit c1e02e4

File tree

4 files changed

+138
-1
lines changed

4 files changed

+138
-1
lines changed

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242
"mocha": "^10.2.0",
4343
"mock-require": "^3.0.3",
4444
"nyc": "^15.1.0",
45-
"test-console": "^2.0.0"
45+
"test-console": "^2.0.0",
46+
"wiremock": "^3.10.0",
47+
"wiremock-rest-client": "^1.11.0"
4648
},
4749
"peerDependencies": {
4850
"asn1.js": "^5.4.1"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
const assert = require('assert');
2+
const fs = require('fs');
3+
const net = require('net');
4+
const axios = require('axios');
5+
const { runWireMockAsync } = require('../../wiremockRunner');
6+
const os = require('os');
7+
8+
async function getFreePort() {
9+
return new Promise(res => {
10+
const srv = net.createServer();
11+
srv.listen(0, () => {
12+
const port = srv.address().port;
13+
srv.close(() => res(port));
14+
});
15+
});
16+
}
17+
18+
if (os.platform !== 'win32') {
19+
describe('Wiremock test', function () {
20+
let port, wireMock;
21+
before(async () => {
22+
port = await getFreePort();
23+
wireMock = await runWireMockAsync(port);
24+
});
25+
after(async () => {
26+
await wireMock.global.shutdown();
27+
});
28+
it('Run Wiremock instance, wait, verify connection and shutdown', async function () {
29+
assert.doesNotReject(async () => await wireMock.mappings.getAllMappings());
30+
});
31+
it('Add mappings', async function () {
32+
const requests = JSON.parse(fs.readFileSync('wiremock/mappings/testMapping.json', 'utf8'));
33+
for (const mapping of requests.mappings) {
34+
await wireMock.mappings.createMapping(mapping);
35+
}
36+
const mappings = await wireMock.mappings.getAllMappings();
37+
assert.strictEqual(mappings.mappings.length, 2);
38+
const response = await axios.get(`http://localhost:${port}/test/authorize.html`);
39+
assert.strictEqual(response.status, 200);
40+
});
41+
});
42+
43+
}

test/wiremockRunner.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
const WireMockRestClient = require('wiremock-rest-client').WireMockRestClient;
2+
const { exec } = require('child_process');
3+
const Logger = require('../lib/logger');
4+
const fs = require('fs');
5+
6+
7+
async function runWireMockAsync(port) {
8+
let timeoutHandle;
9+
const waitingWireMockPromise = new Promise( (resolve, reject) => {
10+
try {
11+
exec(`npx wiremock --enable-browser-proxying --proxy-pass-through false --port ${port} `);
12+
const wireMock = new WireMockRestClient(`http://localhost:${port}`, { logLevel: 'debug' });
13+
const readyWireMock = waitForWiremockStarted(wireMock);
14+
resolve(readyWireMock);
15+
} catch (err) {
16+
reject(err);
17+
}
18+
});
19+
20+
const timeout = new Promise((resolve, reject) =>
21+
timeoutHandle = setTimeout(
22+
() => reject('Wiremock unavailable after 60s.'),
23+
60000));
24+
return Promise.race([waitingWireMockPromise, timeout])
25+
.then(result => {
26+
clearTimeout(timeoutHandle);
27+
return result;
28+
});
29+
}
30+
31+
async function waitForWiremockStarted(wireMock) {
32+
return fetch(wireMock.baseUri)
33+
.then(async (resp) => {
34+
if (resp.ok) {
35+
return Promise.resolve(wireMock);
36+
} else {
37+
await new Promise(resolve => setTimeout(resolve, 1000));
38+
Logger.getInstance().info(`Retry connection to WireMock after wrong response status: ${resp.status}`);
39+
return await waitForWiremockStarted(wireMock);
40+
}
41+
})
42+
.catch(async (err) => {
43+
await new Promise(resolve => setTimeout(resolve, 1000));
44+
Logger.getInstance().info(`Retry connection to WireMock after error: ${err}`);
45+
return await waitForWiremockStarted(wireMock);
46+
});
47+
}
48+
49+
async function addWireMockMappingsFromFile(wireMock, filePath) {
50+
const requests = JSON.parse(fs.readFileSync(filePath, 'utf8'));
51+
for (const mapping of requests.mappings) {
52+
await wireMock.mappings.createMapping(mapping);
53+
}
54+
}
55+
56+
exports.runWireMockAsync = runWireMockAsync;
57+
exports.addWireMockMappingsFromFile = addWireMockMappingsFromFile;
58+

wiremock/mappings/testMapping.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"mappings": [
3+
{
4+
"scenarioName": "Test wiremock endpoint",
5+
"request": {
6+
"urlPathPattern": "/test/authorize.*",
7+
"method": "GET"
8+
},
9+
"response": {
10+
"status": 200,
11+
"fixedDelayMilliseconds": 500
12+
13+
}
14+
},
15+
{
16+
"scenarioName": "Test wiremock endpoint",
17+
"request": {
18+
"urlPathPattern": "/session/v1/login-request.*",
19+
"method": "POST"
20+
},
21+
"response": {
22+
"status": 200,
23+
"fixedDelayMilliseconds": 500,
24+
"jsonBody": {
25+
"data": {
26+
"masterToken": "master token",
27+
"token": "session token",
28+
"validityInSeconds": 3600
29+
}
30+
}
31+
}
32+
}
33+
]
34+
}

0 commit comments

Comments
 (0)