Unit tests

This commit is contained in:
fkereki
2018-05-30 23:11:12 -04:00
parent 66fdef2908
commit f6da619b33
6 changed files with 439 additions and 117 deletions
+146 -109
View File
@@ -1114,7 +1114,7 @@
"babel-plugin-transform-es2015-unicode-regex": "6.24.1",
"babel-plugin-transform-exponentiation-operator": "6.24.1",
"babel-plugin-transform-regenerator": "6.26.0",
"browserslist": "3.2.7",
"browserslist": "3.2.8",
"invariant": "2.2.4",
"semver": "5.5.0"
}
@@ -1485,13 +1485,13 @@
}
},
"browserslist": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.7.tgz",
"integrity": "sha512-oYVLxFVqpX9uMhOIQBLtZL+CX4uY8ZpWcjNTaxyWl5rO8yA9SSNikFnAfvk8J3P/7z3BZwNmEqFKaJoYltj3MQ==",
"version": "3.2.8",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
"integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
"dev": true,
"requires": {
"caniuse-lite": "1.0.30000843",
"electron-to-chromium": "1.3.47"
"caniuse-lite": "1.0.30000846",
"electron-to-chromium": "1.3.48"
}
},
"bser": {
@@ -1587,9 +1587,9 @@
"integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
},
"caniuse-lite": {
"version": "1.0.30000843",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000843.tgz",
"integrity": "sha512-1ntiW826MhRBmM0CeI7w1cQr16gxwOoM8doJWh3BFalPZoKWdZXs27Bc04xth/3NR1/wNXn9cpP4F92lVenCvg==",
"version": "1.0.30000846",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000846.tgz",
"integrity": "sha512-qxUOHr5mTaadWH1ap0ueivHd8x42Bnemcn+JutVr7GWmm2bU4zoBhjuv5QdXgALQnnT626lOQros7cCDf8PwCg==",
"dev": true
},
"capture-exit": {
@@ -2334,9 +2334,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"electron-to-chromium": {
"version": "1.3.47",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.47.tgz",
"integrity": "sha1-dk6IfKkQTQGgrI6r7n38DizhQQQ=",
"version": "1.3.48",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz",
"integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=",
"dev": true
},
"enabled": {
@@ -2577,9 +2577,9 @@
"dev": true
},
"eslint-plugin-flowtype": {
"version": "2.47.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.47.1.tgz",
"integrity": "sha512-8PSgM3Fvnpkz5yE8MedV16cWIbXG1vgT3okqdopLEy9mH8Ok+5xce+t+K2EmYhUzEUEJTdIRQPXE/7xSLuAkKA==",
"version": "2.48.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.48.0.tgz",
"integrity": "sha512-D9zX5os88JjrIdM2eLldLYL8xJcbPIiMMT6n4fBFcAk/r6lGc+XPKOv5hpHt6OwfVrZ4TVoQAcKPyZB1hS0Ovg==",
"dev": true,
"requires": {
"lodash": "4.17.10"
@@ -2868,16 +2868,16 @@
}
},
"expect": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/expect/-/expect-23.0.1.tgz",
"integrity": "sha1-mRMfL9kRVZX4zDaXQB5/BzTUX+8=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/expect/-/expect-23.1.0.tgz",
"integrity": "sha1-v9/VeiogFw2HWZnul4fMcfAcIF8=",
"dev": true,
"requires": {
"ansi-styles": "3.2.1",
"jest-diff": "23.0.1",
"jest-get-type": "22.4.3",
"jest-matcher-utils": "23.0.1",
"jest-message-util": "23.0.0",
"jest-message-util": "23.1.0",
"jest-regex-util": "23.0.0"
}
},
@@ -5197,13 +5197,13 @@
}
},
"jest": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest/-/jest-23.0.1.tgz",
"integrity": "sha1-DQgykO5BEs7Pt4Dfb/gTMu03MgE=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest/-/jest-23.1.0.tgz",
"integrity": "sha1-u7f4kxAKEadC3YvQ0EelSwlorRo=",
"dev": true,
"requires": {
"import-local": "1.0.0",
"jest-cli": "23.0.1"
"jest-cli": "23.1.0"
},
"dependencies": {
"ansi-regex": {
@@ -5292,9 +5292,9 @@
}
},
"jest-cli": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.0.1.tgz",
"integrity": "sha1-NRpbpRzyjs8gM22XowuXDR9TClY=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.1.0.tgz",
"integrity": "sha1-64vdTODRUlCJLjGtm2m8mdKo9r8=",
"dev": true,
"requires": {
"ansi-escapes": "3.1.0",
@@ -5309,18 +5309,19 @@
"istanbul-lib-instrument": "1.10.1",
"istanbul-lib-source-maps": "1.2.4",
"jest-changed-files": "23.0.1",
"jest-config": "23.0.1",
"jest-environment-jsdom": "23.0.1",
"jest-config": "23.1.0",
"jest-environment-jsdom": "23.1.0",
"jest-get-type": "22.4.3",
"jest-haste-map": "23.0.1",
"jest-message-util": "23.0.0",
"jest-haste-map": "23.1.0",
"jest-message-util": "23.1.0",
"jest-regex-util": "23.0.0",
"jest-resolve-dependencies": "23.0.1",
"jest-runner": "23.0.1",
"jest-runtime": "23.0.1",
"jest-runner": "23.1.0",
"jest-runtime": "23.1.0",
"jest-snapshot": "23.0.1",
"jest-util": "23.0.1",
"jest-util": "23.1.0",
"jest-validate": "23.0.1",
"jest-watcher": "23.1.0",
"jest-worker": "23.0.1",
"micromatch": "2.3.11",
"node-notifier": "5.2.1",
@@ -5413,22 +5414,22 @@
}
},
"jest-config": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.0.1.tgz",
"integrity": "sha1-Z5i/8SR8ejkLEycZMwUAFYL8WPo=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.1.0.tgz",
"integrity": "sha1-cIyg9DHTVu5CT7SJXTMIAGvdgkE=",
"dev": true,
"requires": {
"babel-core": "6.26.3",
"babel-jest": "23.0.1",
"chalk": "2.4.1",
"glob": "7.1.2",
"jest-environment-jsdom": "23.0.1",
"jest-environment-node": "23.0.1",
"jest-environment-jsdom": "23.1.0",
"jest-environment-node": "23.1.0",
"jest-get-type": "22.4.3",
"jest-jasmine2": "23.0.1",
"jest-jasmine2": "23.1.0",
"jest-regex-util": "23.0.0",
"jest-resolve": "23.0.1",
"jest-util": "23.0.1",
"jest-resolve": "23.1.0",
"jest-util": "23.1.0",
"jest-validate": "23.0.1",
"pretty-format": "23.0.1"
}
@@ -5455,9 +5456,9 @@
}
},
"jest-each": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.0.1.tgz",
"integrity": "sha1-puXb9TCvxr+ddHkt3mnY23D4RwY=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.1.0.tgz",
"integrity": "sha1-FhRrWSw1SGelrl4TzfFcbGW2lsY=",
"dev": true,
"requires": {
"chalk": "2.4.1",
@@ -5465,24 +5466,24 @@
}
},
"jest-environment-jsdom": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.0.1.tgz",
"integrity": "sha1-2mieuTWNwW5XCKuyCPTrJqQ5V1w=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.1.0.tgz",
"integrity": "sha1-hZKZFOI77TV32sl1X0EG0Gl8R5w=",
"dev": true,
"requires": {
"jest-mock": "23.0.1",
"jest-util": "23.0.1",
"jest-mock": "23.1.0",
"jest-util": "23.1.0",
"jsdom": "11.11.0"
}
},
"jest-environment-node": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.0.1.tgz",
"integrity": "sha1-Z2t0DiBfHyvnckGWnngSvoJO55U=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.1.0.tgz",
"integrity": "sha1-RSwL+UnPy7rNoeF2Lu7XC8eEx9U=",
"dev": true,
"requires": {
"jest-mock": "23.0.1",
"jest-util": "23.0.1"
"jest-mock": "23.1.0",
"jest-util": "23.1.0"
}
},
"jest-get-type": {
@@ -5492,9 +5493,9 @@
"dev": true
},
"jest-haste-map": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.0.1.tgz",
"integrity": "sha1-zYkFKr/Iy6AfVgu+wJ1PNq7CXU8=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.1.0.tgz",
"integrity": "sha1-GObH1ajScTb5G32YUvhd4McHTEk=",
"dev": true,
"requires": {
"fb-watchman": "2.0.0",
@@ -5598,21 +5599,21 @@
}
},
"jest-jasmine2": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.0.1.tgz",
"integrity": "sha1-Fth1NW5jYIcrukhCb30x/cGwvOo=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.1.0.tgz",
"integrity": "sha1-SvqzFym2VN3NKwdK3YSTlvE7MLg=",
"dev": true,
"requires": {
"chalk": "2.4.1",
"co": "4.6.0",
"expect": "23.0.1",
"expect": "23.1.0",
"is-generator-fn": "1.0.0",
"jest-diff": "23.0.1",
"jest-each": "23.0.1",
"jest-each": "23.1.0",
"jest-matcher-utils": "23.0.1",
"jest-message-util": "23.0.0",
"jest-message-util": "23.1.0",
"jest-snapshot": "23.0.1",
"jest-util": "23.0.1",
"jest-util": "23.1.0",
"pretty-format": "23.0.1"
}
},
@@ -5637,9 +5638,9 @@
}
},
"jest-message-util": {
"version": "23.0.0",
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.0.0.tgz",
"integrity": "sha1-Bz89dscB98cYpLmvHrfxOHksR5Y=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.1.0.tgz",
"integrity": "sha1-moCbpIfsrFzlEdTmmO47XuJGHqk=",
"dev": true,
"requires": {
"@babel/code-frame": "7.0.0-beta.44",
@@ -5741,9 +5742,9 @@
}
},
"jest-mock": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.0.1.tgz",
"integrity": "sha1-FWn0d5aMZo/HKCc6F8N2d3O0Y1c=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.1.0.tgz",
"integrity": "sha1-o4HDGxIasfYMRiotrbe4bczKxIc=",
"dev": true
},
"jest-regex-util": {
@@ -5753,9 +5754,9 @@
"dev": true
},
"jest-resolve": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.0.1.tgz",
"integrity": "sha1-P4QDRisQo0wt8dR6q1V0xJNbzSQ=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.1.0.tgz",
"integrity": "sha1-ueMW7s69bwC8UKOWDRUnuuZXktI=",
"dev": true,
"requires": {
"browser-resolve": "1.11.2",
@@ -5774,21 +5775,21 @@
}
},
"jest-runner": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.0.1.tgz",
"integrity": "sha1-sXauPs+eGUqkuEp/z3DRuNsjGqc=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.1.0.tgz",
"integrity": "sha1-+iCpM//3MaVDKzVh5/ZCZZT6KbU=",
"dev": true,
"requires": {
"exit": "0.1.2",
"graceful-fs": "4.1.11",
"jest-config": "23.0.1",
"jest-config": "23.1.0",
"jest-docblock": "23.0.1",
"jest-haste-map": "23.0.1",
"jest-jasmine2": "23.0.1",
"jest-haste-map": "23.1.0",
"jest-jasmine2": "23.1.0",
"jest-leak-detector": "23.0.1",
"jest-message-util": "23.0.0",
"jest-runtime": "23.0.1",
"jest-util": "23.0.1",
"jest-message-util": "23.1.0",
"jest-runtime": "23.1.0",
"jest-util": "23.1.0",
"jest-worker": "23.0.1",
"source-map-support": "0.5.6",
"throat": "4.1.0"
@@ -5813,9 +5814,9 @@
}
},
"jest-runtime": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.0.1.tgz",
"integrity": "sha1-sddl+wP7bUBDgFrycGdqaT9QTVc=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.1.0.tgz",
"integrity": "sha1-tK4OhyWeys/UqIS2OdsHz03WIK8=",
"dev": true,
"requires": {
"babel-core": "6.26.3",
@@ -5825,13 +5826,13 @@
"exit": "0.1.2",
"fast-json-stable-stringify": "2.0.0",
"graceful-fs": "4.1.11",
"jest-config": "23.0.1",
"jest-haste-map": "23.0.1",
"jest-message-util": "23.0.0",
"jest-config": "23.1.0",
"jest-haste-map": "23.1.0",
"jest-message-util": "23.1.0",
"jest-regex-util": "23.0.0",
"jest-resolve": "23.0.1",
"jest-resolve": "23.1.0",
"jest-snapshot": "23.0.1",
"jest-util": "23.0.1",
"jest-util": "23.1.0",
"jest-validate": "23.0.1",
"micromatch": "2.3.11",
"realpath-native": "1.0.0",
@@ -6017,17 +6018,18 @@
}
},
"jest-util": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.0.1.tgz",
"integrity": "sha1-aOpb1+2xd9MFn5eXJZ+ODazOL5k=",
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.1.0.tgz",
"integrity": "sha1-wCUbrzRkTG3S/qeKli9CY6xVdy0=",
"dev": true,
"requires": {
"callsites": "2.0.0",
"chalk": "2.4.1",
"graceful-fs": "4.1.11",
"is-ci": "1.1.0",
"jest-message-util": "23.0.0",
"jest-message-util": "23.1.0",
"mkdirp": "0.5.1",
"slash": "1.0.0",
"source-map": "0.6.1"
},
"dependencies": {
@@ -6057,6 +6059,17 @@
"pretty-format": "23.0.1"
}
},
"jest-watcher": {
"version": "23.1.0",
"resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.1.0.tgz",
"integrity": "sha1-qNWELjjZ+0r/+CPfartCpYrmzb0=",
"dev": true,
"requires": {
"ansi-escapes": "3.1.0",
"chalk": "2.4.1",
"string-length": "2.0.0"
}
},
"jest-worker": {
"version": "23.0.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.0.1.tgz",
@@ -6177,9 +6190,9 @@
}
},
"jsonwebtoken": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz",
"integrity": "sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw==",
"version": "8.2.2",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.2.tgz",
"integrity": "sha512-rFFq7ow/JpPzwgaz4IyRL9cp7f4ptjW92eZgsQyqkysLBmDjSSBhnKfQESoq0GU+qJXK/CQ0o4shgwbUPiFCdw==",
"requires": {
"jws": "3.1.5",
"lodash.includes": "4.3.0",
@@ -6588,8 +6601,7 @@
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.33.0",
@@ -6738,6 +6750,11 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
},
"net": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz",
"integrity": "sha1-0XV+yaf7I3HYPPR1XOPifhCCk4g="
},
"nocache": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz",
@@ -6759,6 +6776,23 @@
"integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
"dev": true
},
"node-mocks-http": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.7.0.tgz",
"integrity": "sha512-AX1jGG87itK38N9UZif1CFYjJDibCOj07d0YGpUsxzglVWJjyJ3R7fxtuK7l6RVCKZteLiQyaTo9UR8rIEESgw==",
"requires": {
"accepts": "1.3.5",
"depd": "1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "1.1.2",
"mime": "1.6.0",
"net": "1.0.2",
"parseurl": "1.3.2",
"range-parser": "1.2.0",
"type-is": "1.6.16"
}
},
"node-notifier": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz",
@@ -7296,9 +7330,9 @@
"dev": true
},
"prettier": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz",
"integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=",
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.3.tgz",
"integrity": "sha512-CIWJNU+cFFdeA0GJSzzFkxiq2WuMvWZMlz6cV/EXhPlRnI3esSFMh+lNmyZ8z/X8O8C1U60Sc8puXALj4/WmZw==",
"dev": true
},
"pretty-format": {
@@ -9326,9 +9360,9 @@
"dev": true
},
"winston": {
"version": "3.0.0-rc5",
"resolved": "https://registry.npmjs.org/winston/-/winston-3.0.0-rc5.tgz",
"integrity": "sha512-BRYS7jsNkfLAqGu4dZW3kp6CmqiWKrComvfsIMYdsnpPre7g8BIw63nWRyX69vxyLYvZdszcEyxJkJmILXd/pA==",
"version": "3.0.0-rc6",
"resolved": "https://registry.npmjs.org/winston/-/winston-3.0.0-rc6.tgz",
"integrity": "sha512-4QwLccPbU/aJMA+j6uYTQ8TobwLKPWhpceJZwz1lkQ+wYv7bxGyAHIdbfEOrxsKHD8zRCcgCXPbbpV3BDRD1rw==",
"requires": {
"async": "2.6.1",
"diagnostics": "1.1.0",
@@ -9337,13 +9371,16 @@
"one-time": "0.0.4",
"stack-trace": "0.0.10",
"triple-beam": "1.3.0",
"winston-transport": "3.2.1"
"winston-transport": "4.0.0"
}
},
"winston-transport": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-3.2.1.tgz",
"integrity": "sha512-WPqbdAmMK/kfWCWKM2bA1o997wWPZ0jg5NpO8JPqoaDZgCiZnFpIEddcf7Ur4UZV2sYRUdySVBWKx0+gQQ/jrg=="
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.0.0.tgz",
"integrity": "sha512-0f2989AvU0GAzj8R7sG2/VWunlG9xd10eEQ3fP+MbP04249DXECww5H5HHvk5zY3Eflz7DtA5NTNXal5+RmAYQ==",
"requires": {
"triple-beam": "1.3.0"
}
},
"wordwrap": {
"version": "1.0.0",
+10 -8
View File
@@ -14,14 +14,13 @@
"flow": "flow",
"flow-coverage": "flow-coverage-report",
"eslint": "eslint src",
"test": "echo \"Error: no test specified\" && exit 1"
"test": "jest out/"
},
"author": "Federico Kereki",
"license": "ISC",
"babel": {
"presets": [
"env",
"node",
"flow"
]
},
@@ -33,7 +32,8 @@
"parser": "babel-eslint",
"env": {
"node": true,
"es6": true
"es6": true,
"jest": true
},
"extends": [
"eslint:recommended",
@@ -78,24 +78,26 @@
"dotenv": "^5.0.1",
"express": "^4.16.3",
"helmet": "^3.12.1",
"jsonwebtoken": "^8.2.1",
"jsonwebtoken": "^8.2.2",
"mariasql": "^0.2.6",
"morgan": "^1.9.0",
"winston": "^3.0.0-rc5"
"node-mocks-http": "^1.7.0",
"winston": "^3.0.0-rc6"
},
"devDependencies": {
"babel-eslint": "^8.2.2",
"babel-jest": "^23.0.1",
"babel-preset-env": "^1.7.0",
"babel-preset-flow": "^6.23.0",
"eslint": "^4.19.0",
"eslint-config-recommended": "^2.0.0",
"eslint-plugin-flowtype": "^2.47.1",
"eslint-plugin-flowtype": "^2.48.0",
"flow-bin": "^0.68.0",
"flow-coverage-report": "^0.5.0",
"flow-remove-types": "^1.2.3",
"flow-typed": "^2.4.0",
"jest": "^23.0.1",
"jest": "^23.1.0",
"nodemon": "^1.17.5",
"prettier": "^1.11.1"
"prettier": "^1.13.3"
}
}
+182
View File
@@ -0,0 +1,182 @@
/* @flow */
"use strict";
const getRegion = async (
res: any,
dbConn: any,
country: ?string,
region: ?string
) => {
try {
let sqlQuery = "";
if (country == null) {
sqlQuery = `
SELECT rr.*
FROM regions rr
JOIN countries cc
ON cc.countryCode=rr.countryCode
ORDER BY cc.countryCode, rr.regionCode
`;
} else if (region == null) {
sqlQuery = `
SELECT 1
FROM countries
WHERE countryCode="${country}"
`;
const countries = await dbConn.query(sqlQuery);
if (countries.length === 0) {
return res.status(404).send("Country not found");
}
sqlQuery = `
SELECT rr.*
FROM regions rr
JOIN countries cc
ON cc.countryCode=rr.countryCode
WHERE rr.countryCode="${country}"
ORDER BY rr.regionCode
`;
} else {
sqlQuery = `
SELECT rr.*
FROM regions rr
JOIN countries cc
ON cc.countryCode=rr.countryCode
WHERE rr.countryCode="${country}"
AND rr.regionCode="${region}"
`;
}
const regions = await dbConn.query(sqlQuery);
if (regions.length > 0 || region === null) {
res
.status(200)
.set("Content-Type", "application/json")
.send(JSON.stringify(regions));
} else {
res.status(404).send("Not found");
}
} catch (e) {
res.status(500).send("Server error");
}
};
const deleteRegion = async (
res: any,
dbConn: any,
country: string,
region: string
) => {
try {
const sqlCities = `
SELECT 1 FROM cities
WHERE countryCode="${country}"
AND regionCode="${region}"
LIMIT 1
`;
const cities = await dbConn.query(sqlCities);
if (cities.length > 0) {
res.status(405).send("Cannot delete a region with cities");
} else {
const deleteRegion = `
DELETE FROM regions
WHERE countryCode="${country}"
AND regionCode="${region}"
`;
const result = await dbConn.query(deleteRegion);
if (result.info.affectedRows > 0) {
res.status(204).send();
} else {
res.status(404).send("Region not found");
}
}
} catch (e) {
res.status(500).send("Server error");
}
};
const postRegion = async (
res: any,
dbConn: any,
country: string,
name: string
) => {
if (!name) {
return res.status(400).send("Missing name");
}
try {
const sqlCountry = `
SELECT 1
FROM countries
WHERE countryCode="${country}"
`;
const countries = await dbConn.query(sqlCountry);
if (countries.length === 0) {
res.status(403).send("Country must exist");
}
const sqlGetId = `
SELECT MAX(CAST(regionCode AS INTEGER)) AS maxr
FROM regions
WHERE countryCode="${country}"
`;
const regions = await dbConn.query(sqlGetId);
const newId =
regions.length === 0 ? 1 : 1 + Number(regions[0].maxr);
const sqlAddRegion = `
INSERT INTO regions SET
countryCode="${country}",
regionCode="${newId}",
regionName="${name}"
`;
const result = await dbConn.query(sqlAddRegion);
if (result.info.affectedRows > 0) {
res
.status(201)
.header("Location", `/regions/${country}/${newId}`)
.send("Region created");
} else {
res.status(409).send("Region not created");
}
} catch (e) {
res.status(500).send("Server error");
}
};
const putRegion = async (
res: any,
dbConn: any,
country: string,
region: string,
name: string
) => {
if (!name) {
return res.status(400).send("Missing name");
}
try {
const sqlUpdateRegion = `
UPDATE regions
SET regionName="${name}"
WHERE countryCode="${country}"
AND regionCode="${region}"
`;
const result = await dbConn.query(sqlUpdateRegion);
if (result.info.affectedRows > 0) {
res.status(204).send();
} else {
res.status(409).send("Region not updated");
}
} catch (e) {
res.status(500).send("Server error");
}
};
module.exports = { getRegion, deleteRegion, postRegion, putRegion };
+44
View File
@@ -0,0 +1,44 @@
/* @flow */
"use strict";
const { deleteRegion } = require("./restful_regions");
const mockRes = require("node-mocks-http");
describe("deleteRegion", () => {
it("should not delete a region with cities", async () => {
const mDb = { query: jest.fn() };
mDb.query.mockReturnValueOnce(Promise.resolve([1]));
const mRes = new mockRes.createResponse();
await deleteRegion(mRes, mDb, "UY", "11");
expect(mRes.statusCode).toBe(405);
});
it("should delete a region without cities", async () => {
const mDb = { query: jest.fn() };
mDb.query
.mockReturnValueOnce(Promise.resolve([]))
.mockReturnValueOnce(
Promise.resolve({
info: { affectedRows: 1 }
})
);
const mRes = new mockRes.createResponse();
await deleteRegion(mRes, mDb, "UY", "11");
expect(mRes.statusCode).toBe(204);
});
it("should produce a 404 for non-existing region", async () => {
const mDb = { query: jest.fn() };
mDb.query
.mockReturnValueOnce(Promise.resolve([]))
.mockReturnValueOnce(
Promise.resolve({
info: { affectedRows: 0 }
})
);
const mRes = new mockRes.createResponse();
await deleteRegion(mRes, mDb, "UY", "11");
expect(mRes.statusCode).toBe(404);
});
});
+34
View File
@@ -0,0 +1,34 @@
/* @flow */
"use strict";
// These won't be exported:
const roundToCents = (x: number): number => Math.round(x * 100) / 100;
const changeSign = (x: number): number => -x;
// The following will be exported:
const addR = (x: number, y: number): number => roundToCents(x + y);
const subR = (x: number, y: number): number => addR(x, changeSign(y));
const multR = (x: number, y: number): number => roundToCents(x * y);
const divR = (x: number, y: number): number => {
if (y === 0) {
throw new Error("Divisor must be nonzero");
} else {
return roundToCents(x / y);
}
};
/*
NOTES:
1. Exports are all together, at the end, per convention
2. roundToCents and changeSign are not exported, on purpose
*/
exports.addR = addR;
exports.subR = subR;
exports.multR = multR;
exports.divR = divR;
+23
View File
@@ -0,0 +1,23 @@
/* @flow */
"use strict";
const rm = require("./roundmath");
describe("addR", () => {
it("should add first and round later", () => {
expect(rm.addR(1.505, 2.505)).toBe(4.01);
});
it("should handle negatives", () => {
expect(rm.addR(3.15, -2.149)).toBe(1.0);
});
});
describe("divR", () => {
it("should divide first, then round", () => {
expect(rm.divR(22.96, 0.001)).toBe(22960);
});
it("should not divide by zero", () =>
expect(() => rm.divR(22, 0)).toThrow());
});