basic-implementation #1
135
package-lock.json
generated
135
package-lock.json
generated
|
@ -11,7 +11,9 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/chai": "^4.2.18",
|
"@types/chai": "^4.2.18",
|
||||||
"@types/mocha": "^8.2.2",
|
"@types/mocha": "^8.2.2",
|
||||||
|
"@types/nock": "^11.1.0",
|
||||||
"@types/node": "^15.3.0",
|
"@types/node": "^15.3.0",
|
||||||
|
"@types/node-fetch": "^2.5.10",
|
||||||
"@types/sinon-chai": "^3.2.5",
|
"@types/sinon-chai": "^3.2.5",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.23.0",
|
"@typescript-eslint/eslint-plugin": "^4.23.0",
|
||||||
"@typescript-eslint/parser": "^4.23.0",
|
"@typescript-eslint/parser": "^4.23.0",
|
||||||
|
@ -23,10 +25,14 @@
|
||||||
"eslint-plugin-import": "^2.23.2",
|
"eslint-plugin-import": "^2.23.2",
|
||||||
"eslint-plugin-mocha": "^8.1.0",
|
"eslint-plugin-mocha": "^8.1.0",
|
||||||
"eslint-plugin-prettier": "^3.4.0",
|
"eslint-plugin-prettier": "^3.4.0",
|
||||||
|
"form-data": "^3.0.1",
|
||||||
"mocha": "^8.4.0",
|
"mocha": "^8.4.0",
|
||||||
|
"nock": "^13.0.11",
|
||||||
|
"node-fetch": "^2.6.1",
|
||||||
"prettier": "^2.3.0",
|
"prettier": "^2.3.0",
|
||||||
"sinon-chai": "^3.6.0",
|
"sinon-chai": "^3.6.0",
|
||||||
"tmp-promise": "^3.0.2",
|
"tmp-promise": "^3.0.2",
|
||||||
|
"ts-dedent": "^2.1.1",
|
||||||
"ts-node": "^9.1.1",
|
"ts-node": "^9.1.1",
|
||||||
"ts-sinon": "^2.0.1",
|
"ts-sinon": "^2.0.1",
|
||||||
"tsc-watch": "^4.2.9",
|
"tsc-watch": "^4.2.9",
|
||||||
|
@ -265,11 +271,29 @@
|
||||||
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz",
|
||||||
"integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw=="
|
"integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw=="
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/nock": {
|
||||||
|
"version": "11.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/nock/-/nock-11.1.0.tgz",
|
||||||
|
"integrity": "sha512-jI/ewavBQ7X5178262JQR0ewicPAcJhXS/iFaNJl0VHLfyosZ/kwSrsa6VNQNSO8i9d8SqdRgOtZSOKJ/+iNMw==",
|
||||||
|
"deprecated": "This is a stub types definition. nock provides its own type definitions, so you do not need this installed.",
|
||||||
|
"dependencies": {
|
||||||
|
"nock": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "15.3.0",
|
"version": "15.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz",
|
||||||
"integrity": "sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ=="
|
"integrity": "sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ=="
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/node-fetch": {
|
||||||
|
"version": "2.5.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz",
|
||||||
|
"integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/node": "*",
|
||||||
|
"form-data": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/sinon": {
|
"node_modules/@types/sinon": {
|
||||||
"version": "10.0.0",
|
"version": "10.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.0.tgz",
|
||||||
|
@ -1512,6 +1536,19 @@
|
||||||
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
|
||||||
"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA=="
|
"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA=="
|
||||||
},
|
},
|
||||||
|
"node_modules/form-data": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
|
||||||
|
"dependencies": {
|
||||||
|
"asynckit": "^0.4.0",
|
||||||
|
"combined-stream": "^1.0.8",
|
||||||
|
"mime-types": "^2.1.12"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/from": {
|
"node_modules/from": {
|
||||||
"version": "0.1.7",
|
"version": "0.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
|
"resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
|
||||||
|
@ -1972,6 +2009,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
|
||||||
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
|
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
|
||||||
},
|
},
|
||||||
|
"node_modules/json-stringify-safe": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
|
||||||
|
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
|
||||||
|
},
|
||||||
"node_modules/json5": {
|
"node_modules/json5": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||||
|
@ -2041,6 +2083,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
|
||||||
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
|
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
|
||||||
},
|
},
|
||||||
|
"node_modules/lodash.set": {
|
||||||
|
"version": "4.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
|
||||||
|
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
|
||||||
|
},
|
||||||
"node_modules/lodash.truncate": {
|
"node_modules/lodash.truncate": {
|
||||||
"version": "4.4.2",
|
"version": "4.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
|
||||||
|
@ -2317,6 +2364,20 @@
|
||||||
"@sinonjs/commons": "^1.7.0"
|
"@sinonjs/commons": "^1.7.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/nock": {
|
||||||
|
"version": "13.0.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/nock/-/nock-13.0.11.tgz",
|
||||||
|
"integrity": "sha512-sKZltNkkWblkqqPAsjYW0bm3s9DcHRPiMOyKO/PkfJ+ANHZ2+LA2PLe22r4lLrKgXaiSaDQwW3qGsJFtIpQIeQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"debug": "^4.1.0",
|
||||||
|
"json-stringify-safe": "^5.0.1",
|
||||||
|
"lodash.set": "^4.3.2",
|
||||||
|
"propagate": "^2.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.13"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/node-cleanup": {
|
"node_modules/node-cleanup": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz",
|
||||||
|
@ -2677,6 +2738,14 @@
|
||||||
"node": ">=0.4.0"
|
"node": ">=0.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/propagate": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ps-tree": {
|
"node_modules/ps-tree": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
|
||||||
|
@ -3240,6 +3309,14 @@
|
||||||
"node": ">=8.0"
|
"node": ">=8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/ts-dedent": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-riHuwnzAUCfdIeTBNUq7+Yj+ANnrMXo/7+Z74dIdudS7ys2k8aSGMzpJRMFDF7CLwUTbtvi1ZZff/Wl+XxmqIA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ts-node": {
|
"node_modules/ts-node": {
|
||||||
"version": "9.1.1",
|
"version": "9.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
|
||||||
|
@ -3861,11 +3938,28 @@
|
||||||
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz",
|
||||||
"integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw=="
|
"integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw=="
|
||||||
},
|
},
|
||||||
|
"@types/nock": {
|
||||||
|
"version": "11.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/nock/-/nock-11.1.0.tgz",
|
||||||
|
"integrity": "sha512-jI/ewavBQ7X5178262JQR0ewicPAcJhXS/iFaNJl0VHLfyosZ/kwSrsa6VNQNSO8i9d8SqdRgOtZSOKJ/+iNMw==",
|
||||||
|
"requires": {
|
||||||
|
"nock": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "15.3.0",
|
"version": "15.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz",
|
||||||
"integrity": "sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ=="
|
"integrity": "sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ=="
|
||||||
},
|
},
|
||||||
|
"@types/node-fetch": {
|
||||||
|
"version": "2.5.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz",
|
||||||
|
"integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==",
|
||||||
|
"requires": {
|
||||||
|
"@types/node": "*",
|
||||||
|
"form-data": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/sinon": {
|
"@types/sinon": {
|
||||||
"version": "10.0.0",
|
"version": "10.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.0.tgz",
|
||||||
|
@ -4771,6 +4865,16 @@
|
||||||
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
|
||||||
"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA=="
|
"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA=="
|
||||||
},
|
},
|
||||||
|
"form-data": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
|
||||||
|
"requires": {
|
||||||
|
"asynckit": "^0.4.0",
|
||||||
|
"combined-stream": "^1.0.8",
|
||||||
|
"mime-types": "^2.1.12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"from": {
|
"from": {
|
||||||
"version": "0.1.7",
|
"version": "0.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
|
"resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
|
||||||
|
@ -5085,6 +5189,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
|
||||||
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
|
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
|
||||||
},
|
},
|
||||||
|
"json-stringify-safe": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
|
||||||
|
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
|
||||||
|
},
|
||||||
"json5": {
|
"json5": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||||
|
@ -5142,6 +5251,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
|
||||||
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
|
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
|
||||||
},
|
},
|
||||||
|
"lodash.set": {
|
||||||
|
"version": "4.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
|
||||||
|
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
|
||||||
|
},
|
||||||
"lodash.truncate": {
|
"lodash.truncate": {
|
||||||
"version": "4.4.2",
|
"version": "4.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
|
||||||
|
@ -5348,6 +5462,17 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nock": {
|
||||||
|
"version": "13.0.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/nock/-/nock-13.0.11.tgz",
|
||||||
|
"integrity": "sha512-sKZltNkkWblkqqPAsjYW0bm3s9DcHRPiMOyKO/PkfJ+ANHZ2+LA2PLe22r4lLrKgXaiSaDQwW3qGsJFtIpQIeQ==",
|
||||||
|
"requires": {
|
||||||
|
"debug": "^4.1.0",
|
||||||
|
"json-stringify-safe": "^5.0.1",
|
||||||
|
"lodash.set": "^4.3.2",
|
||||||
|
"propagate": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node-cleanup": {
|
"node-cleanup": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz",
|
||||||
|
@ -5595,6 +5720,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
|
||||||
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
|
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
|
||||||
},
|
},
|
||||||
|
"propagate": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag=="
|
||||||
|
},
|
||||||
"ps-tree": {
|
"ps-tree": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
|
||||||
|
@ -5996,6 +6126,11 @@
|
||||||
"is-number": "^7.0.0"
|
"is-number": "^7.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ts-dedent": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-riHuwnzAUCfdIeTBNUq7+Yj+ANnrMXo/7+Z74dIdudS7ys2k8aSGMzpJRMFDF7CLwUTbtvi1ZZff/Wl+XxmqIA=="
|
||||||
|
},
|
||||||
"ts-node": {
|
"ts-node": {
|
||||||
"version": "9.1.1",
|
"version": "9.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
|
||||||
|
|
|
@ -26,7 +26,9 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/chai": "^4.2.18",
|
"@types/chai": "^4.2.18",
|
||||||
"@types/mocha": "^8.2.2",
|
"@types/mocha": "^8.2.2",
|
||||||
|
"@types/nock": "^11.1.0",
|
||||||
"@types/node": "^15.3.0",
|
"@types/node": "^15.3.0",
|
||||||
|
"@types/node-fetch": "^2.5.10",
|
||||||
"@types/sinon-chai": "^3.2.5",
|
"@types/sinon-chai": "^3.2.5",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.23.0",
|
"@typescript-eslint/eslint-plugin": "^4.23.0",
|
||||||
"@typescript-eslint/parser": "^4.23.0",
|
"@typescript-eslint/parser": "^4.23.0",
|
||||||
|
@ -38,10 +40,14 @@
|
||||||
"eslint-plugin-import": "^2.23.2",
|
"eslint-plugin-import": "^2.23.2",
|
||||||
"eslint-plugin-mocha": "^8.1.0",
|
"eslint-plugin-mocha": "^8.1.0",
|
||||||
"eslint-plugin-prettier": "^3.4.0",
|
"eslint-plugin-prettier": "^3.4.0",
|
||||||
|
"form-data": "^3.0.1",
|
||||||
"mocha": "^8.4.0",
|
"mocha": "^8.4.0",
|
||||||
|
"nock": "^13.0.11",
|
||||||
|
"node-fetch": "^2.6.1",
|
||||||
"prettier": "^2.3.0",
|
"prettier": "^2.3.0",
|
||||||
"sinon-chai": "^3.6.0",
|
"sinon-chai": "^3.6.0",
|
||||||
"tmp-promise": "^3.0.2",
|
"tmp-promise": "^3.0.2",
|
||||||
|
"ts-dedent": "^2.1.1",
|
||||||
"ts-node": "^9.1.1",
|
"ts-node": "^9.1.1",
|
||||||
"ts-sinon": "^2.0.1",
|
"ts-sinon": "^2.0.1",
|
||||||
"tsc-watch": "^4.2.9",
|
"tsc-watch": "^4.2.9",
|
||||||
|
|
|
@ -1,44 +1,113 @@
|
||||||
import { Channel, Client } from 'discord.js';
|
import { Client, TextChannel } from 'discord.js';
|
||||||
import { isBooleanObject } from 'util/types';
|
import dedent from 'ts-dedent';
|
||||||
import { ImplementableApi } from './implementableApi';
|
import { ImplementableApi } from './implementableApi';
|
||||||
|
|
||||||
namespace DiscordParser {
|
namespace DiscordParser {
|
||||||
export type Config = ImplementableApi.Config & {
|
export type Config = ImplementableApi.Config & {
|
||||||
token: string;
|
token: string;
|
||||||
|
channelsId: {
|
||||||
|
idChannelYtb: string;
|
||||||
|
idChannelPeerTube: string;
|
||||||
|
};
|
||||||
|
keyWord: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///Penser a split mes event peertube Ytb en 2 channel differents
|
||||||
class DiscordParser extends ImplementableApi {
|
class DiscordParser extends ImplementableApi {
|
||||||
readonly token: string;
|
readonly token: string;
|
||||||
readonly channelid: string;
|
readonly keyWord: string;
|
||||||
client: Client;
|
readonly channels: {
|
||||||
|
readonly ChannelYtb: TextChannel;
|
||||||
|
readonly ChannelPeerTube: TextChannel;
|
||||||
|
};
|
||||||
|
readonly client: Client;
|
||||||
|
|
||||||
constructor(readonly config: DiscordParser.Config) {
|
constructor(readonly config: DiscordParser.Config) {
|
||||||
super(config);
|
super(config);
|
||||||
this.token = config.token;
|
this.token = config.token;
|
||||||
// this.settingEvents();
|
this.keyWord = config.keyWord;
|
||||||
this.client = new Client();
|
this.settingEvents();
|
||||||
this.instantiateClient();
|
this.client = this.instantiateClient();
|
||||||
|
this.channels = this.setChannel(config.channelsId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private instantiateClient() {
|
private setChannel(ids: {
|
||||||
this.client.login(this.token);
|
[key: string]: string;
|
||||||
|
idChannelYtb: string;
|
||||||
|
idChannelPeerTube: string;
|
||||||
|
}): {
|
||||||
|
ChannelYtb: TextChannel;
|
||||||
|
ChannelPeerTube: TextChannel;
|
||||||
|
} {
|
||||||
|
let resp: {
|
||||||
|
[key: string]: TextChannel | undefined;
|
||||||
|
ChannelYtb?: TextChannel;
|
||||||
|
ChannelPeerTube?: TextChannel;
|
||||||
|
} = {};
|
||||||
|
// construct and check the channels
|
||||||
|
for (const key in ids) {
|
||||||
|
if (ids[key]) {
|
||||||
|
const tmpChannel = this.client.channels.resolve(ids[key]);
|
||||||
|
if (tmpChannel)
|
||||||
|
if (tmpChannel instanceof TextChannel)
|
||||||
|
resp[key] = tmpChannel;
|
||||||
|
else throw new Error('The channel must be a TextChannel');
|
||||||
|
else
|
||||||
|
throw new Error(
|
||||||
|
dedent`The channel cannot be found by the bot.
|
||||||
|
Check if you had the bot to your server or if the channel ID is correct`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// return the well formed object
|
||||||
|
if (resp.ChannelPeerTube)
|
||||||
|
if (resp.ChannelYtb)
|
||||||
|
return {
|
||||||
|
ChannelPeerTube: resp.ChannelPeerTube,
|
||||||
|
ChannelYtb: resp.ChannelYtb,
|
||||||
|
};
|
||||||
|
throw new Error('Theres an issue concerned the channel check');
|
||||||
|
}
|
||||||
|
|
||||||
|
private instantiateClient(): Client {
|
||||||
|
const newClient = new Client();
|
||||||
|
newClient.login(this.token);
|
||||||
|
return newClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public receivedMessage(message: ImplementableApi.Message) {
|
public receivedMessage(message: ImplementableApi.Message) {
|
||||||
switch (message.type) {
|
switch (message.type) {
|
||||||
case 'newEntriesNotify':
|
case 'newEntriesNotify':
|
||||||
|
this.sendMsgYtb(
|
||||||
|
`New YouTubes entries received :\n${JSON.parse(
|
||||||
|
message.rawContent
|
||||||
|
).items.map((item: any) => `Author : ${item.author}`)}`
|
||||||
|
);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private sendMsg(message: string) {
|
private sendMsgYtb(message: string) {
|
||||||
// this.client.channels.resolveID();
|
this.channels.ChannelYtb.send(message);
|
||||||
|
}
|
||||||
|
private sendMsgPeerTube(message: string) {
|
||||||
|
this.channels.ChannelPeerTube.send(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
private settingEvents(): void {
|
private settingEvents(): void {
|
||||||
throw 'empty';
|
this.client.on('message', (message) => {
|
||||||
|
const msg_splitted = message.content.split(' ');
|
||||||
|
if (msg_splitted[0] === this.keyWord) {
|
||||||
|
// if (!this.channel) {
|
||||||
|
// this.channel = message.channel;
|
||||||
|
// }
|
||||||
|
switch (msg_splitted[1]) {
|
||||||
|
case 'add':
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
import { ImplementableApi } from './implementableApi';
|
import { ImplementableApi } from './implementableApi';
|
||||||
|
// Api request lib
|
||||||
|
import fetch, { FetchError, Headers } from 'node-fetch';
|
||||||
|
import { URLSearchParams } from 'url';
|
||||||
|
import FormData from 'form-data';
|
||||||
|
import dedent from 'ts-dedent';
|
||||||
|
|
||||||
namespace PeerTubeRequester {
|
namespace PeerTubeRequester {
|
||||||
export type Config = ImplementableApi.Config & {
|
export type Config = ImplementableApi.Config & {
|
||||||
|
@ -12,10 +17,6 @@ type UploadInstruction = {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
channelID: string;
|
channelID: string;
|
||||||
targetUrl: string;
|
targetUrl: string;
|
||||||
name: string;
|
|
||||||
description: string;
|
|
||||||
originallyPublishedAt: string;
|
|
||||||
thumbnailsfile: string;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
type ClientToken = {
|
type ClientToken = {
|
||||||
|
@ -46,71 +47,110 @@ class PeerTubeRequester extends ImplementableApi {
|
||||||
this.password = config.password;
|
this.password = config.password;
|
||||||
}
|
}
|
||||||
|
|
||||||
public receivedMessage(message: ImplementableApi.Message) {
|
public async receivedMessage(
|
||||||
|
message: ImplementableApi.Message
|
||||||
|
): Promise<void> {
|
||||||
switch (message.type) {
|
switch (message.type) {
|
||||||
case 'newEntriesNotify':
|
case 'newEntriesNotify':
|
||||||
this.newEntriesNotify(message);
|
await this.newEntriesNotify(message);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private newEntriesNotify(message: ImplementableApi.Message) {
|
private async newEntriesNotify(
|
||||||
|
message: ImplementableApi.Message
|
||||||
|
): Promise<void> {
|
||||||
// parse content
|
// parse content
|
||||||
const items = message.rawContent['items'];
|
const items = message.rawContent['items'];
|
||||||
if (Array.isArray(items))
|
if (Array.isArray(items))
|
||||||
items.forEach((item) => {
|
for (const item of items) {
|
||||||
const media_group = item['media:group'];
|
const media_group = item['media:group'];
|
||||||
const args: UploadInstruction = {
|
const args: UploadInstruction = {
|
||||||
channelID: 'undefined', // to do binding avec les idDeChaines Skeptikom
|
channelID: 'undefined', // to do binding avec les idDeChaines Skeptikom
|
||||||
description: media_group['media:description'][0],
|
targetUrl: item.link,
|
||||||
name: media_group['media:title'][0],
|
|
||||||
originallyPublishedAt: item.pubDate,
|
|
||||||
targetUrl: media_group['media:content'][0]['$']['url'],
|
|
||||||
thumbnailsfile:
|
|
||||||
media_group['media:thumbnail'][0]['$']['url'],
|
|
||||||
};
|
};
|
||||||
this.apiRequest(args);
|
await this.apiRequest(args);
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async apiRequest(message: UploadInstruction) {
|
private async apiRequest(message: UploadInstruction): Promise<void> {
|
||||||
// Auth
|
let response = await fetch(
|
||||||
const client_info: ClientToken = {
|
|
||||||
...(await (
|
|
||||||
await fetch(
|
|
||||||
`https://${this.domain_name}/api/v1/oauth-clients/local`
|
`https://${this.domain_name}/api/v1/oauth-clients/local`
|
||||||
)
|
);
|
||||||
).json()),
|
if (!response.ok) {
|
||||||
...{
|
throw new Error(response.statusText); // CRASH
|
||||||
|
}
|
||||||
|
const { client_id, client_secret } = await response.json();
|
||||||
|
|
||||||
|
const client_info: { [key: string]: string } = {
|
||||||
|
client_id,
|
||||||
|
client_secret,
|
||||||
grant_type: 'password',
|
grant_type: 'password',
|
||||||
response_type: 'code',
|
response_type: 'code',
|
||||||
username: this.username,
|
username: this.username,
|
||||||
password: this.password,
|
password: this.password,
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const myAuthForm = new FormData();
|
let myParams = new URLSearchParams();
|
||||||
for (const key in client_info) myAuthForm.append(key, message[key]);
|
for (const key in client_info) myParams.append(key, client_info[key]);
|
||||||
|
|
||||||
const tokens_info: UserToken = await (
|
response = await fetch(
|
||||||
await fetch(`https://${this.domain_name}/api/v1/users/token`, {
|
`https://${this.domain_name}/api/v1/users/token`,
|
||||||
method: 'get',
|
{
|
||||||
body: myAuthForm,
|
method: 'post',
|
||||||
})
|
body: myParams,
|
||||||
).json();
|
}
|
||||||
|
);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(response.statusText); // CRASH
|
||||||
|
}
|
||||||
|
const { access_token } = await response.json();
|
||||||
|
|
||||||
// Upload
|
// Upload
|
||||||
const myUploadForm = new FormData();
|
const myUploadForm = new URLSearchParams();
|
||||||
const myHeader = new Headers();
|
const myHeader = new Headers();
|
||||||
myHeader.append('Authorization', `Bearer ${tokens_info.access_token}`);
|
myHeader.append('Authorization', `Bearer ${access_token}`);
|
||||||
for (const key in message) myUploadForm.append(key, message[key]);
|
for (const key in message) myUploadForm.append(key, message[key]);
|
||||||
await fetch(`https://${this.domain_name}/api/v1/videos/imports`, {
|
|
||||||
|
response = await fetch(
|
||||||
|
`https://${this.domain_name}/api/v1/videos/imports`,
|
||||||
|
{
|
||||||
method: 'post',
|
method: 'post',
|
||||||
headers: myHeader,
|
headers: myHeader,
|
||||||
body: myUploadForm,
|
body: myUploadForm,
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
switch (response.status) {
|
||||||
|
case 400:
|
||||||
|
throw new Error(
|
||||||
|
dedent`Your target URL was not accepted by the API.\
|
||||||
|
Actualy it's : ${message.targetUrl}
|
||||||
|
${response.statusText}`
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 403:
|
||||||
|
throw new Error(response.statusText);
|
||||||
|
break;
|
||||||
|
case 409:
|
||||||
|
throw new Error(
|
||||||
|
dedent`Oops, your instance had not allowed the HTTPS import.\
|
||||||
|
Contact your administrator.
|
||||||
|
${response.statusText}`
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(
|
||||||
|
dedent`Oh, you resolved an undocumented issues.\
|
||||||
|
Please report this on the git if you have the time.
|
||||||
|
ERROR: ${response.statusText}`
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
55
tests/discord-spec.ts
Normal file
55
tests/discord-spec.ts
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
import chai from 'chai';
|
||||||
|
import sinon from 'ts-sinon';
|
||||||
|
import sinonChai from 'sinon-chai';
|
||||||
|
|
||||||
|
chai.use(sinonChai);
|
||||||
|
const expect = chai.expect;
|
||||||
|
|
||||||
|
import nock, { disableNetConnect, RequestBodyMatcher } from 'nock';
|
||||||
|
|
||||||
|
import { DiscordParser } from '../src/discordParser';
|
||||||
|
|
||||||
|
//data
|
||||||
|
const config: DiscordParser.Config = {
|
||||||
|
channelsId: {
|
||||||
|
idChannelPeerTube: 'peertubeID',
|
||||||
|
idChannelYtb: 'ytbChannel',
|
||||||
|
},
|
||||||
|
keyWord: 'myDiscordKeyword',
|
||||||
|
name: 'DiscordTestedInterface',
|
||||||
|
token: 'mySecretDiscordToken',
|
||||||
|
};
|
||||||
|
|
||||||
|
//stubed imports
|
||||||
|
import { Channel, ChannelManager, Client } from 'discord.js';
|
||||||
|
import { utils } from 'mocha';
|
||||||
|
|
||||||
|
describe.only('test DiscordParser', function () {
|
||||||
|
let clientStub: sinon.SinonStubbedInstance<Client>,
|
||||||
|
channelManagerStub: sinon.SinonStubbedInstance<ChannelManager>;
|
||||||
|
before(() => {
|
||||||
|
clientStub = sinon.createStubInstance(Client);
|
||||||
|
clientStub.login.withArgs(config.token).onFirstCall().resolves('ok');
|
||||||
|
clientStub.login.throws('Error, bad parameter or too much call');
|
||||||
|
|
||||||
|
channelManagerStub = sinon.createStubInstance(ChannelManager);
|
||||||
|
channelManagerStub.resolve
|
||||||
|
.withArgs(config.channelsId.idChannelPeerTube)
|
||||||
|
.onFirstCall()
|
||||||
|
.returns(new Channel(new Client()))
|
||||||
|
.withArgs(config.channelsId.idChannelYtb)
|
||||||
|
.onFirstCall()
|
||||||
|
.returns(new Channel(new Client()));
|
||||||
|
channelManagerStub.resolve.throws("Error Bad id's or too much call");
|
||||||
|
});
|
||||||
|
|
||||||
|
after(() => {
|
||||||
|
clientStub.login.restore();
|
||||||
|
channelManagerStub.resolve.restore();
|
||||||
|
});
|
||||||
|
it('it will test the DiscordParser constructor', function () {
|
||||||
|
const discordParser = new DiscordParser(config);
|
||||||
|
|
||||||
|
console.log("c'est bon signe");
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,54 +1,54 @@
|
||||||
import chai from "chai";
|
import chai from 'chai';
|
||||||
import sinon from "ts-sinon";
|
import sinon from 'ts-sinon';
|
||||||
import sinonChai from "sinon-chai";
|
import sinonChai from 'sinon-chai';
|
||||||
|
|
||||||
chai.use(sinonChai)
|
chai.use(sinonChai);
|
||||||
const expect = chai.expect;
|
const expect = chai.expect;
|
||||||
|
|
||||||
import { withFile } from "tmp-promise"
|
import { withFile } from 'tmp-promise';
|
||||||
import { writeFileSync } from "fs";
|
import { writeFileSync } from 'fs';
|
||||||
|
|
||||||
import { Router } from "../src/index";
|
|
||||||
import { DiscordParser } from "../src/discordParser";
|
|
||||||
import { LogWriter } from "../src/logWriter";
|
|
||||||
import { PeerTubeRequester } from "../src/peertubeRequester";
|
|
||||||
|
|
||||||
|
import { Router } from '../src/index';
|
||||||
|
import { DiscordParser } from '../src/discordParser';
|
||||||
|
import { LogWriter } from '../src/logWriter';
|
||||||
|
import { PeerTubeRequester } from '../src/peertubeRequester';
|
||||||
|
|
||||||
// const path = require("path");
|
// const path = require("path");
|
||||||
const well_build_routing_file: Router.GlobalConfig = require("./rsrc/wellBuildedRoutingFile.json");
|
const well_build_routing_file: Router.GlobalConfig = require('./rsrc/wellBuildedRoutingFile.json');
|
||||||
|
|
||||||
describe("testing the routing part", function () {
|
describe('testing the routing part', function () {
|
||||||
describe("testing the building part", function () {
|
describe('testing the building part', function () {
|
||||||
it("it will test a normal building", async function () {
|
it('it will test a normal building', async function () {
|
||||||
await withFile(async (file) => {
|
await withFile(
|
||||||
|
async (file) => {
|
||||||
const edit_config = {
|
const edit_config = {
|
||||||
...well_build_routing_file,
|
...well_build_routing_file,
|
||||||
logWriter: {
|
logWriter: {
|
||||||
...well_build_routing_file.logWriter,
|
...well_build_routing_file.logWriter,
|
||||||
...{path: file.path}
|
...{ path: file.path },
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
const r = new Router(edit_config);
|
const r = new Router(edit_config);
|
||||||
|
|
||||||
expect(r.api_array['Discord']).to.be.instanceOf(DiscordParser);
|
expect(r.api_array['Discord']).to.be.instanceOf(
|
||||||
expect(r.api_array['logWriter']).to.be.instanceOf(LogWriter);
|
DiscordParser
|
||||||
expect(r.api_array['peertubeRequester']).to.be.instanceOf(PeerTubeRequester);
|
);
|
||||||
|
expect(r.api_array['logWriter']).to.be.instanceOf(
|
||||||
}, {postfix: '.log'})
|
LogWriter
|
||||||
|
);
|
||||||
})
|
expect(r.api_array['peertubeRequester']).to.be.instanceOf(
|
||||||
})
|
PeerTubeRequester
|
||||||
describe("testing the data transmission", function () {
|
);
|
||||||
it("it will emit a upload request message", function () {
|
},
|
||||||
|
{ postfix: '.log' }
|
||||||
})
|
);
|
||||||
it("it will emit a new listener request", function () {
|
});
|
||||||
|
});
|
||||||
})
|
describe('testing the data transmission', function () {
|
||||||
})
|
it('it will emit a upload request message', function () {});
|
||||||
describe("testing the data reception", function () {
|
it('it will emit a new listener request', function () {});
|
||||||
it("it will received a new entries notification", function() {
|
});
|
||||||
|
describe('testing the data reception', function () {
|
||||||
})
|
it('it will received a new entries notification', function () {});
|
||||||
})
|
});
|
||||||
});
|
});
|
123
tests/peertubeRequeter-spec.ts
Normal file
123
tests/peertubeRequeter-spec.ts
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
import chai from 'chai';
|
||||||
|
import sinon from 'ts-sinon';
|
||||||
|
import sinonChai from 'sinon-chai';
|
||||||
|
|
||||||
|
chai.use(sinonChai);
|
||||||
|
const expect = chai.expect;
|
||||||
|
|
||||||
|
import nock, { disableNetConnect, RequestBodyMatcher } from 'nock';
|
||||||
|
|
||||||
|
import { ImplementableApi } from '../src';
|
||||||
|
import { PeerTubeRequester } from '../src/peertubeRequester';
|
||||||
|
import { Request } from 'node-fetch';
|
||||||
|
|
||||||
|
const paramsPeerTube: PeerTubeRequester.Config = {
|
||||||
|
name: 'testedRequester',
|
||||||
|
domain_name: 'myApiAddress.yolo',
|
||||||
|
password: 'mySuperSecretPassphrase',
|
||||||
|
username: 'myUsername',
|
||||||
|
};
|
||||||
|
|
||||||
|
const newEntriesMessage: ImplementableApi.Message = {
|
||||||
|
type: 'newEntriesNotify',
|
||||||
|
rawContent: {
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
author: 'channel1',
|
||||||
|
link: 'link1',
|
||||||
|
title: 'title1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
author: 'channel2',
|
||||||
|
link: 'link2',
|
||||||
|
title: 'title2',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
author: 'channel3',
|
||||||
|
link: 'link3',
|
||||||
|
title: 'title3',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const UploadInstruction = {
|
||||||
|
channelID: 'undefined', //todo uncompleted test but incompleted function too
|
||||||
|
targetUrl: 'myTargerUrl',
|
||||||
|
};
|
||||||
|
|
||||||
|
// nock data
|
||||||
|
const expectedReplyOauthClient = {
|
||||||
|
client_id: 'expectedClientID',
|
||||||
|
client_secret: 'expectedClientSecret',
|
||||||
|
};
|
||||||
|
|
||||||
|
const expectedReplyTokenAddress = {
|
||||||
|
access_token: 'expectedAccessToken',
|
||||||
|
};
|
||||||
|
|
||||||
|
const bodyTokenRequest: RequestBodyMatcher = {
|
||||||
|
client_id: expectedReplyOauthClient.client_id,
|
||||||
|
client_secret: expectedReplyOauthClient.client_secret,
|
||||||
|
grant_type: 'password',
|
||||||
|
response_type: 'code',
|
||||||
|
username: paramsPeerTube.username,
|
||||||
|
password: paramsPeerTube.password,
|
||||||
|
};
|
||||||
|
describe('PeerTube Requester Test', function () {
|
||||||
|
before(function () {
|
||||||
|
disableNetConnect();
|
||||||
|
});
|
||||||
|
|
||||||
|
after(function () {
|
||||||
|
nock.cleanAll();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('it will test the upload function', async function () {
|
||||||
|
// given
|
||||||
|
const scope = nock(`https://${paramsPeerTube.domain_name}/api/v1`)
|
||||||
|
.get(`/oauth-clients/local`)
|
||||||
|
.times(3)
|
||||||
|
.reply(200, expectedReplyOauthClient)
|
||||||
|
.post(`/users/token`, bodyTokenRequest)
|
||||||
|
.times(3)
|
||||||
|
.reply(200, expectedReplyTokenAddress)
|
||||||
|
.post(`/videos/imports`, {
|
||||||
|
channelID: 'undefined',
|
||||||
|
targeUrl: newEntriesMessage.rawContent.items[0].link,
|
||||||
|
})
|
||||||
|
.matchHeader(
|
||||||
|
'Authorization',
|
||||||
|
`Bearer ${expectedReplyTokenAddress.access_token}`
|
||||||
|
)
|
||||||
|
.reply(200)
|
||||||
|
.post(`/videos/imports`, {
|
||||||
|
channelID: 'undefined',
|
||||||
|
targeUrl: newEntriesMessage.rawContent.items[1].link,
|
||||||
|
})
|
||||||
|
.matchHeader(
|
||||||
|
'Authorization',
|
||||||
|
`Bearer ${expectedReplyTokenAddress.access_token}`
|
||||||
|
)
|
||||||
|
.reply(200)
|
||||||
|
.post(`/videos/imports`, {
|
||||||
|
channelID: 'undefined',
|
||||||
|
targeUrl: newEntriesMessage.rawContent.items[2].link,
|
||||||
|
})
|
||||||
|
.matchHeader(
|
||||||
|
'Authorization',
|
||||||
|
`Bearer ${expectedReplyTokenAddress.access_token}`
|
||||||
|
)
|
||||||
|
.reply(200);
|
||||||
|
|
||||||
|
if (scope.isDone()) console.log(scope.activeMocks());
|
||||||
|
|
||||||
|
const requester = new PeerTubeRequester(paramsPeerTube);
|
||||||
|
|
||||||
|
// when
|
||||||
|
await requester.receivedMessage(newEntriesMessage);
|
||||||
|
|
||||||
|
//expected
|
||||||
|
if (scope.isDone()) console.log(scope.activeMocks());
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user