Skip to content

Commit

Permalink
adding support for headers object format
Browse files Browse the repository at this point in the history
  • Loading branch information
jamesdbloom committed Jun 22, 2019
1 parent 9f488be commit c943aef
Show file tree
Hide file tree
Showing 3 changed files with 315 additions and 24 deletions.
62 changes: 39 additions & 23 deletions mockServerClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,23 +79,39 @@ var mockServerClient;
];
var defaultRequestHeaders = [];

var arrayUniqueConcatenate = function (arrayTarget, arraySource) {
if (arraySource && arraySource.length) {
if (arrayTarget && arrayTarget.length) {
for (var i = 0; i < arraySource.length; i++) {
var arrayTargetAlreadyHasValue = false;
for (var j = 0; j < arrayTarget.length; j++) {
if (JSON.stringify(arraySource[i]) === JSON.stringify(arrayTarget[j])) {
arrayTargetAlreadyHasValue = true;
var headersUniqueConcatenate = function (arrayTarget, arraySource) {
if (!arrayTarget) {
arrayTarget = arraySource;
} else if (Array.isArray(arrayTarget) && Array.isArray(arraySource)) {
if (arraySource && arraySource.length) {
if (arrayTarget && arrayTarget.length) {
for (var i = 0; i < arraySource.length; i++) {
var arrayTargetAlreadyHasValue = false;
for (var j = 0; j < arrayTarget.length; j++) {
if (JSON.stringify(arraySource[i]) === JSON.stringify(arrayTarget[j])) {
arrayTargetAlreadyHasValue = true;
}
}
if (!arrayTargetAlreadyHasValue) {
arrayTarget.push(arraySource[i]);
}
}
if (!arrayTargetAlreadyHasValue) {
arrayTarget.push(arraySource[i]);
}
} else {
arrayTarget = arraySource;
}
}
} else if (!Array.isArray(arrayTarget) && Array.isArray(arraySource)) {
arraySource.forEach(function(entry) {
arrayTarget[entry["name"]] = entry["values"];
});
} else if (Array.isArray(arrayTarget) && !Array.isArray(arraySource)) {
for (var property in arraySource) {
if (arraySource.hasOwnProperty(property)) {
arrayTarget.push({"name": property, "values": arraySource[property]});
}
} else {
arrayTarget = arraySource;
}
} else if (!Array.isArray(arrayTarget) && !Array.isArray(arraySource)) {
arrayTarget = Object.assign(arrayTarget, arraySource);
}
return arrayTarget;
};
Expand Down Expand Up @@ -139,7 +155,7 @@ var mockServerClient;
} else if (typeof times === 'object') {
timesObject = times;
}
requestMatcher.headers = arrayUniqueConcatenate(requestMatcher.headers, defaultRequestHeaders);
requestMatcher.headers = headersUniqueConcatenate(requestMatcher.headers, defaultRequestHeaders);
return {
httpRequest: requestMatcher,
httpResponseObjectCallback: {
Expand Down Expand Up @@ -288,7 +304,7 @@ var mockServerClient;
var webSocketClient = WebSocketClient(host, port, cleanedContextPath);
webSocketClient.requestCallback(function (request) {
var response = requestHandler(request);
response.headers = arrayUniqueConcatenate(response.headers, [
response.headers = headersUniqueConcatenate(response.headers, [
{"name": "WebSocketCorrelationId", "values": request.headers["WebSocketCorrelationId"] || request.headers["websocketcorrelationid"]}
]);
return {
Expand Down Expand Up @@ -359,11 +375,11 @@ var mockServerClient;
} else {
requestMatcher = {};
}
if (defaultRequestHeaders.length) {
if (defaultRequestHeaders) {
if (requestMatcher.httpRequest) {
requestMatcher.httpRequest.headers = arrayUniqueConcatenate(requestMatcher.httpRequest.headers, defaultRequestHeaders);
requestMatcher.httpRequest.headers = headersUniqueConcatenate(requestMatcher.httpRequest.headers, defaultRequestHeaders);
} else {
requestMatcher.headers = arrayUniqueConcatenate(requestMatcher.headers, defaultRequestHeaders);
requestMatcher.headers = headersUniqueConcatenate(requestMatcher.headers, defaultRequestHeaders);
}
}
return requestMatcher;
Expand All @@ -375,11 +391,11 @@ var mockServerClient;
} else {
responseMatcher = {};
}
if (defaultResponseHeaders.length) {
if (defaultResponseHeaders) {
if (responseMatcher.httpResponse) {
responseMatcher.httpResponse.headers = arrayUniqueConcatenate(responseMatcher.httpResponse.headers, defaultResponseHeaders);
responseMatcher.httpResponse.headers = headersUniqueConcatenate(responseMatcher.httpResponse.headers, defaultResponseHeaders);
} else {
responseMatcher.headers = arrayUniqueConcatenate(responseMatcher.headers, defaultResponseHeaders);
responseMatcher.headers = headersUniqueConcatenate(responseMatcher.headers, defaultResponseHeaders);
}
}
return responseMatcher;
Expand Down Expand Up @@ -420,7 +436,7 @@ var mockServerClient;
}
return {
then: function (sucess, error) {
request.headers = arrayUniqueConcatenate(request.headers, defaultRequestHeaders);
request.headers = headersUniqueConcatenate(request.headers, defaultRequestHeaders);
return makeRequest(host, port, "/verify", {
"httpRequest": request,
"times": {
Expand Down Expand Up @@ -466,7 +482,7 @@ var mockServerClient;
var requestSequence = [];
for (var i = 0; i < arguments.length; i++) {
var requestMatcher = arguments[i];
requestMatcher.headers = arrayUniqueConcatenate(requestMatcher.headers, defaultRequestHeaders);
requestMatcher.headers = headersUniqueConcatenate(requestMatcher.headers, defaultRequestHeaders);
requestSequence.push(requestMatcher);
}
return {
Expand Down
138 changes: 138 additions & 0 deletions test/no_proxy/mock_server_node_client_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,144 @@
});
},

'should support headers object format in matcher': function (test) {
// when
client.setDefaultHeaders([
{"name": "x-test-default", "values": ["default-value"]}
]);
client.mockAnyResponse(
{
'httpRequest': {
'path': '/somePath'
},
'httpResponse': {
'statusCode': 200,
'body': JSON.stringify({name: 'first_body'}),
'headers': {
'x-test': ['test-value']
},
'delay': {
'timeUnit': 'MILLISECONDS',
'value': 250
}
},
'times': {
'remainingTimes': 1,
'unlimited': false
}
}
).then(function () {
// then - matching first expectation
sendRequest("GET", "localhost", mockServerPort, "/somePath")
.then(function (response) {
test.equal(response.statusCode, 200);
test.equal(response.body, '{"name":"first_body"}');
test.equal(response.headers["x-test-default"], "default-value");
test.equal(response.headers["x-test"], "test-value");
test.done();
}, function (error) {
test.ok(false, "failed with the following error \n" + JSON.stringify(error));
test.done();
});
}, function (error) {
test.ok(false, "failed with the following error \n" + JSON.stringify(error));
test.done();
});
},

'should support headers object format in default headers': function (test) {
// when
client.setDefaultHeaders({
"x-test-default": ["default-value"]
});
client.mockAnyResponse(
{
'httpRequest': {
'path': '/somePath'
},
'httpResponse': {
'statusCode': 200,
'body': JSON.stringify({name: 'first_body'}),
'headers': [
{
'name': 'x-test',
'values': ['test-value']
}
],
'delay': {
'timeUnit': 'MILLISECONDS',
'value': 250
}
},
'times': {
'remainingTimes': 1,
'unlimited': false
}
}
).then(function () {
// then - matching first expectation
sendRequest("GET", "localhost", mockServerPort, "/somePath", "", {'Allow': 'first'})
.then(function (response) {
test.equal(response.statusCode, 200);
test.equal(response.body, '{"name":"first_body"}');
test.equal(response.headers["x-test-default"], "default-value");
test.equal(response.headers["x-test"], "test-value");
test.done();
}, function (error) {
test.ok(false, "failed with the following error \n" + JSON.stringify(error));
test.done();
});
}, function (error) {
test.ok(false, "failed with the following error \n" + JSON.stringify(error));
test.done();
});
},

'should support headers object format in default headers and matcher': function (test) {
// when
client.setDefaultHeaders([
{"name": "x-test-default", "values": ["default-value"]}
]);
client.mockAnyResponse(
{
'httpRequest': {
'path': '/somePath'
},
'httpResponse': {
'statusCode': 200,
'body': JSON.stringify({name: 'first_body'}),
'headers': {
'x-test': ['test-value']
},
'delay': {
'timeUnit': 'MILLISECONDS',
'value': 250
}
},
'times': {
'remainingTimes': 1,
'unlimited': false
}
}
).then(function () {
// then - matching first expectation
sendRequest("GET", "localhost", mockServerPort, "/somePath", "", {'Allow': 'first'})
.then(function (response) {
test.equal(response.statusCode, 200);
test.equal(response.body, '{"name":"first_body"}');
test.equal(response.headers["x-test-default"], "default-value");
test.equal(response.headers["x-test"], "test-value");
test.done();
}, function (error) {
test.ok(false, "failed with the following error \n" + JSON.stringify(error));
test.done();
});
}, function (error) {
test.ok(false, "failed with the following error \n" + JSON.stringify(error));
test.done();
});
},

'should match on cookies only': function (test) {
// when
client.mockAnyResponse(
Expand Down

0 comments on commit c943aef

Please sign in to comment.