diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index f5ca6bb34..72db1f8f7 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -6,20 +6,58 @@ on:
branches: [main, master]
jobs:
- R-CMD-check:
+ r-tests:
runs-on: ubuntu-latest
+ name: R coverage tests
+ env:
+ TEST_SUITE: R_coverage
+ GITHUB_PAT: ${{ secrets.PAT_GITHUB }}
+ GH_ACTION: "ENABLED"
+ steps:
+ - uses: actions/checkout@v3
+ - name: install and update texlive
+ run: /usr/bin/sudo DEBIAN_FRONTEND=noninteractive apt update -y -qq
+ - run: /usr/bin/sudo DEBIAN_FRONTEND=noninteractive apt install tidy texlive texlive-fonts-extra -y
+ - uses: r-lib/actions/setup-r@v2
+ - uses: r-lib/actions/setup-r-dependencies@v2
+
+ - name: install package
+ run: R CMD INSTALL .
- strategy:
- fail-fast: false
- matrix:
- test-suite: [ R_coverage, JS_coverage, CRAN ]
+ - name: git config user.name
+ run: git config --global user.name "GitHub Actions"
+
+ - name: git config user.email
+ run: git config --global user.email toby.hocking@r-project.org
- name: ${{ matrix.test-suite }}
- env:
- TEST_SUITE: ${{ matrix.test-suite }}
+ - name: Run R tests and generate coverage
+ run: |
+ Rscript -e "if (!requireNamespace('covr', quietly=TRUE)) install.packages('covr'); cov <- covr::package_coverage(type='tests', test_files = "tests/testthat.R"); covr::to_cobertura(cov, file='r-coverage.xml')"
+
+ - name: Normalize R coverage paths
+ run: |
+ if [ -f "r-coverage.xml" ]; then
+ Rscript -e "
+ content <- paste(readLines('r-coverage.xml', warn = FALSE), collapse='\n')
+ content <- gsub('.*?', '.', content)
+ content <- gsub('\\\\\\\\', '/', content)
+ writeLines(content, 'r-coverage.xml')
+ "
+ fi
+
+ - name: Upload R coverage artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: r-coverage
+ path: r-coverage.xml
+
+ js-tests:
+ runs-on: ubuntu-latest
+ name: JS coverage tests
+ env:
+ TEST_SUITE: JS_coverage
GITHUB_PAT: ${{ secrets.PAT_GITHUB }}
GH_ACTION: "ENABLED"
- CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
steps:
- uses: actions/checkout@v3
- name: install and update texlive
@@ -38,48 +76,84 @@ jobs:
run: git config --global user.email toby.hocking@r-project.org
- name: Setup Node.js
- if: matrix.test-suite == 'JS_coverage'
uses: actions/setup-node@v3
with:
node-version: '18'
-
- name: Install Node.js dependencies
- if: matrix.test-suite == 'JS_coverage'
- run: |
- npm install v8-to-istanbul
- echo "Node modules installed"
-
- - name: run tests
+ run: npm install v8-to-istanbul
+
+ - name: Run JS tests and convert coverage
run: |
- if [ "$TEST_SUITE" == "CRAN" ]; then
- bash build.sh
- elif [ "$TEST_SUITE" == "JS_coverage" ]; then
- echo "Running testthat with JS coverage collection..."
- Rscript -e "source('tests/testthat.R', chdir = TRUE)"
- else
- echo "Running testthat with R coverage collection..."
- Rscript -e 'covr::codecov(quiet = FALSE, type = "tests", test_files = "tests/testthat.R", flags = "r")'
- fi
+ Rscript -e "source('tests/testthat.R', chdir = TRUE)"
- name: Convert JS coverage to Istanbul format
- if: matrix.test-suite == 'JS_coverage'
run: |
if [ -f "tests/testthat/js-coverage.json" ]; then
- echo "Converting JS coverage to LCOV format..."
+ echo "Converting JS coverage to Istanbul format..."
node v8-to-istanbul.js
else
echo "No JS coverage file found"
exit 1
fi
- - name: Upload JS coverage to Codecov
- if: matrix.test-suite == 'JS_coverage'
+ - name: Upload JS coverage artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: js-coverage
+ path: coverage-istanbul.json
+
+ CRAN:
+ runs-on: ubuntu-latest
+ name: CRAN checks
+ env:
+ TEST_SUITE: CRAN
+ GITHUB_PAT: ${{ secrets.PAT_GITHUB }}
+ GH_ACTION: "ENABLED"
+ steps:
+ - uses: actions/checkout@v3
+ - name: install and update texlive
+ run: /usr/bin/sudo DEBIAN_FRONTEND=noninteractive apt update -y -qq
+ - run: /usr/bin/sudo DEBIAN_FRONTEND=noninteractive apt install tidy texlive texlive-fonts-extra -y
+ - uses: r-lib/actions/setup-r@v2
+ - uses: r-lib/actions/setup-r-dependencies@v2
+
+ - name: install package
+ run: R CMD INSTALL .
+
+ - name: git config user.name
+ run: git config --global user.name "GitHub Actions"
+
+ - name: git config user.email
+ run: git config --global user.email toby.hocking@r-project.org
+
+ - name: run CRAN build
+ run: bash build.sh
+
+ upload-coverage:
+ runs-on: ubuntu-latest
+ name: Upload combined coverage to Codecov
+ needs: [r-tests, js-tests]
+ if: always()
+ env:
+ CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
+ steps:
+ - name: Checkout repository (needed so Codecov can find source files)
+ uses: actions/checkout@v3
+
+ - name: Download R coverage artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: r-coverage
+ path: ./
+
+ - name: Download JS coverage artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: js-coverage
+ path: ./
+
+ - name: Upload to Codecov
run: |
- if [ -f "coverage-istanbul.json" ]; then
- curl -Os https://uploader.codecov.io/latest/linux/codecov
- chmod +x codecov
- ./codecov -f coverage-istanbul.json -t ${{ secrets.CODECOV_TOKEN }} --flags javascript
- else
- echo "No coverage file found"
- exit 1
- fi
+ curl -Os https://uploader.codecov.io/latest/linux/codecov
+ chmod +x codecov
+ ./codecov -f "r-coverage.xml" -f "coverage-istanbul.json" -t $CODECOV_TOKEN
\ No newline at end of file
diff --git a/NEWS.md b/NEWS.md
index f1082b8f0..c51635987 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,7 @@
+# Changes in version 2025.10.31 (PR#260)
+
+- Ensures R and JS coverage reports are uploaded together to prevent partial coverage data
+- Upload only occurs when both test suites pass, avoiding skewed coverage comparisons
# Changes in version 2025.10.31 (PR#271)
- `geom_point()` now warns when shape parameter is set to a value other than 21, since animint2 web rendering only supports shape=21 for proper display of both color and fill aesthetics.