@autofleet/node-common 1.0.8 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.eslintrc.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": [
3
+ "airbnb/base"
4
+ ],
5
+ "env": {
6
+ "jest": true
7
+ },
8
+ "rules": {
9
+ "semi": ["error", "never"]
10
+ }
11
+ }
package/.gitlab-ci.yml ADDED
@@ -0,0 +1,13 @@
1
+ image: node:8.9.4
2
+
3
+ stages:
4
+ - test
5
+
6
+ before_script:
7
+ - node -v
8
+ - npm -v
9
+ - npm install
10
+ test:
11
+ stage: test
12
+ script:
13
+ - npm run coverage
@@ -0,0 +1,8 @@
1
+ module.exports = {
2
+ testEnvironment: 'node',
3
+ coverageThreshold: {
4
+ global: {
5
+ lines: 80,
6
+ },
7
+ },
8
+ };
package/logger/index.js CHANGED
@@ -1,31 +1,41 @@
1
1
  const winston = require('winston')
2
+ require('dotenv').config()
2
3
 
3
- const createLogger = (logLevel) => {
4
- let level = logLevel ? logLevel : 'info'
5
- const logger = winston.createLogger({
6
- level,
7
- format: winston.format.simple(),
8
- transports: [
9
- //
10
- // - Write to all logs with level `info` and below to `combined.log`
11
- // - Write all logs error (and below) to `error.log`.
12
- //
13
- new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
14
- new winston.transports.File({ filename: 'logs/combined.log' })
15
- ]
16
- });
4
+ const { env } = process
17
5
 
18
- //
19
- // If we're not in production then log to the `console` with the format:
20
- // `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
21
- //
22
- if (process.env.NODE_ENV !== 'production') {
23
- logger.add(new winston.transports.Console({
24
- format: winston.format.simple()
25
- }));
6
+ const getLevel = (logLevel) => {
7
+ if (logLevel) return logLevel
8
+ if (env.LOG_LEVEL) return env.LOG_LEVEL
9
+ if (env.NODE_ENV === 'development') return 'debug'
10
+ // test and producion will return info
11
+ return 'info'
12
+ }
13
+
14
+ const getTransporters = () => {
15
+ let transporters = [new winston.transports.Console()]
16
+ if (env.USE_LOG_FILES === 'true') {
17
+ transporters = transporters.concat([
18
+ new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
19
+ new winston.transports.File({ filename: 'logs/all.log' }),
20
+ ])
26
21
  }
22
+ return transporters
23
+ }
24
+
25
+ const createLogger = (level, transporters) => {
26
+ const logger = winston.createLogger({
27
+ level,
28
+ format: winston.format.json(),
29
+ transports: transporters,
30
+ })
27
31
 
28
32
  return logger
29
33
  }
30
34
 
31
- module.exports = createLogger
35
+ const getLogger = (logLevel) => {
36
+ const level = getLevel(logLevel)
37
+ const transporters = getTransporters()
38
+ return createLogger(level, transporters)
39
+ }
40
+
41
+ module.exports = getLogger
@@ -0,0 +1,110 @@
1
+ const Logger = require('./index')
2
+ const fs = require('fs')
3
+ const wait = require('wait-promise')
4
+
5
+ const { env } = process
6
+
7
+ const deleteLogFile = (filePath) => {
8
+ const dir = 'logs'
9
+ if (!fs.existsSync(dir)) {
10
+ fs.mkdirSync(dir)
11
+ }
12
+ if (fs.existsSync(filePath)) {
13
+ fs.unlinkSync(filePath)
14
+ }
15
+ }
16
+
17
+ const waitForFileToHaveContent = ((filePath) => {
18
+ return wait.limit(30).until(() => {
19
+ if (fs.existsSync(filePath)) {
20
+ const content = fs.readFileSync(filePath, 'utf8')
21
+ return content !== ''
22
+ }
23
+ return false
24
+ })
25
+ })
26
+
27
+ describe('Logger', () => {
28
+ it('it`s default level is info', () => {
29
+ env.NODE_ENV=''
30
+ const logger = Logger()
31
+ expect(logger).toBeDefined()
32
+ expect(logger.level).toBe('info')
33
+ })
34
+
35
+ it('its default develpment level is debug', () => {
36
+ env.NODE_ENV='development'
37
+ const logger = Logger()
38
+ expect(logger.level).toBe('debug')
39
+ })
40
+
41
+ it('its default test level is info', () => {
42
+ env.NODE_ENV='test'
43
+ const logger = Logger()
44
+ expect(logger.level).toBe('info')
45
+ })
46
+
47
+ it('its default production level is info', () => {
48
+ env.NODE_ENV='production'
49
+ const logger = Logger()
50
+ expect(logger.level).toBe('info')
51
+ })
52
+
53
+ it('its level can be override by LOG_LEVEL env variable', () => {
54
+ env.NODE_ENV='development'
55
+ env.LOG_LEVEL='warn'
56
+ const logger = Logger()
57
+ expect(logger.level).toBe('warn')
58
+ })
59
+
60
+ it('its level can be override by function variable', () => {
61
+ env.NODE_ENV='production'
62
+ env.LOG_LEVEL='warn'
63
+ const logger = Logger('silly')
64
+ expect(logger.level).toBe('silly')
65
+ })
66
+
67
+ it('its has functions for each level', () => {
68
+ const logger = Logger()
69
+ expect(logger.error).toBeFunction()
70
+ expect(logger.warn).toBeFunction()
71
+ expect(logger.info).toBeFunction()
72
+ expect(logger.verbose).toBeFunction()
73
+ expect(logger.debug).toBeFunction()
74
+ expect(logger.silly).toBeFunction()
75
+ })
76
+
77
+ it('it can have general file transporters', async () => {
78
+ env.USE_LOG_FILES='true'
79
+ const allPath = 'logs/all.log'
80
+ deleteLogFile(allPath)
81
+
82
+ const logger = Logger()
83
+ const errorText = "this is error"
84
+ logger.error(errorText)
85
+
86
+ await waitForFileToHaveContent(allPath)
87
+
88
+ expect(fs.existsSync(allPath)).toBe(true)
89
+
90
+ const contents = fs.readFileSync(allPath, 'utf8')
91
+ expect(contents).toBe(`error: ${errorText}\n`)
92
+ })
93
+
94
+ it('it can have general file transporters', async () => {
95
+ env.USE_LOG_FILES='true'
96
+ const errorPath = 'logs/error.log'
97
+ deleteLogFile(errorPath)
98
+
99
+ expect(fs.existsSync(errorPath)).toBe(false)
100
+
101
+ const logger = Logger()
102
+ const errorText = "this is error"
103
+ logger.error(errorText)
104
+
105
+ await waitForFileToHaveContent(errorPath)
106
+
107
+ const contents = fs.readFileSync(errorPath, 'utf8')
108
+ expect(contents).toBe(`error: ${errorText}\n`)
109
+ })
110
+ })
package/network/index.js CHANGED
@@ -1,11 +1,12 @@
1
- const axios = require('axios');
2
- require('dotenv').config();
1
+ const axios = require('axios')
2
+ const httpAdapter = require('axios/lib/adapters/http')
3
+ require('dotenv').config()
3
4
  /**
4
- * Add support for nock testing
5
+ * Add support for nock testing
5
6
  * see s://github.com/axios/axios/issues/305
6
7
  */
7
8
  if (process.env.NODE_ENV === 'test') {
8
- axios.defaults.adapter = require('axios/lib/adapters/http')
9
+ axios.defaults.adapter = httpAdapter
9
10
  }
10
11
 
11
12
  const HTTPMethods = [
@@ -15,12 +16,12 @@ const HTTPMethods = [
15
16
  'head',
16
17
  'put',
17
18
  'patch',
18
- 'options'
19
+ 'options',
19
20
  ]
20
21
 
21
22
  const defaultSettings = {
22
23
  timeout: 2500,
23
- headers: { 'X-AF-AUTH': 'ANYONE' }
24
+ headers: { 'X-AF-AUTH': 'ANYONE' },
24
25
  }
25
26
 
26
27
  module.exports = class Network {
@@ -32,29 +33,31 @@ module.exports = class Network {
32
33
  }
33
34
 
34
35
  validate() {
35
- if (!this.settings.serviceUrl && ! this.settings.serviceName) {
36
+ if (!this.settings.serviceUrl && !this.settings.serviceName) {
36
37
  throw new Error('At least one of the settings Missing serviceUrl or serviceName')
37
38
  }
38
39
  }
39
40
 
40
41
  createBaseUrl() {
41
- let settings = this.settings
42
+ const { settings } = this
42
43
  if (settings.serviceUrl) {
43
- settings.baseURL = settings.serviceUrl;
44
+ settings.baseURL = settings.serviceUrl
44
45
  } else if (settings.serviceName) {
45
46
  const envServiceHostName = `${settings.serviceName}_SERVICE_HOST`
46
- settings.baseURL = 'http://' + process.env[envServiceHostName]
47
- if(!settings.baseURL) {
47
+ settings.baseURL = `http://${process.env[envServiceHostName]}`
48
+ if (!settings.baseURL) {
48
49
  throw new Error(`Missing environment variable: ${envServiceHostName}`)
49
50
  }
50
51
  }
51
52
  }
52
-
53
+
53
54
  /**
54
55
  * Build class methods that wrap axios methods
55
56
  */
56
57
  buildClassHttpMethods() {
57
- this.axios = axios.create(this.settings);
58
- HTTPMethods.map((method) => this[method] = (...args) => this.axios[method](...args))
58
+ this.axios = axios.create(this.settings)
59
+ HTTPMethods.forEach((method) => {
60
+ this[method] = (...args) => this.axios[method](...args)
61
+ })
59
62
  }
60
63
  }
@@ -0,0 +1,31 @@
1
+ const nock = require('nock')
2
+ const Network = require('./index')
3
+
4
+ nock('http://www.google.com')
5
+ .get('/resource')
6
+ .reply(200, { one: 1 })
7
+
8
+
9
+ nock('https://www.apple.com')
10
+ .get('/resource')
11
+ .reply(200, { two: 2 })
12
+
13
+ describe('Network', () => {
14
+ it('Making requests by service name from ENV', async () => {
15
+ process.env.TEST_SERVICE_HOST = 'www.google.com'
16
+ const n = new Network({ serviceName: 'TEST' })
17
+ const response = await n.get('/resource')
18
+ expect(response).toBeDefined()
19
+ expect(response.data).toBeDefined()
20
+ expect(response.data.one).toBe(1)
21
+ })
22
+
23
+ it('Making requests by service name from ENV', async () => {
24
+ process.env.TEST_SERVICE_HOST = 'www.google.com'
25
+ const n = new Network({ serviceUrl: 'https://www.apple.com' })
26
+ const response = await n.get('/resource')
27
+ expect(response).toBeDefined()
28
+ expect(response.data).toBeDefined()
29
+ expect(response.data.two).toBe(2)
30
+ })
31
+ })
package/package.json CHANGED
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "@autofleet/node-common",
3
- "version": "1.0.8",
3
+ "version": "1.1.1",
4
4
  "description": "",
5
- "main": "index.js",
6
5
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
6
+ "coverage": "jest --coverage --forceExit --runInBand",
7
+ "test": "jest --forceExit --runInBand",
8
+ "test-auto": "jest --watch --runInBand",
9
+ "linter": "./node_modules/.bin/eslint ."
10
+ },
11
+ "jest": {
12
+ "setupTestFrameworkScriptFile": "jest-extended"
8
13
  },
9
14
  "repository": {
10
15
  "type": "git",
@@ -19,6 +24,15 @@
19
24
  "dependencies": {
20
25
  "axios": "^0.18.0",
21
26
  "dotenv": "^5.0.1",
27
+ "jest": "^22.4.3",
28
+ "wait-promise": "^0.4.1",
22
29
  "winston": "^3.0.0-rc5"
30
+ },
31
+ "devDependencies": {
32
+ "eslint": "^4.19.1",
33
+ "eslint-config-airbnb": "^16.1.0",
34
+ "eslint-plugin-import": "^2.11.0",
35
+ "jest-extended": "^0.7.1",
36
+ "nock": "^9.2.5"
23
37
  }
24
38
  }
File without changes