From 8b3e2535e22a4a8f9d07c2e94a282eaa6a603bb8 Mon Sep 17 00:00:00 2001 From: Amaury Date: Sun, 30 May 2021 15:36:20 +0200 Subject: [PATCH] Writted peertube and discordParser class, and added many test. --- package-lock.json | 135 +++++++++++++++++++++++++++++++++ package.json | 6 ++ src/discordParser.ts | 93 ++++++++++++++++++++--- src/peertubeRequester.ts | 130 ++++++++++++++++++++----------- tests/discord-spec.ts | 55 ++++++++++++++ tests/index-spec.ts | 92 +++++++++++----------- tests/peertubeRequeter-spec.ts | 123 ++++++++++++++++++++++++++++++ 7 files changed, 531 insertions(+), 103 deletions(-) create mode 100644 tests/discord-spec.ts create mode 100644 tests/peertubeRequeter-spec.ts diff --git a/package-lock.json b/package-lock.json index a9d01f7..78087f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,9 @@ "dependencies": { "@types/chai": "^4.2.18", "@types/mocha": "^8.2.2", + "@types/nock": "^11.1.0", "@types/node": "^15.3.0", + "@types/node-fetch": "^2.5.10", "@types/sinon-chai": "^3.2.5", "@typescript-eslint/eslint-plugin": "^4.23.0", "@typescript-eslint/parser": "^4.23.0", @@ -23,10 +25,14 @@ "eslint-plugin-import": "^2.23.2", "eslint-plugin-mocha": "^8.1.0", "eslint-plugin-prettier": "^3.4.0", + "form-data": "^3.0.1", "mocha": "^8.4.0", + "nock": "^13.0.11", + "node-fetch": "^2.6.1", "prettier": "^2.3.0", "sinon-chai": "^3.6.0", "tmp-promise": "^3.0.2", + "ts-dedent": "^2.1.1", "ts-node": "^9.1.1", "ts-sinon": "^2.0.1", "tsc-watch": "^4.2.9", @@ -265,11 +271,29 @@ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", "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": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz", "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": { "version": "10.0.0", "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", "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": { "version": "0.1.7", "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", "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": { "version": "1.0.1", "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", "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": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -2317,6 +2364,20 @@ "@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": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", @@ -2677,6 +2738,14 @@ "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": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", @@ -3240,6 +3309,14 @@ "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": { "version": "9.1.1", "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", "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": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz", "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": { "version": "10.0.0", "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", "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": { "version": "0.1.7", "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", "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": { "version": "1.0.1", "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", "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": { "version": "4.4.2", "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": { "version": "2.1.2", "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", "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": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", @@ -5996,6 +6126,11 @@ "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": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", diff --git a/package.json b/package.json index f3d4a7b..eebbd9b 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,9 @@ "dependencies": { "@types/chai": "^4.2.18", "@types/mocha": "^8.2.2", + "@types/nock": "^11.1.0", "@types/node": "^15.3.0", + "@types/node-fetch": "^2.5.10", "@types/sinon-chai": "^3.2.5", "@typescript-eslint/eslint-plugin": "^4.23.0", "@typescript-eslint/parser": "^4.23.0", @@ -38,10 +40,14 @@ "eslint-plugin-import": "^2.23.2", "eslint-plugin-mocha": "^8.1.0", "eslint-plugin-prettier": "^3.4.0", + "form-data": "^3.0.1", "mocha": "^8.4.0", + "nock": "^13.0.11", + "node-fetch": "^2.6.1", "prettier": "^2.3.0", "sinon-chai": "^3.6.0", "tmp-promise": "^3.0.2", + "ts-dedent": "^2.1.1", "ts-node": "^9.1.1", "ts-sinon": "^2.0.1", "tsc-watch": "^4.2.9", diff --git a/src/discordParser.ts b/src/discordParser.ts index 96ae4de..870fbb5 100644 --- a/src/discordParser.ts +++ b/src/discordParser.ts @@ -1,44 +1,113 @@ -import { Channel, Client } from 'discord.js'; -import { isBooleanObject } from 'util/types'; +import { Client, TextChannel } from 'discord.js'; +import dedent from 'ts-dedent'; import { ImplementableApi } from './implementableApi'; namespace DiscordParser { export type Config = ImplementableApi.Config & { token: string; + channelsId: { + idChannelYtb: string; + idChannelPeerTube: string; + }; + keyWord: string; }; } +///Penser a split mes event peertube Ytb en 2 channel differents class DiscordParser extends ImplementableApi { readonly token: string; - readonly channelid: string; - client: Client; + readonly keyWord: string; + readonly channels: { + readonly ChannelYtb: TextChannel; + readonly ChannelPeerTube: TextChannel; + }; + readonly client: Client; constructor(readonly config: DiscordParser.Config) { super(config); this.token = config.token; - // this.settingEvents(); - this.client = new Client(); - this.instantiateClient(); + this.keyWord = config.keyWord; + this.settingEvents(); + this.client = this.instantiateClient(); + this.channels = this.setChannel(config.channelsId); } - private instantiateClient() { - this.client.login(this.token); + private setChannel(ids: { + [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) { switch (message.type) { case 'newEntriesNotify': + this.sendMsgYtb( + `New YouTubes entries received :\n${JSON.parse( + message.rawContent + ).items.map((item: any) => `Author : ${item.author}`)}` + ); default: break; } } - private sendMsg(message: string) { - // this.client.channels.resolveID(); + private sendMsgYtb(message: string) { + this.channels.ChannelYtb.send(message); + } + private sendMsgPeerTube(message: string) { + this.channels.ChannelPeerTube.send(message); } 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': + } + } + }); } } diff --git a/src/peertubeRequester.ts b/src/peertubeRequester.ts index 10b837f..83c5fcc 100644 --- a/src/peertubeRequester.ts +++ b/src/peertubeRequester.ts @@ -1,4 +1,9 @@ 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 { export type Config = ImplementableApi.Config & { @@ -12,10 +17,6 @@ type UploadInstruction = { [key: string]: string; channelID: string; targetUrl: string; - name: string; - description: string; - originallyPublishedAt: string; - thumbnailsfile: string; }; type ClientToken = { @@ -46,71 +47,110 @@ class PeerTubeRequester extends ImplementableApi { this.password = config.password; } - public receivedMessage(message: ImplementableApi.Message) { + public async receivedMessage( + message: ImplementableApi.Message + ): Promise { switch (message.type) { case 'newEntriesNotify': - this.newEntriesNotify(message); + await this.newEntriesNotify(message); break; default: break; } } - private newEntriesNotify(message: ImplementableApi.Message) { + private async newEntriesNotify( + message: ImplementableApi.Message + ): Promise { // parse content const items = message.rawContent['items']; if (Array.isArray(items)) - items.forEach((item) => { + for (const item of items) { const media_group = item['media:group']; const args: UploadInstruction = { channelID: 'undefined', // to do binding avec les idDeChaines Skeptikom - description: media_group['media:description'][0], - name: media_group['media:title'][0], - originallyPublishedAt: item.pubDate, - targetUrl: media_group['media:content'][0]['$']['url'], - thumbnailsfile: - media_group['media:thumbnail'][0]['$']['url'], + targetUrl: item.link, }; - this.apiRequest(args); - }); + await this.apiRequest(args); + } } - private async apiRequest(message: UploadInstruction) { - // Auth - const client_info: ClientToken = { - ...(await ( - await fetch( - `https://${this.domain_name}/api/v1/oauth-clients/local` - ) - ).json()), - ...{ - grant_type: 'password', - response_type: 'code', - username: this.username, - password: this.password, - }, + private async apiRequest(message: UploadInstruction): Promise { + let response = await fetch( + `https://${this.domain_name}/api/v1/oauth-clients/local` + ); + 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', + response_type: 'code', + username: this.username, + password: this.password, }; - const myAuthForm = new FormData(); - for (const key in client_info) myAuthForm.append(key, message[key]); + let myParams = new URLSearchParams(); + for (const key in client_info) myParams.append(key, client_info[key]); - const tokens_info: UserToken = await ( - await fetch(`https://${this.domain_name}/api/v1/users/token`, { - method: 'get', - body: myAuthForm, - }) - ).json(); + response = await fetch( + `https://${this.domain_name}/api/v1/users/token`, + { + method: 'post', + body: myParams, + } + ); + if (!response.ok) { + throw new Error(response.statusText); // CRASH + } + const { access_token } = await response.json(); // Upload - const myUploadForm = new FormData(); + const myUploadForm = new URLSearchParams(); 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]); - await fetch(`https://${this.domain_name}/api/v1/videos/imports`, { - method: 'post', - headers: myHeader, - body: myUploadForm, - }); + + response = await fetch( + `https://${this.domain_name}/api/v1/videos/imports`, + { + method: 'post', + headers: myHeader, + 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; + } + } } } diff --git a/tests/discord-spec.ts b/tests/discord-spec.ts new file mode 100644 index 0000000..742c923 --- /dev/null +++ b/tests/discord-spec.ts @@ -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, + channelManagerStub: sinon.SinonStubbedInstance; + 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"); + }); +}); diff --git a/tests/index-spec.ts b/tests/index-spec.ts index fbcdaa8..1899fe9 100644 --- a/tests/index-spec.ts +++ b/tests/index-spec.ts @@ -1,54 +1,54 @@ -import chai from "chai"; -import sinon from "ts-sinon"; -import sinonChai from "sinon-chai"; +import chai from 'chai'; +import sinon from 'ts-sinon'; +import sinonChai from 'sinon-chai'; -chai.use(sinonChai) +chai.use(sinonChai); const expect = chai.expect; -import { withFile } from "tmp-promise" -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 { withFile } from 'tmp-promise'; +import { writeFileSync } from 'fs'; +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 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 building part", function () { - it("it will test a normal building", async function () { - await withFile(async (file) => { - const edit_config = { - ...well_build_routing_file, - logWriter: { - ...well_build_routing_file.logWriter, - ...{path: file.path} - } - }; - const r = new Router(edit_config); +describe('testing the routing part', function () { + describe('testing the building part', function () { + it('it will test a normal building', async function () { + await withFile( + async (file) => { + const edit_config = { + ...well_build_routing_file, + logWriter: { + ...well_build_routing_file.logWriter, + ...{ path: file.path }, + }, + }; + const r = new Router(edit_config); - expect(r.api_array['Discord']).to.be.instanceOf(DiscordParser); - expect(r.api_array['logWriter']).to.be.instanceOf(LogWriter); - expect(r.api_array['peertubeRequester']).to.be.instanceOf(PeerTubeRequester); - - }, {postfix: '.log'}) - - }) - }) - describe("testing the data transmission", function () { - it("it will emit a upload request message", function () { - - }) - it("it will emit a new listener request", function () { - - }) - }) - describe("testing the data reception", function () { - it("it will received a new entries notification", function() { - - }) - }) -}); \ No newline at end of file + expect(r.api_array['Discord']).to.be.instanceOf( + DiscordParser + ); + expect(r.api_array['logWriter']).to.be.instanceOf( + LogWriter + ); + expect(r.api_array['peertubeRequester']).to.be.instanceOf( + PeerTubeRequester + ); + }, + { postfix: '.log' } + ); + }); + }); + describe('testing the data transmission', function () { + it('it will emit a upload request message', function () {}); + it('it will emit a new listener request', function () {}); + }); + describe('testing the data reception', function () { + it('it will received a new entries notification', function () {}); + }); +}); diff --git a/tests/peertubeRequeter-spec.ts b/tests/peertubeRequeter-spec.ts new file mode 100644 index 0000000..83f676b --- /dev/null +++ b/tests/peertubeRequeter-spec.ts @@ -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()); + }); +});