Skip to content

Commit 62a9c44

Browse files
committed
feat(karma): relax consumer/provider requirement in MockService #96
1 parent 601d158 commit 62a9c44

5 files changed

Lines changed: 70 additions & 34 deletions

File tree

src/common/logger.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,35 @@ import * as proxyquire from '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
const logger = proxyquire('./logger', { './config': { config: { logging: true } } }).logger;
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
const logger = proxyquire('./logger', { './config': { config: { logging: false } } }).logger;
2429
logger.info('this will be ignored');
30+
logger.warn('this will be ignored at warn');
2531
});
2632

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

src/common/logger.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ const logger = {
1111
if (config.logging) {
1212
console.log(msg);
1313
}
14+
},
15+
warn: (msg: any) => {
16+
if (config.logging) {
17+
console.warn(msg)
18+
}
1419
}
1520
}
1621

src/dsl/mockService.spec.ts

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ describe('MockService', () => {
3232

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

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

@@ -64,13 +64,12 @@ describe('MockService', () => {
6464

6565
it('when interactions are removed successfully', (done) => {
6666
nock(mock.baseUrl).delete(/interactions$/).reply(200)
67-
expect(mock.removeInteractions()).to.eventually.notify(done)
67+
expect(mock.removeInteractions()).to.eventually.be.fulfilled.notify(done)
6868
})
6969

7070
it('when interactions fail to be removed', (done) => {
7171
nock(mock.baseUrl).delete(/interactions$/).reply(500)
72-
expect(mock.removeInteractions()).to.eventually.be.rejected
73-
done()
72+
expect(mock.removeInteractions()).to.eventually.be.rejected.notify(done)
7473
})
7574
})
7675

@@ -79,29 +78,51 @@ describe('MockService', () => {
7978

8079
it('when verification is successful', (done) => {
8180
nock(mock.baseUrl).get(/interactions\/verification$/).reply(200)
82-
expect(mock.verify()).to.eventually.notify(done)
81+
expect(mock.verify()).to.eventually.be.fulfilled.notify(done)
8382
})
8483

8584
it('when verification fails', (done) => {
8685
nock(mock.baseUrl).get(/interactions\/verification$/).reply(500)
87-
expect(mock.verify()).to.eventually.be.rejected
88-
done()
86+
expect(mock.verify()).to.eventually.be.rejected.notify(done)
8987
})
9088
})
9189

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

src/dsl/mockService.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@
77
import { isEmpty } from 'lodash';
88
import { Request } from '../common/request';
99
import { Interaction } from './interaction';
10+
import { logger } from '../common/logger';
1011

1112
export type PactfileWriteMode = 'overwrite' | 'update' | 'none';
1213

14+
export interface Pacticipant {
15+
name: string
16+
}
1317
export interface PactDetails {
14-
consumer: { name: string };
15-
provider: { name: string };
18+
consumer?: Pacticipant;
19+
provider?: Pacticipant;
1620
pactfile_write_mode: PactfileWriteMode;
1721
}
1822

@@ -29,22 +33,23 @@ export class MockService {
2933
* @param {boolean} ssl - which protocol to use, defaults to false (HTTP)
3034
* @param {string} pactfileWriteMode - 'overwrite' | 'update' | 'none', defaults to 'overwrite'
3135
*/
32-
constructor(private consumer: string,
33-
private provider: string,
36+
constructor(private consumer?: string,
37+
private provider?: string,
3438
private port = 1234,
3539
private host = '127.0.0.1',
3640
private ssl = false,
3741
private pactfileWriteMode: PactfileWriteMode = 'overwrite') {
3842

3943
if (isEmpty(consumer) || isEmpty(provider)) {
40-
throw new Error('Please provide the names of the provider and consumer for this Pact.')
44+
logger.warn('Warning: Consumer\Provider details not provided, ensure ' +
45+
'that the mock service has been started with this information')
4146
}
4247

4348
this.request = new Request();
4449
this.baseUrl = `${ssl ? 'https' : 'http'}://${host}:${port}`;
4550
this.pactDetails = {
46-
consumer: { name: consumer },
47-
provider: { name: provider },
51+
consumer: (consumer) ? { name: consumer } : undefined,
52+
provider: (provider) ? { name: provider } : undefined,
4853
pactfile_write_mode: pactfileWriteMode
4954
};
5055
}

src/pact-web.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,10 @@ export class PactWeb {
5252

5353
this.opts = { ...defaults, ...config } as PactOptionsComplete;
5454

55-
if (isEmpty(this.opts.consumer)) {
56-
throw new Error('You must specify a Consumer for this pact.');
57-
}
58-
59-
if (isEmpty(this.opts.provider)) {
60-
throw new Error('You must specify a Provider for this pact.');
55+
if (isEmpty(this.opts.consumer) || isEmpty(this.opts.provider)) {
56+
logger.info(`Setting up Pact using mock service on port: "${this.opts.port}"`)
57+
} else {
58+
logger.info(`Setting up Pact with Consumer "${this.opts.consumer}" and Provider "${this.opts.provider}" using mock service on port: "${this.opts.port}"`)
6159
}
6260

6361
logger.info(`Setting up Pact with Consumer "${this.opts.consumer}" and Provider "${this.opts.provider}"
@@ -140,8 +138,8 @@ export class PactWeb {
140138
* @param {string} pactfileWriteMode - 'overwrite' | 'update', 'none', defaults to 'overwrite'
141139
*/
142140
export interface PactOptions {
143-
consumer: string;
144-
provider: string;
141+
consumer?: string;
142+
provider?: string;
145143
port?: number;
146144
host?: string;
147145
ssl?: boolean;

0 commit comments

Comments
 (0)