Skip to content

Commit 3b03a37

Browse files
add unittest for reconnect, as well as adding env configuration
1 parent ba824a0 commit 3b03a37

11 files changed

+437
-384
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ config.json
44
coverage
55
.vscode
66
.nyc_output
7+
test/test.env

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,20 @@ class MainCom extends component {
191191
* Create a RabbitMQ queue
192192
* Bind the queue to an exchange (exchange's name: `<namespace>.<publisher>.<event>`)
193193
* Consume its messages
194+
195+
196+
# TESTING
197+
198+
In case of you are using custom rabbitmq connection, you can provide an env file as follow:
199+
200+
```bash
201+
# filename: ./test/test.env
202+
export RABBIT_HOST=0.0.0.0
203+
export RABBIT_PORT=5672
204+
export RABBIT_USERNAME=root
205+
export RABBIT_PASSWORD=toor
206+
```
207+
208+
and perform:
209+
210+
`source ./test/test.env && npm test`

lib/service_amqp.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,4 @@ module.exports = class Amqp extends Component.mixin(AsyncEmitter) {
6161
yield this.doConnect();
6262
}
6363
}
64-
};
64+
};

package-lock.json

Lines changed: 240 additions & 349 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
"chai": "^4.1.2",
3737
"chai-as-promised": "^7.1.1",
3838
"codacy-coverage": "^2.0.3",
39-
"nyc": "^13.1.0",
4039
"mocha": "^5.2.0",
4140
"mocha-lcov-reporter": "^1.3.0",
41+
"nyc": "^13.3.0",
4242
"supertest": "^3.3.0"
4343
}
4444
}

test/configuration.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const rabbitConnection = {
2+
host: process.env.RABBIT_HOST || "localhost",
3+
port: process.env.RABBIT_PORT || 5672,
4+
user: process.env.RABBIT_USERNAME || 'guest',
5+
password: process.env.RABBIT_PASSWORD || 'guest',
6+
consumerPrefetch: 1,
7+
maxAttemtps: 5,
8+
retryDelay: 50,
9+
};
10+
11+
const rabbitUrl = `amqp://${rabbitConnection.user}:${rabbitConnection.password}@${rabbitConnection.host}:${rabbitConnection.port}`;
12+
13+
module.exports = {
14+
rabbitConnection,
15+
rabbitUrl,
16+
};

test/service_pub_queue_rabbit_test.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ const sleep = require("then-sleep");
99
const merapi = require("merapi");
1010
const { Component, async } = require("merapi");
1111

12+
const { rabbitConnection, rabbitUrl } = require("./configuration.js");
13+
1214
/* eslint-env mocha */
1315

1416
describe("Merapi Plugin Service: Queue Publisher", function() {
@@ -28,10 +30,7 @@ describe("Merapi Plugin Service: Queue Publisher", function() {
2830
secret: "abc123",
2931
plugins: ["service"],
3032
service: {
31-
rabbit: {
32-
host: "localhost",
33-
port: 5672,
34-
},
33+
rabbit: rabbitConnection,
3534
queue: {
3635
publish: {
3736
subscriber: {
@@ -80,7 +79,7 @@ describe("Merapi Plugin Service: Queue Publisher", function() {
8079
yield publisherBContainer.start();
8180

8281
service = yield publisherAContainer.resolve("service");
83-
connection = yield amqplib.connect("amqp://localhost");
82+
connection = yield amqplib.connect(rabbitUrl);
8483
channel = yield connection.createChannel();
8584

8685
yield sleep(100);

test/service_pub_rabbit_test.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ const chaiAsPromised = require("chai-as-promised");
1010
const merapi = require("merapi");
1111
const { Component, async } = require("merapi");
1212

13+
const { rabbitConnection, rabbitUrl } = require("./configuration.js");
14+
1315
chai.use(chaiAsPromised);
1416

1517
/* eslint-env mocha */
@@ -31,10 +33,7 @@ describe("Merapi Plugin Service: Publisher", function() {
3133
secret: "abc123",
3234
plugins: ["service"],
3335
service: {
34-
rabbit: {
35-
host: "localhost",
36-
port: 5672,
37-
},
36+
rabbit: rabbitConnection,
3837
publish: {
3938
incoming_message_publisher_test:
4039
"triggerIncomingMessagePublisherTest",
@@ -81,7 +80,7 @@ describe("Merapi Plugin Service: Publisher", function() {
8180
yield publisherBContainer.start();
8281

8382
service = yield publisherAContainer.resolve("service");
84-
connection = yield amqplib.connect("amqp://localhost");
83+
connection = yield amqplib.connect(rabbitUrl);
8584
channel = yield connection.createChannel();
8685

8786
yield sleep(100);

test/service_sub_queue_rabbit_test.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ const amqplib = require("amqplib");
99
const merapi = require("merapi");
1010
const { async, Component } = require("merapi");
1111

12+
const { rabbitConnection, rabbitUrl } = require("./configuration.js");
13+
1214
/* eslint-env mocha */
1315

1416
describe("Merapi Plugin Service: Queue Subscriber", function() {
@@ -29,10 +31,7 @@ describe("Merapi Plugin Service: Queue Subscriber", function() {
2931
main: "mainCom",
3032
plugins: ["service"],
3133
service: {
32-
rabbit: {
33-
host: "localhost",
34-
port: 5672,
35-
},
34+
rabbit: rabbitConnection,
3635
queue: {
3736
publish: {
3837
subscriber: {
@@ -50,11 +49,7 @@ describe("Merapi Plugin Service: Queue Subscriber", function() {
5049
main: "mainCom",
5150
plugins: ["service"],
5251
service: {
53-
rabbit: {
54-
host: "localhost",
55-
port: 5672,
56-
prefetch: 1,
57-
},
52+
rabbit: rabbitConnection,
5853
queue: {
5954
subscribe: {
6055
sub_queue_publisher_test: "mainCom.handleIncomingMessage",
@@ -123,7 +118,7 @@ describe("Merapi Plugin Service: Queue Subscriber", function() {
123118
yield subscriberBContainer.start();
124119

125120
service = yield subscriberAContainer.resolve("service");
126-
connection = yield amqplib.connect("amqp://localhost");
121+
connection = yield amqplib.connect(rabbitUrl);
127122
channel = yield connection.createChannel();
128123

129124
yield sleep(100);
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
"use strict";
2+
3+
const chai = require("chai");
4+
const expect = chai.expect;
5+
const request = require("supertest");
6+
const sleep = require("then-sleep");
7+
const amqplib = require("amqplib");
8+
9+
const merapi = require("merapi");
10+
const { async, Component } = require("merapi");
11+
12+
const { rabbitConnection, rabbitUrl } = require("./configuration.js");
13+
14+
/* eslint-env mocha */
15+
16+
describe("Merapi Plugin Service: Queue Subscriber", function() {
17+
let publisherContainer, subscriberAContainer, subscriberBContainer;
18+
let service = {};
19+
let connection = {};
20+
let channel = {};
21+
let messageA = [];
22+
23+
beforeEach(async(function*() {
24+
this.timeout(5000);
25+
26+
let publisherConfig = {
27+
name: "publisher",
28+
version: "1.0.0",
29+
main: "mainCom",
30+
plugins: ["service"],
31+
service: {
32+
rabbit: rabbitConnection,
33+
queue: {
34+
publish: {
35+
subscriber: {
36+
sub_queue_reconnect_publisher_test: "inQueuePublisherTest",
37+
},
38+
},
39+
},
40+
port: 5135,
41+
},
42+
};
43+
44+
let subscriberConfig = {
45+
name: "subscriber",
46+
version: "1.0.0",
47+
main: "mainCom",
48+
plugins: ["service"],
49+
service: {
50+
rabbit: rabbitConnection,
51+
queue: {
52+
subscribe: {
53+
sub_queue_reconnect_publisher_test: "mainCom.handleIncomingMessage",
54+
},
55+
},
56+
},
57+
};
58+
59+
publisherContainer = merapi({
60+
basepath: __dirname,
61+
config: publisherConfig,
62+
});
63+
64+
publisherContainer.registerPlugin(
65+
"service-rabbit",
66+
require("../index.js")(publisherContainer)
67+
);
68+
publisherContainer.register(
69+
"mainCom",
70+
class MainCom extends Component {
71+
start() {}
72+
}
73+
);
74+
yield publisherContainer.start();
75+
76+
subscriberConfig.service.port = 5212;
77+
subscriberAContainer = merapi({
78+
basepath: __dirname,
79+
config: subscriberConfig,
80+
});
81+
82+
subscriberAContainer.registerPlugin(
83+
"service-rabbit",
84+
require("../index.js")(subscriberAContainer)
85+
);
86+
subscriberAContainer.register(
87+
"mainCom",
88+
class MainCom extends Component {
89+
start() {}
90+
*handleIncomingMessage(payload) {
91+
messageA.push(payload);
92+
}
93+
}
94+
);
95+
yield subscriberAContainer.start();
96+
97+
service = yield subscriberAContainer.resolve("service");
98+
connection = yield amqplib.connect(rabbitUrl);
99+
channel = yield connection.createChannel();
100+
101+
yield sleep(100);
102+
}));
103+
104+
afterEach(async(function*() {
105+
yield subscriberAContainer.stop();
106+
yield channel.close();
107+
yield connection.close();
108+
}));
109+
110+
describe("Subscriber service", function() {
111+
112+
describe("when subscribing event", function() {
113+
it("published event should be caught", async(function*() {
114+
this.timeout(5000);
115+
let trigger = yield publisherContainer.resolve("inQueuePublisherTest");
116+
117+
// send "0"
118+
yield sleep(100);
119+
yield trigger(0);
120+
yield sleep(1000);
121+
// messageA should be [0]
122+
expect(messageA).to.deep.equal([0]);
123+
124+
// emulate broken connection
125+
yield channel.close();
126+
yield connection.close();
127+
// reconnect
128+
connection = yield amqplib.connect(rabbitUrl);
129+
channel = yield connection.createChannel();
130+
131+
// send "1"
132+
yield sleep(100);
133+
yield trigger(1);
134+
yield sleep(1000);
135+
// messageA should be [1]
136+
expect(messageA).to.deep.equal([0, 1]);
137+
138+
}));
139+
});
140+
141+
});
142+
});

0 commit comments

Comments
 (0)