Skip to content
This repository has been archived by the owner on May 10, 2022. It is now read-only.

Commit

Permalink
Add done callback to mockService to allow errors to be communicated b…
Browse files Browse the repository at this point in the history
…ack to the tests in a async friendly way
  • Loading branch information
BenSayers committed Jan 15, 2015
1 parent 34820b3 commit c51fb58
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 81 deletions.
74 changes: 38 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,42 +48,44 @@ This DSL relies on the Ruby [pact-mock_service][pact-mock-service] gem to provid

1. Write a Jasmine unit test similar to the following,

describe("Client", function() {

var client, helloProvider;

beforeEach(function() {

client = new ProviderClient('http://localhost:1234');
helloProvider = MockService.create(
consumer: 'Hello Consumer',
provider: 'Hello Provider',
port: 1234,
pactDir: '.');
});

it("should say hello", function(done) {

helloProvider
.uponReceiving("a request for hello")
.withRequest("get", "/sayHello")
.willRespondWith(200, {
"Content-Type": "application/json"
}, {
reply: "Hello"
});

helloProvider.run(function(runComplete) {
expect(client.sayHello()).toEqual("Hello");
runComplete(function (pactError) {
expect(pactError).toBe(null);
done();
});
});
});
});

See the spec in the example directory for examples of asynchronous callbacks, how to expect error responses, and how to use query params.
```
describe("Client", function() {
var client, helloProvider;
beforeEach(function() {
client = new ProviderClient('http://localhost:1234');
helloProvider = MockService.create({
consumer: 'Hello Consumer',
provider: 'Hello Provider',
port: 1234,
pactDir: '.'
});
});
it("should say hello", function(done) {
helloProvider
.uponReceiving("a request for hello")
.withRequest("get", "/sayHello")
.willRespondWith(200, {
"Content-Type": "application/json"
}, {
reply: "Hello"
});
helloProvider.done(function(pactError) {
expect(pactError).toBe(null);
done();
});
helloProvider.run(function(runComplete) {
expect(client.sayHello()).toEqual("Hello");
runComplete();
});
});
});
```

See the spec in the example directory for more examples of asynchronous callbacks, how to expect error responses, and how to use query params.

Make sure the source and test files are included by Karma in the `karma.conf.js` in the files array.

Expand Down
23 changes: 13 additions & 10 deletions dist/pact-consumer-js-dsl.js
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,11 @@ Pact.MockService = Pact.MockService || {};

function MockService(opts) {
var _baseURL = 'http://127.0.0.1:' + opts.port;
var _doneCallback = function(error) {
if (error) {
throw error;
}
};
var _interactions = [];

var _pactDetails = {
Expand Down Expand Up @@ -262,12 +267,6 @@ Pact.MockService = Pact.MockService || {};
});
};

var throwOnError = function(error) {
if (error) {
throw error;
}
};

this.given = function(providerState) {
var interaction = Pact.givenInteraction(providerState);
_interactions.push(interaction);
Expand All @@ -283,17 +282,21 @@ Pact.MockService = Pact.MockService || {};
this.run = function(testFunction) {
cleanAndSetup(function(error) {
if (error) {
throw error;
_doneCallback(error);
return;
}

var runComplete = function(testComplete) {
testComplete = (typeof testComplete === 'function') ? testComplete : throwOnError;
verifyAndWrite(testComplete);
var runComplete = function() {
verifyAndWrite(_doneCallback);
};

testFunction(runComplete); // Call the tests
});
};

this.done = function(callback) {
_doneCallback = callback;
};
}

this.create = function(opts) {
Expand Down
27 changes: 17 additions & 10 deletions example/client-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

describe("Client", function() {

var client, helloProvider, withNoError;
var client, expectNoErrors, helloProvider;

withNoError = function (doneCallback) {
return function (error) {
expect(error).toBe(null);
expectNoErrors = function (doneCallback) {
return function (pactError) {
expect(pactError).toBe(null);
doneCallback();
};
};
Expand All @@ -33,10 +33,12 @@
reply: "Hello"
});

helloProvider.done(expectNoErrors(done));

//Run the tests
helloProvider.run(function(runComplete) {
expect(client.sayHello()).toEqual("Hello");
runComplete(withNoError(done));
runComplete();
});

});
Expand Down Expand Up @@ -70,12 +72,14 @@
}
});

helloProvider.done(expectNoErrors(done));

//Run the tests
helloProvider.run(function(runComplete) {
expect(client.findFriendsByAgeAndChildren('30', ['Mary Jane', 'James'])).toEqual([{
name: 'Sue'
}]);
runComplete(withNoError(done));
runComplete();
});

});
Expand All @@ -100,17 +104,18 @@
}
});

helloProvider.done(expectNoErrors(done));

//Run the tests
helloProvider.run(function(runComplete) {

function success(message) {
expect(message).toEqual("Bye");
runComplete(withNoError(done));
runComplete();
}

function error(response) {
runComplete(withNoError(done));
runComplete();
expect(true).toEqual(false);
}

Expand All @@ -128,19 +133,21 @@
.withRequest("put", "/unfriendMe")
.willRespondWith(404);

helloProvider.done(expectNoErrors(done));

//Run the tests
helloProvider.run(function(runComplete) {

function success(message) {
//The success callback should *not* be invoked!
expect(true).toEqual(false);
runComplete(withNoError(done));
runComplete();
}

function error(message) {
//The error callback *should* be invoked
expect(message).toEqual("No friends :(");
runComplete(withNoError(done));
runComplete();
}

client.unfriendMe(success, error);
Expand Down
40 changes: 25 additions & 15 deletions spec/mock_service_spec.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
'use strict';

describe('MockService', function() {
var baseUrl, isNodeJs, mockService, Pact, withNoError;
var baseUrl, expectNoErrors, isNodeJs, mockService, Pact;

baseUrl = 'http://localhost:1234';
isNodeJs = typeof module === 'object' && typeof module.exports === 'object';
Pact = (isNodeJs) ? require('../dist/pact-consumer-js-dsl.js') : window.Pact;
withNoError = function (doneCallback) {
return function (error) {
expect(error).toBe(null);
expectNoErrors = function (doneCallback) {
return function (pactError) {
expect(pactError).toBe(null);
doneCallback();
};
};
Expand Down Expand Up @@ -90,16 +90,17 @@ describe('MockService', function() {
reply: 'Hello'
});

mockService.done(expectNoErrors(done));

mockService.run(function(runComplete) {
doHttpCall(function (error, response) {
expect(error).toBe(null, 'error');
expect(JSON.parse(response.responseText)).toEqual({reply: 'Hello'}, 'responseText');
expect(response.status).toEqual(201, 'status');
expect(response.getResponseHeader('Content-Type')).toEqual('application/json', 'Content-Type header');
runComplete(withNoError(done));
runComplete();
});
});

});
});

Expand Down Expand Up @@ -138,16 +139,17 @@ describe('MockService', function() {
}
});

mockService.done(expectNoErrors(done));

mockService.run(function(runComplete) {
doHttpCall(function (error, response) {
expect(error).toBe(null, 'error');
expect(JSON.parse(response.responseText)).toEqual({reply: 'Hello'}, 'responseText');
expect(response.status).toEqual(201, 'status');
expect(response.getResponseHeader('Content-Type')).toEqual('application/json', 'Content-Type header');
runComplete(withNoError(done));
runComplete();
});
});

});
});

Expand All @@ -173,11 +175,13 @@ describe('MockService', function() {
})
.willRespondWith(201);

mockService.done(expectNoErrors(done));

mockService.run(function(runComplete) {
doHttpCall(function (error, response) {
expect(error).toBe(null, 'error');
expect(response.status).toEqual(201, 'status');
runComplete(withNoError(done));
runComplete();
});
});
});
Expand Down Expand Up @@ -212,14 +216,16 @@ describe('MockService', function() {
.withRequest('get', '/different-thing')
.willRespondWith(200, {}, 'different thing response');

mockService.done(expectNoErrors(done));

mockService.run(function(runComplete) {
doHttpCall(function (responseError, response) {
doDifferentHttpCall(function (differentResponseError, differentResponse) {
expect(responseError).toBe(null, 'responseError');
expect(differentResponseError).toBe(null, 'differentResponseError');
expect(response.responseText).toEqual('thing response', 'response.responseText');
expect(differentResponse.responseText).toEqual('different thing response', 'differentResponse.responseText');
runComplete(withNoError(done));
runComplete();
});
});
});
Expand All @@ -241,11 +247,13 @@ describe('MockService', function() {
.withRequest('post', '/thing')
.willRespondWith(201);

mockService.done(expectNoErrors(done));

mockService.run(function(runComplete) {
doHttpCall(function (error, response) {
expect(error).toBe(null, 'error');
expect(response.status).toEqual(201, 'status');
runComplete(withNoError(done));
runComplete();
});
});
});
Expand All @@ -266,14 +274,16 @@ describe('MockService', function() {
.withRequest('post', '/thing')
.willRespondWith(201);

mockService.done(function (pactError) {
expect(pactError).toMatch(/verification failed/, 'pactError');
done();
});

mockService.run(function(runComplete) {
doHttpCall(function (error, response) {
expect(error).toBe(null, 'error');
expect(response.status).toEqual(500, 'status');
runComplete(function(pactError) {
expect(pactError).toMatch(/verification failed/, 'pactError');
done();
});
runComplete();
});
});
});
Expand Down
Loading

0 comments on commit c51fb58

Please sign in to comment.