Repository: btcpay-monero/btcpayserver-monero-plugin
Pull request #16: Add Code Coverage
Author: login: deverickapollo
Created: 2025-05-23T02:38:54Z | Merged: 2025-05-25T11:00:08Z

Code Coverage Reports for unit and integration tests + reports sent to Codacy



Diff:
diff --git a/.github/workflows/codacy.yml b/.github/workflows/codacy.yml
new file mode 100644
index 00000000..2e56f433
--- /dev/null
+++ b/.github/workflows/codacy.yml
@@ -0,0 +1,26 @@
+name: Codacy Coverage Reporter
+
+on:
+  workflow_run:
+    workflows:
+      - Build and Test
+    types:
+      - completed
+
+permissions:
+  contents: read
+
+jobs:
+  report-coverage:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Download coverage report
+        uses: actions/download-artifact@v4
+        with:
+          name: coverage-report
+          path: ./coverage
+      - name: Run codacy-coverage-reporter
+        uses: codacy/codacy-coverage-reporter-action@v1.3.0
+        with:
+          project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
+          coverage-reports: ./coverage/coverage.cobertura.xml
\ No newline at end of file
diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 00987d74..3b50f57b 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -41,11 +41,17 @@ jobs:
       run: dotnet build --no-restore
 
     - name: Run unit tests
-      run: dotnet test BTCPayServer.Plugins.Monero.UnitTests --verbosity normal
+      run: dotnet test BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=json /p:CoverletOutput=../coverage/coverage.json 
 
     - name: Run integration tests
       run: docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml run tests
 
     - name: Cleanup Docker containers
       if: always()
-      run: docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml down -v
\ No newline at end of file
+      run: docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml down -v
+
+    - name: Upload coverage report
+      uses: actions/upload-artifact@v4
+      with:
+        name: coverage-report
+        path: coverage/coverage.cobertura.xml
\ No newline at end of file
diff --git a/BTCPayServer.Plugins.IntegrationTests/BTCPayServer.Plugins.IntegrationTests.csproj b/BTCPayServer.Plugins.IntegrationTests/BTCPayServer.Plugins.IntegrationTests.csproj
index 6a35ecb5..288d75bc 100644
--- a/BTCPayServer.Plugins.IntegrationTests/BTCPayServer.Plugins.IntegrationTests.csproj
+++ b/BTCPayServer.Plugins.IntegrationTests/BTCPayServer.Plugins.IntegrationTests.csproj
@@ -16,6 +16,14 @@
             <PrivateAssets>all</PrivateAssets>
             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
         </PackageReference>
+        <PackageReference Include="coverlet.collector" Version="6.0.4">
+          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+          <PrivateAssets>all</PrivateAssets>
+        </PackageReference>
+        <PackageReference Include="coverlet.msbuild" Version="6.0.4">
+            <PrivateAssets>all</PrivateAssets>
+            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+        </PackageReference>
     </ItemGroup>
 
     <ItemGroup>
diff --git a/BTCPayServer.Plugins.IntegrationTests/docker-compose.yml b/BTCPayServer.Plugins.IntegrationTests/docker-compose.yml
index 4fa17f49..da87f8d3 100644
--- a/BTCPayServer.Plugins.IntegrationTests/docker-compose.yml
+++ b/BTCPayServer.Plugins.IntegrationTests/docker-compose.yml
@@ -19,6 +19,8 @@ services:
       - xmr_wallet
     extra_hosts:
       - "tests:127.0.0.1"
+    volumes:
+      - ../coverage:/coverage
 
   # The dev container is not used, it is just handy to run `docker-compose up dev` to start all services
   dev:
diff --git a/BTCPayServer.Plugins.IntegrationTests/docker-entrypoint.sh b/BTCPayServer.Plugins.IntegrationTests/docker-entrypoint.sh
index 2547c2b4..72b3db13 100755
--- a/BTCPayServer.Plugins.IntegrationTests/docker-entrypoint.sh
+++ b/BTCPayServer.Plugins.IntegrationTests/docker-entrypoint.sh
@@ -6,4 +6,4 @@ if [ ! -z "$TEST_FILTERS" ]; then
 FILTERS="--filter $TEST_FILTERS"
 fi
 
-dotnet test -c ${CONFIGURATION_NAME} $FILTERS --no-build -v n --logger "console;verbosity=normal" < /dev/null
+dotnet test -c ${CONFIGURATION_NAME} $FILTERS --no-build -v n --logger "console;verbosity=normal" /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=/coverage/coverage.cobertura.xml /p:MergeWith=/coverage/coverage.json< /dev/null
\ No newline at end of file
diff --git a/BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj b/BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj
index cac904c0..602a640c 100644
--- a/BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj
+++ b/BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj
@@ -6,9 +6,19 @@
         <Nullable>enable</Nullable>
         <IsPackable>false</IsPackable>
         <AssemblyName>BTCPayServer.Plugins.Monero.UnitTests</AssemblyName>
+        <CoverletOutput>$(MSBuildProjectDirectory)/coverage/</CoverletOutput>
+        <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
     </PropertyGroup>
 
     <ItemGroup>
+        <PackageReference Include="coverlet.collector" Version="6.0.4">
+          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+          <PrivateAssets>all</PrivateAssets>
+        </PackageReference>
+        <PackageReference Include="coverlet.msbuild" Version="6.0.4">
+            <PrivateAssets>all</PrivateAssets>
+            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+        </PackageReference>
         <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
         <PackageReference Include="Moq" Version="4.20.72" />
         <PackageReference Include="xunit" Version="2.9.3" />
@@ -23,10 +33,6 @@
         <ProjectReference Include="..\btcpayserver\BTCPayServer.Abstractions\BTCPayServer.Abstractions.csproj" />
     </ItemGroup>
 
-    <PropertyGroup>
-        <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
-    </PropertyGroup>
-
     <!-- This will make sure that referencing BTCPayServer doesn't put any artifact in the published directory -->
     <ItemDefinitionGroup>
         <ProjectReference>
diff --git a/README.md b/README.md
index 1b8d3096..2f1479d8 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
 <div align="center">
   
   ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/btcpay-monero/btcpayserver-monero-plugin/dotnet.yml?branch=master)
+  [![Codacy Badge](https://app.codacy.com/project/badge/Grade/a86461725075418b95ae501256839500)](https://app.codacy.com/gh/btcpay-monero/btcpayserver-monero-plugin/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
+  [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/a86461725075418b95ae501256839500)](https://app.codacy.com/gh/btcpay-monero/btcpayserver-monero-plugin/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
   [![Matrix rooms](https://img.shields.io/badge/%F0%9F%92%AC%20Matrix-%23btcpay--monero-blue)](https://matrix.to/#/#btcpay-monero:matrix.org)
 </div>
 
@@ -38,7 +40,20 @@ To build and run unit tests, run the following commands:
 dotnet build btcpay-monero-plugin.sln
 dotnet test BTCPayServer.Plugins.Monero.UnitTests --verbosity normal
 ```
-This will build the plugin and run the unit tests.
+To run unit tests with coverage, run the following command:
+
+```bash
+dotnet test BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=json /p:CoverletOutput=../coverage/coverage.json 
+```
+
+To build and run integration tests, run the following commands:
+
+```bash
+dotnet build btcpay-monero-plugin.sln
+docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml run tests
+```
+
+**BTCPAY_XMR_CASHCOW_WALLET_DAEMON_URI** | **Optional**. The URI of the [monero-wallet-rpc](https://getmonero.dev/interacting/monero-wallet-rpc.html) interface for the cashcow wallet. This is used to create a second wallet for testing purposes in regtest mode. | http://
 
 
 If you are a developer maintaining this plugin, in order to maintain this plugin, you need to clone this repository with `--recurse-submodules`:


Reviews:
user: login: napoly
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-23T04:52:35Z
user: login: napoly
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-23T04:57:25Z
user: login: napoly
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-23T07:25:27Z
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-23T22:32:09Z
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-23T22:34:13Z
user: login: napoly
body: ..approving as the overall functionality is there..
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-25T07:55:29Z
user: login: plowsof
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-25T22:54:28Z
user: login: plowsof
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-25T22:58:32Z

Review comments:
diff_hunk: @@ -41,11 +41,17 @@ jobs:
       run: dotnet build --no-restore
 
     - name: Run unit tests
-      run: dotnet test BTCPayServer.Plugins.Monero.UnitTests --verbosity normal
+      run: dotnet test BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=coverage/coverage.cobertura.xml
 
     - name: Run integration tests
       run: docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml run tests
 
     - name: Cleanup Docker containers
       if: always()
-      run: docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml down -v
\ No newline at end of file
+      run: docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml down -v
+
+    - name: Upload integration test coverage
path: .github/workflows/dotnet.yml
user: login: napoly
body: you should upload this artifact to Codacy i believe.. most probably with https://github.com/codacy/codacy-coverage-reporter-action.. in a separated workflow.. conditioned to this repo.. check [haveno codacy](https://github.com/haveno-dex/haveno/blob/master/.github/workflows/codacy-code-reporter.yml) or [bisq codacy](https://github.com/bisq-network/bisq/blob/master/.github/workflows/codacy-coverage-reporter.yml)
created_at: 2025-05-23T04:52:35Z
author_association: MEMBER
diff_hunk: @@ -41,11 +41,17 @@ jobs:
       run: dotnet build --no-restore
 
     - name: Run unit tests
-      run: dotnet test BTCPayServer.Plugins.Monero.UnitTests --verbosity normal
+      run: dotnet test BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=coverage/coverage.cobertura.xml
 
     - name: Run integration tests
       run: docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml run tests
 
     - name: Cleanup Docker containers
       if: always()
-      run: docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml down -v
\ No newline at end of file
+      run: docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml down -v
+
+    - name: Upload integration test coverage
path: .github/workflows/dotnet.yml
user: login: napoly
body: ah.. sorry.. commenting outdated parts here lol.. still.. u should condition so if someone fork it wont fail.. maybe a separated workflow ?
created_at: 2025-05-23T04:57:25Z
author_association: MEMBER
diff_hunk: @@ -1,6 +1,7 @@
 <div align="center">
   
   ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/btcpay-monero/btcpayserver-monero-plugin/dotnet.yml?branch=master)
+  [![Codacy Badge](https://app.codacy.com/project/badge/Grade/a86461725075418b95ae501256839500)](https://app.codacy.com/gh/btcpay-monero/btcpayserver-monero-plugin/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
path: README.md
user: login: napoly
body: there should be two badges.. one for code quality.. the other one for code coverage 
created_at: 2025-05-23T07:25:26Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,23 @@
+name: Codacy Coverage Reporter
+
+on:
+  workflow_run:
+    workflows:
+      - Build and Test
+    types:
+      - completed
+
+jobs:
+  report-coverage:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Download coverage report
+        uses: actions/download-artifact@v3
+        with:
+          name: coverage-report
+          path: ./coverage
+      - name: Run codacy-coverage-reporter
+        uses: codacy/codacy-coverage-reporter-action@v1.3.0
+        with:
+          project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
+          coverage-reports: ./coverage/coverage.cobertura.xml
path: .github/workflows/codacy.yml
user: login: github-advanced-security[bot]
body: ## Workflow does not contain permissions

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {{}}

[Show more details](https://github.com/btcpay-monero/btcpayserver-monero-plugin/security/code-scanning/5)
created_at: 2025-05-23T22:32:09Z
author_association: NONE
diff_hunk: @@ -0,0 +1,23 @@
+name: Codacy Coverage Reporter
+
+on:
+  workflow_run:
+    workflows:
+      - Build and Test
+    types:
+      - completed
+
+jobs:
+  report-coverage:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Download coverage report
+        uses: actions/download-artifact@v4
+        with:
+          name: coverage-report
+          path: ./coverage
+      - name: Run codacy-coverage-reporter
+        uses: codacy/codacy-coverage-reporter-action@v1.3.0
+        with:
+          project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
+          coverage-reports: ./coverage/coverage.cobertura.xml
path: .github/workflows/codacy.yml
user: login: github-advanced-security[bot]
body: ## Workflow does not contain permissions

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {{}}

[Show more details](https://github.com/btcpay-monero/btcpayserver-monero-plugin/security/code-scanning/6)
created_at: 2025-05-23T22:34:13Z
author_association: NONE
diff_hunk: @@ -38,7 +40,19 @@ To build and run unit tests, run the following commands:
 dotnet build btcpay-monero-plugin.sln
 dotnet test BTCPayServer.Plugins.Monero.UnitTests --verbosity normal
 ```
-This will build the plugin and run the unit tests.
+To run unit tests with coverage, run the following command:
path: README.md
user: login: napoly
body: these commands can be read from workflows files.. i mean how to show code coverage in IDE.. so it looks like: 
![code_cov_ide](https://github.com/user-attachments/assets/21b274f4-82e8-479d-8e9e-988436e31a85)

created_at: 2025-05-24T06:04:35Z
author_association: MEMBER
diff_hunk: @@ -38,7 +40,20 @@ To build and run unit tests, run the following commands:
 dotnet build btcpay-monero-plugin.sln
 dotnet test BTCPayServer.Plugins.Monero.UnitTests --verbosity normal
 ```
-This will build the plugin and run the unit tests.
+To run unit tests with coverage, run the following command:
+
+```bash
+dotnet test BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=json /p:CoverletOutput=../coverage/coverage.json 
+```
+
+To build and run integration tests, run the following commands:
+
+```bash
+dotnet build btcpay-monero-plugin.sln
+docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml run tests
+```
+
+**BTCPAY_XMR_CASHCOW_WALLET_DAEMON_URI** | **Optional**. The URI of the [monero-wallet-rpc](https://getmonero.dev/interacting/monero-wallet-rpc.html) interface for the cashcow wallet. This is used to create a second wallet for testing purposes in regtest mode. | http://
path: README.md
user: login: napoly
body: http:// ?
created_at: 2025-05-25T07:47:16Z
author_association: MEMBER
diff_hunk: @@ -6,4 +6,4 @@ if [ ! -z "$TEST_FILTERS" ]; then
 FILTERS="--filter $TEST_FILTERS"
 fi
 
-dotnet test -c ${CONFIGURATION_NAME} $FILTERS --no-build -v n --logger "console;verbosity=normal" < /dev/null
+dotnet test -c ${CONFIGURATION_NAME} $FILTERS --no-build -v n --logger "console;verbosity=normal" /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=/coverage/coverage.cobertura.xml /p:MergeWith=/coverage/coverage.json< /dev/null
path: BTCPayServer.Plugins.IntegrationTests/docker-entrypoint.sh
user: login: napoly
body: ```suggestion
dotnet test -c ${CONFIGURATION_NAME} $FILTERS --no-build -v n --logger "console;verbosity=normal" /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=/coverage/coverage.cobertura.xml /p:MergeWith=/coverage/coverage.json < /dev/null
```
created_at: 2025-05-25T07:48:41Z
author_association: MEMBER
diff_hunk: @@ -38,7 +40,20 @@ To build and run unit tests, run the following commands:
 dotnet build btcpay-monero-plugin.sln
 dotnet test BTCPayServer.Plugins.Monero.UnitTests --verbosity normal
 ```
-This will build the plugin and run the unit tests.
+To run unit tests with coverage, run the following command:
+
+```bash
+dotnet test BTCPayServer.Plugins.Monero.UnitTests/BTCPayServer.Plugins.UnitTests.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=json /p:CoverletOutput=../coverage/coverage.json 
+```
+
+To build and run integration tests, run the following commands:
+
+```bash
+dotnet build btcpay-monero-plugin.sln
+docker compose -f BTCPayServer.Plugins.IntegrationTests/docker-compose.yml run tests
+```
+
+**BTCPAY_XMR_CASHCOW_WALLET_DAEMON_URI** | **Optional**. The URI of the [monero-wallet-rpc](https://getmonero.dev/interacting/monero-wallet-rpc.html) interface for the cashcow wallet. This is used to create a second wallet for testing purposes in regtest mode. | http://
path: README.md
user: login: plowsof
body: https://docs.getmonero.org/ 
created_at: 2025-05-25T22:54:28Z
author_association: NONE
diff_hunk: @@ -6,4 +6,4 @@ if [ ! -z "$TEST_FILTERS" ]; then
 FILTERS="--filter $TEST_FILTERS"
 fi
 
-dotnet test -c ${CONFIGURATION_NAME} $FILTERS --no-build -v n --logger "console;verbosity=normal" < /dev/null
+dotnet test -c ${CONFIGURATION_NAME} $FILTERS --no-build -v n --logger "console;verbosity=normal" /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=/coverage/coverage.cobertura.xml /p:MergeWith=/coverage/coverage.json< /dev/null
path: BTCPayServer.Plugins.IntegrationTests/docker-entrypoint.sh
user: login: plowsof
body: is the space important? the PR was merged 
created_at: 2025-05-25T22:58:32Z
author_association: NONE

PR comments:
user: login: codacy-production[bot]
created_at: 2025-05-23T02:38:57Z
body: ## Coverage summary from Codacy
### [See diff coverage on Codacy](https://app.codacy.com/gh/btcpay-monero/btcpayserver-monero-plugin/pull-requests/16/coverage?utm_source=github.com&utm_medium=coverageSummary&utm_campaign=coverageSummaryPullRequest)

 | Coverage variation | Diff coverage | 
 | ------------- | ------------- |
 | Report missing for 354ab1954b9e092c7169622161a8868639f7c178[^1] | :white_check_mark: **∅** |

<details>
<summary>Coverage variation details</summary>

| | Coverable lines | Covered lines | Coverage |
| ------------- | ------------- | ------------- | ------------- |
| Common ancestor commit (354ab1954b9e092c7169622161a8868639f7c178) | Report Missing | Report Missing | Report Missing | |
| Head commit (0b8b9f236796181e6058286edcb2f63a09f47b3b) | 133096 | 10264 | 7.71% |

**Coverage variation** is the difference between the coverage for the head and common ancestor commits of the pull request branch: `<coverage of head commit> - <coverage of common ancestor commit>`
</details>

<details>
<summary>Diff coverage details</summary>

| | Coverable lines | Covered lines | Diff coverage |
| ------------- | ------------- | ------------- | ------------- |
| Pull request (#16) | 0 | 0 | **∅ (not applicable)** |

**Diff coverage** is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: `<covered lines added or modified>/<coverable lines added or modified> * 100%`
</details>

#### [See your quality gate settings](https://app.codacy.com/gh/btcpay-monero/btcpayserver-monero-plugin/settings/quality?utm_source=github.com&utm_medium=coverageSummary&utm_campaign=coverageSummaryGates)&nbsp;&nbsp;&nbsp;&nbsp;[Change summary preferences](https://app.codacy.com/gh/btcpay-monero/btcpayserver-monero-plugin/settings/integrations?utm_source=github.com&utm_medium=coverageSummary&utm_campaign=coverageSummarySettings)
[^1]: Codacy didn't receive coverage data for the commit, or there was an error processing the received data. [Check your integration for errors](https://app.codacy.com/gh/btcpay-monero/btcpayserver-monero-plugin/settings/coverage?utm_source=github.com&utm_medium=coverageSummary&utm_campaign=coverageSummarySetup) and [validate that your coverage setup is correct](https://docs.codacy.com/coverage-reporter/#validating-coverage?utm_source=github.com&utm_medium=coverageSummary&utm_campaign=coverageSummaryTroubleshoot).
<!-- 108f945d-e553-4918-8ccf-027c6d4acc2c -->
author_association: NONE
user: login: napoly
created_at: 2025-05-23T05:06:15Z
body: pls add to readme how to show code coverage in IDEs.. 
author_association: MEMBER