From eb89bc3f1baf7305585872bbefa14fe8981f5279 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Mon, 1 Feb 2021 20:37:17 +0100 Subject: [PATCH] Split tests (#88) --- CONTRIBUTING.md | 3 +- package.json | 5 + source/plugins/activity/tests.yml | 21 ++ source/plugins/anilist/tests.yml | 60 +++++ source/plugins/base/tests.yml | 45 ++++ source/plugins/core/tests.yml | 26 ++ source/plugins/followup/tests.yml | 5 + source/plugins/gists/tests.yml | 5 + source/plugins/habits/tests.yml | 30 +++ source/plugins/isocalendar/tests.yml | 20 ++ source/plugins/languages/tests.yml | 44 ++++ source/plugins/lines/tests.yml | 7 + source/plugins/music/tests.yml | 30 +++ source/plugins/pagespeed/tests.yml | 39 +++ source/plugins/people/tests.yml | 63 +++++ source/plugins/posts/tests.yml | 7 + source/plugins/projects/tests.yml | 22 ++ source/plugins/stargazers/tests.yml | 5 + source/plugins/stars/tests.yml | 5 + source/plugins/topics/tests.yml | 69 +++++ source/plugins/traffic/tests.yml | 6 + source/plugins/tweets/tests.yml | 14 + source/templates/repository/template.mjs | 2 +- tests/metrics.test.js | 89 +++---- tests/testscases.js | 314 ----------------------- 25 files changed, 575 insertions(+), 361 deletions(-) create mode 100644 source/plugins/activity/tests.yml create mode 100644 source/plugins/anilist/tests.yml create mode 100644 source/plugins/base/tests.yml create mode 100644 source/plugins/core/tests.yml create mode 100644 source/plugins/followup/tests.yml create mode 100644 source/plugins/gists/tests.yml create mode 100644 source/plugins/habits/tests.yml create mode 100644 source/plugins/isocalendar/tests.yml create mode 100644 source/plugins/languages/tests.yml create mode 100644 source/plugins/lines/tests.yml create mode 100644 source/plugins/music/tests.yml create mode 100644 source/plugins/pagespeed/tests.yml create mode 100644 source/plugins/people/tests.yml create mode 100644 source/plugins/posts/tests.yml create mode 100644 source/plugins/projects/tests.yml create mode 100644 source/plugins/stargazers/tests.yml create mode 100644 source/plugins/stars/tests.yml create mode 100644 source/plugins/topics/tests.yml create mode 100644 source/plugins/traffic/tests.yml create mode 100644 source/plugins/tweets/tests.yml delete mode 100644 tests/testscases.js diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 648a916e..dbb8026c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -162,7 +162,6 @@ This section explain how metrics is structured. * `fonts.css` contains additional fonts used to render metrics * `template.mjs` contains template source code * `tests/` contains tests - * `testscases.js` contains tests case * `metrics.test.js` contains metrics testers * `Dockerfile` contains docker instructions used to build metrics image * `package.json` contains dependencies and command line aliases @@ -576,7 +575,7 @@ json: Creating tests for your plugin ensure that external changes don't break it. -You can define your tests cases in [`testscases.js`](/tests/testscases.js), which will automatically test your plugin with: +You can define your tests cases in `tests.yml` in your plugin directory, which will automatically test your plugin with: - Metrics action - Metrics web instance - Metrics web instance placeholder (rendered by browser) diff --git a/package.json b/package.json index 03cc9515..74eb91ba 100644 --- a/package.json +++ b/package.json @@ -43,5 +43,10 @@ "devDependencies": { "jest": "^26.6.3", "libxmljs": "^0.19.7" + }, + "jest": { + "testEnvironment":"node", + "testTimeout":60000, + "transform":{} } } diff --git a/source/plugins/activity/tests.yml b/source/plugins/activity/tests.yml new file mode 100644 index 00000000..0f8f83ee --- /dev/null +++ b/source/plugins/activity/tests.yml @@ -0,0 +1,21 @@ +- name: Activity plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_activity: yes + +- name: Activity plugin (filtered) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_activity: yes + plugin_activity_filter: pr, issue + +- name: Activity plugin (complete) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_activity: yes + plugin_activity_limit: 100 + plugin_activity_days: 14 + plugin_activity_filter: all diff --git a/source/plugins/anilist/tests.yml b/source/plugins/anilist/tests.yml new file mode 100644 index 00000000..b77a3ad1 --- /dev/null +++ b/source/plugins/anilist/tests.yml @@ -0,0 +1,60 @@ +- name: Anilist plugin (default) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_anilist: yes + +- name: Anilist plugin (manga only) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_anilist: yes + plugin_anilist_medias: manga + +- name: Anilist plugin (anime only) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_anilist: yes + plugin_anilist_medias: anime + +- name: Anilist plugin (favorites section) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_anilist: yes + plugin_anilist_sections: favorites + +- name: Anilist plugin (watching/reading section) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_anilist: yes + plugin_anilist_sections: watching, reading + +- name: Anilist plugin (characters section) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_anilist: yes + plugin_anilist_sections: characters + +- name: Anilist plugin (additional options) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_anilist: yes + plugin_anilist_limit: 0 + plugin_anilist_shuffle: no + plugin_anilist_user: user + +- name: Anilist plugin (complete) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_anilist: yes + plugin_anilist_medias: manga, anime + plugin_anilist_sections: favorites, watching, reading, characters + plugin_anilist_limit: 0 + plugin_anilist_shuffle: no + plugin_anilist_user: user diff --git a/source/plugins/base/tests.yml b/source/plugins/base/tests.yml new file mode 100644 index 00000000..7bca85a9 --- /dev/null +++ b/source/plugins/base/tests.yml @@ -0,0 +1,45 @@ +- name: Base (header) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + base: header + base_header: yes # For web instance + +- name: Base (activity) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + base: activity + base_activity: yes # For web instance + +- name: Base (community) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + base: community + base_community: yes # For web instance + +- name: Base (repositories) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + base: repositories + base_repositories: yes # For web instance + +- name: Base (metadata) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + base: metadata + base_metadata: yes # For web instance + +- name: Base (complete) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + base: header, activity, community, repositories, metadata + base_header: yes # For web instance + base_activity: yes # For web instance + base_community: yes # For web instance + base_repositories: yes # For web instance + base_metadata: yes # For web instance \ No newline at end of file diff --git a/source/plugins/core/tests.yml b/source/plugins/core/tests.yml new file mode 100644 index 00000000..cf4d28df --- /dev/null +++ b/source/plugins/core/tests.yml @@ -0,0 +1,26 @@ +- name: Image output (jpeg) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + config_output: jpeg + +- name: Image output (png) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + config_output: png + +- name: Disable animations + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + config_animations: no + +- name: Community templates + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + template: "@classic" + setup_community_templates: "lowlighter/metrics@master:classic" + modes: + - action diff --git a/source/plugins/followup/tests.yml b/source/plugins/followup/tests.yml new file mode 100644 index 00000000..6e347faf --- /dev/null +++ b/source/plugins/followup/tests.yml @@ -0,0 +1,5 @@ +- name: Follow-up plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_followup: yes diff --git a/source/plugins/gists/tests.yml b/source/plugins/gists/tests.yml new file mode 100644 index 00000000..cde896f8 --- /dev/null +++ b/source/plugins/gists/tests.yml @@ -0,0 +1,5 @@ +- name: Gists plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_gists: yes diff --git a/source/plugins/habits/tests.yml b/source/plugins/habits/tests.yml new file mode 100644 index 00000000..3116d420 --- /dev/null +++ b/source/plugins/habits/tests.yml @@ -0,0 +1,30 @@ +- name: Habits plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_habits: yes + +- name: Habits plugin (charts) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_habits: yes + plugin_habits_facts: no + plugin_habits_charts: yes + config_timezone: Europe/Paris + +- name: Habits plugin (facts) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_habits: yes + plugin_habits_facts: yes + +- name: Habits plugin (complete) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_habits: yes + plugin_habits_facts: yes + plugin_habits_charts: yes + config_timezone: Europe/Paris diff --git a/source/plugins/isocalendar/tests.yml b/source/plugins/isocalendar/tests.yml new file mode 100644 index 00000000..3130c74b --- /dev/null +++ b/source/plugins/isocalendar/tests.yml @@ -0,0 +1,20 @@ +- name: Isocalendar plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_isocalendar: yes + +- name: Isocalendar plugin (half-year) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_isocalendar: yes + plugin_isocalendar_duration: half-year + + +- name: Isocalendar plugin (full-year) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_isocalendar: yes + plugin_isocalendar_duration: full-year diff --git a/source/plugins/languages/tests.yml b/source/plugins/languages/tests.yml new file mode 100644 index 00000000..b76f3c52 --- /dev/null +++ b/source/plugins/languages/tests.yml @@ -0,0 +1,44 @@ +- name: Language plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_languages: yes + +- name: Language plugin (ignored languages) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_languages: yes + plugin_languages_ignored: html, css, dockerfile + + +- name: Language plugin (skipped repositories) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_languages: yes + plugin_languages_skipped: metrics + +- name: Language plugin (custom color set) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_languages: yes + plugin_languages_colors: complementary + +- name: Language plugin (with details) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_languages: yes + plugin_languages_details: percentage + +- name: Language plugin (complete) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_languages: yes + plugin_languages_ignored: html, css, dockerfile + plugin_languages_skipped: metrics + plugin_languages_colors: rainbow + plugin_languages_details: bytes-size, percentage diff --git a/source/plugins/lines/tests.yml b/source/plugins/lines/tests.yml new file mode 100644 index 00000000..2150afe7 --- /dev/null +++ b/source/plugins/lines/tests.yml @@ -0,0 +1,7 @@ +- name: Lines plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + base: repositories + plugin_lines: yes + diff --git a/source/plugins/music/tests.yml b/source/plugins/music/tests.yml new file mode 100644 index 00000000..6312605f --- /dev/null +++ b/source/plugins/music/tests.yml @@ -0,0 +1,30 @@ +- name: Music plugin (playlist - apple) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_music: yes + plugin_music_playlist: https://embed.music.apple.com/fr/playlist/usr-share/pl.u-V9D7m8Etjmjd0D + +- name: Music plugin (playlist - spotify) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_music: yes + plugin_music_playlist: https://open.spotify.com/embed/playlist/3nfA87oeJw4LFVcUDjRcqi + +- name: Music plugin (recent - spotify) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_music_token: MOCKED_CLIENT_ID, MOCKED_CLIENT_SECRET, MOCKED_REFRESH_TOKEN + plugin_music: yes + plugin_music_provider: spotify + +- name: Music plugin (recent - lastfm) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_music_token: MOCKED_TOKEN + plugin_music: yes + plugin_music_provider: lastfm + plugin_music_user: RJ diff --git a/source/plugins/pagespeed/tests.yml b/source/plugins/pagespeed/tests.yml new file mode 100644 index 00000000..68225683 --- /dev/null +++ b/source/plugins/pagespeed/tests.yml @@ -0,0 +1,39 @@ +- name: PageSpeed plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_pagespeed_token: MOCKED_TOKEN + plugin_pagespeed: yes + +- name: PageSpeed plugin (different url) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_pagespeed_token: MOCKED_TOKEN + plugin_pagespeed: yes + plugin_pagespeed_url: github.com + +- name: PageSpeed plugin (detailed) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_pagespeed_token: MOCKED_TOKEN + plugin_pagespeed: yes + plugin_pagespeed_detailed: yes + +- name: PageSpeed plugin (screenshot) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_pagespeed_token: MOCKED_TOKEN + plugin_pagespeed: yes + plugin_pagespeed_screenshot: yes + +- name: PageSpeed plugin (complete) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_pagespeed_token: MOCKED_TOKEN + plugin_pagespeed: yes + plugin_pagespeed_detailed: yes + plugin_pagespeed_screenshot: yes diff --git a/source/plugins/people/tests.yml b/source/plugins/people/tests.yml new file mode 100644 index 00000000..a39053f6 --- /dev/null +++ b/source/plugins/people/tests.yml @@ -0,0 +1,63 @@ +- name: People plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_people: yes + +- name: People plugin (followers) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_people: yes + plugin_people_types: followers + +- name: People plugin (following) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_people: yes + plugin_people_types: following + +- name: People plugin (sponsoring) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_people: yes + plugin_people_types: sponsoring + +- name: People plugin (sponsors) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_people: yes + plugin_people_types: sponsors + +- name: People plugin (stargazers) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_people: yes + plugin_people_types: stargazers + +- name: People plugin (watchers) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_people: yes + plugin_people_types: watchers + +- name: People plugin (thanks) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_people: yes + plugin_people_types: thanks + plugin_people_thanks: lowlighter + +- name: People plugin (identicons) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOKEN + plugin_people: yes + plugin_people_identicons: yes + diff --git a/source/plugins/posts/tests.yml b/source/plugins/posts/tests.yml new file mode 100644 index 00000000..a82bb4c8 --- /dev/null +++ b/source/plugins/posts/tests.yml @@ -0,0 +1,7 @@ +- name: Posts plugin (dev.to) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_posts: yes + plugin_posts_source: dev.to + plugin_posts_user: lowlighter diff --git a/source/plugins/projects/tests.yml b/source/plugins/projects/tests.yml new file mode 100644 index 00000000..74019e8b --- /dev/null +++ b/source/plugins/projects/tests.yml @@ -0,0 +1,22 @@ +- name: Projects plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_projects: yes + +- name: Projects plugin (repositories) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_projects: yes + plugin_projects_repositories: lowlighter/metrics/projects/1 + plugin_projects_limit: 0 + +- name: Projects plugin (descriptions) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_projects: yes + plugin_projects_repositories: lowlighter/metrics/projects/1 + plugin_projects_limit: 0 + plugin_projects_descriptions: yes diff --git a/source/plugins/stargazers/tests.yml b/source/plugins/stargazers/tests.yml new file mode 100644 index 00000000..ef72a882 --- /dev/null +++ b/source/plugins/stargazers/tests.yml @@ -0,0 +1,5 @@ +- name: Stargazers plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_stargazers: yes diff --git a/source/plugins/stars/tests.yml b/source/plugins/stars/tests.yml new file mode 100644 index 00000000..1b386390 --- /dev/null +++ b/source/plugins/stars/tests.yml @@ -0,0 +1,5 @@ +- name: Stars plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_stars: yes diff --git a/source/plugins/topics/tests.yml b/source/plugins/topics/tests.yml new file mode 100644 index 00000000..3d355020 --- /dev/null +++ b/source/plugins/topics/tests.yml @@ -0,0 +1,69 @@ +- name: Topics plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_topics: yes + +- name: Topics plugin (starred - starred sort) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_topics: yes + plugin_topics_mode: starred + plugin_topics_sort: starred + +- name: Topics plugin (starred - activity sort) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_topics: yes + plugin_topics_mode: starred + plugin_topics_sort: activity + +- name: Topics plugin (starred - stars sort) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_topics: yes + plugin_topics_mode: starred + plugin_topics_sort: stars + +- name: Topics plugin (starred - random sort) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_topics: yes + plugin_topics_mode: starred + plugin_topics_sort: random + +- name: Topics plugin (mastered - starred sort) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_topics: yes + plugin_topics_mode: mastered + plugin_topics_sort: starred + +- name: Topics plugin (mastered - activity sort) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_topics: yes + plugin_topics_mode: mastered + plugin_topics_sort: activity + +- name: Topics plugin (mastered - stars sort) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_topics: yes + plugin_topics_mode: mastered + plugin_topics_sort: stars + +- name: Topics plugin (mastered - random sort) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + plugin_topics: yes + plugin_topics_mode: mastered + plugin_topics_sort: random diff --git a/source/plugins/traffic/tests.yml b/source/plugins/traffic/tests.yml new file mode 100644 index 00000000..8e8ba088 --- /dev/null +++ b/source/plugins/traffic/tests.yml @@ -0,0 +1,6 @@ +- name: Traffic plugin (default) + uses: lowlighter/metrics@latest + with: + token: MOCKED_TOCKEN + base: repositories + plugin_traffic: yes diff --git a/source/plugins/tweets/tests.yml b/source/plugins/tweets/tests.yml new file mode 100644 index 00000000..bc1361c1 --- /dev/null +++ b/source/plugins/tweets/tests.yml @@ -0,0 +1,14 @@ +- name: Tweets plugin (default) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_tweets: yes + plugin_tweets_token: MOCKED_TOKEN + +- name: Tweets plugin (different user) + uses: lowlighter/metrics@latest + with: + token: NOT_NEEDED + plugin_tweets: yes + plugin_tweets_user: twitterdev + plugin_tweets_token: MOCKED_TOKEN diff --git a/source/templates/repository/template.mjs b/source/templates/repository/template.mjs index b4e39c59..cd9d4ca5 100644 --- a/source/templates/repository/template.mjs +++ b/source/templates/repository/template.mjs @@ -11,7 +11,7 @@ //Retrieving single repository console.debug(`metrics/compute/${login}/${repo} > retrieving single repository ${repo}`) - const {[account]:{repository}} = await graphql(queries.base.repository({login, repo, account})) + const {[account === "bypass" ? "user" : account]:{repository}} = await graphql(queries.base.repository({login, repo, account})) data.user.repositories.nodes = [repository] data.repo = repository diff --git a/tests/metrics.test.js b/tests/metrics.test.js index da869e43..3cd67f83 100644 --- a/tests/metrics.test.js +++ b/tests/metrics.test.js @@ -1,7 +1,3 @@ -/** - * @jest-environment node - */ - //Imports const processes = require("child_process") const yaml = require("js-yaml") @@ -33,21 +29,13 @@ //Web instance const web = {} web.run = async (vars) => (await axios(`http://localhost:3000/lowlighter?${new url.URLSearchParams(Object.fromEntries(Object.entries(vars).map(([key, value]) => [key.replace(/^plugin_/, "").replace(/_/g, "."), value])))}`)).status === 200 - beforeAll(async done => { - await fs.promises.rmdir(path.join(__dirname, "../source/templates/@classic"), {recursive:true}) - await new Promise((solve, reject) => { - let stdout = "" - web.instance = processes.spawn("node", ["source/app/web/index.mjs"], {env:{...process.env, USE_MOCKED_DATA:true, NO_SETTINGS:true}}) - web.instance.stdout.on("data", data => (stdout += data, /Server ready !/.test(stdout) ? solve() : null)) - web.instance.stderr.on("data", data => console.error(`${data}`)) - }) - done() - }) - afterAll(async done => { - await web.instance.kill("SIGKILL") - await fs.promises.rmdir(path.join(__dirname, "../source/templates/@classic"), {recursive:true}) - done() + web.start = async () => new Promise(solve => { + let stdout = "" + web.instance = processes.spawn("node", ["source/app/web/index.mjs"], {env:{...process.env, USE_MOCKED_DATA:true, NO_SETTINGS:true}}) + web.instance.stdout.on("data", data => (stdout += data, /Server ready !/.test(stdout) ? solve() : null)) + web.instance.stderr.on("data", data => console.error(`${data}`)) }) + web.stop = async () => await web.instance.kill("SIGKILL") //Web instance placeholder require("./../source/app/web/statics/app.placeholder.js") @@ -69,8 +57,42 @@ }) === "string" } -//Test cases - const tests = require("./testscases")() +//Setup + beforeAll(async done => { + //Clean community template + await fs.promises.rmdir(path.join(__dirname, "../source/templates/@classic"), {recursive:true}) + //Start web instance + await web.start() + done() + }) +//Teardown + afterAll(async done => { + //Stop web instance + await web.stop() + //Clean community template + await fs.promises.rmdir(path.join(__dirname, "../source/templates/@classic"), {recursive:true}) + done() + }) + +//Load metadata (as jest doesn't support ESM modules, we use this dirty hack) + const metadata = JSON.parse(`${processes.spawnSync("node", [ + "--input-type", "module", + "--eval", 'import metadata from "./source/app/metrics/metadata.mjs";console.log(JSON.stringify(await metadata({log:false})))' + ]).stdout}`) + +//Build tests index + const tests = [] + for (const name in metadata.plugins) { + const cases = yaml + .load(fs.readFileSync(path.join(__dirname, "../source/plugins", name, "tests.yml"), "utf8")) + .map(({name:test, with:inputs, modes = []}) => { + const skip = new Set(Object.entries(metadata.templates).filter(([_, {readme:{compatibility}}]) => !compatibility[name]).map(([template]) => template)) + if (!(metadata.plugins[name].supports.includes("repository"))) + skip.add("repository") + return [test, inputs, {skip:[...skip], modes}] + }) + tests.push(...cases) + } //Tests run describe("GitHub Action", () => @@ -83,16 +105,7 @@ if ((skip.includes(template))||((modes.length)&&(!modes.includes("action")))) test.skip(name, () => null) else - test(name, async () => expect(await action.run({ - token:"MOCKED_TOKEN", - plugin_pagespeed_token:"MOCKED_TOKEN", - plugin_tweets_token:"MOCKED_TOKEN", - plugin_music_token:"MOCKED_CLIENT_ID, MOCKED_CLIENT_SECRET, MOCKED_REFRESH_TOKEN", - template, base:"", query:JSON.stringify(query), - config_timezone:"Europe/Paris", - plugins_errors_fatal:true, dryrun:true, use_mocked_data:true, verify:true, - ...input - })).toBe(true), 60*1e3) + test(name, async () => expect(await action.run({template, base:"", query:JSON.stringify(query), plugins_errors_fatal:true, dryrun:true, use_mocked_data:true, verify:true, ...input})).toBe(true)) }) ) @@ -106,12 +119,7 @@ if ((skip.includes(template))||((modes.length)&&(!modes.includes("web")))) test.skip(name, () => null) else - test(name, async () => expect(await web.run({ - template, base:0, ...query, - config_timezone:"Europe/Paris", - plugins_errors_fatal:true, verify:true, - ...input - })).toBe(true), 60*1e3) + test(name, async () => expect(await web.run({template, base:0, ...query, plugins_errors_fatal:true, verify:true, ...input})).toBe(true)) }) ) @@ -124,13 +132,6 @@ if ((skip.includes(template))||((modes.length)&&(!modes.includes("placeholder")))) test.skip(name, () => null) else - test(name, async () => expect(await placeholder.run({ - template, base:0, ...query, - config_timezone:"Europe/Paris", - plugins_errors_fatal:true, verify:true, - ...input - })).toBe(true)) + test(name, async () => expect(await placeholder.run({template, base:0, ...query, ...input})).toBe(true)) }) ) - - diff --git a/tests/testscases.js b/tests/testscases.js deleted file mode 100644 index 017e444c..00000000 --- a/tests/testscases.js +++ /dev/null @@ -1,314 +0,0 @@ -/** Test cases */ - module.exports = function () { - return [ - ["Base (header)", { - base:"header", - base_header:true, - }], - ["Base (activity", { - base:"activity", - base_activity:true, - }], - ["Base (community)", { - base:"community", - base_community:true, - }], - ["Base (repositories)", { - base:"repositories", - base_repositories:true, - }], - ["Base (metadata)", { - base:"metadata", - base_metadata:true, - }], - ["Base (complete)", { - base:"header, activity, community, repositories, metadata", - base_header:true, - base_activity:true, - base_community:true, - base_repositories:true, - base_metadata:true, - }], - ["Image output (jpeg)", { - config_output:"jpeg", - }], - ["Image output (png)", { - config_output:"png", - }], - ["Disable animations", { - config_animations:"no", - }], - ["PageSpeed plugin (default)", { - plugin_pagespeed:true, - }], - ["PageSpeed plugin (different url)", { - plugin_pagespeed:true, - plugin_pagespeed_url:"github.com", - }], - ["PageSpeed plugin (detailed)", { - plugin_pagespeed:true, - plugin_pagespeed_detailed:true, - }], - ["PageSpeed plugin (screenshot)", { - plugin_pagespeed:true, - plugin_pagespeed_screenshot:true, - }], - ["PageSpeed plugin (complete)", { - plugin_pagespeed:true, - plugin_pagespeed_detailed:true, - plugin_pagespeed_screenshot:true, - }], - ["Isocalendar plugin (default)", { - plugin_isocalendar: true, - }, {skip:["terminal", "repository"]}], - ["Isocalendar plugin (half-year)", { - plugin_isocalendar: true, - plugin_isocalendar_duration: "half-year", - }, {skip:["terminal", "repository"]}], - ["Isocalendar plugin (full-year)", { - plugin_isocalendar: true, - plugin_isocalendar_duration: "full-year", - }, {skip:["terminal", "repository"]}], - ["Music plugin (playlist - apple)", { - plugin_music:true, - plugin_music_playlist:"https://embed.music.apple.com/fr/playlist/usr-share/pl.u-V9D7m8Etjmjd0D", - }, {skip:["terminal", "repository"]}], - ["Music plugin (playlist - spotify)", { - plugin_music:true, - plugin_music_playlist:"https://open.spotify.com/embed/playlist/3nfA87oeJw4LFVcUDjRcqi", - }, {skip:["terminal", "repository"]}], - ["Music plugin (recent - spotify)", { - plugin_music:true, - plugin_music_provider: "spotify", - }, {skip:["terminal", "repository"]}], - ["Music plugin (recent - lastfm)", { - plugin_music:true, - plugin_music_provider: "lastfm", - plugin_music_user: "RJ", - }, {skip:["terminal", "repository"]}], - ["Language plugin (default)", { - plugin_languages:true, - }], - ["Language plugin (ignored languages)", { - plugin_languages:true, - plugin_languages_ignored:"html, css, dockerfile", - }], - ["Language plugin (skipped repositories)", { - plugin_languages:true, - plugin_languages_skipped:"metrics", - }], - ["Language plugin (custom color set)", { - plugin_languages:true, - plugin_languages_colors:"0:ff0000,1:red", - }], - ["Language plugin (custom color set)", { - plugin_languages:true, - plugin_languages_colors:"complementary", - }], - ["Language plugin (with details)", { - plugin_languages:true, - plugin_languages_details:"percentage", - }], - ["Language plugin (complete)", { - plugin_languages:true, - plugin_languages_ignored:"html, css, dockerfile", - plugin_languages_skipped:"metrics", - plugin_languages_colors:"rainbow", - plugin_languages_details:"bytes-size, percentage", - }], - ["Follow-up plugin (default)", { - plugin_followup:true, - }], - ["Topics plugin (default)", { - plugin_topics:true, - }, {skip:["terminal", "repository"]}], - ["Topics plugin (starred - starred sort)", { - plugin_topics:true, - plugin_topics_mode:"starred", - plugin_topics_sort:"starred", - }, {skip:["terminal", "repository"]}], - ["Topics plugin (starred - activity sort)", { - plugin_topics:true, - plugin_topics_mode:"starred", - plugin_topics_sort:"activity", - }, {skip:["terminal", "repository"]}], - ["Topics plugin (starred - stars sort)", { - plugin_topics:true, - plugin_topics_mode:"starred", - plugin_topics_sort:"stars", - }, {skip:["terminal", "repository"]}], - ["Topics plugin (starred - random sort)", { - plugin_topics:true, - plugin_topics_mode:"starred", - plugin_topics_sort:"random", - }, {skip:["terminal", "repository"]}], - ["Topics plugin (mastered - starred sort)", { - plugin_topics:true, - plugin_topics_mode:"mastered", - plugin_topics_sort:"starred", - }, {skip:["terminal", "repository"]}], - ["Topics plugin (mastered - activity sort)", { - plugin_topics:true, - plugin_topics_mode:"mastered", - plugin_topics_sort:"activity", - }, {skip:["terminal", "repository"]}], - ["Topics plugin (mastered - stars sort)", { - plugin_topics:true, - plugin_topics_mode:"mastered", - plugin_topics_sort:"stars", - }, {skip:["terminal", "repository"]}], - ["Topics plugin (mastered - random sort)", { - plugin_topics:true, - plugin_topics_mode:"mastered", - plugin_topics_sort:"random", - }, {skip:["terminal", "repository"]}], - ["Projects plugin (default)", { - plugin_projects:true, - }, {skip:["terminal"]}], - ["Projects plugin (repositories)", { - plugin_projects:true, - plugin_projects_repositories:"lowlighter/metrics/projects/1", - plugin_projects_limit:0, - }, {skip:["terminal"]}], - ["Projects plugin (descriptions)", { - plugin_projects:true, - plugin_projects_repositories:"lowlighter/metrics/projects/1", - plugin_projects_limit:0, - plugin_projects_descriptions:true, - }, {skip:["terminal"]}], - ["Lines plugin (default)", { - base:"repositories", - plugin_lines:true, - }], - ["Traffic plugin (default)", { - base:"repositories", - plugin_traffic:true, - }], - ["Tweets plugin (default)", { - plugin_tweets:true, - }, {skip:["terminal", "repository"]}], - ["Tweets plugin (different user)", { - plugin_tweets:true, - plugin_tweets_user:"twitterdev", - }, {skip:["terminal", "repository"]}], - ["Posts plugin (dev.to)", { - user:"lowlighter", - plugin_posts:true, - plugin_posts_source:"dev.to", - }, {skip:["terminal", "repository"]}], - ["Habits plugin (default)", { - plugin_habits:true, - plugin_habits_from:5, - }, {skip:["terminal", "repository"]}], - ["Habits plugin (charts)", { - plugin_habits:true, - plugin_habits_from:5, - plugin_habits_charts:true, - }, {skip:["terminal", "repository"]}], - ["Habits plugin (facts)", { - plugin_habits:true, - plugin_habits_from:5, - plugin_habits_facts:true, - }, {skip:["terminal", "repository"]}], - ["Habits plugin (complete)", { - plugin_habits:true, - plugin_habits_from:5, - plugin_habits_charts:true, - }, {skip:["terminal", "repository"]}], - ["Activity plugin (default)", { - plugin_activity:true, - plugin_activity_limit:100, - plugin_activity_days:14, - plugin_activity_filter:"all", - }, {skip:["terminal", "repository"]}], - ["Activity plugin (filtered)", { - plugin_activity:true, - plugin_activity_filter:"pr, issue", - }, {skip:["terminal", "repository"]}], - ["Stars plugin (default)", { - plugin_stars:true, - }, {skip:["terminal", "repository"]}], - ["Stargazers plugin (default)", { - plugin_stargazers:true, - }, {skip:["terminal"]}], - ["Gists plugin (default)", { - plugin_gists:true, - }, {skip:["terminal", "repository"]}], - ["People plugin (default)", { - plugin_people:true, - }, {skip:["terminal", "repository"]}], - ["People plugin (followers)", { - plugin_people:true, - plugin_people_types:"followers", - }, {skip:["terminal", "repository"]}], - ["People plugin (following)", { - plugin_people:true, - plugin_people_types:"following", - }, {skip:["terminal", "repository"]}], - ["People plugin (sponsoring)", { - plugin_people:true, - plugin_people_types:"sponsoring", - }, {skip:["terminal", "repository"]}], - ["People plugin (sponsors)", { - plugin_people:true, - plugin_people_types:"sponsors", - }, {skip:["terminal"]}], - ["People plugin (stargazers)", { - plugin_people:true, - plugin_people_types:"stargazers", - }, {skip:["classic", "terminal"]}], - ["People plugin (watchers)", { - plugin_people:true, - plugin_people_types:"watchers", - }, {skip:["classic", "terminal"]}], - ["People plugin (thanks)", { - plugin_people:true, - plugin_people_types:"thanks", - plugin_people_thanks:"lowlighter", - }, {skip:["classic", "terminal"]}], - ["People plugin (identicons)", { - plugin_people:true, - plugin_people_identicons:true, - }, {skip:["terminal", "repository"]}], - ["Anilist plugin (default)", { - plugin_anilist:true, - }, {skip:["terminal", "repository"]}], - ["Anilist plugin (manga only)", { - plugin_anilist:true, - plugin_anilist_medias:"manga", - }, {skip:["terminal", "repository"]}], - ["Anilist plugin (anime only)", { - plugin_anilist:true, - plugin_anilist_medias:"anime", - }, {skip:["terminal", "repository"]}], - ["Anilist plugin (favorites section)", { - plugin_anilist:true, - plugin_anilist_sections:"favorites", - }, {skip:["terminal", "repository"]}], - ["Anilist plugin (watching/reading section)", { - plugin_anilist:true, - plugin_anilist_sections:"watching, reading", - }, {skip:["terminal", "repository"]}], - ["Anilist plugin (characters section)", { - plugin_anilist:true, - plugin_anilist_sections:"characters", - }, {skip:["terminal", "repository"]}], - ["Anilist plugin (additional options)", { - plugin_anilist:true, - plugin_anilist_limit:0, - plugin_anilist_shuffle:false, - plugin_anilist_user:"anilist", - }, {skip:["terminal", "repository"]}], - ["Anilist plugin (complete)", { - plugin_anilist:true, - plugin_anilist_medias:"manga, anime", - plugin_anilist_sections:"favorites, watching, reading, characters", - plugin_anilist_limit:0, - plugin_anilist_shuffle:false, - }, {skip:["terminal", "repository"]}], - ["Community templates", { - template:"@classic", - setup_community_templates:"lowlighter/metrics@master:classic", - }, {skip:["terminal", "repository"], modes:["action"]}] - ] - } \ No newline at end of file