Repository: anuraghazra/github-readme-stats
Pull request #3399 (2023-10-20 17:30:55)

themes: add ambient_gradient theme for test
I want to check if we currently support gradient themes addition.

github-actions[bot]: 
      # Automated Theme Preview
      
  Hi, thanks for the theme contribution. Please read our theme [contribution guidelines](https://github.com/anuraghazra/github-readme-stats/blob/master/CONTRIBUTING.md#themes-contribution).

  > [!WARNING]  > Keep in mind that we already have a vast collection of different themes. To keep their number manageable, we began to add only themes supported by the community. Your pull request with theme addition will be merged once we get enough positive feedback from the community in the form of thumbs up :+1: emojis (see [#1935](https://github.com/anuraghazra/github-readme-stats/issues/1935#top-themes-prs)). We expect to see at least 10-15 thumbs up before making a decision to merge your pull request into the master branch. Remember that you can also support themes of other contributors that you liked to speed up their merge.

  > [!NOTE]  > Also, note that if this theme is exclusively for your personal use, then instead of adding it to our theme collection, you can use card [customization options](https://github.com/anuraghazra/github-readme-stats#customization).

    
      :x: Theme PR does not adhere to our guidelines.
      ## Test results
      - :x: ambient_gradient

      **Result:** :x: Some themes are invalid.


  Unfortunately, your theme PR contains an error or does not adhere to our [theme guidelines](https://github.com/anuraghazra/github-readme-stats/blob/master/CONTRIBUTING.md#themes-contribution). Please fix the issues below, and we will review your   PR again. This pull request will **automatically close in 20 days** if no changes are made. After this time, you must re-open the PR for it to be reviewed.

      
      ## Details
      
          ### Ambient_gradient theme preview
          
          
          - :x: Theme color property `bg_color` can not be longer than `8` characters.


          >:x: Cannot create theme preview.
        
    
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3399?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Comparison is base [(`f8aa2db`)](https://app.codecov.io/gh/anuraghazra/github-readme-stats/commit/f8aa2db39df2af78a59fd0cd6f7dbc18af567e2c?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra) 98.40% compared to head [(`2196217`)](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3399?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra) 98.40%.
> Report is 1 commits behind head on master.

<details><summary>Additional details and impacted files</summary>


```diff
@@           Coverage Diff           @@
##           master    #3399   +/-   ##
=======================================
  Coverage   98.40%   98.40%           
=======================================
  Files          26       26           
  Lines        6014     6020    +6     
  Branches      535      535           
=======================================
+ Hits         5918     5924    +6     
  Misses         93       93           
  Partials        3        3           
```


| [Files](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3399?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra) | Coverage Δ | |
|---|---|---|
| [themes/index.js](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3399?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra#diff-dGhlbWVzL2luZGV4Lmpz) | `100.00% <100.00%> (ø)` | |


</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3399?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra).

rickstaa: @qwerty541 looks like the test failed 🤔.
qwerty541: @rickstaa Looks like theme preview workflow finally works with gradient themes. What do you think about adding 2-3 such themes into our collection before disabling this workflow, since currently we do not provide any gradient theme?
rickstaa: > @rickstaa Looks like theme preview workflow finally works with gradient themes. What do you think about adding 2-3 such themes into our collection before disabling this workflow, since currently we do not provide any gradient theme?

I'm okay with adding three gradient themes 👍🏻. But let's first check with @anuraghazra.

Patch:
diff --git a/.eslintrc.json b/.eslintrc.json
index 9ec7f29..a98bf6b 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -150,12 +150,12 @@
         // "arrow-body-style": [ "error", "always" ],
         // "arrow-parens": [ "error", "always" ],
         // "arrow-spacing": [ "error", { "before": true, "after": true }],
-        // "constructor-super": "error",
+        "constructor-super": "error",
         // "generator-star-spacing": [ "error", "before" ],
         // "no-arrow-condition": "error",
-        // "no-class-assign": "error",
-        // "no-const-assign": "error",
-        // "no-dupe-class-members": "error",
+        "no-class-assign": "error",
+        "no-const-assign": "error",
+        "no-dupe-class-members": "error",
         "no-this-before-super": "error",
         // "no-var": "warn",
         "object-shorthand": [ "warn" ],
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 1691b12..ec984a5 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -6,6 +6,11 @@ updates:
     schedule:
       interval: weekly
     open-pull-requests-limit: 10
+    commit-message:
+      prefix: "build(deps)"
+      prefix-development: "build(deps-dev)"
+    reviewers:
+      - "qwerty541"
 
   # Maintain dependencies for GitHub Actions
   - package-ecosystem: github-actions
@@ -13,3 +18,8 @@ updates:
     schedule:
       interval: weekly
     open-pull-requests-limit: 10
+    commit-message:
+      prefix: "build(deps)"
+      prefix-development: "build(deps-dev)"
+    reviewers:
+      - "qwerty541"
diff --git a/.github/workflows/empty-issues-closer.yaml b/.github/workflows/empty-issues-closer.yaml
index e7d3738..29b1dd5 100644
--- a/.github/workflows/empty-issues-closer.yaml
+++ b/.github/workflows/empty-issues-closer.yaml
@@ -30,7 +30,7 @@ jobs:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
 
       - name: Run empty issues closer action
-        uses: rickstaa/empty-issues-closer-action@af151e679df0e3b59cda0e10c43010556d6c5bff # v1.1.35
+        uses: rickstaa/empty-issues-closer-action@37f2cd30a4fb97504bbb570dc73264cfa522dee3 # v1.1.40
         env:
           github_token: ${{ secrets.GITHUB_TOKEN }}
         with:
diff --git a/.github/workflows/ossf-analysis.yml b/.github/workflows/ossf-analysis.yml
index fb66b49..7b1b63a 100644
--- a/.github/workflows/ossf-analysis.yml
+++ b/.github/workflows/ossf-analysis.yml
@@ -26,7 +26,7 @@ jobs:
           persist-credentials: false
 
       - name: "Run analysis"
-        uses: ossf/scorecard-action@483ef80eb98fb506c348f7d62e28055e49fe2398 # v2.3.0
+        uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1
         with:
           results_file: results.sarif
           results_format: sarif
diff --git a/.github/workflows/top-issues-dashboard.yml b/.github/workflows/top-issues-dashboard.yml
index e07c269..ee0dd56 100644
--- a/.github/workflows/top-issues-dashboard.yml
+++ b/.github/workflows/top-issues-dashboard.yml
@@ -34,7 +34,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Run top issues action
-        uses: rickstaa/top-issues-action@36df2af30c15ddf48558931420138890ed1b1708 # v1.3.61
+        uses: rickstaa/top-issues-action@da2fb7f2bd61828135e0971f8d33efb1a079e9a9 # v1.3.65
         env:
           github_token: ${{ secrets.GITHUB_TOKEN }}
         with:
diff --git a/api/index.js b/api/index.js
index e1e1c27..2029367 100644
--- a/api/index.js
+++ b/api/index.js
@@ -43,7 +43,7 @@ export default async (req, res) => {
 
   if (blacklist.includes(username)) {
     return res.send(
-      renderError("Something went wrong", "", {
+      renderError("Something went wrong", "This username is blacklisted", {
         title_color,
         text_color,
         bg_color,
diff --git a/api/pin.js b/api/pin.js
index bdad925..c67df29 100644
--- a/api/pin.js
+++ b/api/pin.js
@@ -30,7 +30,7 @@ export default async (req, res) => {
 
   if (blacklist.includes(username)) {
     return res.send(
-      renderError("Something went wrong", "", {
+      renderError("Something went wrong", "This username is blacklisted", {
         title_color,
         text_color,
         bg_color,
diff --git a/api/top-langs.js b/api/top-langs.js
index 0ca96fe..382ee42 100644
--- a/api/top-langs.js
+++ b/api/top-langs.js
@@ -38,7 +38,7 @@ export default async (req, res) => {
 
   if (blacklist.includes(username)) {
     return res.send(
-      renderError("Something went wrong", "", {
+      renderError("Something went wrong", "This username is blacklisted", {
         title_color,
         text_color,
         bg_color,
diff --git a/package-lock.json b/package-lock.json
index ca82673..05d2de9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
       "version": "1.0.0",
       "license": "MIT",
       "dependencies": {
-        "axios": "^1.5.1",
+        "axios": "^1.6.0",
         "dotenv": "^16.3.1",
         "emoji-name-map": "^1.2.8",
         "github-username-regex": "^1.0.0",
@@ -24,7 +24,7 @@
         "@uppercod/css-to-object": "^1.1.1",
         "axios-mock-adapter": "^1.22.0",
         "color-contrast-checker": "^2.1.0",
-        "eslint": "^8.52.0",
+        "eslint": "^8.53.0",
         "eslint-config-prettier": "^9.0.0",
         "hjson": "^3.2.2",
         "husky": "^8.0.3",
@@ -769,9 +769,9 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
-      "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz",
+      "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
@@ -792,9 +792,9 @@
       }
     },
     "node_modules/@eslint/eslintrc/node_modules/globals": {
-      "version": "13.21.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
-      "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
+      "version": "13.23.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
+      "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
       "dev": true,
       "dependencies": {
         "type-fest": "^0.20.2"
@@ -819,9 +819,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "8.52.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz",
-      "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==",
+      "version": "8.53.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz",
+      "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1908,9 +1908,9 @@
       }
     },
     "node_modules/axios": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
-      "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
+      "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==",
       "dependencies": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
@@ -2758,15 +2758,15 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.52.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz",
-      "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==",
+      "version": "8.53.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz",
+      "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.6.1",
-        "@eslint/eslintrc": "^2.1.2",
-        "@eslint/js": "8.52.0",
+        "@eslint/eslintrc": "^2.1.3",
+        "@eslint/js": "8.53.0",
         "@humanwhocodes/config-array": "^0.11.13",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
@@ -7826,9 +7826,9 @@
       "dev": true
     },
     "@eslint/eslintrc": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
-      "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz",
+      "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
@@ -7843,9 +7843,9 @@
       },
       "dependencies": {
         "globals": {
-          "version": "13.21.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
-          "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
+          "version": "13.23.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
+          "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
           "dev": true,
           "requires": {
             "type-fest": "^0.20.2"
@@ -7860,9 +7860,9 @@
       }
     },
     "@eslint/js": {
-      "version": "8.52.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz",
-      "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==",
+      "version": "8.53.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz",
+      "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==",
       "dev": true
     },
     "@fastify/busboy": {
@@ -8728,9 +8728,9 @@
       "dev": true
     },
     "axios": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
-      "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
+      "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==",
       "requires": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
@@ -9355,15 +9355,15 @@
       }
     },
     "eslint": {
-      "version": "8.52.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz",
-      "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==",
+      "version": "8.53.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz",
+      "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==",
       "dev": true,
       "requires": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.6.1",
-        "@eslint/eslintrc": "^2.1.2",
-        "@eslint/js": "8.52.0",
+        "@eslint/eslintrc": "^2.1.3",
+        "@eslint/js": "8.53.0",
         "@humanwhocodes/config-array": "^0.11.13",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
diff --git a/package.json b/package.json
index 999ea06..b588391 100644
--- a/package.json
+++ b/package.json
@@ -43,7 +43,7 @@
     "@uppercod/css-to-object": "^1.1.1",
     "axios-mock-adapter": "^1.22.0",
     "color-contrast-checker": "^2.1.0",
-    "eslint": "^8.52.0",
+    "eslint": "^8.53.0",
     "eslint-config-prettier": "^9.0.0",
     "hjson": "^3.2.2",
     "husky": "^8.0.3",
@@ -57,7 +57,7 @@
     "prettier": "^3.0.3"
   },
   "dependencies": {
-    "axios": "^1.5.1",
+    "axios": "^1.6.0",
     "dotenv": "^16.3.1",
     "emoji-name-map": "^1.2.8",
     "github-username-regex": "^1.0.0",
diff --git a/src/cards/stats-card.js b/src/cards/stats-card.js
index 5f57205..b7bc54b 100644
--- a/src/cards/stats-card.js
+++ b/src/cards/stats-card.js
@@ -76,7 +76,7 @@ const createTextNode = ({
 };
 
 /**
- * Calculates progress along the boundary of the circle i.e it's circumference.
+ * Calculates progress along the boundary of the circle, i.e. its circumference.
  *
  * @param {number} value The rank value to calculate progress for.
  * @returns {number} Progress value.
diff --git a/src/common/languageColors.json b/src/common/languageColors.json
index 8c1c23d..4501dc8 100644
--- a/src/common/languageColors.json
+++ b/src/common/languageColors.json
@@ -53,6 +53,7 @@
     "BlitzBasic": "#00FFAE",
     "BlitzMax": "#cd6400",
     "Bluespec": "#12223c",
+    "Bluespec BH": "#12223c",
     "Boo": "#d4bec1",
     "Boogie": "#c80fa0",
     "Brainfuck": "#2F2530",
@@ -192,6 +193,7 @@
     "Gosu": "#82937f",
     "Grace": "#615f8b",
     "Gradle": "#02303a",
+    "Gradle Kotlin DSL": "#02303a",
     "Grammatical Framework": "#ff0000",
     "GraphQL": "#e10098",
     "Graphviz (DOT)": "#2596be",
@@ -422,6 +424,7 @@
     "Red": "#f50000",
     "Regular Expression": "#009a00",
     "Ren'Py": "#ff7f7f",
+    "Rez": "#FFDAB3",
     "Ring": "#2D54CB",
     "Riot": "#A71E49",
     "RobotFramework": "#00c0b5",
@@ -476,6 +479,7 @@
     "SuperCollider": "#46390b",
     "Svelte": "#ff3e00",
     "Sway": "#dea584",
+    "Sweave": "#198ce7",
     "Swift": "#F05138",
     "SystemVerilog": "#DAE1C2",
     "TI Program": "#A0AA87",
@@ -496,6 +500,7 @@
     "Turing": "#cf142b",
     "Twig": "#c1d026",
     "TypeScript": "#3178c6",
+    "Typst": "#239dad",
     "Unified Parallel C": "#4e3617",
     "Unity3D Asset": "#222c37",
     "Uno": "#9933cc",
diff --git a/themes/index.js b/themes/index.js
index 043ccf1..f5d8d91 100644
--- a/themes/index.js
+++ b/themes/index.js
@@ -456,6 +456,12 @@ export const themes = {
     border_color: "e1bc29",
     bg_color: "2b2d40",
   },
+  ambient_gradient: {
+    title_color: "ffffff",
+    text_color: "ffffff",
+    icon_color: "ffffff",
+    bg_color: "35,4158d0,c850c0,ffcc70",
+  },
 };
 
 export default themes;


Test patch:
diff --git a/tests/api.test.js b/tests/api.test.js
index a6ed04b..eee9a1a 100644
--- a/tests/api.test.js
+++ b/tests/api.test.js
@@ -120,6 +120,21 @@ describe("Test /api/", () => {
     );
   });
 
+  it("should render error card in same theme as requested card", async () => {
+    const { req, res } = faker({ theme: "merko" }, error);
+
+    await api(req, res);
+
+    expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml");
+    expect(res.send).toBeCalledWith(
+      renderError(
+        error.errors[0].message,
+        "Make sure the provided username is not an organization",
+        { theme: "merko" },
+      ),
+    );
+  });
+
   it("should get the query options", async () => {
     const { req, res } = faker(
       {
@@ -291,7 +306,9 @@ describe("Test /api/", () => {
     await api(req, res);
 
     expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml");
-    expect(res.send).toBeCalledWith(renderError("Something went wrong"));
+    expect(res.send).toBeCalledWith(
+      renderError("Something went wrong", "This username is blacklisted"),
+    );
   });
 
   it("should render error card when wrong locale is provided", async () => {
diff --git a/tests/fetchWakatime.test.js b/tests/fetchWakatime.test.js
index ebad3a2..8e24893 100644
--- a/tests/fetchWakatime.test.js
+++ b/tests/fetchWakatime.test.js
@@ -103,7 +103,7 @@ const wakaTimeData = {
 };
 
 describe("WakaTime fetcher", () => {
-  it("should fetch correct wakatime data", async () => {
+  it("should fetch correct WakaTime data", async () => {
     const username = "anuraghazra";
     mock
       .onGet(
diff --git a/tests/pin.test.js b/tests/pin.test.js
index 0dcb5aa..105e445 100644
--- a/tests/pin.test.js
+++ b/tests/pin.test.js
@@ -155,7 +155,9 @@ describe("Test /api/pin", () => {
     await pin(req, res);
 
     expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml");
-    expect(res.send).toBeCalledWith(renderError("Something went wrong"));
+    expect(res.send).toBeCalledWith(
+      renderError("Something went wrong", "This username is blacklisted"),
+    );
   });
 
   it("should render error card if wrong locale provided", async () => {
diff --git a/tests/top-langs.test.js b/tests/top-langs.test.js
index 272ee7e..692681b 100644
--- a/tests/top-langs.test.js
+++ b/tests/top-langs.test.js
@@ -183,7 +183,9 @@ describe("Test /api/top-langs", () => {
     await topLangs(req, res);
 
     expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml");
-    expect(res.send).toBeCalledWith(renderError("Something went wrong"));
+    expect(res.send).toBeCalledWith(
+      renderError("Something went wrong", "This username is blacklisted"),
+    );
   });
 
   it("should render error card if wrong locale provided", async () => {
diff --git a/tests/wakatime.test.js b/tests/wakatime.test.js
new file mode 100644
index 0000000..944c3e0
--- /dev/null
+++ b/tests/wakatime.test.js
@@ -0,0 +1,123 @@
+import { jest } from "@jest/globals";
+import "@testing-library/jest-dom";
+import axios from "axios";
+import MockAdapter from "axios-mock-adapter";
+import wakatime from "../api/wakatime.js";
+import { renderWakatimeCard } from "../src/cards/wakatime-card.js";
+import { expect, it, describe, afterEach } from "@jest/globals";
+
+const wakaTimeData = {
+  data: {
+    categories: [
+      {
+        digital: "22:40",
+        hours: 22,
+        minutes: 40,
+        name: "Coding",
+        percent: 100,
+        text: "22 hrs 40 mins",
+        total_seconds: 81643.570077,
+      },
+    ],
+    daily_average: 16095,
+    daily_average_including_other_language: 16329,
+    days_including_holidays: 7,
+    days_minus_holidays: 5,
+    editors: [
+      {
+        digital: "22:40",
+        hours: 22,
+        minutes: 40,
+        name: "VS Code",
+        percent: 100,
+        text: "22 hrs 40 mins",
+        total_seconds: 81643.570077,
+      },
+    ],
+    holidays: 2,
+    human_readable_daily_average: "4 hrs 28 mins",
+    human_readable_daily_average_including_other_language: "4 hrs 32 mins",
+    human_readable_total: "22 hrs 21 mins",
+    human_readable_total_including_other_language: "22 hrs 40 mins",
+    id: "random hash",
+    is_already_updating: false,
+    is_coding_activity_visible: true,
+    is_including_today: false,
+    is_other_usage_visible: true,
+    is_stuck: false,
+    is_up_to_date: true,
+    languages: [
+      {
+        digital: "0:19",
+        hours: 0,
+        minutes: 19,
+        name: "Other",
+        percent: 1.43,
+        text: "19 mins",
+        total_seconds: 1170.434361,
+      },
+      {
+        digital: "0:01",
+        hours: 0,
+        minutes: 1,
+        name: "TypeScript",
+        percent: 0.1,
+        text: "1 min",
+        total_seconds: 83.293809,
+      },
+      {
+        digital: "0:00",
+        hours: 0,
+        minutes: 0,
+        name: "YAML",
+        percent: 0.07,
+        text: "0 secs",
+        total_seconds: 54.975151,
+      },
+    ],
+    operating_systems: [
+      {
+        digital: "22:40",
+        hours: 22,
+        minutes: 40,
+        name: "Mac",
+        percent: 100,
+        text: "22 hrs 40 mins",
+        total_seconds: 81643.570077,
+      },
+    ],
+    percent_calculated: 100,
+    range: "last_7_days",
+    status: "ok",
+    timeout: 15,
+    total_seconds: 80473.135716,
+    total_seconds_including_other_language: 81643.570077,
+    user_id: "random hash",
+    username: "anuraghazra",
+    writes_only: false,
+  },
+};
+
+const mock = new MockAdapter(axios);
+
+afterEach(() => {
+  mock.reset();
+});
+
+describe("Test /api/wakatime", () => {
+  it("should test the request", async () => {
+    const username = "anuraghazra";
+    const req = { query: { username } };
+    const res = { setHeader: jest.fn(), send: jest.fn() };
+    mock
+      .onGet(
+        `https://wakatime.com/api/v1/users/${username}/stats?is_including_today=true`,
+      )
+      .reply(200, wakaTimeData);
+
+    await wakatime(req, res);
+
+    expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml");
+    expect(res.send).toBeCalledWith(renderWakatimeCard(wakaTimeData.data, {}));
+  });
+});