Skip to content

Commit e9f3a4a

Browse files
committed
feat(karma): relax consumer/provider requirement in MockService
- For pact-web use cases, where mock service is started independently of the test cases themselves, we allow consumer and provider to be specified in underlying mock service directly. - Logs warning to console if details aren't provided to assist in debugging issues - Addresses pact-foundation/karma-pact/pull/4 - Addresses #59
1 parent 1e8349b commit e9f3a4a

6 files changed

Lines changed: 67 additions & 38 deletions

File tree

src/common/logger.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,10 @@ module.exports = {
1313
if (config.logging) {
1414
console.log(msg)
1515
}
16+
},
17+
warn: (msg) => {
18+
if (config.logging) {
19+
console.warn(msg)
20+
}
1621
}
1722
}

src/dsl/mockService.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ export type PactfileWriteMode = "overwrite" | "update" | "none";
44

55
export class MockService {
66
constructor(
7-
consumer: string,
8-
provider: string,
7+
consumer?: string,
8+
provider?: string,
99
port?: number,
1010
host?: string,
1111
ssl?: boolean,

src/dsl/mockService.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
const isNil = require('lodash.isnil')
1111
const Request = require('../common/request')
12+
const logger = require('../common/logger')
1213

1314
module.exports = class MockService {
1415

@@ -22,7 +23,8 @@ module.exports = class MockService {
2223
*/
2324
constructor (consumer, provider, port, host, ssl, pactfileWriteMode) {
2425
if (isNil(consumer) || isNil(provider)) {
25-
throw new Error('Please provide the names of the provider and consumer for this Pact.')
26+
logger.warn('Warning: Consumer\Provider details not provided, ensure ' +
27+
'that the mock service has been started with this information')
2628
}
2729

2830
port = port || 1234
@@ -33,9 +35,9 @@ module.exports = class MockService {
3335
this._request = new Request()
3436
this._baseURL = `${ssl ? 'https' : 'http'}://${host}:${port}`
3537
this._pactDetails = {
36-
consumer: { name: consumer },
37-
provider: { name: provider },
38-
pactfile_write_mode: pactfileWriteMode
38+
pactfile_write_mode: pactfileWriteMode,
39+
consumer: (consumer) ? { name: consumer } : undefined,
40+
provider: (provider) ? { name: provider } : undefined
3941
}
4042
}
4143

src/pact-web.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,16 @@ var Interaction = require('./dsl/interaction')
2929
module.exports = (opts) => {
3030
var consumer = opts.consumer
3131
var provider = opts.provider
32-
33-
if (isNil(consumer)) {
34-
throw new Error('You must provide a Consumer for this pact.')
35-
}
36-
37-
if (isNil(provider)) {
38-
throw new Error('You must provide a Provider for this pact.')
39-
}
40-
4132
var port = opts.port || 1234
4233
var host = opts.host || '127.0.0.1'
4334
var ssl = opts.ssl || false
4435
var pactfileWriteMode = opts.pactfileWriteMode || 'overwrite'
4536

46-
logger.info(`Setting up Pact with Consumer "${consumer}" and Provider "${provider}" using mock service on Port: "${port}"`)
37+
if (isNil(consumer) || isNil(provider)) {
38+
logger.info(`Setting up Pact using mock service on port: "${port}"`)
39+
} else {
40+
logger.info(`Setting up Pact with Consumer "${consumer}" and Provider "${provider}" using mock service on port: "${port}"`)
41+
}
4742

4843
const mockService = new MockService(consumer, provider, port, host, ssl, pactfileWriteMode)
4944

test/common/logger.spec.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,35 @@ var proxyquire = require('proxyquire')
44

55
describe('Logger#info', () => {
66
const consoleLogSpy = sinon.spy(console, 'log')
7+
const consoleWarnSpy = sinon.spy(console, 'warn')
78

89
context('with logging configuration turned on', () => {
910
beforeEach(() => {
1011
consoleLogSpy.reset()
12+
consoleWarnSpy.reset()
1113
var logger = proxyquire('../../src/common/logger', { './config': { logging: true } })
1214
logger.info('this will be logged')
15+
logger.warn('this will be logged at warn')
1316
})
1417

1518
it('logs a message', () => {
1619
expect(consoleLogSpy).to.have.been.calledWith('this will be logged')
20+
expect(consoleWarnSpy).to.have.been.calledWith('this will be logged at warn')
1721
})
1822
})
1923

2024
context('with logging configuration turned off', () => {
2125
beforeEach(() => {
2226
consoleLogSpy.reset()
27+
consoleWarnSpy.reset()
2328
var logger = proxyquire('../../src/common/logger', { './config': { logging: false } })
2429
logger.info('this will be ignored')
30+
logger.warn('this will be logged at warn')
2531
})
2632

2733
it('ignores a message to be logged', function () {
2834
expect(consoleLogSpy).to.not.have.been.called
35+
expect(consoleWarnSpy).to.not.have.been.called
2936
})
3037
})
3138
})

test/dsl/mockService.spec.js

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ describe('MockService', () => {
3131

3232
it('does not create a MockService when consumer is not informed', () => {
3333
expect(() => { new MockService() })
34-
.to.throw(Error, 'Please provide the names of the provider and consumer for this Pact.')
34+
.not.to.throw(Error)
3535
})
3636

3737
it('does not create a MockService when provider is not informed', () => {
3838
expect(() => { new MockService('consumer') })
39-
.to.throw(Error, 'Please provide the names of the provider and consumer for this Pact.')
39+
.not.to.throw(Error)
4040
})
4141
})
4242

@@ -48,13 +48,12 @@ describe('MockService', () => {
4848

4949
it('when Interaction added successfully', (done) => {
5050
nock(mock._baseURL).post(/interactions$/).reply(200)
51-
expect(mock.addInteraction(interaction)).to.eventually.notify(done)
51+
expect(mock.addInteraction(interaction)).to.eventually.be.fulfilled.notify(done)
5252
})
5353

5454
it('when Interaction fails to be added', (done) => {
5555
nock(mock._baseURL).post(/interactions$/).reply(500)
56-
expect(mock.addInteraction(interaction)).to.eventually.be.rejected
57-
done()
56+
expect(mock.addInteraction(interaction)).to.eventually.be.rejected.notify(done)
5857
})
5958
})
6059

@@ -63,13 +62,12 @@ describe('MockService', () => {
6362

6463
it('when interactions are removed successfully', (done) => {
6564
nock(mock._baseURL).delete(/interactions$/).reply(200)
66-
expect(mock.removeInteractions()).to.eventually.notify(done)
65+
expect(mock.removeInteractions()).to.eventually.be.fulfilled.notify(done)
6766
})
6867

6968
it('when interactions fail to be removed', (done) => {
7069
nock(mock._baseURL).delete(/interactions$/).reply(500)
71-
expect(mock.removeInteractions()).to.eventually.be.rejected
72-
done()
70+
expect(mock.removeInteractions()).to.eventually.be.rejected.notify(done)
7371
})
7472
})
7573

@@ -78,29 +76,51 @@ describe('MockService', () => {
7876

7977
it('when verification is successful', (done) => {
8078
nock(mock._baseURL).get(/interactions\/verification$/).reply(200)
81-
expect(mock.verify()).to.eventually.notify(done)
79+
expect(mock.verify()).to.eventually.be.fulfilled.notify(done)
8280
})
8381

8482
it('when verification fails', (done) => {
8583
nock(mock._baseURL).get(/interactions\/verification$/).reply(500)
86-
expect(mock.verify()).to.eventually.be.rejected
87-
done()
84+
expect(mock.verify()).to.eventually.be.rejected.notify(done)
8885
})
8986
})
9087

9188
describe('#writePact', () => {
92-
const mock = new MockService('consumer', 'provider', 1234)
93-
94-
it('when writing is successful', (done) => {
95-
nock(mock._baseURL).post(/pact$/).reply(200)
96-
expect(mock.writePact()).to.eventually.notify(done)
89+
describe('when consumer and provider details provided', () => {
90+
const mock = new MockService('aconsumer', 'aprovider', 1234)
91+
92+
describe('and writing is successful', () => {
93+
it('should write the consumer and provider details into the pact', (done) => {
94+
nock(mock._baseURL)
95+
.post(/pact$/, {
96+
pactfile_write_mode: 'overwrite',
97+
consumer: { name: 'aconsumer' },
98+
provider: { name: 'aprovider' }
99+
})
100+
.reply(200)
101+
expect(mock.writePact()).to.eventually.be.fulfilled.notify(done)
102+
})
103+
})
104+
105+
describe('and writing fails', () => {
106+
it('should return a rejected promise', (done) => {
107+
nock(mock._baseURL)
108+
.post(/pact$/).reply(500)
109+
expect(mock.writePact()).to.eventually.be.rejected.notify(done)
110+
})
111+
})
97112
})
98-
99-
it('when writing fails', (done) => {
100-
nock(mock._baseURL).post(/pact$/).reply(500)
101-
expect(mock.writePact()).to.eventually.be.rejected
102-
done()
113+
describe('when consumer and provider details are not provided', () => {
114+
const mock = new MockService(null, null, 1234)
115+
it('should not write the consumer and provider details into the pact', (done) => {
116+
nock(mock._baseURL)
117+
.post(/pact$/, {
118+
pactfile_write_mode: 'overwrite',
119+
consumer: undefined,
120+
provider: undefined
121+
}).reply(200)
122+
expect(mock.writePact()).to.eventually.be.fulfilled.notify(done)
123+
})
103124
})
104125
})
105-
106126
})

0 commit comments

Comments
 (0)