diff --git a/cucumber.js b/cucumber.js new file mode 100644 index 0000000..3877193 --- /dev/null +++ b/cucumber.js @@ -0,0 +1,9 @@ +let common = [ + 'tests/**/features/*.feature', // Specify our feature files + '--require-module ts-node/register', // Load TypeScript module + '--require tests/**/features/step_definitions/*.steps.ts' // Load step definitions +].join(' '); + +module.exports = { + default: common +}; diff --git a/package-lock.json b/package-lock.json index e489159..9b4198d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -153,6 +153,16 @@ "regenerator-runtime": "^0.13.2" } }, + "@babel/runtime-corejs2": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.6.3.tgz", + "integrity": "sha512-nuA2o+rgX2+PrNTZ063ehncVcg7sn+tU71BB81SaWRVUbGwCOlb0+yQA1e0QqmzOfRSYOxfvf8cosYqFbJEiwQ==", + "dev": true, + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.2" + } + }, "@babel/template": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", @@ -479,6 +489,14 @@ "@types/node": "*" } }, + "@types/bson": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.0.tgz", + "integrity": "sha512-pq/rqJwJWkbS10crsG5bgnrisL8pML79KlMKQMoQwLUjlPAkrUHMvHJ3oGwE7WHR61Lv/nadMwXVAD2b+fpD8Q==", + "requires": { + "@types/node": "*" + } + }, "@types/compression": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.0.1.tgz", @@ -506,6 +524,12 @@ "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==", "dev": true }, + "@types/cucumber": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/cucumber/-/cucumber-4.0.7.tgz", + "integrity": "sha512-uYvDSl+JV1fT1U9EIFXlnb7DjZdRNYZHQFppQf9aYAe71joppErWenznupwZUj9zuo+SAFYNoongarQpNOb+pQ==", + "dev": true + }, "@types/errorhandler": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/@types/errorhandler/-/errorhandler-0.0.32.tgz", @@ -755,6 +779,12 @@ "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", "dev": true }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -848,6 +878,17 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, + "assertion-error-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz", + "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==", + "dev": true, + "requires": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + } + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -1018,6 +1059,11 @@ } } }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -1027,6 +1073,12 @@ "tweetnacl": "^0.14.3" } }, + "becke-ch--regex--s0-0-v1--base--pl--lib": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/becke-ch--regex--s0-0-v1--base--pl--lib/-/becke-ch--regex--s0-0-v1--base--pl--lib-1.4.0.tgz", + "integrity": "sha1-Qpzuu/pffpNueNc/vcfacWKyDiA=", + "dev": true + }, "bluebird": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", @@ -1145,6 +1197,24 @@ "node-int64": "^0.4.0" } }, + "bson": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.0.2.tgz", + "integrity": "sha512-rBdCxMBCg2aR420e1oKUejjcuPZLTibA7zEhWAlliFWEwzuBCC9Dkp5r7VFFIQB2t1WVsvTbohry575mc7Xw5A==", + "requires": { + "buffer": "^5.1.0", + "long": "^4.0.0" + } + }, + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1280,6 +1350,50 @@ "restore-cursor": "^2.0.0" } }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "cli-truncate": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", @@ -1335,6 +1449,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1492,6 +1612,12 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1537,6 +1663,116 @@ "cssom": "0.3.x" } }, + "cucumber": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/cucumber/-/cucumber-6.0.2.tgz", + "integrity": "sha512-yEwPYGvgS2KG6ODdUXQwWcxjyr/l31dmpGJsZSkJIXNLNNmieKVefTpf8zLj6+0V2TCPwkmUZt4+OIXv97duEw==", + "dev": true, + "requires": { + "assertion-error-formatter": "^3.0.0", + "bluebird": "^3.4.1", + "cli-table3": "^0.5.1", + "colors": "^1.1.2", + "commander": "^3.0.1", + "cucumber-expressions": "^8.0.1", + "cucumber-tag-expressions": "^2.0.2", + "duration": "^0.2.1", + "escape-string-regexp": "^2.0.0", + "figures": "^3.0.0", + "gherkin": "5.0.0", + "glob": "^7.1.3", + "indent-string": "^4.0.0", + "is-generator": "^1.0.2", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash": "^4.17.14", + "mz": "^2.4.0", + "progress": "^2.0.0", + "resolve": "^1.3.3", + "serialize-error": "^4.1.0", + "stack-chain": "^2.0.0", + "stacktrace-js": "^2.0.0", + "string-argv": "^0.3.0", + "title-case": "^2.1.1", + "util-arity": "^1.0.2", + "verror": "^1.9.0" + }, + "dependencies": { + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "figures": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + } + } + }, + "cucumber-expressions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cucumber-expressions/-/cucumber-expressions-8.0.1.tgz", + "integrity": "sha512-g+A+tUEafNofe6ErwvOkqaMvDj9NuOr0GouGotpw4r5yK2d4144o9/6sQpXBr2YXbRy5ItmER/2bzAyDAzhPyQ==", + "dev": true, + "requires": { + "becke-ch--regex--s0-0-v1--base--pl--lib": "^1.4.0", + "xregexp": "^4.2.4" + } + }, + "cucumber-tag-expressions": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cucumber-tag-expressions/-/cucumber-tag-expressions-2.0.2.tgz", + "integrity": "sha512-DohmT4X641KX/sb96bdb7J2kXNcQBPrYmf3Oc5kiHCLfzFMWx/o2kB4JvjvQPZnYuA9lRt6pqtArM5gvUn4uzw==", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1729,6 +1965,16 @@ "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" }, + "duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, "easy-table": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz", @@ -1787,6 +2033,15 @@ "is-arrayish": "^0.2.1" } }, + "error-stack-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.4.tgz", + "integrity": "sha512-fZ0KkoxSjLFmhW5lHbUT3tLwy3nX1qEzMYo8koY1vrsAco53CMT1djnBSeC/wUjTEZRhZl9iRw7PaMaxfJ4wzQ==", + "dev": true, + "requires": { + "stackframe": "^1.1.0" + } + }, "errorhandler": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", @@ -1825,6 +2080,38 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.51" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2917,6 +3204,12 @@ "assert-plus": "^1.0.0" } }, + "gherkin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gherkin/-/gherkin-5.0.0.tgz", + "integrity": "sha1-lt70EZjsOQgli1Ea909lWidk0qE=", + "dev": true + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -3255,6 +3548,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, "ienoopen": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", @@ -3437,6 +3735,12 @@ "number-is-nan": "^1.0.0" } }, + "is-generator": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", + "integrity": "sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=", + "dev": true + }, "is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", @@ -4445,6 +4749,15 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "knuth-shuffle-seeded": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", + "integrity": "sha1-AfG2VzOqdUDuCNiwF0Fk0iCB5OE=", + "dev": true, + "requires": { + "seed-random": "~2.2.0" + } + }, "lazy-cache": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", @@ -4710,6 +5023,11 @@ "wrap-ansi": "^3.0.1" } }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4719,6 +5037,12 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -4987,6 +5311,17 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -5108,12 +5443,27 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, "nocache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", @@ -5426,6 +5776,15 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", + "dev": true, + "requires": { + "repeat-string": "^1.5.2" + } + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -5599,6 +5958,12 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "prompts": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", @@ -6025,6 +6390,12 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ=", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -6079,6 +6450,15 @@ } } }, + "serialize-error": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-4.1.0.tgz", + "integrity": "sha512-5j9GgyGsP9vV9Uj1S0lDCvlsd+gc2LEPVK7HHHte7IyPwOD4lVQFeaX143gx3U5AnoCi+wbcb3mvaxVysjpxEw==", + "dev": true, + "requires": { + "type-fest": "^0.3.0" + } + }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", @@ -6425,12 +6805,62 @@ "tweetnacl": "~0.14.0" } }, + "stack-chain": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-2.0.0.tgz", + "integrity": "sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg==", + "dev": true + }, + "stack-generator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.4.tgz", + "integrity": "sha512-ha1gosTNcgxwzo9uKTQ8zZ49aUp5FIUW58YHFxCqaAHtE0XqBg0chGFYA1MfmW//x1KWq3F4G7Ug7bJh4RiRtg==", + "dev": true, + "requires": { + "stackframe": "^1.1.0" + } + }, "stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "dev": true }, + "stackframe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.0.tgz", + "integrity": "sha512-Vx6W1Yvy+AM1R/ckVwcHQHV147pTPBKWCRLrXMuPrFVfvBUc3os7PR1QLIWCMhPpRg5eX9ojzbQIMLGBwyLjqg==", + "dev": true + }, + "stacktrace-gps": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.3.tgz", + "integrity": "sha512-51Rr7dXkyFUKNmhY/vqZWK+EvdsfFSRiQVtgHTFlAdNIYaDD7bVh21yBHXaNWAvTD+w+QSjxHg7/v6Tz4veExA==", + "dev": true, + "requires": { + "source-map": "0.5.6", + "stackframe": "^1.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "stacktrace-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.1.tgz", + "integrity": "sha512-13oDNgBSeWtdGa4/2BycNyKqe+VktCoJ8VLx4pDoJkwGGJVtiHdfMOAj3aW9xTi8oR2v34z9IcvfCvT6XNdNAw==", + "dev": true, + "requires": { + "error-stack-parser": "^2.0.4", + "stack-generator": "^2.0.4", + "stacktrace-gps": "^3.0.3" + } + }, "staged-git-files": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", @@ -6647,6 +7077,24 @@ "require-main-filename": "^2.0.0" } }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "throat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", @@ -6662,6 +7110,16 @@ "xtend": "~4.0.1" } }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -7003,6 +7461,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -7012,6 +7476,12 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -7110,6 +7580,12 @@ } } }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -7131,6 +7607,12 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "util-arity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", + "integrity": "sha1-WdAa8f2z/t4KxOYysKtfbOl8kzA=", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -7355,6 +7837,15 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xregexp": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.2.4.tgz", + "integrity": "sha512-sO0bYdYeJAJBcJA8g7MJJX7UrOZIfJPd8U2SC7B2Dd/J24U0aQNoGp33shCaBSWeb0rD5rh6VBUIXOkGal1TZA==", + "dev": true, + "requires": { + "@babel/runtime-corejs2": "^7.2.0" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index f823774..8e0981d 100644 --- a/package.json +++ b/package.json @@ -7,15 +7,17 @@ "npm": ">=6.7.0" }, "scripts": { - "test": "NODE_ENV=test jest", - "test:unit": "NODE_ENV=test jest --watch", - "start": "NODE_ENV=production node dist/src/apps/mooc/server", + "test": "npm run test:unit && npm run test:features", + "test:unit": "NODE_ENV=test jest", + "test:features": "NODE_ENV=test cucumber-js -p default", + "start": "NODE_ENV=production node dist/src/apps/mooc_backend/server", "build": "npm run build:clean && npm run build:tsc && npm run build:di", "build:tsc": "tsc -p tsconfig.prod.json", "build:di": "copy 'src/**/*.yaml' dist/src", "build:clean": "rm -r dist; exit 0" }, "dependencies": { + "@types/bson": "^4.0.0", "@types/compression": "^1.0.1", "@types/convict": "^4.2.1", "@types/errorhandler": "0.0.32", @@ -24,6 +26,7 @@ "@types/node": "~11.13.0", "@types/uuid": "^3.4.5", "body-parser": "^1.19.0", + "bson": "^4.0.2", "compression": "^1.7.4", "convict": "^5.1.0", "copy": "^0.3.2", @@ -39,9 +42,11 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.31", + "@types/cucumber": "^4.0.7", "@types/faker": "^4.1.5", "@types/jest": "^24.0.18", "@types/supertest": "^2.0.8", + "cucumber": "^6.0.2", "faker": "^4.1.0", "husky": "^1.3.1", "jest": "^24.9.0", diff --git a/src/Mooc/Courses/application/CreateCourse.ts b/src/Mooc/Courses/application/CreateCourse.ts index 35ee45b..6c15d02 100644 --- a/src/Mooc/Courses/application/CreateCourse.ts +++ b/src/Mooc/Courses/application/CreateCourse.ts @@ -1,5 +1,16 @@ +import CourseRepository from '../domain/CourseRepository'; +import Course from '../domain/Course'; + export default class CreateCourse { - async run(): Promise { - return null; + private repository: CourseRepository; + + constructor(repository: CourseRepository) { + this.repository = repository; + } + + async run(id: string, name: string, duration: string): Promise { + const course = new Course(id, name, duration); + + this.repository.save(course); } } diff --git a/src/Mooc/Courses/domain/Course.ts b/src/Mooc/Courses/domain/Course.ts new file mode 100644 index 0000000..a7a8432 --- /dev/null +++ b/src/Mooc/Courses/domain/Course.ts @@ -0,0 +1,23 @@ +export default class Course { + private _id: string; + private _name: string; + private _duration: string; + + constructor(id: string, name: string, duration: string) { + this._id = id; + this._name = name; + this._duration = duration; + } + + get id(): string { + return this._id; + } + + get name(): string { + return this._name; + } + + get duration(): string { + return this._duration; + } +} diff --git a/src/Mooc/Courses/domain/CourseRepository.ts b/src/Mooc/Courses/domain/CourseRepository.ts new file mode 100644 index 0000000..2dbe575 --- /dev/null +++ b/src/Mooc/Courses/domain/CourseRepository.ts @@ -0,0 +1,7 @@ +import Course from './Course'; + +export default interface CourseRepository { + save(course: Course): Promise | void; + + search(id: string): Promise | Course; +} diff --git a/src/Mooc/Courses/infrastructure/FileCourseRepository.ts b/src/Mooc/Courses/infrastructure/FileCourseRepository.ts new file mode 100644 index 0000000..75834cb --- /dev/null +++ b/src/Mooc/Courses/infrastructure/FileCourseRepository.ts @@ -0,0 +1,20 @@ +import CourseRepository from '../domain/CourseRepository'; +import Course from '../domain/Course'; +import * as fs from 'fs'; +import BSON from 'bson'; + +export default class FileCourseRepository implements CourseRepository { + private FILE_PATH = `${__dirname}/courses`; + + save(course: Course): void | Promise { + fs.writeFileSync(this.filePath(course.id), BSON.serialize(course)); + } + + search(id: string): Course { + return fs.existsSync(this.filePath(id)) ? BSON.deserialize(fs.readFileSync(this.filePath(id))) : null; + } + + private filePath(id: string): string { + return `${this.FILE_PATH}.${id}.repo`; + } +} diff --git a/src/apps/mooc/config/dependency-injection/application.yaml b/src/apps/mooc/config/dependency-injection/application.yaml deleted file mode 100644 index ac0cb73..0000000 --- a/src/apps/mooc/config/dependency-injection/application.yaml +++ /dev/null @@ -1,9 +0,0 @@ -services: - - Mooc.courses.CreateCourse: - class: ../../../../Mooc/Courses/application/CreateCourse - arguments: [] - - Apps.mooc.controllers.CreateCourseController: - class: ../../infrastructure/controllers/CreateCourseController - arguments: ['@Mooc.courses.CreateCourse'] diff --git a/src/apps/mooc/infrastructure/controllers/CreateCourseController.ts b/src/apps/mooc/infrastructure/controllers/CreateCourseController.ts deleted file mode 100644 index cba013d..0000000 --- a/src/apps/mooc/infrastructure/controllers/CreateCourseController.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Request, Response } from 'express'; -import CreateCourse from '../../../../Mooc/Courses/application/CreateCourse'; -import httpStatus from 'http-status'; - -export default class CreateCourseController { - constructor(private createUser: CreateCourse) {} - - async create(req: Request, res: Response) { - try { - await this.createUser.run(); - } catch (e) { - res.status(500).json(e); - } - - res.status(httpStatus.CREATED).send(); - } -} diff --git a/src/apps/mooc/app.ts b/src/apps/mooc_backend/app.ts similarity index 89% rename from src/apps/mooc/app.ts rename to src/apps/mooc_backend/app.ts index 90ce8b2..d575de2 100644 --- a/src/apps/mooc/app.ts +++ b/src/apps/mooc_backend/app.ts @@ -2,7 +2,7 @@ import bodyParser from 'body-parser'; import express from 'express'; import helmet from 'helmet'; import compress from 'compression'; -import { registerRoutes } from './infrastructure/routes'; +import { registerRoutes } from './routes'; const app: express.Express = express(); diff --git a/src/apps/mooc/config/config.ts b/src/apps/mooc_backend/config/config.ts similarity index 100% rename from src/apps/mooc/config/config.ts rename to src/apps/mooc_backend/config/config.ts diff --git a/src/apps/mooc/config/default.json b/src/apps/mooc_backend/config/default.json similarity index 100% rename from src/apps/mooc/config/default.json rename to src/apps/mooc_backend/config/default.json diff --git a/src/apps/mooc_backend/config/dependency-injection/application.yaml b/src/apps/mooc_backend/config/dependency-injection/application.yaml new file mode 100644 index 0000000..c2904c6 --- /dev/null +++ b/src/apps/mooc_backend/config/dependency-injection/application.yaml @@ -0,0 +1,16 @@ +services: + Mooc.courses.CourseRepository: + class: ../../../../Mooc/Courses/infrastructure/FileCourseRepository + arguments: [] + + Mooc.courses.CreateCourse: + class: ../../../../Mooc/Courses/application/CreateCourse + arguments: ["@Mooc.courses.CourseRepository"] + + Apps.mooc.controllers.CreateCourseController: + class: ../../controllers/CreateCourseController + arguments: ["@Mooc.courses.CreateCourse"] + + Apps.mooc.controllers.StatusController: + class: ../../controllers/StatusController + arguments: [] diff --git a/src/apps/mooc/config/dependency-injection/application_dev.yaml b/src/apps/mooc_backend/config/dependency-injection/application_dev.yaml similarity index 100% rename from src/apps/mooc/config/dependency-injection/application_dev.yaml rename to src/apps/mooc_backend/config/dependency-injection/application_dev.yaml diff --git a/src/apps/mooc/config/dependency-injection/application_production.yaml b/src/apps/mooc_backend/config/dependency-injection/application_production.yaml similarity index 100% rename from src/apps/mooc/config/dependency-injection/application_production.yaml rename to src/apps/mooc_backend/config/dependency-injection/application_production.yaml diff --git a/src/apps/mooc/config/dependency-injection/application_staging.yaml b/src/apps/mooc_backend/config/dependency-injection/application_staging.yaml similarity index 100% rename from src/apps/mooc/config/dependency-injection/application_staging.yaml rename to src/apps/mooc_backend/config/dependency-injection/application_staging.yaml diff --git a/src/apps/mooc/config/dependency-injection/application_test.yaml b/src/apps/mooc_backend/config/dependency-injection/application_test.yaml similarity index 100% rename from src/apps/mooc/config/dependency-injection/application_test.yaml rename to src/apps/mooc_backend/config/dependency-injection/application_test.yaml diff --git a/src/apps/mooc/config/dependency-injection/index.ts b/src/apps/mooc_backend/config/dependency-injection/index.ts similarity index 100% rename from src/apps/mooc/config/dependency-injection/index.ts rename to src/apps/mooc_backend/config/dependency-injection/index.ts diff --git a/src/apps/mooc/config/staging.json b/src/apps/mooc_backend/config/staging.json similarity index 100% rename from src/apps/mooc/config/staging.json rename to src/apps/mooc_backend/config/staging.json diff --git a/src/apps/mooc/config/test.json b/src/apps/mooc_backend/config/test.json similarity index 100% rename from src/apps/mooc/config/test.json rename to src/apps/mooc_backend/config/test.json diff --git a/src/apps/mooc_backend/controllers/CreateCourseController.ts b/src/apps/mooc_backend/controllers/CreateCourseController.ts new file mode 100644 index 0000000..436c1f0 --- /dev/null +++ b/src/apps/mooc_backend/controllers/CreateCourseController.ts @@ -0,0 +1,21 @@ +import { Request, Response } from 'express'; +import CreateCourse from '../../../Mooc/Courses/application/CreateCourse'; +import httpStatus from 'http-status'; + +export default class CreateCourseController { + constructor(private createCourse: CreateCourse) {} + + async create(req: Request, res: Response) { + const id: string = req.params.id; + const name: string = req.body.name; + const duration: string = req.body.duration; + + try { + await this.createCourse.run(id, name, duration); + } catch (e) { + res.status(500).json(e); + } + + res.status(httpStatus.CREATED).send(); + } +} diff --git a/src/apps/mooc_backend/controllers/StatusController.ts b/src/apps/mooc_backend/controllers/StatusController.ts new file mode 100644 index 0000000..44c7c44 --- /dev/null +++ b/src/apps/mooc_backend/controllers/StatusController.ts @@ -0,0 +1,8 @@ +import { Request, Response } from 'express'; +import httpStatus from 'http-status'; + +export default class StatusController { + async create(req: Request, res: Response) { + res.status(httpStatus.OK).send(); + } +} diff --git a/src/apps/mooc/infrastructure/routes/create-course.route.ts b/src/apps/mooc_backend/routes/create-course.route.ts similarity index 68% rename from src/apps/mooc/infrastructure/routes/create-course.route.ts rename to src/apps/mooc_backend/routes/create-course.route.ts index 733ccf3..cafd913 100644 --- a/src/apps/mooc/infrastructure/routes/create-course.route.ts +++ b/src/apps/mooc_backend/routes/create-course.route.ts @@ -1,9 +1,8 @@ import { Express } from 'express'; -import container from '../../config/dependency-injection'; +import container from '../config/dependency-injection'; import CreateCourseController from '../controllers/CreateCourseController'; export const createUserRoute = (app: Express) => { - const controller: CreateCourseController = container.get('Apps.mooc.controllers.CreateCourseController'); - app.post('/courses', (req, res) => controller.create(req, res)); + app.put('/courses/:id', (req, res) => controller.create(req, res)); }; diff --git a/src/apps/mooc/infrastructure/routes/index.ts b/src/apps/mooc_backend/routes/index.ts similarity index 56% rename from src/apps/mooc/infrastructure/routes/index.ts rename to src/apps/mooc_backend/routes/index.ts index dbfeca4..77959b7 100644 --- a/src/apps/mooc/infrastructure/routes/index.ts +++ b/src/apps/mooc_backend/routes/index.ts @@ -1,7 +1,8 @@ -import {Express} from 'express'; +import { Express } from 'express'; +import { statusRoute } from './status.route'; import { createUserRoute } from './create-course.route'; export function registerRoutes(app: Express) { - + statusRoute(app); createUserRoute(app); } diff --git a/src/apps/mooc_backend/routes/status.route.ts b/src/apps/mooc_backend/routes/status.route.ts new file mode 100644 index 0000000..28eeecb --- /dev/null +++ b/src/apps/mooc_backend/routes/status.route.ts @@ -0,0 +1,8 @@ +import { Express } from 'express'; +import container from '../config/dependency-injection'; +import StatusController from '../controllers/StatusController'; + +export const statusRoute = (app: Express) => { + const controller: StatusController = container.get('Apps.mooc.controllers.StatusController'); + app.get('/status', (req, res) => controller.create(req, res)); +}; diff --git a/src/apps/mooc/server.ts b/src/apps/mooc_backend/server.ts similarity index 100% rename from src/apps/mooc/server.ts rename to src/apps/mooc_backend/server.ts diff --git a/tests/Mooc/Courses/application/CreateCourse.test.ts b/tests/Mooc/Courses/application/CreateCourse.test.ts new file mode 100644 index 0000000..e7cc8dd --- /dev/null +++ b/tests/Mooc/Courses/application/CreateCourse.test.ts @@ -0,0 +1,25 @@ +import Course from '../../../../src/Mooc/Courses/domain/Course'; +import CreateCourse from '../../../../src/Mooc/Courses/application/CreateCourse'; +import CourseRepository from '../../../../src/Mooc/Courses/domain/CourseRepository'; + +describe('Create Course', () => { + it('should create a valid course', async () => { + const save = jest.fn(); + const repository: CourseRepository = { + save, + search: jest.fn() + }; + + const createCourse = new CreateCourse(repository); + + const id = 'some-id'; + const name = 'some-name'; + const duration = 'some-duration'; + + const course = new Course(id, name, duration); + + await createCourse.run(id, name, duration); + + expect(save).toHaveBeenCalledWith(course); + }); +}); diff --git a/tests/Mooc/Courses/infrastructure/FileCourseRepository.test.ts b/tests/Mooc/Courses/infrastructure/FileCourseRepository.test.ts new file mode 100644 index 0000000..b68da3e --- /dev/null +++ b/tests/Mooc/Courses/infrastructure/FileCourseRepository.test.ts @@ -0,0 +1,11 @@ +import Course from '../../../../src/Mooc/Courses/domain/Course'; +import FileCourseRepository from '../../../../src/Mooc/Courses/infrastructure/FileCourseRepository'; + +describe('Save Course', () => { + it('should have a course', () => { + const repository = new FileCourseRepository(); + const course = new Course('id', 'name', 'duration'); + + repository.save(course); + }); +}); diff --git a/tests/apps/mooc/features/create-course.test.ts b/tests/apps/mooc/features/create-course.test.ts deleted file mode 100644 index 3ddd973..0000000 --- a/tests/apps/mooc/features/create-course.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import request from 'supertest'; -import app from '../../../../src/apps/mooc/app'; - -describe('Create Course Feature', () => { - it('should respond with a 201 Created code', async () => { - await request(app) - .post('/courses') - .send({}) - .expect(201); - }); -}); diff --git a/tests/apps/mooc_backend/features/create-course.feature b/tests/apps/mooc_backend/features/create-course.feature new file mode 100644 index 0000000..1d5ca8d --- /dev/null +++ b/tests/apps/mooc_backend/features/create-course.feature @@ -0,0 +1,15 @@ +Feature: Create a new course + In order to have courses in the platform + As a user with admin permissions + I want to create a new course + + Scenario: A valid unexisting course + Given I send a PUT request to "/courses/ef8ac118-8d7f-49cc-abec-78e0d05af80a" with body: + """ + { + "name": "The best course", + "duration": "5 hours" + } + """ + Then the response status code should be 201 + And the response should be empty diff --git a/tests/apps/mooc_backend/features/status.feature b/tests/apps/mooc_backend/features/status.feature new file mode 100644 index 0000000..61e614c --- /dev/null +++ b/tests/apps/mooc_backend/features/status.feature @@ -0,0 +1,8 @@ +Feature: Api status + In order to know the server is up and running + As a health check + I want to check the api status + + Scenario: Check the api status + Given I send a GET request to "/status" + Then the response status code should be 200 diff --git a/tests/apps/mooc_backend/features/step_definitions/controller.steps.ts b/tests/apps/mooc_backend/features/step_definitions/controller.steps.ts new file mode 100644 index 0000000..fdeaff0 --- /dev/null +++ b/tests/apps/mooc_backend/features/step_definitions/controller.steps.ts @@ -0,0 +1,25 @@ +import { Given, Then } from 'cucumber'; +import request from 'supertest'; +import app from '../../../../../src/apps/mooc_backend/app'; +import assert from 'assert'; + +let _request: request.Test; +let _response: request.Response; + +Given('I send a GET request to {string}', (route: string) => { + _request = request(app).get(route); +}); + +Given('I send a PUT request to {string} with body:', (route: string, body: string) => { + _request = request(app) + .put(route) + .send(body); +}); + +Then('the response status code should be {int}', async (status: number) => { + _response = await _request.expect(status); +}); + +Then('the response should be empty', () => { + assert.deepEqual(_response.body, {}); +});