Skip to content

Commit 61ef7ff

Browse files
feat: add config entity to config microservice & create helpers package for all microservices
refactor structure
1 parent 986d03f commit 61ef7ff

37 files changed

+3956
-1771
lines changed

microservices/configuration/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ This microservice provides configuration for all other microservices. Single poi
2020
- [HOW TO DEVELOP](#how-to-develop)
2121

2222
### <a id="environments"></a>ENVIRONMENTS:
23+
- `NODE_ENV` - Can be `production` or `development`. Default: `development`
2324
- `MS_CONNECTION` - Invert json host and port (with protocol). Default: `http://127.0.0.1:8001`
2425
- `MS_NAME` - Microservice name. Default: `gateway`
2526
- `MS_DISABLE_REMOTE_MIDDLEWARE` - Disable remote middleware feature. Default: `0`
@@ -28,6 +29,7 @@ This microservice provides configuration for all other microservices. Single poi
2829
- `DB_USERNAME` - Database host. Default: `postgres`
2930
- `DB_PASSWORD` - Database host. Default: `example`
3031
- `DB_DATABASE` - Database host. Default: `ms-configuration`
32+
- `MS_CONFIGS` - JSON string for configure initial `Config` values. Default: `[]`
3133

3234
### <a id="how-to-develop"></a>HOW TO DEVELOP:
3335
1. Run `Inverted Json` job server.
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import chai from 'chai';
22
import sinonChai from 'sinon-chai';
3+
import Log from '@services/log';
34

45
chai.use(sinonChai);
6+
Log.configure({ silent: true });
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import TypeormMock from '@lomray/microservice-helpers/mocks/typeorm';
2+
import rewiremock from 'rewiremock';
3+
import sinon from 'sinon';
4+
import OriginalConfigRepository from '@repositories/config-repository';
5+
6+
const { default: ConfigRepository } = rewiremock.proxy<{
7+
default: typeof OriginalConfigRepository;
8+
}>(() => require('@repositories/config-repository'), {
9+
typeorm: TypeormMock.mock,
10+
});
11+
12+
class ConfigRepositoryMock extends ConfigRepository {
13+
bulkSave = sinon.stub();
14+
}
15+
16+
export default ConfigRepositoryMock;

microservices/configuration/__mocks__/typeorm.ts

-15
This file was deleted.

microservices/configuration/__tests__/config/db-test.ts

+2-11
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
import TypeormMock from '@lomray/microservice-helpers/mocks/typeorm';
2+
import TypeormExtensionMock from '@lomray/microservice-helpers/mocks/typeorm-extension';
13
import { expect } from 'chai';
24
import rewiremock from 'rewiremock';
3-
import sinon from 'sinon';
4-
import TypeormMock from '@__mocks__/typeorm';
5-
import TypeormExtensionMock from '@__mocks__/typeorm-extension';
65

76
const { createDbConnection, connectionDbOptions } = rewiremock.proxy(() => require('@config/db'), {
87
typeorm: TypeormMock.mock,
@@ -15,14 +14,6 @@ describe('config/db', () => {
1514
TypeormExtensionMock.sandbox.reset();
1615
});
1716

18-
before(() => {
19-
sinon.stub(console, 'info');
20-
});
21-
22-
after(() => {
23-
sinon.restore();
24-
});
25-
2617
it('should correct create db connection', async () => {
2718
await createDbConnection(connectionDbOptions);
2819

microservices/configuration/__tests__/index-test.ts

+20-6
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
1+
import TypeormMock from '@lomray/microservice-helpers/mocks/typeorm';
12
import { Microservice } from '@lomray/microservice-nodejs-lib';
23
import { RemoteMiddlewareServer } from '@lomray/microservice-remote-middleware';
34
import { expect } from 'chai';
5+
import rewiremock from 'rewiremock';
46
import sinon from 'sinon';
57
import type { Connection } from 'typeorm';
8+
import ConfigRepositoryMock from '@__mocks__/config-repository';
69
import * as DBConfig from '@config/db';
710
import { microserviceOptions, microserviceParams } from '@config/ms';
811
import { MS_NAME, MS_CONNECTION } from '@constants/index';
9-
import { start } from '../src';
12+
import { start as OriginalStart } from '../src';
13+
14+
const { start } = rewiremock.proxy<{ start: typeof OriginalStart }>(() => require('../src'), {
15+
typeorm: TypeormMock.mock,
16+
});
1017

1118
describe('start', () => {
12-
const middlewareRepo = { middleware: 'repo' };
1319
const dbConnectionMock = {
14-
getRepository: sinon.stub().returns(middlewareRepo),
20+
getRepository: sinon.stub().returns({}),
1521
} as unknown as Promise<Connection>;
22+
const configRepository = new ConfigRepositoryMock();
1623

1724
before(() => {
1825
sinon.stub(console, 'info');
26+
TypeormMock.sandbox.reset();
27+
28+
TypeormMock.stubs.getCustomRepository.returns(configRepository);
1929
});
2030

2131
beforeEach(() => {
@@ -29,7 +39,8 @@ describe('start', () => {
2939
it('should correct start microservice', async () => {
3040
const spyCreate = sinon.spy(Microservice, 'create');
3141
let stubbedStart;
32-
let remoteMiddlewareInstance;
42+
let addRegisterEndpointSpy;
43+
let addObtainEndpointSpy;
3344
let dbConnection;
3445
let isRunBeforeStart = false;
3546

@@ -43,7 +54,8 @@ describe('start', () => {
4354
dbConnection = connection;
4455
},
4556
afterInitRemoteMiddleware: (remoteMiddleware) => {
46-
remoteMiddlewareInstance = remoteMiddleware;
57+
addRegisterEndpointSpy = sinon.spy(remoteMiddleware, 'addRegisterEndpoint');
58+
addObtainEndpointSpy = sinon.spy(remoteMiddleware, 'addObtainEndpoint');
4759
},
4860
beforeStart: () => {
4961
isRunBeforeStart = true;
@@ -57,7 +69,9 @@ describe('start', () => {
5769
expect(stubbedStart).to.calledOnce;
5870
expect(isRunBeforeStart).to.ok;
5971
expect(dbConnection).to.deep.equal(dbConnectionMock);
60-
expect(remoteMiddlewareInstance).property('repository').to.deep.equal(middlewareRepo);
72+
expect(addRegisterEndpointSpy).to.calledOnce;
73+
expect(addObtainEndpointSpy).to.calledOnce;
74+
expect(configRepository.bulkSave).to.calledOnce;
6175
});
6276

6377
it('should correct start microservice without remote middleware', async () => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import TypeormMock from '@lomray/microservice-helpers/mocks/typeorm';
2+
import { expect } from 'chai';
3+
import rewiremock from 'rewiremock';
4+
import { getCustomRepository } from 'typeorm';
5+
import Config from '@entities/config';
6+
import OriginalConfigRepository from '@repositories/config-repository';
7+
8+
const { default: ConfigRepository } = rewiremock.proxy<{
9+
default: typeof OriginalConfigRepository;
10+
}>(() => require('@repositories/config-repository'), {
11+
typeorm: TypeormMock.mock,
12+
});
13+
14+
describe('repositories/config-repository', () => {
15+
beforeEach(() => {
16+
TypeormMock.sandbox.reset();
17+
});
18+
19+
it('should correct split by chunks and create configs', async () => {
20+
const instance = getCustomRepository(ConfigRepository);
21+
const sampleConfigs: Partial<Config>[] = Array(5).fill({
22+
microservice: 'demo',
23+
type: 'db',
24+
});
25+
26+
await instance.bulkSave(sampleConfigs, 2);
27+
28+
const [, entities, config] = TypeormMock.entityManager.save.firstCall.args;
29+
30+
expect(entities).to.length(sampleConfigs.length);
31+
expect(config.chunk).to.equal(2);
32+
});
33+
});

0 commit comments

Comments
 (0)