Skip to content

Commit 1ed0061

Browse files
authored
Merge pull request #6 from hapinessjs/next
Merge next to master
2 parents 77b3371 + 081dbd2 commit 1ed0061

File tree

8 files changed

+115
-41
lines changed

8 files changed

+115
-41
lines changed

package-lock.json

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

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@hapiness/redis",
3-
"version": "1.0.1",
3+
"version": "1.0.2",
44
"description": "Hapiness module for redis",
55
"main": "commonjs/index.js",
66
"types": "index.d.ts",
@@ -85,15 +85,15 @@
8585
"mocha": "^4.0.1",
8686
"mocha-typescript": "^1.1.12",
8787
"rimraf": "^2.6.2",
88-
"rxjs": "^5.5.5",
88+
"rxjs": "^5.5.6",
8989
"ts-node": "^3.3.0",
9090
"tslint": "^5.8.0",
9191
"typescript": "^2.6.2",
9292
"unit.js": "^2.0.0"
9393
},
9494
"peerDependencies": {
9595
"@hapiness/core": "1.3.0",
96-
"rxjs": "^5.5.5"
96+
"rxjs": "^5.5.6"
9797
},
9898
"engines": {
9999
"node": ">=7.0.0"

src/module/managers/redis-client.manager.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import { createClient, RedisClient } from 'redis';
2+
import { Observable } from 'rxjs';
23

34
import { RedisConfig } from '../interfaces';
45
import { DefaultValues } from '../common';
56

67
export class RedisClientManager {
78

9+
private _config: any;
810
private _client: RedisClient;
911

1012
constructor(config: RedisConfig) {
@@ -16,7 +18,22 @@ export class RedisClientManager {
1618
delete config.reconnect_interval;
1719

1820
// Create the redis client
19-
this._client = createClient(config);
21+
this._config = config;
22+
}
23+
24+
public createClient() {
25+
return Observable.create(
26+
observer => {
27+
this._client = createClient(this._config);
28+
this._client.on('ready', () => {
29+
observer.next();
30+
observer.complete();
31+
});
32+
this._client.on('error', err => {
33+
observer.error(err);
34+
});
35+
}
36+
);
2037
}
2138

2239
public get client(): RedisClient {

src/module/redis.extension.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export class RedisExt implements OnExtensionLoad {
2626
onExtensionLoad(module: CoreModule, config: RedisConfig): Observable<Extension> {
2727
return Observable
2828
.of(new RedisClientManager(config))
29+
.switchMap(_ => _.createClient().map(__ => _))
2930
.map(_ => ({
3031
instance: this,
3132
token: RedisExt,

test/integration/redis.module.test.ts

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { test, suite } from 'mocha-typescript';
77
* @see http://unitjs.com/
88
*/
99
import * as unit from 'unit.js';
10+
import { Observable } from 'rxjs';
1011

1112
import { Hapiness, HapinessModule, Inject, OnStart, Server, HttpServerExt } from '@hapiness/core';
1213

@@ -18,54 +19,58 @@ import { RedisExt, RedisModule, RedisClientService } from '../../src';
1819

1920
@suite('- Integration tests of RedisModule')
2021
export class RedisModuleIntegrationTest {
22+
2123
/**
2224
* Function executed before the suite
2325
*/
24-
static before() {
25-
}
26+
static before() {}
2627

2728
/**
2829
* Function executed after the suite
2930
*/
30-
static after() {
31-
}
31+
static after() {}
3232

3333
/**
3434
* Class constructor
3535
* New lifecycle
3636
*/
37-
constructor() {
38-
}
37+
constructor() {}
3938

4039
/**
4140
* Function executed before each test
4241
*/
43-
before() {
44-
}
42+
before() {}
4543

4644
/**
4745
* Function executed after each test
4846
*/
49-
after() {
50-
}
47+
after() {}
5148

5249
/**
5350
* Test if `RedisModule` is correctly integrated and has functions
5451
*/
5552
@test('- Test if `RedisModule` is correctly integrated and has functions')
5653
testRedisModule(done) {
54+
const fakeInst = new FakeRedisClient();
5755
const redisStub = mockRedisCreateConnection();
58-
redisStub.returns(<any>new FakeRedisClient());
56+
redisStub.returns(<any> fakeInst);
57+
58+
Observable
59+
.of(fakeInst)
60+
.delay(new Date(Date.now() + 1500))
61+
.map(_ => _.emit('ready'))
62+
.subscribe();
5963

6064
@HapinessModule({
6165
version: '1.0.0',
6266
providers: [],
6367
imports: [RedisModule]
6468
})
6569
class RedisModuleTest implements OnStart {
66-
constructor(@Inject(HttpServerExt) private _httpServer: Server,
67-
private _redisClient: RedisClientService) {
68-
}
70+
constructor(
71+
@Inject(HttpServerExt) private _httpServer: Server,
72+
private _redisClient: RedisClientService
73+
) {}
6974

7075
onStart(): void {
7176
this

test/mocks/redis.mock.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import * as unit from 'unit.js';
22
import * as redis from 'redis';
3+
import { EventEmitter } from 'events';
34

45
export function mockRedisCreateConnection() {
56
return unit.stub(redis, 'createClient');
67
}
78

8-
export class FakeRedisClient {
9+
export class FakeRedisClient extends EventEmitter {
910
get(param: string, cb: redis.Callback<string>) {
1011
cb(null, param);
1112
return true;
Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,61 @@
11
import * as unit from 'unit.js';
22

33
import { test, suite } from 'mocha-typescript';
4-
import { Callback } from 'redis';
54

65
import { RedisClientManager } from '../../src';
7-
import { mockRedisCreateConnection } from '../mocks';
6+
import { mockRedisCreateConnection, FakeRedisClient } from '../mocks';
7+
import { Observable } from 'rxjs/Observable';
88

99
@suite('- Unit RedisClientManagerTest file')
1010
export class RedisClientManagerTest {
1111

1212
@test('- Create the manager')
1313
testCreateManager(done) {
14-
class FakeRedisClient {
15-
get(param: string, cb: Callback<string>) {
16-
cb(null, param);
17-
return true;
14+
const fakeInst = new FakeRedisClient();
15+
16+
const redisStub = mockRedisCreateConnection();
17+
redisStub.returns(<any>fakeInst);
18+
19+
Observable
20+
.of(fakeInst)
21+
.delay(new Date(Date.now() + 1500))
22+
.map(_ => fakeInst.emit('ready'))
23+
.subscribe();
24+
25+
const manager = new RedisClientManager(
26+
{
27+
url: '//toto',
28+
password: 'pass_redis',
29+
db: '2'
1830
}
19-
}
31+
);
32+
33+
manager
34+
.createClient()
35+
.subscribe(
36+
_ => {
37+
manager.client.get('param', (err, res) => {
38+
unit.string(res).is('param');
39+
redisStub.restore();
40+
done();
41+
});
42+
},
43+
err => done(err)
44+
);
45+
}
46+
47+
@test('- Dont create the manager and return error')
48+
testCreateManagerError(done) {
49+
const fakeInst = new FakeRedisClient();
2050

2151
const redisStub = mockRedisCreateConnection();
22-
redisStub.returns(<any>new FakeRedisClient());
52+
redisStub.returns(<any>fakeInst);
53+
54+
Observable
55+
.of(fakeInst)
56+
.delay(new Date(Date.now() + 1500))
57+
.map(_ => fakeInst.emit('error', new Error('Thrown by fakeInst')))
58+
.subscribe();
2359

2460
const manager = new RedisClientManager(
2561
{
@@ -29,10 +65,15 @@ export class RedisClientManagerTest {
2965
}
3066
);
3167

32-
manager.client.get('param', (err, res) => {
33-
unit.string(res).is('param');
34-
redisStub.restore();
35-
done();
36-
});
68+
manager
69+
.createClient()
70+
.subscribe(
71+
_ => done(new Error('Should not be there')),
72+
err => {
73+
unit.string(err.message).is('Thrown by fakeInst');
74+
redisStub.restore();
75+
done();
76+
}
77+
);
3778
}
3879
}

test/unit/redis-client.service.test.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as unit from 'unit.js';
22

33
import { test, suite } from 'mocha-typescript';
4+
import { Observable } from 'rxjs';
45

56
import { RedisClientManager, RedisClientService } from '../../src';
67
import { FakeRedisClient, mockRedisCreateConnection } from '../mocks';
@@ -10,8 +11,10 @@ export class RedisClientServiceTest {
1011

1112
@test('- Create the service and get the connection')
1213
testCreateServiceAndGetConnection(done) {
14+
const fakeInst = new FakeRedisClient();
15+
1316
const redisStub = mockRedisCreateConnection();
14-
redisStub.returns(<any>new FakeRedisClient());
17+
redisStub.returns(<any>fakeInst);
1518

1619
const manager = new RedisClientManager(
1720
{
@@ -21,11 +24,17 @@ export class RedisClientServiceTest {
2124
}
2225
);
2326

24-
const service = new RedisClientService(manager);
27+
Observable
28+
.of(fakeInst)
29+
.delay(new Date(Date.now() + 1500))
30+
.map(_ => _.emit('ready'))
31+
.subscribe();
32+
2533

26-
service
27-
.connection
28-
.get('param')
34+
Observable.of(manager)
35+
.flatMap(_ => _.createClient().map(__ => _))
36+
.map(_ => new RedisClientService(<any> _))
37+
.flatMap(_ => _.connection.get('param'))
2938
.subscribe(
3039
res => {
3140
unit.string(res).is('param');

0 commit comments

Comments
 (0)