From 03c231cd44b60f218dd61c2f8a1abf8713d3503d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Feb 2024 15:58:08 +0000 Subject: [PATCH 01/98] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index c4c40bfad..228cb8451 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 702ea3f9c..fc4dbea8b 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 60aa6a657..cb30adf37 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index fc412205d..452c69dab 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 8325ec636..01a850083 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 1f7f2d191..df8c9d47d 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index d1ff5da07..72c70de2e 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 57a108fdd..d1448fa23 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 5d071335e..d3e7ef42e 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index ca52ac951..43d67eb68 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index b6f3d7e29..c4ddb4757 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 9620878ad..964ccbdcf 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 8f32c5a10..08bd036b0 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index e3ec1f53d..77307bf7c 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index e37ac6627..cd49d7c38 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 3b23f5f98..941a00e36 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index e5537f520..623bef999 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4187--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 522da1480..9bdf0c7a5 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4187-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4194-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 688aad2f0a9d4b39b69d44de5e7d0b5834966702 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 19 Feb 2024 23:14:30 +0200 Subject: [PATCH 02/98] Simplification of the release process. --- .github/scripts/get_project_build_version.sh | 2 -- .github/scripts/get_project_version.sh | 13 +++-------- .../set_release_version_numbers_env.sh | 9 ++++++++ .github/scripts/set_version_numbers_env.sh | 12 ++++------ .github/scripts/update_project_version.sh | 1 + .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- BUILD_NO | 1 + development/releasing.md | 23 ++++++++----------- 9 files changed, 31 insertions(+), 34 deletions(-) delete mode 100755 .github/scripts/get_project_build_version.sh create mode 100755 .github/scripts/set_release_version_numbers_env.sh create mode 100644 BUILD_NO diff --git a/.github/scripts/get_project_build_version.sh b/.github/scripts/get_project_build_version.sh deleted file mode 100755 index 838523b05..000000000 --- a/.github/scripts/get_project_build_version.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -echo `sed -E "s/(v?[0-9]+\.)([0-9]+\.)([0-9]+)(-.*)?/\1\2\3\.${UTPLSQL_BUILD_NO}\4/" <<< "${UTPLSQL_VERSION}"` diff --git a/.github/scripts/get_project_version.sh b/.github/scripts/get_project_version.sh index 60fc0a796..54a30a562 100755 --- a/.github/scripts/get_project_version.sh +++ b/.github/scripts/get_project_version.sh @@ -1,14 +1,7 @@ #!/usr/bin/env bash - -#When building a new version from a release branch, the version is taken from release branch name -if [[ "${CI_ACTION_REF_NAME}" =~ ^release/v[0-9]+\.[0-9]+\.[0-9]+.*$ ]]; then - version=${CI_ACTION_REF_NAME#release\/} -else - #Otherwise, version is taken from the VERSION file - version=`cat VERSION` - #When on develop branch, add "-develop" to the version text - if [[ "${CI_ACTION_REF_NAME}" == "develop" ]]; then +version=`cat VERSION` +#When on develop branch, add "-develop" to the version text +if [[ "${CI_ACTION_REF_NAME}" == "develop" ]]; then version=`sed -E "s/(v?[0-9]+\.[0-9]+\.[0-9]+).*/\1-develop/" <<< "${version}"` - fi fi echo ${version} diff --git a/.github/scripts/set_release_version_numbers_env.sh b/.github/scripts/set_release_version_numbers_env.sh new file mode 100755 index 000000000..a43843508 --- /dev/null +++ b/.github/scripts/set_release_version_numbers_env.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +build_no=$(cat BUILD_NO) +version=${CI_ACTION_REF_NAME} + +echo "UTPLSQL_BUILD_NO=${build_no}" >> $GITHUB_ENV +echo "UTPLSQL_VERSION=${version}" >> $GITHUB_ENV +echo UTPLSQL_BUILD_VERSION=$(echo ${version} | sed -E "s/(v?[0-9]+\.)([0-9]+\.)([0-9]+)(-.*)?/\1\2\3\.${build_no}\4/") >> $GITHUB_ENV + diff --git a/.github/scripts/set_version_numbers_env.sh b/.github/scripts/set_version_numbers_env.sh index 10529a1bf..c61639bf9 100755 --- a/.github/scripts/set_version_numbers_env.sh +++ b/.github/scripts/set_version_numbers_env.sh @@ -1,10 +1,8 @@ #!/bin/bash -UTPLSQL_BUILD_NO=$( expr ${GITHUB_RUN_NUMBER} + ${UTPLSQL_BUILD_NO_OFFSET} ) -UTPLSQL_VERSION=$(.github/scripts/get_project_version.sh) +build_no=$( expr ${GITHUB_RUN_NUMBER} + ${UTPLSQL_BUILD_NO_OFFSET} ) +version=$(.github/scripts/get_project_version.sh) -echo "UTPLSQL_BUILD_NO=${UTPLSQL_BUILD_NO}" >> $GITHUB_ENV -echo "UTPLSQL_VERSION=${UTPLSQL_VERSION}" >> $GITHUB_ENV -echo UTPLSQL_BUILD_VERSION=$(echo ${UTPLSQL_VERSION} | sed -E "s/(v?[0-9]+\.)([0-9]+\.)([0-9]+)(-.*)?/\1\2\3\.${UTPLSQL_BUILD_NO}\4/") >> $GITHUB_ENV - -echo "CURRENT_BRANCH=${CI_ACTION_REF_NAME}" >> $GITHUB_ENV +echo "UTPLSQL_BUILD_NO=${build_no}" >> $GITHUB_ENV +echo "UTPLSQL_VERSION=${version}" >> $GITHUB_ENV +echo UTPLSQL_BUILD_VERSION=$(echo ${version} | sed -E "s/(v?[0-9]+\.)([0-9]+\.)([0-9]+)(-.*)?/\1\2\3\.${build_no}\4/") >> $GITHUB_ENV diff --git a/.github/scripts/update_project_version.sh b/.github/scripts/update_project_version.sh index 586cb5b64..66e45125a 100755 --- a/.github/scripts/update_project_version.sh +++ b/.github/scripts/update_project_version.sh @@ -16,4 +16,5 @@ sed -i -r "s/(sonar\.projectVersion=).*?/\1${UTPLSQL_VERSION}/" sonar-project.pr echo Update VERSION file echo ${UTPLSQL_VERSION} > VERSION +echo ${UTPLSQL_BUILD_NO} > BUILD_NO diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c2fe3971e..668f1e5a4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -245,7 +245,7 @@ jobs: - name: Push version update to repository id: push-version-number-update run: | - git add sonar-project.properties VERSION source/* docs/* + git add sonar-project.properties VERSION BUILD_NO source/* docs/* git commit -m 'Updated project version after build [skip ci]' git push --quiet origin HEAD:${CI_ACTION_REF_NAME} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a748d1cbd..0e29bd5c1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: - uses: FranzDiebold/github-env-vars-action@v2 #https://github.com/marketplace/actions/github-environment-variables-action - name: Set build version number env variables - run: .github/scripts/set_version_numbers_env.sh + run: .github/scripts/set_release_version_numbers_env.sh - name: Update project version & build number in source code and documentation run: .github/scripts/update_project_version.sh diff --git a/BUILD_NO b/BUILD_NO new file mode 100644 index 000000000..9ae5f9c77 --- /dev/null +++ b/BUILD_NO @@ -0,0 +1 @@ +4194 \ No newline at end of file diff --git a/development/releasing.md b/development/releasing.md index 2b9be317a..c1e49184d 100644 --- a/development/releasing.md +++ b/development/releasing.md @@ -3,28 +3,25 @@ To create a release follow the below steps ## Release preparation - - Create a **draft** of a Release with version number `vX.Y.X` sourced from the `main` branch using [github releases page](https://github.com/utPLSQL/utPLSQL/releases) and populate release description using information found on the issues and pull requests **since previous release**. - To find issues closed after certain date use [advanced filters](https://help.github.com/articles/searching-issues-and-pull-requests/#search-by-open-or-closed-state). - Example: [`is:issue closed:>2018-07-22`](https://github.com/utPLSQL/utPLSQL/issues?utf8=%E2%9C%93&q=is%3Aissue+closed%3A%3E2018-07-22+) + - Create a **draft** of a Release with a new tag number `vX.Y.X` sourced from the `develop` branch on [github releases page](https://github.com/utPLSQL/utPLSQL/releases) + - Populate release description using the `Generate release notes` button + - Review the auto-generated release notes and update tem if needed + - Split the default `## What's Changed` list into `## New features`, `## Enhancements`, `## Bug fixes`. See previous release notes for details ## Performing a release - - create the release branch from `develop` branch and make sure to name the release branch: `release/vX.Y.Z` - - update, commit and push at least one file change in the release branch, to kick off a build on [GithubActions](https://github.com/utPLSQL/utPLSQL/actions) or kick-off a build manually for that branch after it was created on github. - - wait for the build to complete successfully as it will update the version to be release number (without develop) - - merge the release branch to `main` branch and publish [the previously prepared](#release-preparation) release draft. + - Publish [the previously prepared](#release-preparation) release draft. - Wait for the [Github Actions `Release`](https://github.com/utPLSQL/utPLSQL/actions/workflows/release.yml) process to complete successfully. The process will upload release artifacts (`zip` and `tar.gz` files along with `md5`) - - After Release build was completed successfully, merge the `main` branch back into `develop` branch. At this point, main branch and release tag should be at the same commit version and artifacts should be uploaded into Github release. - - After develop branch was built, increase the version number in `VERSION` file to represent next planned release version. + - After Release build was completed successfully, merge the `develop` branch into `main` branch. At this point, main branch and release tag should be at the same commit version and artifacts should be uploaded into Github release. + - Increase the version number in the `VERSION` file on `develop` branch to open start next release version. - Clone `utplsql.githug.io` project and: - Add a new announcement about next version being released in `docs/_posts`. Use previous announcements as a template. Make sure to set date, time and post title properly. - Add the post to list in `mkdocs.yml` file in root directory of that repository. - Add the link to the post at the beginning of the `docs/index.md` file. + - Send the announcement on Twitter(X) accoiunt abut utPLSQL release. The following will happen: - - build executed on branch `release/vX.Y.Z-[something]` updates files `sonar-project.properties`, `VERSION` with project version derived from the release branch name - - changes to those two files are committed and pushed back to release branch - - when a Github release is published, a new tag is added in on the repository and a release build is executed - - With Release build, the documentation for new release is published on `utplsql.github.io` and installation archives are added to the release. + - When a Github release is published, a new tag is added in on the repository and a release build is executed + - With Release action, the documentation for new release is published on `utplsql.github.io` and installation archives are added to the release. # Note: The utPLSQL installation files are uploaded by the release build process as release artifacts (separate `zip` and `tar.gz` files). From fc9382e27515762ca5a4cbfa747d54de47e2675c Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 19 Feb 2024 23:24:21 +0200 Subject: [PATCH 03/98] Fixed a flaky test when test runs in 0 seconds. --- test/ut3_user/api/test_ut_run.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index e80235744..f0cfd8373 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -742,7 +742,7 @@ Failures:% procedure remove_time_from_results(a_results in out nocopy ut3_develop.ut_varchar2_list) is begin for i in 1 .. a_results.count loop - a_results(i) := regexp_replace(a_results(i),'\[[0-9]*[\.,][0-9]+ sec\]',''); + a_results(i) := regexp_replace(a_results(i),'\[[0-9]*[\.,]?[0-9]+ sec\]',''); a_results(i) := regexp_replace(a_results(i),'Finished in [0-9]*[\.,][0-9]+ seconds',''); end loop; end; From 072dfbc1d0ed37f8da9c0ff87823906483ea3887 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Feb 2024 21:41:43 +0000 Subject: [PATCH 04/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 9ae5f9c77..26de2ed80 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4194 \ No newline at end of file +4197 diff --git a/docs/about/authors.md b/docs/about/authors.md index 228cb8451..203d450d1 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index fc4dbea8b..28aea5fed 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index cb30adf37..8e6730847 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 452c69dab..0748fd479 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 01a850083..320784892 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index df8c9d47d..34b4eddcc 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 72c70de2e..b3602ef10 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index d1448fa23..379024e73 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index d3e7ef42e..24855cbb5 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 43d67eb68..e2a8bc7da 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index c4ddb4757..472c9654e 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 964ccbdcf..9c4d8813a 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 08bd036b0..c322639df 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 77307bf7c..463bcef97 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index cd49d7c38..41468a3a5 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 941a00e36..502bd49bd 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 623bef999..cb49a0424 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4194--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 9bdf0c7a5..463aa1604 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4194-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4197-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 614a0e00bd0285c3a938de5cdf83a9c3aa547202 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 19 Feb 2024 23:47:32 +0200 Subject: [PATCH 05/98] Remove deprecated github actions and update releasing documentation. --- .github/workflows/build.yml | 4 ++-- .github/workflows/release.yml | 2 +- development/releasing.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 668f1e5a4..3d2f9a0a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -88,7 +88,7 @@ jobs: --health-cmd healthcheck.sh steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: c-py/action-dotenv-to-setenv@v2 @@ -183,7 +183,7 @@ jobs: run: bash .github/scripts/validate_report_files.sh - name: Codecov - uses: codecov/codecov-action@v2 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos files: ./cobertura.xml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0e29bd5c1..1c4db5d59 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: c-py/action-dotenv-to-setenv@v2 diff --git a/development/releasing.md b/development/releasing.md index c1e49184d..ac2091632 100644 --- a/development/releasing.md +++ b/development/releasing.md @@ -6,7 +6,7 @@ To create a release follow the below steps - Create a **draft** of a Release with a new tag number `vX.Y.X` sourced from the `develop` branch on [github releases page](https://github.com/utPLSQL/utPLSQL/releases) - Populate release description using the `Generate release notes` button - Review the auto-generated release notes and update tem if needed - - Split the default `## What's Changed` list into `## New features`, `## Enhancements`, `## Bug fixes`. See previous release notes for details + - Optionally, split the default `## What's Changed` list into `## New features`, `## Enhancements`, `## Bug fixes`. See previous release notes for details ## Performing a release - Publish [the previously prepared](#release-preparation) release draft. From 5a42ce5ea71045b4cafa063ccc57781fa7ce09ae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Feb 2024 21:56:00 +0000 Subject: [PATCH 06/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 26de2ed80..8c8049510 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4197 +4198 diff --git a/docs/about/authors.md b/docs/about/authors.md index 203d450d1..541662a36 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 28aea5fed..f07bdd4b4 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 8e6730847..0cd02e09e 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 0748fd479..195b194e3 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 320784892..8f1cc584e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 34b4eddcc..4068e2d09 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index b3602ef10..57cb29685 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 379024e73..b016fdac0 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 24855cbb5..f48051ba5 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index e2a8bc7da..b580b7077 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 472c9654e..19e77835a 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 9c4d8813a..1cf1f9d2f 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index c322639df..4fdd04af6 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 463bcef97..2c6ae2d95 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 41468a3a5..8042fcd55 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 502bd49bd..7f8f6d620 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index cb49a0424..11410dd2b 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4197--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 463aa1604..36264fafc 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4197-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4198-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 42b923be7f4c46768c4f62eeb347b45590f11ad3 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Tue, 20 Feb 2024 00:39:24 +0200 Subject: [PATCH 07/98] Removed unneeded files from the release archives. --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitattributes b/.gitattributes index 5e0c801de..2cda5ad55 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,6 +6,8 @@ test export-ignore .gitignore export-ignore .gitmodules export-ignore mkdocs.yml export-ignore +BUILD_NO export-ignore +mkdocs_offline.yml export-ignore sonar-project.properties export-ignore ^docs/** linguist-documentation *.pkb linguist-language=PLSQL From 629e6116887b1921f956ff6dd449ed9b9b1e29da Mon Sep 17 00:00:00 2001 From: bozo030 Date: Tue, 21 May 2024 11:59:34 +0200 Subject: [PATCH 08/98] Matcher shortcut syntax example fixed --- docs/userguide/expectations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 19e77835a..ec24b570c 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -52,7 +52,7 @@ Shortcut syntax, where matcher is directly part of expectation: ut.expect( a_actual ).not_to_{matcher}; --example - ut.expect( 1 ).to_( be_null() ); + ut.expect( 1 ).to_be_null(); ``` When using shortcut syntax you don't need to surround matcher with brackets. Shortcut syntax is provided for convenience. From 3f4dc81ccaa2625b8da111e446105d6d51ef32de Mon Sep 17 00:00:00 2001 From: Samuel Nitsche Date: Tue, 17 Sep 2024 22:58:03 +0200 Subject: [PATCH 09/98] Update build.yml to use actions/upload-artifact@v4 as described in https://github.blog/news-insights/product-news/get-started-with-v4-of-github-actions-artifacts/ --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3d2f9a0a0..af2e4875d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,7 +172,7 @@ jobs: - name: Upload ORACLE_BASE/diag data Artifact id: upload if: ${{ always() && steps.run-tests.outcome == 'failure' }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: my-artifact$-${{matrix.db_version_name}} path: ${{github.workspace}}/database-diag From ca88e498e8e374776f76a5f63d136f2609c6c60c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 23 Oct 2024 00:30:02 +0300 Subject: [PATCH 10/98] Update test_realtime_reporter.pkb Fixing failing test for 23ai --- test/ut3_user/reporters/test_realtime_reporter.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ut3_user/reporters/test_realtime_reporter.pkb b/test/ut3_user/reporters/test_realtime_reporter.pkb index 2dafa71d0..84053c3c9 100644 --- a/test/ut3_user/reporters/test_realtime_reporter.pkb +++ b/test/ut3_user/reporters/test_realtime_reporter.pkb @@ -408,7 +408,7 @@ create or replace package body test_realtime_reporter as from table(g_events) t where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() = 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error'; - ut3_tester_helper.main_helper.append_to_list(l_expected_list, ''); l_expected := ut3_tester_helper.main_helper.table_to_clob(l_expected_list); From 5241c43e2b25d718a8ecc3e5c26820af852310ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Wed, 23 Oct 2024 00:38:54 +0300 Subject: [PATCH 11/98] Update test_documentation_reporter.pkb Fixed failing unit test --- test/ut3_user/reporters/test_documentation_reporter.pkb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/ut3_user/reporters/test_documentation_reporter.pkb b/test/ut3_user/reporters/test_documentation_reporter.pkb index 2a05679ff..016cec256 100644 --- a/test/ut3_user/reporters/test_documentation_reporter.pkb +++ b/test/ut3_user/reporters/test_documentation_reporter.pkb @@ -34,7 +34,6 @@ Failures: "Fails as values are different" Actual: 'number [1] ' (varchar2) was expected to equal: 'number [2] ' (varchar2)% at "UT3_USER.TEST_REPORTERS%", line 36 ut3_develop.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] '); -% % 2) erroring_test ORA-06502: PL/SQL: %: character to number conversion error From 1819ca766160a4b6c82090b7304512b68d08b063 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 22 Oct 2024 22:47:42 +0100 Subject: [PATCH 12/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 8c8049510..fab85b21d 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4198 +4206 diff --git a/docs/about/authors.md b/docs/about/authors.md index 541662a36..499398993 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index f07bdd4b4..03cc286eb 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 0cd02e09e..5579a943b 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 195b194e3..6d68864bd 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 8f1cc584e..b277c9d16 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 4068e2d09..45fca1871 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 57cb29685..31a91cac2 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index b016fdac0..6becefc5c 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index f48051ba5..c9015b438 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index b580b7077..824aaecd5 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index ec24b570c..54c204d58 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 1cf1f9d2f..1ff54a7d6 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 4fdd04af6..9d8167739 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 2c6ae2d95..24159fede 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 8042fcd55..9b1a7e75b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 7f8f6d620..375a05125 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 11410dd2b..6fdaa6a48 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4198--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 36264fafc..0e1e0a851 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4198-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4206-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 808fcdfc31c17dac2fedc41a440f55d7f7bd9bbe Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sat, 29 Mar 2025 16:43:12 +0000 Subject: [PATCH 13/98] Update documentation for customer reporter --- docs/userguide/reporters.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 9b1a7e75b..24d1065fe 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -175,6 +175,16 @@ If you need to produce a colored text output from the custom reporter, then you It is recommended to create the reporter type in the schema where utPLSQL is installed (by default it is the `UT3` schema). Note that before running the utPLSQL uninstall scripts, all custom reporters should be dropped (cf. [the installation documentation](install.md)). In particular, when upgrading to a newer version of utPLSQL, one has to drop the custom reporters and recreate them after the upgrade. +!!! note + Please make sure that grants have been added and synonyms created for the custom reporter in order for reporter to be accessible the same way as other reporters. + Assuming that reporter with name `customer_reporter` was created in schema `UT3` +```sql + grant execute on ut3.custom_reporter to public; + create or replace public synonym custom_reporter for ut3.custom_reporter; +``` + + + !!! note It is possible, but cumbersome, to use another schema for storing the custom reporters. This requires to create a synonym for the base reporter type in the schema that is going to own the custom reporter, and to provide appropriate grants both to the owner of the custom reporter and to the user running the reporter. After upgrading or reinstalling utPLSQL, the extra privileges need to be recreated. This approach is not recommended. From 39ff2ed0090a22fe680f5de38a2aa87f31b95226 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Wed, 2 Apr 2025 20:41:46 +0100 Subject: [PATCH 14/98] Adding tests for issue 1293 --- .../expectations/test_expectations_cursor.pkb | 42 +++++++++++++++++++ .../expectations/test_expectations_cursor.pks | 6 +++ 2 files changed, 48 insertions(+) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 847cce9a0..867a5f3db 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2950,5 +2950,47 @@ Rows: [ 2 differences ] ); end; + procedure cursor_joinby_compare_issue_1293 is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + --Arrange + open l_expected for + select 'FOO' username, 12 from dual union all + select 'TEST' username, -600 user_id from dual + order by 1 desc; + open l_actual for + select 'FOO' username, 12 from dual union all + select 'TEST' username, -600 user_id from dual union all + -- DUPLICATE!!! + select 'TEST' username, -600 user_id from dual + order by 1 asc; + --Act + ut3_develop.ut.expect(l_actual).to_equal(l_expected).join_by('USERNAME'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure cursor_not_joinby_compare_issue_1293 is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + --Arrange + open l_expected for + select 'FOO' username, 12 from dual union all + select 'TEST' username, -600 user_id from dual + order by 1 desc; + open l_actual for + select 'FOO' username, 12 from dual union all + select 'TEST' username, -600 user_id from dual union all + -- DUPLICATE!!! + select 'TEST' username, -600 user_id from dual + order by 1 asc; + --Act + ut3_develop.ut.expect(l_actual).to_equal(l_expected); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index 0f34486a9..53f754322 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -485,5 +485,11 @@ create or replace package test_expectations_cursor is --%test( Multiple failures reported correctly - Issue #998 ) procedure multiple_cursor_expectations; + --%test( Compares cursors with duplicate rows using join by - Issue #1293 ) + procedure cursor_joinby_compare_issue_1293; + + --%test( Compares cursors with duplicate rows - Issue #1293 ) + procedure cursor_not_joinby_compare_issue_1293; + end; / From 85734ffec7f57efff073d833ee2d43de1a9ad0f2 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Thu, 3 Apr 2025 18:38:33 +0100 Subject: [PATCH 15/98] For a join by key we need to also compare by duplicate numbers to make sure that we have same amount of rows when rows are identical but row counts is different. --- source/expectations/data_values/ut_compound_data_helper.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 4517cd43c..875ec760a 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -300,8 +300,8 @@ create or replace package body ut_compound_data_helper is ut_utils.append_to_clob(a_partition_stmt,' row_number() over (partition by '||l_partition_tmp||' order by '||l_partition_tmp||' ) '); if a_pk_table.count > 0 then - -- If key defined do the join or these and where on diffrences - a_join_by_stmt := ut_utils.table_to_clob(l_join_by_list, ' and '); + -- If key defined do the join or these and where on diffrences as well as on duplicate number when rows are same. + a_join_by_stmt := ' e."UT3$_Dup#No" = a."UT3$_Dup#No" and '||ut_utils.table_to_clob(l_join_by_list, ' and '); elsif a_unordered then -- If no key defined do the join on all columns a_join_by_stmt := ' e."UT3$_Dup#No" = a."UT3$_Dup#No" and '||ut_utils.table_to_clob(l_equal_list, ' and '); From 6f273df2752c7a0665debbc9532886ea01f8ff5a Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Thu, 3 Apr 2025 19:49:58 +0100 Subject: [PATCH 16/98] Change procedure nameto be less 30 to work for 11 and 12 --- test/ut3_user/expectations/test_expectations_cursor.pkb | 4 ++-- test/ut3_user/expectations/test_expectations_cursor.pks | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 867a5f3db..a4ef4e8f2 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2950,7 +2950,7 @@ Rows: [ 2 differences ] ); end; - procedure cursor_joinby_compare_issue_1293 is + procedure cr_joinby_compare_issue_1293 is l_actual sys_refcursor; l_expected sys_refcursor; begin @@ -2971,7 +2971,7 @@ Rows: [ 2 differences ] ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; - procedure cursor_not_joinby_compare_issue_1293 is + procedure cr_not_joinby_comp_issue_1293 is l_actual sys_refcursor; l_expected sys_refcursor; begin diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index 53f754322..8cceb5e01 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -486,10 +486,10 @@ create or replace package test_expectations_cursor is procedure multiple_cursor_expectations; --%test( Compares cursors with duplicate rows using join by - Issue #1293 ) - procedure cursor_joinby_compare_issue_1293; + procedure cr_joinby_compare_issue_1293; --%test( Compares cursors with duplicate rows - Issue #1293 ) - procedure cursor_not_joinby_compare_issue_1293; + procedure cr_not_joinby_comp_issue_1293; end; / From 933f41a70510a04c2eef89846301458009a312e8 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Thu, 10 Jul 2025 13:16:55 +0200 Subject: [PATCH 17/98] Added TAP reporter and synonyms --- source/create_grants.sql | 1 + source/create_synonyms.sql | 1 + source/reporters/ut_tap_reporter.tpb | 104 +++++++++++++++++++++++++++ source/reporters/ut_tap_reporter.tps | 13 ++++ 4 files changed, 119 insertions(+) create mode 100644 source/reporters/ut_tap_reporter.tpb create mode 100644 source/reporters/ut_tap_reporter.tps diff --git a/source/create_grants.sql b/source/create_grants.sql index 0e9f46cc5..2cdea9970 100644 --- a/source/create_grants.sql +++ b/source/create_grants.sql @@ -104,6 +104,7 @@ grant execute on &&ut3_owner..ut_tfs_junit_reporter to &ut3_user; grant execute on &&ut3_owner..ut_documentation_reporter to &ut3_user; grant execute on &&ut3_owner..ut_sonar_test_reporter to &ut3_user; grant execute on &&ut3_owner..ut_realtime_reporter to &ut3_user; +grant execute on &&ut3_owner..ut_tap_reporter to &ut3_user; --reporters - coverage grant execute on &&ut3_owner..ut_coverage_html_reporter to &ut3_user; grant execute on &&ut3_owner..ut_coverage_sonar_reporter to &ut3_user; diff --git a/source/create_synonyms.sql b/source/create_synonyms.sql index fa1c1dc45..d839e11b7 100644 --- a/source/create_synonyms.sql +++ b/source/create_synonyms.sql @@ -119,6 +119,7 @@ create &action_type. synonym &ut3_user.ut_tfs_junit_reporter for &&ut3_owner..ut create &action_type. synonym &ut3_user.ut_documentation_reporter for &&ut3_owner..ut_documentation_reporter; create &action_type. synonym &ut3_user.ut_sonar_test_reporter for &&ut3_owner..ut_sonar_test_reporter; create &action_type. synonym &ut3_user.ut_realtime_reporter for &&ut3_owner..ut_realtime_reporter; +create &action_type. synonym &ut3_user.ut_tap_reporter for &&ut3_owner..ut_tap_reporter; --reporters - coverage create &action_type. synonym &ut3_user.ut_coverage_html_reporter for &&ut3_owner..ut_coverage_html_reporter; create &action_type. synonym &ut3_user.ut_coverage_sonar_reporter for &&ut3_owner..ut_coverage_sonar_reporter; diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb new file mode 100644 index 000000000..f3f511d05 --- /dev/null +++ b/source/reporters/ut_tap_reporter.tpb @@ -0,0 +1,104 @@ +create or replace type body ut_tap_reporter is + + + constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result is + begin + self.init($$plsql_unit); + self.lvl := 0; + return; + end ut_tap_reporter; + + overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as + begin + self.print_text('# Subtest: ' || coalesce(a_suite.description, a_suite.name)); + lvl := lvl + 2; + self.print_text('1..' || a_suite.items.count); + end before_calling_suite; + + overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as + l_message varchar2(4000); + l_test_name varchar2(300) := coalesce(a_test.description, a_test.name); + + procedure print_failed_expectation(a_test ut_test) is + l_lines ut_varchar2_list; + l_failed boolean; + begin + if a_test.get_error_stack_traces().count = 0 then + -- If no error occurred, print failed expectation + l_lines := a_test.all_expectations(a_test.all_expectations.last).get_result_lines(); + l_failed := a_test.all_expectations(a_test.all_expectations.last).status >= ut_utils.gc_success; + if l_failed then + self.print_text('message: ''' || l_lines(1) || ''''); + self.print_text('severity: fail'); + end if; + else + -- Print multi-line YAML-String with implicit newline characters + self.print_text('message: |'); + self.lvl := self.lvl + 1; + self.print_text(ut_utils.table_to_clob(a_test.get_error_stack_traces())); + self.lvl := self.lvl - 1; + self.print_text('severity: error'); + end if; + end print_failed_expectation; + + begin + + if a_test.result = ut_utils.gc_disabled then + self.print_text('ok - ' || l_test_name || ' # SKIP'|| + case when a_test.disabled_reason is not null + then ': '||a_test.disabled_reason + else null + end ); + elsif a_test.result = ut_utils.gc_success then + self.print_text('ok - ' || l_test_name); + elsif a_test.result > ut_utils.gc_success then + if self.lvl = 0 then + self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || l_test_name); + else + self.print_text('not ok - ' || l_test_name); + end if; + self.lvl := self.lvl + 1; + self.print_text('---'); + print_failed_expectation(a_test); + self.print_text('...'); + self.lvl := self.lvl - 1; + end if; + + end after_calling_test; + + overriding member procedure after_calling_before_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is + begin + if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then + self.print_clob(a_executable.serveroutput); + end if; + end after_calling_before_all; + + overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as + l_suite_name varchar2(300) := coalesce(a_suite.description, a_suite.name); + begin + lvl := lvl - 2; + if lvl = 0 then + if a_suite.result = ut_utils.gc_success then + self.print_text('ok - ' || l_suite_name); + elsif a_suite.result > ut_utils.gc_success then + self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || l_suite_name); + end if; + + self.print_text(' '); + end if; + + end after_calling_suite; + + overriding member procedure before_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run) as + begin + self.print_text('TAP version 14'); + self.print_text('1..' || a_run.items.count); + self.print_text(' '); + end before_calling_run; + + overriding member procedure after_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run) as + begin + self.lvl := 0; + end; +end; +/ \ No newline at end of file diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps new file mode 100644 index 000000000..3e792b1f7 --- /dev/null +++ b/source/reporters/ut_tap_reporter.tps @@ -0,0 +1,13 @@ +create or replace type ut_tap_reporter under ut_documentation_reporter( + + constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result, + overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), + overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), + overriding member procedure after_calling_before_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), + overriding member procedure before_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run), + overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), + overriding member procedure after_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run) + +) +not final +/ \ No newline at end of file From c5f07a76885105d2044a655925e94f9dcbf9de9e Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Thu, 10 Jul 2025 13:21:28 +0200 Subject: [PATCH 18/98] Larger variables to prevent failure during reporting --- source/reporters/ut_tap_reporter.tpb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index f3f511d05..6ae764399 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -17,7 +17,7 @@ create or replace type body ut_tap_reporter is overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as l_message varchar2(4000); - l_test_name varchar2(300) := coalesce(a_test.description, a_test.name); + l_test_name varchar2(4000) := coalesce(a_test.description, a_test.name); procedure print_failed_expectation(a_test ut_test) is l_lines ut_varchar2_list; @@ -74,7 +74,7 @@ create or replace type body ut_tap_reporter is end after_calling_before_all; overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as - l_suite_name varchar2(300) := coalesce(a_suite.description, a_suite.name); + l_suite_name varchar2(4000) := coalesce(a_suite.description, a_suite.name); begin lvl := lvl - 2; if lvl = 0 then From 4ed6837276570eac30c7fd674d47ff927077695b Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 11 Jul 2025 21:29:06 +0200 Subject: [PATCH 19/98] Added TAP Reporter to install script --- source/install.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/install.sql b/source/install.sql index 827213e6c..22ce75365 100644 --- a/source/install.sql +++ b/source/install.sql @@ -346,6 +346,8 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema @@install_component.sql 'reporters/ut_xunit_reporter.tpb' @@install_component.sql 'reporters/ut_sonar_test_reporter.tps' @@install_component.sql 'reporters/ut_sonar_test_reporter.tpb' +@@install_component.sql 'reporters/ut_tap_reporter.tps' +@@install_component.sql 'reporters/ut_tap_reporter.tpb' @@install_component.sql 'reporters/ut_coverage_html_reporter.tps' @@install_component.sql 'reporters/ut_coverage_report_html_helper.pks' From 5e656fe4a953f207fcf0618232886d32764d158e Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 11 Jul 2025 21:40:41 +0200 Subject: [PATCH 20/98] Add TAP to expected reporters --- test/ut3_user/api/test_ut_runner.pkb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/ut3_user/api/test_ut_runner.pkb b/test/ut3_user/api/test_ut_runner.pkb index b6b7c67e7..d665718e1 100644 --- a/test/ut3_user/api/test_ut_runner.pkb +++ b/test/ut3_user/api/test_ut_runner.pkb @@ -393,7 +393,8 @@ end;'; select 'UT3_DEVELOP.UT_SONAR_TEST_REPORTER', 'Y' from dual union all select 'UT3_DEVELOP.UT_TEAMCITY_REPORTER', 'Y' from dual union all select 'UT3_DEVELOP.UT_TFS_JUNIT_REPORTER', 'Y' from dual union all - select 'UT3_DEVELOP.UT_XUNIT_REPORTER', 'Y' from dual + select 'UT3_DEVELOP.UT_XUNIT_REPORTER', 'Y' from dual union all + select 'UT3_DEVELOP.UT_TAP_REPORTER', 'Y' from dual order by 1; --Act open l_actual for select * from table(ut3_develop.ut_runner.GET_REPORTERS_LIST()) order by 1; From 6f47bb9999e3a07713416372bc42d2a41a47b692 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Mon, 14 Jul 2025 21:06:20 +0200 Subject: [PATCH 21/98] Added simple test for TAP reporter --- source/reporters/ut_tap_reporter.tpb | 9 ++++++++- source/reporters/ut_tap_reporter.tps | 1 + test/install_ut3_user_tests.sql | 2 ++ test/ut3_user/reporters/test_tap_reporter.pkb | 17 +++++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 10 ++++++++++ 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/ut3_user/reporters/test_tap_reporter.pkb create mode 100644 test/ut3_user/reporters/test_tap_reporter.pks diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 6ae764399..05779cfcf 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -69,10 +69,17 @@ create or replace type body ut_tap_reporter is overriding member procedure after_calling_before_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is begin if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then - self.print_clob(a_executable.serveroutput); + self.print_clob('# ' || a_executable.serveroutput); end if; end after_calling_before_all; + overriding member procedure after_calling_after_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is + begin + if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then + self.print_clob('# ' || a_executable.serveroutput); + end if; + end after_calling_after_all; + overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as l_suite_name varchar2(4000) := coalesce(a_suite.description, a_suite.name); begin diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index 3e792b1f7..cec7afebc 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -4,6 +4,7 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), overriding member procedure after_calling_before_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), + overriding member procedure after_calling_after_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), overriding member procedure before_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run), overriding member procedure after_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), overriding member procedure after_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run) diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index ad7f014bc..518e07841 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -43,6 +43,7 @@ set define off @@ut3_user/reporters/test_documentation_reporter.pks @@ut3_user/reporters/test_debug_reporter.pks @@ut3_user/reporters/test_realtime_reporter.pks +@@ut3_user/reporters/test_tap_reporter.pks @@ut3_user/reporters/test_coverage.pks @@ut3_user/reporters/test_coverage/test_coverage_standalone.pks set define on @@ -86,6 +87,7 @@ set define off @@ut3_user/reporters/test_documentation_reporter.pkb @@ut3_user/reporters/test_debug_reporter.pkb @@ut3_user/reporters/test_realtime_reporter.pkb +@@ut3_user/reporters/test_tap_reporter.pkb @@ut3_user/reporters/test_coverage/test_coverage_standalone.pkb set define on @@ut3_user/reporters/test_coverage/test_extended_coverage.pkb diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb new file mode 100644 index 000000000..6eaf2e4bb --- /dev/null +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -0,0 +1,17 @@ +create or replace package body test_tap_reporter as + + procedure simple_succeeding_test as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := 'TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*# Subtest: A description of some context\s*1..1\s*ok - passing_test\s*# \s*ok - org\s*'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.passing_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end simple_succeeding_test; + +end test_tap_reporter; +/ \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks new file mode 100644 index 000000000..9dca659e6 --- /dev/null +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -0,0 +1,10 @@ +create or replace package test_tap_reporter as + + --%suite(ut_tap_reporter) + --%suitepath(utplsql.test_user.reporters) + + --%test(Simple succeeding test) + procedure simple_succeeding_test; + +end test_tap_reporter; +/ \ No newline at end of file From 641ef7d2434334c7cfd5c8e184d5c110042eb08c Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 15 Jul 2025 16:36:52 +0200 Subject: [PATCH 22/98] Added failing test for TAP --- test/ut3_user/reporters/test_tap_reporter.pkb | 13 +++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 2 files changed, 16 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 6eaf2e4bb..82a02af8a 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -13,5 +13,18 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end simple_succeeding_test; + procedure simple_failing_test as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*not ok - a test with failing assertion\s*---\s*message: '"Fails as values are different"'\s*severity: fail\s*...\s*# \s*not ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.failing_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end simple_failing_test; + end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 9dca659e6..2bc35a8db 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -6,5 +6,8 @@ create or replace package test_tap_reporter as --%test(Simple succeeding test) procedure simple_succeeding_test; + --%test(Simple failing test) + procedure simple_failing_test; + end test_tap_reporter; / \ No newline at end of file From 2500604651a2e97d8b52f9b7fc5e298f2d6a0a1e Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 15 Jul 2025 17:12:44 +0200 Subject: [PATCH 23/98] Added erroring Test for TAP reporter --- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 2 files changed, 17 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 82a02af8a..1aadeb5f7 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -26,5 +26,19 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end simple_failing_test; + + procedure simple_erroring_test as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*not ok - a test raising unhandled exception\s*---\s*message: |\s*ORA-06502: .*\s*ORA-06512: .*\s*ORA-06512: .*\s*ORA-06512: at line [[:digit:]]+\s*severity: error\s*...\s*# \s*not ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.erroring_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end simple_erroring_test; + end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 2bc35a8db..72b72ab4c 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -9,5 +9,8 @@ create or replace package test_tap_reporter as --%test(Simple failing test) procedure simple_failing_test; + --%test(Simple erroring test) + procedure simple_erroring_test; + end test_tap_reporter; / \ No newline at end of file From 9d765a42fa329f1710938d8db505dae5b7917048 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Wed, 16 Jul 2025 21:32:33 +0200 Subject: [PATCH 24/98] Added test for disabled TAP test --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 05779cfcf..3eb783287 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -85,7 +85,7 @@ create or replace type body ut_tap_reporter is begin lvl := lvl - 2; if lvl = 0 then - if a_suite.result = ut_utils.gc_success then + if a_suite.result = ut_utils.gc_success or a_suite.result = ut_utils.gc_disabled then self.print_text('ok - ' || l_suite_name); elsif a_suite.result > ut_utils.gc_success then self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || l_suite_name); diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 1aadeb5f7..6772dcd3f 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -40,5 +40,19 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end simple_erroring_test; + + procedure disabled_test as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*ok - a disabled test # SKIP: Disabled for testing purpose\s*# \s*ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.disabled_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end disabled_test; + end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 72b72ab4c..a3c6475ab 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -12,5 +12,8 @@ create or replace package test_tap_reporter as --%test(Simple erroring test) procedure simple_erroring_test; + --%test(Skipped test) + procedure disabled_test; + end test_tap_reporter; / \ No newline at end of file From ef7f8114e4123c675a93f6b57a7b36ac94ff3a02 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Wed, 16 Jul 2025 21:43:17 +0200 Subject: [PATCH 25/98] Added boilerplate expression for shorter tests --- test/ut3_user/reporters/test_tap_reporter.pkb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 6772dcd3f..40b66318b 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -1,10 +1,12 @@ create or replace package body test_tap_reporter as + gc_boilerplate_suitepath_expression constant varchar2(300) := 'TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters'; + procedure simple_succeeding_test as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := 'TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*# Subtest: A description of some context\s*1..1\s*ok - passing_test\s*# \s*ok - org\s*'; + l_expected := gc_boilerplate_suitepath_expression || '\s*1..1\s*# \s*# Subtest: A description of some context\s*1..1\s*ok - passing_test\s*# \s*ok - org\s*'; select * bulk collect into l_output_data @@ -17,7 +19,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*not ok - a test with failing assertion\s*---\s*message: '"Fails as values are different"'\s*severity: fail\s*...\s*# \s*not ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*not ok - a test with failing assertion\s*---\s*message: '"Fails as values are different"'\s*severity: fail\s*...\s*# \s*not ok - org\s*]'; select * bulk collect into l_output_data @@ -31,7 +33,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*not ok - a test raising unhandled exception\s*---\s*message: |\s*ORA-06502: .*\s*ORA-06512: .*\s*ORA-06512: .*\s*ORA-06512: at line [[:digit:]]+\s*severity: error\s*...\s*# \s*not ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*not ok - a test raising unhandled exception\s*---\s*message: |\s*ORA-06502: .*\s*ORA-06512: .*\s*ORA-06512: .*\s*ORA-06512: at line [[:digit:]]+\s*severity: error\s*...\s*# \s*not ok - org\s*]'; select * bulk collect into l_output_data @@ -45,7 +47,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters\s*1..1\s*# \s*ok - a disabled test # SKIP: Disabled for testing purpose\s*# \s*ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*ok - a disabled test # SKIP: Disabled for testing purpose\s*# \s*ok - org\s*]'; select * bulk collect into l_output_data From 78cc7721c0ccd05d8b048d4bc53cb365652f9ff1 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 18 Jul 2025 12:16:27 +0200 Subject: [PATCH 26/98] Added skipped test with no reason --- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 2 files changed, 17 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 40b66318b..51678c8a2 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -56,5 +56,19 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end disabled_test; + + procedure disabled_test_no_description as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*ok - a disabled test with no reason # SKIP\s*# \s*ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.disabled_test_no_reason',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); + end disabled_test_no_description; + end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index a3c6475ab..7f3c7843a 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -15,5 +15,8 @@ create or replace package test_tap_reporter as --%test(Skipped test) procedure disabled_test; + --%test(Skipped test without description) + procedure disabled_test_no_description; + end test_tap_reporter; / \ No newline at end of file From 1e78987ace0e5a7199f170eddb0f67edf0c6e832 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 18 Jul 2025 12:32:40 +0200 Subject: [PATCH 27/98] Add explicit spaces for correct indentation --- test/ut3_user/reporters/test_tap_reporter.pkb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 51678c8a2..1c24407cf 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -6,7 +6,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || '\s*1..1\s*# \s*# Subtest: A description of some context\s*1..1\s*ok - passing_test\s*# \s*ok - org\s*'; + l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{21}# \sok - org\s*'; select * bulk collect into l_output_data @@ -19,7 +19,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*not ok - a test with failing assertion\s*---\s*message: '"Fails as values are different"'\s*severity: fail\s*...\s*# \s*not ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test with failing assertion\s{23}---\s{23}message: '"Fails as values are different"'\s{23}severity: fail\s{23}...\s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data @@ -33,7 +33,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*not ok - a test raising unhandled exception\s*---\s*message: |\s*ORA-06502: .*\s*ORA-06512: .*\s*ORA-06512: .*\s*ORA-06512: at line [[:digit:]]+\s*severity: error\s*...\s*# \s*not ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test raising unhandled exception\s{23}---\s{23}message: |\s{25ORA-06502: .*\s{25}ORA-06512: .*\s{25}ORA-06512: .*\s{25}ORA-06512: at line [[:digit:]]+\s{23}severity: error\s{23}...\s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data @@ -47,7 +47,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*ok - a disabled test # SKIP: Disabled for testing purpose\s*# \s*ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}ok - a disabled test # SKIP: Disabled for testing purpose\s{21}# \sok - org\s*]'; select * bulk collect into l_output_data @@ -61,7 +61,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s*1..1\s*# \s*ok - a disabled test with no reason # SKIP\s*# \s*ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}ok - a disabled test with no reason # SKIP\s{21}# \sok - org\s*]'; select * bulk collect into l_output_data From ee226695879800a408ed39b4aba8685ed91fa215 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 18 Jul 2025 21:50:18 +0200 Subject: [PATCH 28/98] Added test for multiple test outcomes in one go --- test/ut3_user/reporters/test_tap_reporter.pkb | 13 +++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 2 files changed, 16 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 1c24407cf..9803f5779 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -70,5 +70,18 @@ create or replace package body test_tap_reporter as ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); end disabled_test_no_description; + + procedure multiple_tests_different_outcome as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite for testing different outcomes from reporters\s{21}1..5\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{21}not ok - a test with failing assertion\s{23}---\s{23}message:.*not ok - a test raising unhandled exception\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a disabled test with no reason # SKIP\s{21}# \snot ok - org\s*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected, 'n'); + end multiple_tests_different_outcome; end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 7f3c7843a..9183bd558 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -18,5 +18,8 @@ create or replace package test_tap_reporter as --%test(Skipped test without description) procedure disabled_test_no_description; + --%test(Multiple tests with different outcome) + procedure multiple_tests_different_outcome; + end test_tap_reporter; / \ No newline at end of file From 55d5b612d77f97a442038a61f9b773cc8b413929 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Fri, 18 Jul 2025 22:23:35 +0200 Subject: [PATCH 29/98] Added serverout for beforetest procedures --- source/reporters/ut_tap_reporter.tpb | 9 +++++++++ source/reporters/ut_tap_reporter.tps | 3 +++ test/ut3_user/reporters/test_tap_reporter.pkb | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 3eb783287..6782bda32 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -15,6 +15,15 @@ create or replace type body ut_tap_reporter is self.print_text('1..' || a_suite.items.count); end before_calling_suite; + + overriding member procedure after_calling_before_test (self in out nocopy ut_tap_reporter, a_executable in ut_executable) as + begin + if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then + self.print_clob('# ' || a_executable.serveroutput); + end if; + end after_calling_before_test; + + overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as l_message varchar2(4000); l_test_name varchar2(4000) := coalesce(a_test.description, a_test.name); diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index cec7afebc..17f3784d9 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -2,6 +2,9 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result, overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), + + overriding member procedure after_calling_before_test (self in out nocopy ut_tap_reporter, a_executable in ut_executable), + overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), overriding member procedure after_calling_before_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), overriding member procedure after_calling_after_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 9803f5779..3c8320d4f 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -6,7 +6,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{21}# \sok - org\s*'; + l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}# \s{25}ok - passing_test\s{21}# \sok - org\s*'; select * bulk collect into l_output_data @@ -75,7 +75,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite for testing different outcomes from reporters\s{21}1..5\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{21}not ok - a test with failing assertion\s{23}---\s{23}message:.*not ok - a test raising unhandled exception\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a disabled test with no reason # SKIP\s{21}# \snot ok - org\s*]'; + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite for testing different outcomes from reporters\s{21}1..5\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}# \s{25}ok - passing_test\s{21}not ok - a test with failing assertion\s{23}---\s{23}message:.*not ok - a test raising unhandled exception\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a disabled test with no reason # SKIP\s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data From e451e4b7bfc856daae7e17657ffc1cc483ee62b2 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Mon, 21 Jul 2025 13:03:11 +0200 Subject: [PATCH 30/98] Included print of serverout as comment --- source/reporters/ut_tap_reporter.tpb | 15 +++++++-------- source/reporters/ut_tap_reporter.tps | 4 ++-- test/ut3_user/reporters/test_tap_reporter.pkb | 8 ++++---- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 6782bda32..a6ae51b3c 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -8,6 +8,11 @@ create or replace type body ut_tap_reporter is return; end ut_tap_reporter; + member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob) as + begin + self.print_clob(regexp_replace(a_comment, '^', '# ', 1, 0, 'm')); + end print_comment; + overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as begin self.print_text('# Subtest: ' || coalesce(a_suite.description, a_suite.name)); @@ -16,14 +21,6 @@ create or replace type body ut_tap_reporter is end before_calling_suite; - overriding member procedure after_calling_before_test (self in out nocopy ut_tap_reporter, a_executable in ut_executable) as - begin - if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then - self.print_clob('# ' || a_executable.serveroutput); - end if; - end after_calling_before_test; - - overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as l_message varchar2(4000); l_test_name varchar2(4000) := coalesce(a_test.description, a_test.name); @@ -72,6 +69,8 @@ create or replace type body ut_tap_reporter is self.print_text('...'); self.lvl := self.lvl - 1; end if; + + self.print_comment(a_test.get_serveroutputs); end after_calling_test; diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index 17f3784d9..c706fecd2 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -1,11 +1,11 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result, + member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob), overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), - overriding member procedure after_calling_before_test (self in out nocopy ut_tap_reporter, a_executable in ut_executable), - overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), + overriding member procedure after_calling_before_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), overriding member procedure after_calling_after_all (self in out nocopy ut_tap_reporter, a_executable in ut_executable), overriding member procedure before_calling_run(self in out nocopy ut_tap_reporter, a_run in ut_run), diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 3c8320d4f..bda706809 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -6,7 +6,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}# \s{25}ok - passing_test\s{21}# \sok - org\s*'; + l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{25}# \s{25}# \s{25}# \s{25}# \s{25}# \s{21}# \sok - org\s*'; select * bulk collect into l_output_data @@ -19,7 +19,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test with failing assertion\s{23}---\s{23}message: '"Fails as values are different"'\s{23}severity: fail\s{23}...\s{21}# \snot ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test with failing assertion\s{23}---\s{23}message: '"Fails as values are different"'\s{23}severity: fail\s{23}...\s{21}# \s{21}# \s{21}# \s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data @@ -33,7 +33,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test raising unhandled exception\s{23}---\s{23}message: |\s{25ORA-06502: .*\s{25}ORA-06512: .*\s{25}ORA-06512: .*\s{25}ORA-06512: at line [[:digit:]]+\s{23}severity: error\s{23}...\s{21}# \snot ok - org\s*]'; + l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test raising unhandled exception\s{23}---\s{23}message: |\s{25ORA-06502: .*\s{25}ORA-06512: at line [[:digit:]]+\s{23}severity: error\s{23}...\s{21}# \s{21}# \s{21}# \s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data @@ -75,7 +75,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite for testing different outcomes from reporters\s{21}1..5\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}# \s{25}ok - passing_test\s{21}not ok - a test with failing assertion\s{23}---\s{23}message:.*not ok - a test raising unhandled exception\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a disabled test with no reason # SKIP\s{21}# \snot ok - org\s*]'; + l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite.*\s{21}1..5\s{21}# \s{21}# Subtest: A desc.*\s{25}1..1\s{25}ok - passing_test\s{25}# \s{25}# \s{21}not ok - a test w.*\s{23}---\s{23}message:.*\s{21}# .*\s{21}# not ok - a test rai.*\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a dis.* # SKIP\s{21}# \snot ok - org\s*]'; select * bulk collect into l_output_data From fb9ef0badc83c3d90eb37d393add96d693b8f729 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Mon, 21 Jul 2025 14:10:50 +0200 Subject: [PATCH 31/98] Added suite name escaping --- source/reporters/ut_tap_reporter.tpb | 11 ++- source/reporters/ut_tap_reporter.tps | 1 + test/ut3_user/reporters/test_tap_reporter.pkb | 71 +++++++++++++++++-- test/ut3_user/reporters/test_tap_reporter.pks | 10 +++ 4 files changed, 84 insertions(+), 9 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index a6ae51b3c..8ad880cee 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -13,9 +13,14 @@ create or replace type body ut_tap_reporter is self.print_clob(regexp_replace(a_comment, '^', '# ', 1, 0, 'm')); end print_comment; + member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob as + begin + return regexp_replace(a_string_to_escape, '([\\#])', '\\\1'); + end escape_special_chars; + overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as begin - self.print_text('# Subtest: ' || coalesce(a_suite.description, a_suite.name)); + self.print_text('# Subtest: ' || self.escape_special_chars(coalesce(a_suite.description, a_suite.name))); lvl := lvl + 2; self.print_text('1..' || a_suite.items.count); end before_calling_suite; @@ -94,9 +99,9 @@ create or replace type body ut_tap_reporter is lvl := lvl - 2; if lvl = 0 then if a_suite.result = ut_utils.gc_success or a_suite.result = ut_utils.gc_disabled then - self.print_text('ok - ' || l_suite_name); + self.print_text('ok - ' || self.escape_special_chars(l_suite_name)); elsif a_suite.result > ut_utils.gc_success then - self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || l_suite_name); + self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || self.escape_special_chars(l_suite_name)); end if; self.print_text(' '); diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index c706fecd2..e38d809f9 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -2,6 +2,7 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result, member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob), + member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob, overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite), overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test), diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index bda706809..9c45a431b 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -2,6 +2,44 @@ create or replace package body test_tap_reporter as gc_boilerplate_suitepath_expression constant varchar2(300) := 'TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters'; + + procedure compile_tests as + pragma autonomous_transaction; + begin + + execute immediate q'[ + create or replace package test_tap_escaping as + --%suite(Some \ and # to be escaped) + + --%test(Even more \\ and multiple ###) + procedure more_escaping; + + --%test(Disabled test) + --%disabled(With \ and # in skip reason) + procedure not_skipping_escapes; + end test_tap_escaping; + ]'; + + execute immediate q'[ + create or replace package body test_tap_escaping as + + procedure more_escaping as + begin + ut.expect(1).to_equal(1); + end more_escaping; + + + procedure not_skipping_escapes as + begin + ut.expect(10).to_equal(1); + end not_skipping_escapes; + + end test_tap_escaping; + ]'; + + end compile_tests; + + procedure simple_succeeding_test as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); @@ -9,7 +47,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# \s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{25}# \s{25}# \s{25}# \s{25}# \s{25}# \s{21}# \sok - org\s*'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.passing_test',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -22,7 +60,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test with failing assertion\s{23}---\s{23}message: '"Fails as values are different"'\s{23}severity: fail\s{23}...\s{21}# \s{21}# \s{21}# \s{21}# \snot ok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.failing_test',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -36,7 +74,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}not ok - a test raising unhandled exception\s{23}---\s{23}message: |\s{25ORA-06502: .*\s{25}ORA-06512: at line [[:digit:]]+\s{23}severity: error\s{23}...\s{21}# \s{21}# \s{21}# \s{21}# \snot ok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.erroring_test',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -50,7 +88,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}ok - a disabled test # SKIP: Disabled for testing purpose\s{21}# \sok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.disabled_test',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -64,7 +102,7 @@ create or replace package body test_tap_reporter as l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# \s{21}ok - a disabled test with no reason # SKIP\s{21}# \sok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters.disabled_test_no_reason',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected); @@ -78,10 +116,31 @@ create or replace package body test_tap_reporter as l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite.*\s{21}1..5\s{21}# \s{21}# Subtest: A desc.*\s{25}1..1\s{25}ok - passing_test\s{25}# \s{25}# \s{21}not ok - a test w.*\s{23}---\s{23}message:.*\s{21}# .*\s{21}# not ok - a test rai.*\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a dis.* # SKIP\s{21}# \snot ok - org\s*]'; select * - bulk collect into l_output_data + bulk collect into l_output_data from table(ut3_develop.ut.run('test_reporters',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected, 'n'); end multiple_tests_different_outcome; + + + procedure escape_suite_name as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%# Subtest: Some \\ and \# to be escaped%ok - Some \\ and \# to be escaped%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.more_escaping',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end escape_suite_name; + + + procedure drop_help_tests as + pragma autonomous_transaction; + begin + execute immediate 'drop package test_tap_escaping'; + end drop_help_tests; end test_tap_reporter; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 9183bd558..44247dbfa 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -3,6 +3,9 @@ create or replace package test_tap_reporter as --%suite(ut_tap_reporter) --%suitepath(utplsql.test_user.reporters) + --%beforeall + procedure compile_tests; + --%test(Simple succeeding test) procedure simple_succeeding_test; @@ -21,5 +24,12 @@ create or replace package test_tap_reporter as --%test(Multiple tests with different outcome) procedure multiple_tests_different_outcome; + --%test(Escape special characters in suite name) + procedure escape_suite_name; + + + --%afterall + procedure drop_help_tests; + end test_tap_reporter; / \ No newline at end of file From f18981d278e92d9f69ddfa8c243b840a4f2687f7 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sat, 26 Jul 2025 21:28:49 +0200 Subject: [PATCH 32/98] Included escaped test name --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 8ad880cee..d348f61e1 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -28,7 +28,7 @@ create or replace type body ut_tap_reporter is overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test) as l_message varchar2(4000); - l_test_name varchar2(4000) := coalesce(a_test.description, a_test.name); + l_test_name varchar2(4000) := self.escape_special_chars(coalesce(a_test.description, a_test.name)); procedure print_failed_expectation(a_test ut_test) is l_lines ut_varchar2_list; diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 9c45a431b..5135cffde 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -137,6 +137,20 @@ create or replace package body test_tap_reporter as end escape_suite_name; + procedure escape_multiple_characters_test_name as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%ok - Even more \\\\ and multiple \#\#\#%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.more_escaping',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end escape_multiple_characters_test_name; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 44247dbfa..e77ab8515 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -27,6 +27,9 @@ create or replace package test_tap_reporter as --%test(Escape special characters in suite name) procedure escape_suite_name; + --%test(Escape multiple special characters in test name) + procedure escape_multiple_characters_test_name; + --%afterall procedure drop_help_tests; From f1c0f860f84efe389dc6b3db79a950ff4c266259 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sat, 26 Jul 2025 21:49:52 +0200 Subject: [PATCH 33/98] Included escaped skip reason --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 14 ++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index d348f61e1..4472c2f2f 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -57,7 +57,7 @@ create or replace type body ut_tap_reporter is if a_test.result = ut_utils.gc_disabled then self.print_text('ok - ' || l_test_name || ' # SKIP'|| case when a_test.disabled_reason is not null - then ': '||a_test.disabled_reason + then ': '|| self.escape_special_chars(a_test.disabled_reason) else null end ); elsif a_test.result = ut_utils.gc_success then diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 5135cffde..a4c3a1b6a 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -151,6 +151,20 @@ create or replace package body test_tap_reporter as end escape_multiple_characters_test_name; + procedure special_characters_in_deisabled_reason as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%ok - Disabled test # SKIP: With \\ and \# in skip reason%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.not_skipping_escapes',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end special_characters_in_deisabled_reason; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index e77ab8515..7385b91bb 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -30,6 +30,9 @@ create or replace package test_tap_reporter as --%test(Escape multiple special characters in test name) procedure escape_multiple_characters_test_name; + --%test(Disabled Test with special characters in disable reason) + procedure special_characters_in_deisabled_reason; + --%afterall procedure drop_help_tests; From 33865dd88a80729a6db01b9c511e79e1f9d3a542 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sun, 27 Jul 2025 13:47:27 +0200 Subject: [PATCH 34/98] Added escaped comment test --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 22 +++++++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 +++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 4472c2f2f..3738a0f7a 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -10,7 +10,7 @@ create or replace type body ut_tap_reporter is member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob) as begin - self.print_clob(regexp_replace(a_comment, '^', '# ', 1, 0, 'm')); + self.print_clob(regexp_replace(self.escape_special_chars(a_comment), '^', '# ', 1, 0, 'm')); end print_comment; member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob as diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index a4c3a1b6a..a037e50e5 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -17,6 +17,9 @@ create or replace package body test_tap_reporter as --%test(Disabled test) --%disabled(With \ and # in skip reason) procedure not_skipping_escapes; + + --%test(Escaped Comments) + procedure escaped_comments; end test_tap_escaping; ]'; @@ -34,6 +37,11 @@ create or replace package body test_tap_reporter as ut.expect(10).to_equal(1); end not_skipping_escapes; + procedure escaped_comments as + begin + dbms_output.put_line('This \ and # should be escaped, but this not!!!'); + ut.expect(1).to_equal(1); + end escaped_comments; end test_tap_escaping; ]'; @@ -165,6 +173,20 @@ create or replace package body test_tap_reporter as end special_characters_in_deisabled_reason; + procedure special_characters_in_comment as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%ok - Escaped Comments%# This \\ and \# should be escaped, but this not!!!%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.escaped_comments',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end special_characters_in_comment; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index 7385b91bb..b5ac6c31e 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -33,6 +33,9 @@ create or replace package test_tap_reporter as --%test(Disabled Test with special characters in disable reason) procedure special_characters_in_deisabled_reason; + --%test(Escape special characters in comment) + procedure special_characters_in_comment; + --%afterall procedure drop_help_tests; From a477d688bc278ebc60c2aa400370af75f58a4520 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sun, 27 Jul 2025 14:05:57 +0200 Subject: [PATCH 35/98] Central use of comment procedure --- source/reporters/ut_tap_reporter.tpb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 3738a0f7a..a2540ef97 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -82,14 +82,14 @@ create or replace type body ut_tap_reporter is overriding member procedure after_calling_before_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is begin if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then - self.print_clob('# ' || a_executable.serveroutput); + self.print_comment(a_executable.serveroutput); end if; end after_calling_before_all; overriding member procedure after_calling_after_all(self in out nocopy ut_tap_reporter, a_executable in ut_executable) is begin if a_executable.serveroutput is not null and a_executable.serveroutput != empty_clob() then - self.print_clob('# ' || a_executable.serveroutput); + self.print_comment(a_executable.serveroutput); end if; end after_calling_after_all; From 2e399fdc33d6b1ce8dfdbb3f3b27281c2a0350ab Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 29 Jul 2025 13:53:32 +0200 Subject: [PATCH 36/98] Comments shouldn't escape special characters --- source/reporters/ut_tap_reporter.tpb | 2 +- test/ut3_user/reporters/test_tap_reporter.pkb | 4 ++-- test/ut3_user/reporters/test_tap_reporter.pks | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index a2540ef97..5a75fcac8 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -10,7 +10,7 @@ create or replace type body ut_tap_reporter is member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob) as begin - self.print_clob(regexp_replace(self.escape_special_chars(a_comment), '^', '# ', 1, 0, 'm')); + self.print_clob(regexp_replace(a_comment, '^', '# ', 1, 0, 'm')); end print_comment; member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob as diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index a037e50e5..87ec1dd9d 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -39,7 +39,7 @@ create or replace package body test_tap_reporter as procedure escaped_comments as begin - dbms_output.put_line('This \ and # should be escaped, but this not!!!'); + dbms_output.put_line('This \ and # should not be escaped, and this not as well!!!'); ut.expect(1).to_equal(1); end escaped_comments; end test_tap_escaping; @@ -177,7 +177,7 @@ create or replace package body test_tap_reporter as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin - l_expected := q'[%ok - Escaped Comments%# This \\ and \# should be escaped, but this not!!!%]'; + l_expected := q'[%ok - Escaped Comments%# This \ and # should not be escaped, and this not as well!!!%]'; select * bulk collect into l_output_data diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index b5ac6c31e..aef27fa0a 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -33,7 +33,7 @@ create or replace package test_tap_reporter as --%test(Disabled Test with special characters in disable reason) procedure special_characters_in_deisabled_reason; - --%test(Escape special characters in comment) + --%test(Don't escape special characters in comment) procedure special_characters_in_comment; From 3193f5bdd221250433c434a1110fb0efc733eee1 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Sat, 2 Aug 2025 12:41:09 +0200 Subject: [PATCH 37/98] Added TAP reporter to documentation --- docs/images/tap_reporter_colored.png | Bin 0 -> 36097 bytes docs/images/tap_reporter_no_color.png | Bin 0 -> 44916 bytes docs/userguide/reporters.md | 10 ++++++++++ 3 files changed, 10 insertions(+) create mode 100644 docs/images/tap_reporter_colored.png create mode 100644 docs/images/tap_reporter_no_color.png diff --git a/docs/images/tap_reporter_colored.png b/docs/images/tap_reporter_colored.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a5e932670135bb14350020592eeb9d821131c5 GIT binary patch literal 36097 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
taID(0kCn^@n4t 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 UycK2V`B7!8(L}@05py^H2gM*Zo&W#< literal 0 HcmV?d00001 diff --git a/docs/images/tap_reporter_no_color.png b/docs/images/tap_reporter_no_color.png new file mode 100644 index 0000000000000000000000000000000000000000..e7379a889f3f66af1a50e90b5b0c3e1a6f316343 GIT binary patch literal 44916 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 literal 0 HcmV?d00001 diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 24d1065fe..47fb226fa 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -126,6 +126,16 @@ Details: utPLSQL comes with a set of build-in coverage reporters. [Code coverage](coverage.md) section describes in details how to use configure and use code coverage. +## TAP Reporter + +The `ut_tap_reporter` produces output compatible with the [Test Anything Protocol](https://testanything.org) (Version 14). TAP output can be consumed by a TAP consumer that can aggregate results from testsuites across different programming languages while maintaining good readability for humans. + +![tap_output_no_color](../images/tap_reporter_no_color.png) + +If you use a compatible terminal, you can also have a colored result. Only top level `not ok`-results will be colored: + +![tap_colored_output](../images/tap_reporter_colored.png) + ## Debug reporter The `ut_debug_reporter` provides a highly verbose output containing thorough details about framework and test execution. From 8de19cc8c29b8bf1653a69c11386b48b39b0a406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 14:40:03 +0200 Subject: [PATCH 38/98] Small refresh of project setup scripts and documentation. --- CONTRIBUTING.md | 27 +++++++++++++-------------- development/template.env.sh | 10 +++++----- readme.md | 4 ++-- test/install_and_run_tests.sh | 6 ++++-- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 41a86ecdd..926f0df80 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,7 +57,7 @@ To get started with development, follow the below steps. _If you're using Windows, run the shell scripts using `GIT bash` - Windows-based bash command line._ -**Caution**: If you are using jetBrains DataGrip, don't use the ingegrated console to run the shell scripts (not even with GIT bash configured). It might disconnect from oracle randomly during script-run. +**Caution**: If you are using jetBrains DataGrip, don't use the integrated console to run the shell scripts (not even with GIT bash configured). It might disconnect from oracle randomly during script-run. ### Clone your fork of utPLSQL git repository @@ -94,13 +94,13 @@ export ORACLE_PWD=oracle # Adjust your local SYS password The below script is fetching latest release version from utPLSQL repository. Latest release version is used for self-testing. ```bash -development/refresh_sources.sh +./development/refresh_sources.sh ``` ### Setup local database for utPLSQL development ```bash -development/install.sh +./development/install.sh ``` ### That's it @@ -135,9 +135,9 @@ Whenever a new version of utPLSQL or a new version of utPLSQL-cli is available, utPLSQL v3 unit tests are located in the `test` directory -Before you push any changes and create a pull request to the utPLSQL project repository, make sure that all of the tests are executing successfully in your local environment. +Before you push any changes and create a pull request to the utPLSQL project repository, make sure that all the tests are executing successfully in your local environment. -Every new functionality needs to be documented by unit tests that cover both happy-path scenarios as well as edge-cases and exception paths. +Every new functionality needs to be documented by unit tests that cover happy-path scenarios as well as edge-cases and exception paths. > **Important notice:** > We do our best to keep utPLSQL covered with unit tests. @@ -145,8 +145,8 @@ Every new functionality needs to be documented by unit tests that cover both hap To run a full suite of unit tests execute: ```bash -development/env.sh -test/install_and_run_tests.sh +. ./development/env.sh +./test/install_and_run_tests.sh ``` You can review the results of tests as well as see information about code coverage in `./coverage.html` file. @@ -189,18 +189,17 @@ docker build --force-rm --no-cache --squash -t oracle/db-prebuilt . Travis will use your Docker Hub credentials to pull the private images, and the following secure environment variables must be defined. -Variable | Description ----------|------------ -**DOCKER_USER**
**DOCKER_PASSWORD** | _Your Docker Hub website credentials. They will be used to pull the private database images._ +| Variable | Description | +|------------------------------------------|-----------------------------------------------------------------------------------------------| +| **DOCKER_USER**
**DOCKER_PASSWORD** | _Your Docker Hub website credentials. They will be used to pull the private database images._ | ### SQLCL Our build configuration uses SQLCL to run the scripts, and you need to configure a few additional secure environment variables. After the first build, the downloaded file will be cached. -Variable | Description ----------|------------ -**ORACLE_OTN_USER
ORACLE_OTN_PASSWORD** | _Your Oracle website credentials. They will be used to download SQLCL._ - +| Variable | Description | +|----------------------------------------------|-------------------------------------------------------------------------| +| **ORACLE_OTN_USER
ORACLE_OTN_PASSWORD** | _Your Oracle website credentials. They will be used to download SQLCL._ | ## New to GIT diff --git a/development/template.env.sh b/development/template.env.sh index 7761a70c4..fdbed4b6b 100755 --- a/development/template.env.sh +++ b/development/template.env.sh @@ -1,10 +1,10 @@ #!/bin/bash -export SQLCLI=sql # For sqlcl client -#export SQLCLI=sqlplus # For sqlplus client -export CONNECTION_STR=127.0.0.1:1521/xe ORACLE_VERSION=11g-r2-xe# Adjust the connect string -export ORACLE_PWD=oracle # Adjust your local SYS password -export UTPLSQL_CLI_VERSION="3.1.6" +export SQLCLI=sql # For sqlcl client +#export SQLCLI=sqlplus # For sqlplus client +export CONNECTION_STR=127.0.0.1:1521/xe # Adjust the connect string +export ORACLE_PWD=oracle # Adjust your local SYS password +export UTPLSQL_CLI_VERSION="v3.1.8" export SELFTESTING_BRANCH=develop export UTPLSQL_DIR="utPLSQL_latest_release" diff --git a/readme.md b/readme.md index 141c68ffe..3c2d7fb3a 100644 --- a/readme.md +++ b/readme.md @@ -9,8 +9,8 @@ [![twitter](https://img.shields.io/twitter/follow/utPLSQL.svg?style=social&label=Follow)](https://twitter.com/utPLSQL) [![build](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml/badge.svg)](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml) -[![QualityGate](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=utPLSQL) -[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL&metric=coverage)](https://sonarcloud.io/summary/new_code?id=utPLSQL) +[![QualityGate](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=utPLSQL) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=coverage)](https://sonarcloud.io/summary/new_code?id=utPLSQL_utPLSQL) ---------- utPLSQL version 3 is a complete rewrite of utPLSQL v2 from scratch. diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh index 04f51fb3c..1719f137a 100755 --- a/test/install_and_run_tests.sh +++ b/test/install_and_run_tests.sh @@ -1,9 +1,11 @@ #!/bin/bash set -ev +. ./development/env.sh + #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" cd test -time . ./${DIR}/install_tests.sh -time . ./${DIR}/run_tests.sh +time . ./install_tests.sh +time . ./run_tests.sh From 5d2faaf80bd352bbabe2bd7ca6fd4b829004c1bc Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 12:47:04 +0000 Subject: [PATCH 39/98] Removing old builds from build workflow --- .github/workflows/build.yml | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c2fe3971e..8ddfbd584 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,41 +28,21 @@ jobs: matrix: include: - id: 1 - db_version_name: '11XE' - oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:11-full" - oracle-base: '/u01/app/oracle' - - id: 2 - db_version_name: '12.1EE' + db_version_name: '19se' oracle-sid: 'ORCLCDB' - oracle-version: "utplsqlv3/oracledb:12c-r1-ee-small" - oracle-base: '/opt/oracle' -# - id: 3 -# db_version_name: '12.2se' -# oracle-sid: 'ORCLCDB' -# oracle-version: "utplsqlv3/oracledb:12c-r2-se2-small" -# oracle-base: '/opt/oracle' - - id: 4 - db_version_name: '18XE' - oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:18-slim" + oracle-version: "utplsqlv3/oracledb:19c-se2-small" oracle-base: '/opt/oracle' -# TODO - need to add healthcheck.sh into our containers -# - id: 5 -# db_version_name: '19se' -# oracle-sid: 'ORCLCDB' -# oracle-version: "utplsqlv3/oracledb:19c-se2-small" -# oracle-base: '/opt/oracle' - - id: 6 + - id: 2 db_version_name: '21XE' oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" oracle-base: '/opt/oracle' - - id: 7 + - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim" oracle-base: '/opt/oracle' +# TODO - need to add healthcheck.sh into our containers services: html_checker: @@ -124,17 +104,17 @@ jobs: run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh - name: Check code style - if: ${{ matrix.id == 1 }} + if: ${{ matrix.db_version_name == '21XE' }} id: check-coding-style run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint "$SQLCLI" ${DOCKER_ENV} ${ORACLE_VERSION} $UT3_DEVELOP_SCHEMA/$UT3_DEVELOP_SCHEMA_PASSWORD@//$CONNECTION_STR @development/utplsql_style_check.sql - name: Validate utPLSQL uninstall - if: ${{ matrix.id == 1 }} + if: ${{ matrix.db_version_name == '21XE' }} id: validate-uninstall run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/uninstall_validate_utplsql.sh - name: Reinstall utPLSQL - if: ${{ matrix.id == 1 }} + if: ${{ matrix.db_version_name == '21XE' }} id: reinstall-utplsql run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh From 098aca2ad405f34e1f8da4908543e6b1d97c4e4f Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:06:20 +0000 Subject: [PATCH 40/98] Improvments --- .github/workflows/build.yml | 50 ++++++++++++++++++++++++++--------- .github/workflows/release.yml | 16 ++++++++--- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8ddfbd584..270249b7a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,6 +17,7 @@ jobs: build: name: Build and test on ${{matrix.db_version_name}} DB runs-on: ubuntu-latest + timeout-minutes: 90 env: ORACLE_VERSION: ${{matrix.oracle-version}} ORACLE_SID: ${{matrix.oracle-sid}} @@ -68,13 +69,13 @@ jobs: --health-cmd healthcheck.sh steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: c-py/action-dotenv-to-setenv@v2 + - uses: c-py/action-dotenv-to-setenv@v5 with: env-file: .github/variables/.env - - uses: FranzDiebold/github-env-vars-action@v2 #https://github.com/marketplace/actions/github-environment-variables-action + - uses: FranzDiebold/github-env-vars-action@v2.8.0 #https://github.com/marketplace/actions/github-environment-variables-action - name: Set build version number env variables id: set-build-version-number-vars @@ -91,11 +92,27 @@ jobs: - name: Update privileges on sources run: chmod -R go+w ./{source,test,examples,${UTPLSQL_DIR}/source} + - name: Cache OJDBC jars + id: cache-ojdbc + uses: actions/cache@v4 + with: + path: ${{ env.OJDBC_HOME }} + key: ${{ runner.os }}-ojdbc-${{ env.OJDBC_URL }}-v1 + - name: Add OJDBC home + if: steps.cache-ojdbc.outputs.cache-hit != 'true' id: get-ojdbc run: mkdir -p ${OJDBC_HOME} && curl -Lk -o ${OJDBC_HOME}/ojdbc8.jar ${OJDBC_URL}/ojdbc8.jar && curl -Lk -o ${OJDBC_HOME}/orai18n.jar ${OJDBC_URL}/orai18n.jar + - name: Cache utPLSQL-cli + id: cache-utplsql-cli + uses: actions/cache@v4 + with: + path: utPLSQL-cli + key: ${{ runner.os }}-utplsql-cli-v3.1.8 + - name: Install utPLSQL-cli + if: steps.cache-utplsql-cli.outputs.cache-hit != 'true' id: install-utplsql-cli run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/v3.1.8/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli @@ -152,7 +169,7 @@ jobs: - name: Upload ORACLE_BASE/diag data Artifact id: upload if: ${{ always() && steps.run-tests.outcome == 'failure' }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: my-artifact$-${{matrix.db_version_name}} path: ${{github.workspace}}/database-diag @@ -163,7 +180,7 @@ jobs: run: bash .github/scripts/validate_report_files.sh - name: Codecov - uses: codecov/codecov-action@v2 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos files: ./cobertura.xml @@ -171,7 +188,7 @@ jobs: fail_ci_if_error: true # optional (default = false) - name: Publish unit test results - uses: EnricoMi/publish-unit-test-result-action@v1.24 + uses: EnricoMi/publish-unit-test-result-action@v2 if: always() with: files: junit_test_results.xml @@ -179,7 +196,7 @@ jobs: - name: SonarCloud Scan id: sonar if: ${{ always() && matrix.db_version_name == '21XE' }} - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarcloud-github-action@v5.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} @@ -194,6 +211,7 @@ jobs: needs: [ build ] concurrency: publish runs-on: ubuntu-latest + timeout-minutes: 30 env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} if: | @@ -205,14 +223,14 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: echo "API_TOKEN_GITHUB=${GITHUB_TOKEN}" >> $GITHUB_ENV - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ env.API_TOKEN_GITHUB }} - - uses: c-py/action-dotenv-to-setenv@v2 + - uses: c-py/action-dotenv-to-setenv@v5 with: env-file: .github/variables/.env - - uses: FranzDiebold/github-env-vars-action@v2 #https://github.com/marketplace/actions/github-environment-variables-action + - uses: FranzDiebold/github-env-vars-action@v2.8.0 #https://github.com/marketplace/actions/github-environment-variables-action - name: Set buid version number env variables id: set-build-version-number-vars @@ -234,6 +252,12 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" + - name: Setup Python for docs + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' + - name: Build and publish documentation run: | pip install mkdocs @@ -247,6 +271,7 @@ jobs: concurrency: trigger needs: [ build, publish ] runs-on: ubuntu-latest + timeout-minutes: 15 if: | github.repository == 'utPLSQL/utPLSQL' && github.base_ref == null && ( startsWith( github.ref, 'refs/heads/release/v' ) || github.ref == 'refs/heads/develop' ) @@ -256,7 +281,7 @@ jobs: # repo: [ 'utPLSQL/utPLSQL-v2-v3-migration' ] steps: - name: Repository Dispatch - uses: peter-evans/repository-dispatch@v1 + uses: peter-evans/repository-dispatch@v4 with: token: ${{ secrets.API_TOKEN_GITHUB }} repository: ${{ matrix.repo }} @@ -267,9 +292,10 @@ jobs: name: Post Workflow Status To Slack needs: [ build, publish, dispatch ] runs-on: ubuntu-latest + timeout-minutes: 10 steps: - name: Slack Workflow Notification - uses: Gamesight/slack-workflow-status@master + uses: Gamesight/slack-workflow-status@v1.3.0 with: repo_token: ${{secrets.GITHUB_TOKEN}} slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a748d1cbd..19bf5007f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,15 +14,16 @@ jobs: name: Upload archives concurrency: upload runs-on: ubuntu-latest + timeout-minutes: 60 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: c-py/action-dotenv-to-setenv@v2 + - uses: c-py/action-dotenv-to-setenv@v5 with: env-file: .github/variables/.env - - uses: FranzDiebold/github-env-vars-action@v2 #https://github.com/marketplace/actions/github-environment-variables-action + - uses: FranzDiebold/github-env-vars-action@v2.8.0 #https://github.com/marketplace/actions/github-environment-variables-action - name: Set build version number env variables run: .github/scripts/set_version_numbers_env.sh @@ -35,6 +36,12 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" + - name: Setup Python for docs + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' + - name: Build and publish documentation run: | pip install mkdocs @@ -69,9 +76,10 @@ jobs: name: Post Workflow Status To Slack needs: [ upload_artifacts ] runs-on: ubuntu-latest + timeout-minutes: 10 steps: - name: Slack Workflow Notification - uses: Gamesight/slack-workflow-status@master + uses: Gamesight/slack-workflow-status@v1.3.0 with: repo_token: ${{secrets.GITHUB_TOKEN}} slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} From c2138900c2585bea7de12e7a92e239d9b11a603d Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:13:49 +0000 Subject: [PATCH 41/98] Fixing 19c --- .github/workflows/build.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3c7f80b93..80f734149 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -62,11 +62,7 @@ jobs: ports: - 1521:1521 options: >- - --health-interval 10s - --health-timeout 5s - --health-retries 10 --name oracle - --health-cmd healthcheck.sh steps: - uses: actions/checkout@v4 From 77d2eccf177284e6a469aef703a88751fa628ddc Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:19:26 +0000 Subject: [PATCH 42/98] Adding healthchecks --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 80f734149..ffdab246b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -63,6 +63,10 @@ jobs: - 1521:1521 options: >- --name oracle + --health-interval 10s + --health-timeout 5s + --health-retries 10 + --health-cmd healthcheck.sh steps: - uses: actions/checkout@v4 From 6dd676436709c07c1cd63a9ea0004bbd51730cfd Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:39:45 +0000 Subject: [PATCH 43/98] Testing delays --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ffdab246b..113f9a06a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -116,6 +116,9 @@ jobs: id: install-utplsql-cli run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/v3.1.8/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli + - name: Wait for Oracle DB to be fully ready + run: sleep 30 + - name: Install utPLSQL id: install-utplsql run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh From a0d13444cf332bc02a9197572698045112779af7 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 13:53:20 +0000 Subject: [PATCH 44/98] Change images --- .github/workflows/build.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 113f9a06a..5ea5e3706 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,12 +36,12 @@ jobs: - id: 2 db_version_name: '21XE' oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:21-slim" + oracle-version: "gvenzl/oracle-xe:21-slim-faststart" oracle-base: '/opt/oracle' - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' - oracle-version: "gvenzl/oracle-free:23-slim" + oracle-version: "gvenzl/oracle-free:23-slim-faststart" oracle-base: '/opt/oracle' # TODO - need to add healthcheck.sh into our containers @@ -116,9 +116,6 @@ jobs: id: install-utplsql-cli run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/v3.1.8/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli - - name: Wait for Oracle DB to be fully ready - run: sleep 30 - - name: Install utPLSQL id: install-utplsql run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh From 55b02ba924251f6626616d2e67fb87511af478b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 15:56:13 +0200 Subject: [PATCH 45/98] Removed 11 and 12 DB's - added support for 19c (added health check in docker repository) --- .github/workflows/build.yml | 29 ++++------------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index af2e4875d..870f4b007 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,37 +28,16 @@ jobs: matrix: include: - id: 1 - db_version_name: '11XE' - oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:11-full" - oracle-base: '/u01/app/oracle' - - id: 2 - db_version_name: '12.1EE' + db_version_name: '19se' oracle-sid: 'ORCLCDB' - oracle-version: "utplsqlv3/oracledb:12c-r1-ee-small" + oracle-version: "utplsqlv3/oracledb:19c-se2-small" oracle-base: '/opt/oracle' -# - id: 3 -# db_version_name: '12.2se' -# oracle-sid: 'ORCLCDB' -# oracle-version: "utplsqlv3/oracledb:12c-r2-se2-small" -# oracle-base: '/opt/oracle' - - id: 4 - db_version_name: '18XE' - oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:18-slim" - oracle-base: '/opt/oracle' -# TODO - need to add healthcheck.sh into our containers -# - id: 5 -# db_version_name: '19se' -# oracle-sid: 'ORCLCDB' -# oracle-version: "utplsqlv3/oracledb:19c-se2-small" -# oracle-base: '/opt/oracle' - - id: 6 + - id: 2 db_version_name: '21XE' oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" oracle-base: '/opt/oracle' - - id: 7 + - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim" From 9df078c1323ea77c03c8047d65da3eb5916573a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 15:59:35 +0200 Subject: [PATCH 46/98] Fixing Sonar Scan --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 870f4b007..0be56e66d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -178,7 +178,7 @@ jobs: - name: SonarCloud Scan id: sonar if: ${{ always() && matrix.db_version_name == '21XE' }} - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarqube-scan-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From 40d9998230260225681885f73c9ba51ee7780df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 16:36:34 +0200 Subject: [PATCH 47/98] Update of CONTRIBUTING.md --- CONTRIBUTING.md | 42 +++++++++--------------------------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 926f0df80..744495e76 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -162,44 +162,20 @@ Dependencies to `ut_util` are not shown as most of modules are depending on it. ## Build Environment -We are using private docker images to test utPLSQL for our Travis CI builds. The following versions of Oracle Database are being used. +We are using a combination of private and publicly available docker images to test utPLSQL. The following versions of Oracle Database are used for testing: -* 11g XE R2 -* 12c SE R1 -* 12c SE R2 -* 18c SE +* 19c-Standard Edition (private image) +* 21-free +* 23-free -These images are based on the slimmed versions [official dockerfiles released by Oracle](https://github.com/utPLSQL/docker-scripts), but due to licensing restrictions, we can't make the images public. -You can build your own and use it locally, or push to a private docker repository. - -The build steps are simple if you already have some experience using Docker. You can find detailed information about how to build your own image with a running database in: [example of creating an image with pre-built DB](https://github.com/oracle/docker-images/blob/master/OracleDatabase/samples/prebuiltdb/README.md) - -> You can find more info about the official Oracle images on the [Oracle Database on Docker](https://github.com/oracle/docker-images/tree/master/OracleDatabase) GitHub page. +The Free varsions are publicly available and you can set up your local development environment to use one of from [here](https://github.com/gvenzl/oci-oracle-free) -> If you are new to Docker, you can start by reading the [Getting Started With Docker](https://docs.docker.com/engine/getstarted/) docs. +These [private image]((https://github.com/utPLSQL/docker-scripts) is a slimmed version of [the official Oracle database dockerfiles](https://github.com/oracle/docker-images/tree/master/OracleDatabase) . Due to licensing restrictions, the image cannot be public. -### Docker Build Notes - -* You need to comment out the VOLUME line. This step is required, because volumes are not saved when using `docker commit` command. -* When the build process is complete, you will run the container to install the database. Once everything is set up and you see the message "DATABASE IS READY!", you may change the password and stop the running container. After the container is stopped, you can safely commit the container. -* You can use the --squash experimental docker tag to reduce the image size. Example: -``` -docker build --force-rm --no-cache --squash -t oracle/db-prebuilt . -``` - -Travis will use your Docker Hub credentials to pull the private images, and the following secure environment variables must be defined. - -| Variable | Description | -|------------------------------------------|-----------------------------------------------------------------------------------------------| -| **DOCKER_USER**
**DOCKER_PASSWORD** | _Your Docker Hub website credentials. They will be used to pull the private database images._ | - -### SQLCL - -Our build configuration uses SQLCL to run the scripts, and you need to configure a few additional secure environment variables. After the first build, the downloaded file will be cached. +You can build your own and use it locally, or push to a private docker repository. +The build steps are simple if you already have some experience using Docker. You can find detailed information about how to build your own image with a running database in: [example of creating an image with pre-built DB](https://github.com/oracle/docker-images/blob/master/OracleDatabase/samples/prebuiltdb/README.md) -| Variable | Description | -|----------------------------------------------|-------------------------------------------------------------------------| -| **ORACLE_OTN_USER
ORACLE_OTN_PASSWORD** | _Your Oracle website credentials. They will be used to download SQLCL._ | +> If you are new to Docker, you can start by reading the [Getting Started With Docker](https://docs.docker.com/get-started/) docs. ## New to GIT From 39d36dc1134e598d71114e056cfb0dcff0241012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 16:55:04 +0200 Subject: [PATCH 48/98] Update of sonar-project.properties --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index d088e9ccb..f23e8cf71 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,6 +1,6 @@ # must be unique in a given SonarQube instance sonar.organization=utplsql -sonar.projectKey=utPLSQL +sonar.projectKey=utPLSQL_utPLSQL # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. sonar.projectName=utPLSQL sonar.projectVersion=v3.1.14-develop From ead391da8d88628b47cbbedef268e67d4ed6c111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 17:08:29 +0200 Subject: [PATCH 49/98] Cleanup of build process --- .github/workflows/build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0be56e66d..92dd64549 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,17 +31,14 @@ jobs: db_version_name: '19se' oracle-sid: 'ORCLCDB' oracle-version: "utplsqlv3/oracledb:19c-se2-small" - oracle-base: '/opt/oracle' - id: 2 db_version_name: '21XE' oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" - oracle-base: '/opt/oracle' - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim" - oracle-base: '/opt/oracle' services: html_checker: From e07c6199109faaa3db0071adb3b3621497e9ba89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 17:56:18 +0200 Subject: [PATCH 50/98] Testing sonar scanner updates --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 92dd64549..f4c9da997 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -182,7 +182,7 @@ jobs: with: args: > -Dsonar.buildString=${{ format( '{0}.{1}', env.UTPLSQL_BUILD_VERSION, matrix.id ) }} - -Dsonar.plsql.jdbc.url=${{ format( 'jdbc:oracle:thin:@//oracle:1521/{0}', env.ORACLE_SID ) }} + -Dsonar.plsql.jdbc.url=${{ format( 'jdbc:oracle:thin:@//localhost:1521/{0}', env.ORACLE_SID ) }} -Dsonar.plsql.jdbc.driver.path=${{ format( '{0}/ojdbc8.jar', env.OJDBC_HOME ) }} publish: From 3e3c5603d4e080a704beec7ad9927f76ca8672c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 18:47:53 +0200 Subject: [PATCH 51/98] Attempting to fix 19c install issues --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f4c9da997..1eed2f9b8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,7 +97,8 @@ jobs: - name: Install utPLSQL id: install-utplsql - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh +# run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/install.sh - name: Check code style if: ${{ matrix.id == 1 }} From 229d07242da8d6d479ec403f55afc5c846e25e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:04:12 +0200 Subject: [PATCH 52/98] Change of strategy for installation and execution inside the pipeline. --- .github/workflows/build.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1eed2f9b8..afe3df27b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,39 +97,38 @@ jobs: - name: Install utPLSQL id: install-utplsql -# run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/install.sh - name: Check code style if: ${{ matrix.id == 1 }} id: check-coding-style - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint "$SQLCLI" ${DOCKER_ENV} ${ORACLE_VERSION} $UT3_DEVELOP_SCHEMA/$UT3_DEVELOP_SCHEMA_PASSWORD@//$CONNECTION_STR @development/utplsql_style_check.sql + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash "$SQLCLI" $UT3_DEVELOP_SCHEMA/$UT3_DEVELOP_SCHEMA_PASSWORD@//$CONNECTION_STR @development/utplsql_style_check.sql - name: Validate utPLSQL uninstall if: ${{ matrix.id == 1 }} id: validate-uninstall - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/uninstall_validate_utplsql.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/uninstall_validate_utplsql.sh - name: Reinstall utPLSQL if: ${{ matrix.id == 1 }} id: reinstall-utplsql - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install.sh - name: Create test users id: create-test-users - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/create_test_users.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/create_test_users.sh - name: Install utPLSQL release id: install-utplsql-release - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/install_utplsql_release.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install_utplsql_release.sh - name: Run Examples id: run-examples - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} .github/scripts/run_examples.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/run_examples.sh - name: Install tests id: install-tests - run: docker run --rm -v $(pwd):/utPLSQL -w /utPLSQL --network host --entrypoint bash ${DOCKER_ENV} ${ORACLE_VERSION} test/install_tests.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle test/install_tests.sh - name: Run Tests id: run-tests From 60dff1d596ba3d2700cc0b38b5a7f30bd2aec5ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:19:21 +0200 Subject: [PATCH 53/98] Fixing the utplsql_style_check code --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index afe3df27b..f08ce33cd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -102,7 +102,7 @@ jobs: - name: Check code style if: ${{ matrix.id == 1 }} id: check-coding-style - run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash "$SQLCLI" $UT3_DEVELOP_SCHEMA/$UT3_DEVELOP_SCHEMA_PASSWORD@//$CONNECTION_STR @development/utplsql_style_check.sql + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle "$SQLCLI" ${UT3_DEVELOP_SCHEMA}/${UT3_DEVELOP_SCHEMA_PASSWORD}@//${CONNECTION_STR} @/utPLSQL/development/utplsql_style_check.sql - name: Validate utPLSQL uninstall if: ${{ matrix.id == 1 }} From e97b917bf30c722d69014a87fe94d80685687d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:41:53 +0200 Subject: [PATCH 54/98] Adding debug information to test runner --- .github/workflows/build.yml | 6 +++--- test/run_tests.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f08ce33cd..60c83779c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,17 +97,17 @@ jobs: - name: Install utPLSQL id: install-utplsql - run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/install.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install.sh - name: Check code style if: ${{ matrix.id == 1 }} id: check-coding-style - run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle "$SQLCLI" ${UT3_DEVELOP_SCHEMA}/${UT3_DEVELOP_SCHEMA_PASSWORD}@//${CONNECTION_STR} @/utPLSQL/development/utplsql_style_check.sql + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle "$SQLCLI" ${UT3_DEVELOP_SCHEMA}/${UT3_DEVELOP_SCHEMA_PASSWORD}@//${CONNECTION_STR} @/utPLSQL/development/utplsql_style_check.sql - name: Validate utPLSQL uninstall if: ${{ matrix.id == 1 }} id: validate-uninstall - run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle bash .github/scripts/uninstall_validate_utplsql.sh + run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/uninstall_validate_utplsql.sh - name: Reinstall utPLSQL if: ${{ matrix.id == 1 }} diff --git a/test/run_tests.sh b/test/run_tests.sh index 118bab920..4213b463f 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -4,7 +4,7 @@ set -ev #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@${CONNECTION_STR} \ +time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@${CONNECTION_STR} -d -D \ -source_path=source -owner=ut3_develop \ -p='ut3_tester,ut3_user' \ -test_path=test -c \ From 5fb2c098538a3049ee7d29df99704e799dca2cd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:49:31 +0200 Subject: [PATCH 55/98] Remove profiler run around examples --- examples/RunAllExamples.sql | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/examples/RunAllExamples.sql b/examples/RunAllExamples.sql index faa3388cf..f5f42b7f3 100644 --- a/examples/RunAllExamples.sql +++ b/examples/RunAllExamples.sql @@ -3,22 +3,8 @@ set echo on set feedback on set linesize 1000 -declare - l_run_number binary_integer; -begin - dbms_profiler.start_profiler( run_number => l_run_number); -end; -/ - -- Examples for users @@RunUserExamples.sql -- Framework developer examples @@RunDeveloperExamples.sql - -declare - l_return_code binary_integer; -begin - l_return_code := dbms_profiler.stop_profiler(); -end; -/ From 2e22a4b0551e2a95e591743b03a0edbeb44b327c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 19:57:12 +0200 Subject: [PATCH 56/98] Switch to utPLSQL-cli version 3.1.9 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 60c83779c..38478a425 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -93,7 +93,7 @@ jobs: - name: Install utPLSQL-cli id: install-utplsql-cli - run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/v3.1.8/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli + run: curl -Lk -o utPLSQL-cli.zip "https://github.com/utPLSQL/utPLSQL-cli/releases/download/3.1.9/utPLSQL-cli.zip" && unzip utPLSQL-cli.zip && chmod -R u+x utPLSQL-cli - name: Install utPLSQL id: install-utplsql From 6adb4294ce32d6fe0e71cd0e774bf2a36ee02bec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 20:47:23 +0200 Subject: [PATCH 57/98] Testing other 23-free images --- .github/workflows/build.yml | 12 ++++++++++-- test/run_tests.sh | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 38478a425..2cc3da4e0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,9 +36,17 @@ jobs: oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" - id: 3 - db_version_name: '23free' + db_version_name: '23-slim' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim" + - id: 4 + db_version_name: '23.26.0-slim' + oracle-sid: 'FREEPDB1' + oracle-version: "gvenzl/oracle-free:23.26.0-slim" + - id: 5 + db_version_name: '23-regular' + oracle-sid: 'FREEPDB1' + oracle-version: "gvenzl/oracle-free:23" services: html_checker: @@ -132,7 +140,7 @@ jobs: - name: Run Tests id: run-tests - run: bash test/run_tests.sh + run: test/run_tests.sh #Start Needed to diagnose occasional failures of DB on test runs - name: Prepare diagnostic directory diff --git a/test/run_tests.sh b/test/run_tests.sh index 4213b463f..d1127f87d 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -4,7 +4,7 @@ set -ev #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@${CONNECTION_STR} -d -D \ +time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@//${CONNECTION_STR} -d -D \ -source_path=source -owner=ut3_develop \ -p='ut3_tester,ut3_user' \ -test_path=test -c \ From 71f4911ed3920bff2b6b01b9be6caaf2dfea8219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 21:24:52 +0200 Subject: [PATCH 58/98] Fixing 19c build issues. --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2cc3da4e0..aae9159bd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,6 +23,7 @@ jobs: CONNECTION_STR: ${{ format( '127.0.0.1:1521/{0}', matrix.oracle-sid ) }} ORACLE_PASSWORD: oracle DOCKER_VOLUME: ${{matrix.docker-volume}} + JAVA_TOOL_OPTIONS: '-Doracle:net:disableOob=true' # needed as a workaround for 19c docker connectivity issues. See: https://github.com/gvenzl/oci-oracle-xe/issues/43 strategy: fail-fast: false matrix: From 9278f67f006bd5ab265aa9a5986246b16c24198c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 23:22:17 +0200 Subject: [PATCH 59/98] Fixing 19c build issues. Changed the way docker image is created. See commit: https://github.com/utPLSQL/docker-scripts/commit/0f1b3a4f3e71cdb417b219c3782adf01c4c11744#diff-6d4effe667dc45652da52fb0e218549914006349f7be3da5ab7dc774fbfa53deR85 And issue: https://github.com/gvenzl/oci-oracle-xe/issues/43 --- .github/workflows/build.yml | 1 - test/run_tests.sh | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aae9159bd..2cc3da4e0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,6 @@ jobs: CONNECTION_STR: ${{ format( '127.0.0.1:1521/{0}', matrix.oracle-sid ) }} ORACLE_PASSWORD: oracle DOCKER_VOLUME: ${{matrix.docker-volume}} - JAVA_TOOL_OPTIONS: '-Doracle:net:disableOob=true' # needed as a workaround for 19c docker connectivity issues. See: https://github.com/gvenzl/oci-oracle-xe/issues/43 strategy: fail-fast: false matrix: diff --git a/test/run_tests.sh b/test/run_tests.sh index d1127f87d..9f69bd1a1 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -4,7 +4,7 @@ set -ev #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@//${CONNECTION_STR} -d -D \ +time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@//${CONNECTION_STR} -D \ -source_path=source -owner=ut3_develop \ -p='ut3_tester,ut3_user' \ -test_path=test -c \ From 223f2f73739765f3af75306ed9759b9512bebd7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 8 Mar 2026 23:33:11 +0200 Subject: [PATCH 60/98] Update of pipeline to use 23.26.0 DB version as 23.26.1 was causing problems --- .github/workflows/build.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2cc3da4e0..b10f4ef8f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,17 +36,9 @@ jobs: oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim" - id: 3 - db_version_name: '23-slim' - oracle-sid: 'FREEPDB1' - oracle-version: "gvenzl/oracle-free:23-slim" - - id: 4 - db_version_name: '23.26.0-slim' + db_version_name: '23-free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23.26.0-slim" - - id: 5 - db_version_name: '23-regular' - oracle-sid: 'FREEPDB1' - oracle-version: "gvenzl/oracle-free:23" services: html_checker: @@ -182,7 +174,7 @@ jobs: - name: SonarCloud Scan id: sonar - if: ${{ always() && matrix.db_version_name == '21XE' }} + if: ${{ always() && matrix.db_version_name == '23-free' }} uses: SonarSource/sonarqube-scan-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any From 668c2985421fdcd3dda37bfb910c0f3116f52f04 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 8 Mar 2026 21:39:02 +0000 Subject: [PATCH 61/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index fab85b21d..60233a917 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4206 +4252 diff --git a/docs/about/authors.md b/docs/about/authors.md index 499398993..7790ca3a0 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 03cc286eb..cf433448e 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 5579a943b..259cb7b0f 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 6d68864bd..b7231e190 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index b277c9d16..d02272506 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 45fca1871..7200bfaa9 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 31a91cac2..d733b0142 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 6becefc5c..2883542fa 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index c9015b438..6ca83be3f 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 824aaecd5..121785710 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 54c204d58..5ed52b617 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 1ff54a7d6..a288d34eb 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 9d8167739..3c0b564a7 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 24159fede..a27038eac 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 24d1065fe..ea200df89 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 375a05125..34bc2b71d 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 6fdaa6a48..a3c319315 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4206--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 0e1e0a851..19fb3d0f3 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4206-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4252-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 780d4b17b8c029de7df4e33e8dda7003afb68eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 00:06:23 +0200 Subject: [PATCH 62/98] Adding parameter to allow running a manual build for a Pull Request --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b10f4ef8f..bfda01497 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,6 +6,10 @@ on: branches: [ develop ] workflow_dispatch: + inputs: + pr_number: + description: Pull request number + required: false concurrency: ${{github.ref}} defaults: From 825a6fdb44225680e88d2f4a5cf96f366fbab742 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 8 Mar 2026 22:12:20 +0000 Subject: [PATCH 63/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 60233a917..d3acd1135 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4252 +4253 diff --git a/docs/about/authors.md b/docs/about/authors.md index 7790ca3a0..e9031c587 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index cf433448e..151ffbc09 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 259cb7b0f..9ab358e7e 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index b7231e190..9172ffd73 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index d02272506..d5970b658 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 7200bfaa9..8529cc58b 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index d733b0142..f6b43f37b 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 2883542fa..a690b5627 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 6ca83be3f..bce23f6fb 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 121785710..a3cbb9c56 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 5ed52b617..03f17b058 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index a288d34eb..183b51a43 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 3c0b564a7..8d464cf21 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index a27038eac..45f2b8ca2 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index ea200df89..1739a7c5b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 34bc2b71d..ed1226190 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index a3c319315..011271ef3 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4252--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 19fb3d0f3..d8048e58e 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4252-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4253-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From f27c37c2ef135c5d87744a240c0f87951c3a2005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 00:36:13 +0200 Subject: [PATCH 64/98] Do not push into branch if the build is on a pull request --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bfda01497..04856a894 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -224,6 +224,7 @@ jobs: - name: Push version update to repository id: push-version-number-update + if: ${{ github.event_name != 'pull_request' }} run: | git add sonar-project.properties VERSION BUILD_NO source/* docs/* git commit -m 'Updated project version after build [skip ci]' From 10b589f3df406a2445768310d245372ad749a964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 00:37:23 +0200 Subject: [PATCH 65/98] Do not push into branch if the build is on a pull request --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 04856a894..1fccaf331 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: inputs: pr_number: - description: Pull request number + description: Pull request number (optional) required: false concurrency: ${{github.ref}} From af0ec153e10108641c7124d9b50246a037a0ccc1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 8 Mar 2026 22:49:35 +0000 Subject: [PATCH 66/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index d3acd1135..842b1acc0 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4253 +4258 diff --git a/docs/about/authors.md b/docs/about/authors.md index e9031c587..7f5301bac 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 151ffbc09..b3022f494 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 9ab358e7e..2865e3dd7 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 9172ffd73..813a9b339 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index d5970b658..f0c219240 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 8529cc58b..80fc2f91f 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index f6b43f37b..7651f9e18 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index a690b5627..755ff6c3a 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index bce23f6fb..f4931f432 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index a3cbb9c56..287b078ac 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 03f17b058..5ae611b7d 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 183b51a43..6fd19df5c 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 8d464cf21..7c1d7f9d2 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 45f2b8ca2..9b13c95d0 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 1739a7c5b..41ff8ad29 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index ed1226190..56c8bc387 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 011271ef3..f33d02059 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4253--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index d8048e58e..278834177 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4253-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4258-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 25dd48ba22151523c1d461e200cdacbf9cf9de46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 00:56:51 +0200 Subject: [PATCH 67/98] Reverting unneeded changes for PR builds --- .github/workflows/build.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1fccaf331..b10f4ef8f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,10 +6,6 @@ on: branches: [ develop ] workflow_dispatch: - inputs: - pr_number: - description: Pull request number (optional) - required: false concurrency: ${{github.ref}} defaults: @@ -224,7 +220,6 @@ jobs: - name: Push version update to repository id: push-version-number-update - if: ${{ github.event_name != 'pull_request' }} run: | git add sonar-project.properties VERSION BUILD_NO source/* docs/* git commit -m 'Updated project version after build [skip ci]' From efc5ba87b75e541c41ce500f29e281d7d7aac39a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 8 Mar 2026 23:07:11 +0000 Subject: [PATCH 68/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 842b1acc0..63ac185e9 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4258 +4259 diff --git a/docs/about/authors.md b/docs/about/authors.md index 7f5301bac..c82fedcbf 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index b3022f494..64a1c0b7f 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 2865e3dd7..05c3e91ef 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 813a9b339..5054f4209 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index f0c219240..a3d635866 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 80fc2f91f..eea340c51 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 7651f9e18..cde703327 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 755ff6c3a..3eed598cf 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index f4931f432..aee30ae0e 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 287b078ac..4ece3de5e 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 5ae611b7d..eb8148c22 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 6fd19df5c..d9ba7dba1 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 7c1d7f9d2..6ce52c108 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 9b13c95d0..2bb819610 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 41ff8ad29..0f4ed8d0c 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 56c8bc387..369a4b83e 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index f33d02059..e9bc089a3 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4258--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 278834177..c4a4738d4 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4258-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4259-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From e10f48b99e7a2268bcc135041ef5182ac3a3b1bc Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:18:48 +0000 Subject: [PATCH 69/98] faststart --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d9a20634c..41ccf2942 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,11 +36,11 @@ jobs: - id: 2 db_version_name: '21XE' oracle-sid: 'XE' - oracle-version: "gvenzl/oracle-xe:21-slim" + oracle-version: "gvenzl/oracle-xe:21-slim-faststart" - id: 3 db_version_name: '23free' oracle-sid: 'FREEPDB1' - oracle-version: "gvenzl/oracle-free:23-slim" + oracle-version: "gvenzl/oracle-free:23-slim-faststart" env: ORACLE_PASSWORD: oracle credentials: From 5862a5f613c6d64dda1c6b719fd5d989df972e97 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:24:51 +0000 Subject: [PATCH 70/98] update --- .github/workflows/build.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 41ccf2942..d1af0637c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,7 +32,6 @@ jobs: db_version_name: '19se' oracle-sid: 'ORCLCDB' oracle-version: "utplsqlv3/oracledb:19c-se2-small" - oracle-base: '/opt/oracle' - id: 2 db_version_name: '21XE' oracle-sid: 'XE' @@ -41,20 +40,23 @@ jobs: db_version_name: '23free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim-faststart" + services: + html_checker: + image: ghcr.io/validator/validator:latest + options: >- + -p 8888:8888 + oracle: + image: ${{matrix.oracle-version}} env: ORACLE_PASSWORD: oracle credentials: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASSWORD }} - volumes: - - ${{github.workspace}}:/utPLSQL ports: - 1521:1521 options: >- - --name oracle --health-interval 10s --health-timeout 5s --health-retries 10 + --name oracle --health-cmd healthcheck.sh steps: From 8c6fe6adea87b753a31230c163478c609473ded6 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:25:45 +0000 Subject: [PATCH 71/98] upoate --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d1af0637c..2155b15d6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,6 +50,10 @@ jobs: env: ORACLE_PASSWORD: oracle credentials: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASSWORD }} + volumes: + - ${{github.workspace}}:/utPLSQL ports: - 1521:1521 options: >- From 7ea7198cd21944c56bde8ff2f478bd26acdf5f87 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:26:13 +0000 Subject: [PATCH 72/98] Correct blanks --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2155b15d6..d0a0cb51f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,7 +53,7 @@ jobs: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASSWORD }} volumes: - - ${{github.workspace}}:/utPLSQL + - ${{github.workspace}}:/utPLSQL ports: - 1521:1521 options: >- From 62889256165a233e6025c627daf25b6a56fdad53 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:28:36 +0000 Subject: [PATCH 73/98] Update --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d0a0cb51f..874628682 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -175,7 +175,7 @@ jobs: run: bash .github/scripts/validate_report_files.sh - name: Codecov - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@master with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos files: ./cobertura.xml @@ -290,7 +290,7 @@ jobs: timeout-minutes: 10 steps: - name: Slack Workflow Notification - uses: Gamesight/slack-workflow-status@v1.3.0 + uses: Gamesight/slack-workflow-status@master with: repo_token: ${{secrets.GITHUB_TOKEN}} slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} From f1585ae6cd721e2907c4cdf7402d51bc3b2192c8 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:42:52 +0000 Subject: [PATCH 74/98] Fixing duration --- source/core/types/ut_reporter_base.tpb | 45 +++++++++++++------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/source/core/types/ut_reporter_base.tpb b/source/core/types/ut_reporter_base.tpb index 3f8984331..432bbc7d8 100644 --- a/source/core/types/ut_reporter_base.tpb +++ b/source/core/types/ut_reporter_base.tpb @@ -165,52 +165,53 @@ create or replace type body ut_reporter_base is end; overriding member procedure on_event( self in out nocopy ut_reporter_base, a_event_name varchar2, a_event_item ut_event_item) is + l_event_item ut_event_item := a_event_item; -- ADD THIS LINE begin case a_event_name when ut_event_manager.gc_initialize - then self.on_initialize(treat(a_event_item as ut_run)); + then self.on_initialize(treat(l_event_item as ut_run)); when ut_event_manager.gc_before_run - then self.before_calling_run(treat(a_event_item as ut_run)); + then self.before_calling_run(treat(l_event_item as ut_run)); when ut_event_manager.gc_before_suite - then self.before_calling_suite(treat(a_event_item as ut_logical_suite)); + then self.before_calling_suite(treat(l_event_item as ut_logical_suite)); when ut_event_manager.gc_before_before_all - then self.before_calling_before_all(treat(a_event_item as ut_executable)); + then self.before_calling_before_all(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_before_each - then self.before_calling_before_each(treat(a_event_item as ut_executable)); + then self.before_calling_before_each(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_test - then self.before_calling_test(treat(a_event_item as ut_test)); + then self.before_calling_test(treat(l_event_item as ut_test)); when ut_event_manager.gc_before_before_test - then self.before_calling_before_test(treat(a_event_item as ut_executable)); + then self.before_calling_before_test(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_test_execute - then self.before_calling_test_execute(treat(a_event_item as ut_executable)); + then self.before_calling_test_execute(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_after_test - then self.before_calling_after_test(treat(a_event_item as ut_executable)); + then self.before_calling_after_test(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_after_each - then self.before_calling_after_each(treat(a_event_item as ut_executable)); + then self.before_calling_after_each(treat(l_event_item as ut_executable)); when ut_event_manager.gc_before_after_all - then self.before_calling_after_all(treat(a_event_item as ut_executable)); + then self.before_calling_after_all(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_run - then self.after_calling_run(treat(a_event_item as ut_run)); + then self.after_calling_run(treat(l_event_item as ut_run)); when ut_event_manager.gc_after_suite - then self.after_calling_suite(treat(a_event_item as ut_logical_suite)); + then self.after_calling_suite(treat(l_event_item as ut_logical_suite)); when ut_event_manager.gc_after_before_all - then self.after_calling_before_all(treat(a_event_item as ut_executable)); + then self.after_calling_before_all(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_before_each - then self.after_calling_before_each(treat(a_event_item as ut_executable)); + then self.after_calling_before_each(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_test - then self.after_calling_test(treat(a_event_item as ut_test)); + then self.after_calling_test(treat(l_event_item as ut_test)); when ut_event_manager.gc_after_before_test - then self.after_calling_before_test(treat(a_event_item as ut_executable)); + then self.after_calling_before_test(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_test_execute - then self.after_calling_test_execute(treat(a_event_item as ut_executable)); + then self.after_calling_test_execute(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_after_test - then self.after_calling_after_test(treat(a_event_item as ut_executable)); + then self.after_calling_after_test(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_after_each - then self.after_calling_after_each(treat(a_event_item as ut_executable)); + then self.after_calling_after_each(treat(l_event_item as ut_executable)); when ut_event_manager.gc_after_after_all - then self.after_calling_after_all(treat(a_event_item as ut_executable)); + then self.after_calling_after_all(treat(l_event_item as ut_executable)); when ut_event_manager.gc_finalize - then self.on_finalize(treat(a_event_item as ut_run)); + then self.on_finalize(treat(l_event_item as ut_run)); else null; end case; end; From 5400c7caadac1656613f61a861ffcf429e3aa67c Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:44:29 +0000 Subject: [PATCH 75/98] Correct wrong vrsion --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 874628682..1c38a2ec0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -175,7 +175,7 @@ jobs: run: bash .github/scripts/validate_report_files.sh - name: Codecov - uses: codecov/codecov-action@master + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos files: ./cobertura.xml From fdf4abaef4a02148e9ce8044185a66e0d2cd2f1a Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Sun, 8 Mar 2026 23:59:04 +0000 Subject: [PATCH 76/98] revert --- .github/workflows/build.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1c38a2ec0..5d4c44108 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,7 +37,7 @@ jobs: oracle-sid: 'XE' oracle-version: "gvenzl/oracle-xe:21-slim-faststart" - id: 3 - db_version_name: '23free' + db_version_name: '23-free' oracle-sid: 'FREEPDB1' oracle-version: "gvenzl/oracle-free:23-slim-faststart" services: @@ -116,17 +116,17 @@ jobs: run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install.sh - name: Check code style - if: ${{ matrix.db_version_name == '21XE' }} + if: ${{ matrix.id == 1 }} id: check-coding-style run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle "$SQLCLI" ${UT3_DEVELOP_SCHEMA}/${UT3_DEVELOP_SCHEMA_PASSWORD}@//${CONNECTION_STR} @/utPLSQL/development/utplsql_style_check.sql - name: Validate utPLSQL uninstall - if: ${{ matrix.db_version_name == '21XE' }} + if: ${{ matrix.id == 1 }} id: validate-uninstall run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/uninstall_validate_utplsql.sh - name: Reinstall utPLSQL - if: ${{ matrix.db_version_name == '21XE' }} + if: ${{ matrix.id == 1 }} id: reinstall-utplsql run: docker exec -w /utPLSQL ${DOCKER_ENV} oracle .github/scripts/install.sh @@ -190,15 +190,15 @@ jobs: - name: SonarCloud Scan id: sonar - if: ${{ always() && matrix.db_version_name == '21XE' }} - uses: SonarSource/sonarcloud-github-action@v5.0.0 + if: ${{ always() && matrix.db_version_name == '23-free' }} + uses: SonarSource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: args: > -Dsonar.buildString=${{ format( '{0}.{1}', env.UTPLSQL_BUILD_VERSION, matrix.id ) }} - -Dsonar.plsql.jdbc.url=${{ format( 'jdbc:oracle:thin:@//oracle:1521/{0}', env.ORACLE_SID ) }} + -Dsonar.plsql.jdbc.url=${{ format( 'jdbc:oracle:thin:@//localhost:1521/{0}', env.ORACLE_SID ) }} -Dsonar.plsql.jdbc.driver.path=${{ format( '{0}/ojdbc8.jar', env.OJDBC_HOME ) }} publish: From 83b486ad76231c73a2b734ac72b316f73266b19c Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 00:00:07 +0000 Subject: [PATCH 77/98] update task --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5d4c44108..796017d5c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -191,7 +191,7 @@ jobs: - name: SonarCloud Scan id: sonar if: ${{ always() && matrix.db_version_name == '23-free' }} - uses: SonarSource/sonarcloud-github-action@master + uses: SonarSource/sonarqube-scan-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From 40cbed5a40b6a88b86acb3777b02715e9426f9f1 Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 00:01:24 +0000 Subject: [PATCH 78/98] Update release ver --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 738f4960a..fe8f028c3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -79,7 +79,7 @@ jobs: timeout-minutes: 10 steps: - name: Slack Workflow Notification - uses: Gamesight/slack-workflow-status@v1.3.0 + uses: Gamesight/slack-workflow-status@master with: repo_token: ${{secrets.GITHUB_TOKEN}} slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} From a7b4d84d470bda2382e9079b498786e7170bf1be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 12:50:39 +0200 Subject: [PATCH 79/98] Update source/core/types/ut_reporter_base.tpb --- source/core/types/ut_reporter_base.tpb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/core/types/ut_reporter_base.tpb b/source/core/types/ut_reporter_base.tpb index 432bbc7d8..017dc8971 100644 --- a/source/core/types/ut_reporter_base.tpb +++ b/source/core/types/ut_reporter_base.tpb @@ -165,7 +165,8 @@ create or replace type body ut_reporter_base is end; overriding member procedure on_event( self in out nocopy ut_reporter_base, a_event_name varchar2, a_event_item ut_event_item) is - l_event_item ut_event_item := a_event_item; -- ADD THIS LINE + /* Resolves issue with ORA-21779 being thrown see issue: 1309 -> ( https://github.com/utPLSQL/utPLSQL/issues/1309#issuecomment-4020289898 ) */ + l_event_item ut_event_item := a_event_item; begin case a_event_name when ut_event_manager.gc_initialize From a5ef47631e34fa1d3271a8bbf6bf3e12328bf94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 9 Mar 2026 13:26:52 +0200 Subject: [PATCH 80/98] CONTRIBUTING.md Documentation update --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 744495e76..3cac5c86f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,7 +40,7 @@ Changes are welcome from all members of the Community. # Configuring local environment Your local environment can be of any flavor (Unix/Linux/Windows/Mac). -At minimum you need to have Oracle database 11.2 XE accessible for the project and SYS account access to install and develop utPLSQL. +At minimum, you need to have Oracle database 19c accessible for the project and SYS account access to install and develop utPLSQL. We use four different database accounts (users) for development process. * `ut3` - holds latest released version of utPLSQL. This schema holds the testing framework used for self-testing of utPLSQL development. From 1c85f36ec610d3ab133b0be3b83a872aa186c7c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 9 Mar 2026 11:33:36 +0000 Subject: [PATCH 81/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 63ac185e9..6a22fb16a 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4259 +4280 diff --git a/docs/about/authors.md b/docs/about/authors.md index c82fedcbf..1b31a03bc 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 64a1c0b7f..757e370e8 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 05c3e91ef..265e594b1 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 5054f4209..dac308a65 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index a3d635866..8c88a4d15 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index eea340c51..9b1d31d05 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index cde703327..7c500b509 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 3eed598cf..5a7b71af3 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index aee30ae0e..6bb0738b7 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 4ece3de5e..43b61dc73 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index eb8148c22..5bf9787b1 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index d9ba7dba1..febe7f0c4 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 6ce52c108..766b54b0b 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 2bb819610..77fead32d 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 0f4ed8d0c..839908ca4 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 369a4b83e..fec85d57e 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index e9bc089a3..645f8549f 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4259--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index c4a4738d4..7b14f44ae 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4259-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4280-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From ea7bfd07b85ac57b41a57a79e8adef3c7a7d32e6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 9 Mar 2026 11:43:23 +0000 Subject: [PATCH 82/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 6a22fb16a..0c1460d8f 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4280 +4281 diff --git a/docs/about/authors.md b/docs/about/authors.md index 1b31a03bc..de163c0cf 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 757e370e8..18a13cd81 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 265e594b1..382b0e1c5 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index dac308a65..4a88483a5 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 8c88a4d15..30ad6eaff 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 9b1d31d05..d8ddad0c5 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 7c500b509..3d32b9de6 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 5a7b71af3..d5412673e 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 6bb0738b7..b6b66830d 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 43b61dc73..0ea567077 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 5bf9787b1..3c49f0cb5 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index febe7f0c4..2c86f390e 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 766b54b0b..876a73cf5 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 77fead32d..49c608edf 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 839908ca4..6f8339a52 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index fec85d57e..e9b646142 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 645f8549f..110be8f01 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4280--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 7b14f44ae..939384a85 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4280-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4281-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 7e2b8fb4f83cf26b815e207edf7cad12403f8e8c Mon Sep 17 00:00:00 2001 From: Lukasz Wasylow Date: Mon, 9 Mar 2026 22:19:01 +0000 Subject: [PATCH 83/98] Removing the uncessary setup --- .github/workflows/release.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fe8f028c3..ab043b6eb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,12 +36,6 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" - - name: Setup Python for docs - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' - - name: Build and publish documentation run: | pip install mkdocs From 9ac4a7ed0269773f02b96bc5d5333f9a5a4bf7ab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 10 Mar 2026 06:28:04 +0000 Subject: [PATCH 84/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 0c1460d8f..fda0cb436 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4281 +4298 diff --git a/docs/about/authors.md b/docs/about/authors.md index de163c0cf..3c0117b09 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 18a13cd81..1e030f3f5 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 382b0e1c5..26c89912d 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 4a88483a5..058b84479 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 30ad6eaff..53f4c94aa 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index d8ddad0c5..5de9fb7fb 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 3d32b9de6..0c7c469ee 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index d5412673e..bd09e2d83 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index b6b66830d..0ea6a1208 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 0ea567077..e4143411e 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 3c49f0cb5..bf9f29504 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 2c86f390e..c710607bc 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 876a73cf5..423eccea4 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 49c608edf..bef1e2156 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 6f8339a52..f86bce299 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index e9b646142..750497394 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 110be8f01..9effdcdbc 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4281--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 939384a85..a0d1e612c 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4281-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4298-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 2c8811d6a429d10fc1b026ec73ca0e3da1f2d6da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 15 Mar 2026 12:55:59 +0200 Subject: [PATCH 85/98] Added tests to reproduce the issue. --- test/run_tests.sh | 2 ++ test/ut3_tester/core/test_suite_manager.pks | 2 +- test/ut3_tester_helper/run_helper.pkb | 11 +++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/test/run_tests.sh b/test/run_tests.sh index 9f69bd1a1..7d0431aec 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -4,6 +4,8 @@ set -ev #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" +export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 + time utPLSQL-cli/bin/utplsql run UT3_TESTER_HELPER/ut3@//${CONNECTION_STR} -D \ -source_path=source -owner=ut3_develop \ -p='ut3_tester,ut3_user' \ diff --git a/test/ut3_tester/core/test_suite_manager.pks b/test/ut3_tester/core/test_suite_manager.pks index ac7818f4f..44f102716 100644 --- a/test/ut3_tester/core/test_suite_manager.pks +++ b/test/ut3_tester/core/test_suite_manager.pks @@ -163,7 +163,7 @@ create or replace package test_suite_manager is --%context(get_schema_ut_packages) - --%test(returns list of all unit test packages in given schema) + --%test(returns list of all unit test packages in given schema excluding packages that are not suites) --%beforetest(create_ut3_suite) --%aftertest(drop_ut3_suite) procedure test_get_schema_ut_packages; diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 6289b1642..9d65d6667 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -855,12 +855,23 @@ create or replace package body run_helper is --%test procedure some_test; + end;]'; + execute immediate q'[ + create or replace package ut3_develop.package_that_is_not_a_test + as + --%parameter(a comment inside) + --%parameters( description ) + + --%test + procedure some_test; + end;]'; end; procedure drop_ut3_suite is pragma autonomous_transaction; begin + execute immediate q'[drop package ut3_develop.package_that_is_not_a_test]'; execute immediate q'[drop package ut3_develop.some_test_package]'; end; From f3c0d3f288404b952b8960e93b574342228de09e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 15 Mar 2026 13:12:37 +0200 Subject: [PATCH 86/98] Fixed the problem where `suite_cache_package` and `suite_cache_schema` are getting populated even package is not a suite. --- source/core/ut_suite_cache_manager.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index 6d621c339..e5fdae7ac 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -306,7 +306,7 @@ create or replace package body ut_suite_cache_manager is l_object_owner varchar2(250) := upper(a_object_owner); l_object_name varchar2(250) := upper(a_object_name); begin - if a_suite_items is not null and a_suite_items.count = 0 then + if a_suite_items is null or a_suite_items.count = 0 then delete from ut_suite_cache t where t.object_owner = l_object_owner From b389671cc77cf46004bffd6ad450f129e7a08f46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Sun, 15 Mar 2026 20:53:43 +0200 Subject: [PATCH 87/98] Implementing github discussions --- .github/DISCUSSION_TEMPLATE/README.md | 150 ++++++++++++++++++ .github/DISCUSSION_TEMPLATE/announcements.yml | 54 +++++++ .github/DISCUSSION_TEMPLATE/architecture.yml | 100 ++++++++++++ .github/DISCUSSION_TEMPLATE/contributors.yml | 56 +++++++ .github/DISCUSSION_TEMPLATE/general.yml | 28 ++++ .github/DISCUSSION_TEMPLATE/q-a.yml | 87 ++++++++++ .../DISCUSSION_TEMPLATE/release-planning.yml | 90 +++++++++++ .github/DISCUSSION_TEMPLATE/rfcs-design.yml | 88 ++++++++++ .github/DISCUSSION_TEMPLATE/show-and-tell.yml | 79 +++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 2 +- docs/about/authors.md | 2 +- docs/about/project-details.md | 2 +- mkdocs.yml | 6 +- mkdocs_offline.yml | 4 +- readme.md | 7 +- 15 files changed, 742 insertions(+), 13 deletions(-) create mode 100644 .github/DISCUSSION_TEMPLATE/README.md create mode 100644 .github/DISCUSSION_TEMPLATE/announcements.yml create mode 100644 .github/DISCUSSION_TEMPLATE/architecture.yml create mode 100644 .github/DISCUSSION_TEMPLATE/contributors.yml create mode 100644 .github/DISCUSSION_TEMPLATE/general.yml create mode 100644 .github/DISCUSSION_TEMPLATE/q-a.yml create mode 100644 .github/DISCUSSION_TEMPLATE/release-planning.yml create mode 100644 .github/DISCUSSION_TEMPLATE/rfcs-design.yml create mode 100644 .github/DISCUSSION_TEMPLATE/show-and-tell.yml diff --git a/.github/DISCUSSION_TEMPLATE/README.md b/.github/DISCUSSION_TEMPLATE/README.md new file mode 100644 index 000000000..f6c0905f4 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/README.md @@ -0,0 +1,150 @@ +# GitHub Discussions — setup guide for utPLSQL/utPLSQL + +This folder contains the discussion category form templates that power structured +GitHub Discussions for the utPLSQL project. + +--- + +## File → category mapping + + + +| File | Category name to create in GitHub | Format | Who can post | +|------------------------|-----------------------------------|-----------------------|--------------------------------| +| `announcements.yml` | 📢 Announcements | Announcement | Maintainers only | +| `rfcs-design.yml` | 💡 RFCs & Design | Open-ended discussion | Everyone | +| `architecture.yml` | 🏗 Architecture | Open-ended discussion | Everyone | +| `release-planning.yml` | 🗓 Release Planning | Open-ended discussion | Maintainers only (recommended) | +| `q-a.yml` | ❓ Q&A | Question / Answer | Everyone | +| `show-and-tell.yml` | 🔬 Show & Tell | Open-ended discussion | Everyone | +| `contributors.yml` | 🤝 Contributors | Open-ended discussion | Everyone | +| `general.yml` | 💬 General | Open-ended discussion | Everyone | + +> **Polls** are a built-in GitHub Discussions type and do not support YAML templates. +> Create a 🗳 Polls category manually (type: Poll) — no template file needed. + +--- + +## Step-by-step setup + +### 1. Enable Discussions +Go to **Settings → Features** and check **Discussions**. + +### 2. Create the categories +Go to **Discussions → Categories → ✏️ Edit categories** (gear icon). + +Create each category listed in the table above. +**Order matters** — drag to set the display order shown below: + +1. 📢 Announcements +2. 💡 RFCs & Design +3. 🏗 Architecture +4. 🗓 Release Planning +5. ❓ Q&A +6. 🔬 Show & Tell +7. 🤝 Contributors +8. 🗳 Polls +9. 💬 General + +### 3. Commit the templates +Copy all `.yml` files from this folder into `.github/DISCUSSION_TEMPLATE/` in +the **default branch** (usually `develop` for utPLSQL). + +``` +.github/ +└── DISCUSSION_TEMPLATE/ + ├── announcements.yml + ├── rfcs-design.yml + ├── architecture.yml + ├── release-planning.yml + ├── q-a.yml + ├── show-and-tell.yml + ├── contributors.yml + └── general.yml +``` + +### 4. Configure category permissions + +| Category | Setting | +|------------------|--------------------------------------------------| +| Announcements | Set to **Maintainers only** in category settings | +| Release Planning | Recommended: **Maintainers only** | +| All others | Open to all | + +### 5. Create the welcome pinned post + +Create a first discussion in **Announcements** titled +**"Welcome to utPLSQL Discussions — how to use this space"** + +Suggested body: + +```markdown +## Welcome 👋 + +This is the place for design discussions, feature proposals, and community +conversation around utPLSQL. + +### Where to post + +| I want to… | Use | +|---|---| +| Propose a new feature or behaviour change | 💡 RFCs & Design | +| Discuss internal architecture | 🏗 Architecture | +| Ask a usage / how-to question | ❓ Q&A | +| Share a CI pipeline, integration, or tip | 🔬 Show & Tell | +| Ask about contributing / development setup | 🤝 Contributors | +| Vote on priorities | 🗳 Polls | +| Anything else | 💬 General | + +### Discussions vs Issues + +**Discussions** are for ideas that are still open, need input, or require consensus. +**Issues** are for well-scoped work that someone can pick up and implement. + +A maintainer will convert a Discussion to an Issue once scope is agreed. + +### Real-time chat + +For quick questions: [utPLSQL Slack](https://utplsql.slack.com) +For decisions that need a permanent record: post here. +``` + +Pin this post from the discussion's `…` menu → **Pin discussion**. + +### 6. Update the README + +Add a Discussions badge to the project README: + +```markdown +[![GitHub Discussions](https://img.shields.io/github/discussions/utPLSQL/utPLSQL)](https://github.com/utPLSQL/utPLSQL/discussions) +``` + +And add a short paragraph in the "Community" or "Contributing" section pointing +to Discussions as the place for design proposals. + +--- + +## Operating guidelines + +### Discussion → Issue conversion rule + +| Category | Convert when… | +|---------------|----------------------------------------------------------------------| +| RFCs & Design | Consensus reached, scope is defined | +| Architecture | Breaking change formally agreed by maintainers | +| Q&A | A confirmed bug surfaces in the thread | +| Contributors | A gap in docs or tooling is identified that can be filed as an issue | + +Use the **"Create issue from discussion"** button (available in the discussion's sidebar). + +### Housekeeping + +- Lock **Announcements** threads after 30 days. +- Close **Polls** after 14 days; post a summary comment with the result before closing. +- Label cross-references: apply the same labels used on issues + (`enhancement`, `breaking-change`, `coverage`, `oracle-version`, etc.) + to discussions for consistent search. diff --git a/.github/DISCUSSION_TEMPLATE/announcements.yml b/.github/DISCUSSION_TEMPLATE/announcements.yml new file mode 100644 index 000000000..262746e11 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/announcements.yml @@ -0,0 +1,54 @@ +title: "[Announcement] " +labels: ["announcement"] +body: + - type: markdown + attributes: + value: | + > **Maintainers only.** This category is restricted to project maintainers. + > Announcements are pinned and locked after 30 days. + + - type: dropdown + id: announcement_type + attributes: + label: Announcement type + options: + - New release + - Release candidate / pre-release + - Roadmap update + - Deprecation notice + - Security advisory + - Community / governance update + - Other + validations: + required: true + + - type: input + id: version + attributes: + label: Version (if applicable) + placeholder: "e.g. 3.2.0" + validations: + required: false + + - type: textarea + id: body + attributes: + label: Announcement body + description: | + Write the full announcement here. + For releases, include: highlights, breaking changes, upgrade notes, and a link to the full changelog. + validations: + required: true + + - type: textarea + id: links + attributes: + label: Key links + description: Release tag, changelog, migration guide, Docker image, CLI download, etc. + placeholder: | + - Release: https://github.com/utPLSQL/utPLSQL/releases/tag/v… + - Changelog: … + - Docker: … + - CLI: … + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/architecture.yml b/.github/DISCUSSION_TEMPLATE/architecture.yml new file mode 100644 index 000000000..f3df8e29c --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/architecture.yml @@ -0,0 +1,100 @@ +title: "[Architecture] " +labels: ["architecture", "design"] +body: + - type: markdown + attributes: + value: | + ## Architecture discussion + Use this template for internal design decisions: changes to the suite-loading mechanism, + the coverage engine, DDL trigger behaviour, reporter infrastructure, or any + cross-cutting concern that affects the internals of utPLSQL. + + This category is primarily for **contributors and maintainers**. + If you want to propose a user-facing feature, use **RFCs & Design** instead. + + - type: input + id: title_short + attributes: + label: Component / area + description: Which internal component or subsystem does this discussion concern? + placeholder: "e.g. Suite loader, Coverage engine, Annotation parser, Event system" + validations: + required: true + + - type: textarea + id: context + attributes: + label: Context and current design + description: Briefly describe how the relevant part works today. + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem or design question + description: What specific decision needs to be made, or what limitation needs to be addressed? + validations: + required: true + + - type: textarea + id: options + attributes: + label: Options under consideration + description: | + List the design options you are weighing. For each option describe: + - How it works + - Pros + - Cons + - Impact on Oracle compatibility + placeholder: | + **Option A — …** + How: … + Pros: … + Cons: … + + **Option B — …** + How: … + Pros: … + Cons: … + validations: + required: true + + - type: textarea + id: preferred + attributes: + label: Preferred direction (if any) + description: If you already lean toward one option, say so and why. Leave blank if genuinely open. + validations: + required: false + + - type: dropdown + id: breaking + attributes: + label: Does this introduce a breaking change? + options: + - "No" + - "Yes — public API change (ut_runner, ut packages, annotations)" + - "Yes — output/reporter format change" + - "Yes — internal package change (no public API impact)" + - "Unsure" + validations: + required: true + + - type: textarea + id: migration + attributes: + label: Migration / compatibility notes + description: If breaking, describe the migration path for users and downstream integrations. + validations: + required: false + + - type: checkboxes + id: checklist + attributes: + label: Checklist + options: + - label: I have reviewed the existing architecture docs and source + required: true + - label: Relevant unit / integration tests have been considered + required: false diff --git a/.github/DISCUSSION_TEMPLATE/contributors.yml b/.github/DISCUSSION_TEMPLATE/contributors.yml new file mode 100644 index 000000000..6325961de --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/contributors.yml @@ -0,0 +1,56 @@ +title: "[Contributors] " +labels: ["contributors"] +body: + - type: markdown + attributes: + value: | + ## Contributors + Questions about **contributing to utPLSQL** — development environment setup, + the test suite, pull request process, coding conventions, or anything else + that helps you get your first (or next) contribution merged. + + **Useful links before posting:** + - [CONTRIBUTING.md](../../blob/develop/CONTRIBUTING.md) + - [Development environment setup](../../blob/develop/docs/development/developer-guide.md) + - [Open issues labelled `good first issue`](../../issues?q=is%3Aopen+label%3A%22good+first+issue%22) + + - type: dropdown + id: topic + attributes: + label: Topic + options: + - Dev environment / Docker setup + - Running the test suite locally + - Understanding the codebase + - PR review process + - Coding conventions / style + - Good first issue — looking for guidance + - Release process + - Documentation contribution + - Other + validations: + required: true + + - type: textarea + id: question + attributes: + label: Question or request + description: What do you need help with? + validations: + required: true + + - type: textarea + id: context + attributes: + label: What you have tried + description: Steps already taken, error messages, links to relevant code, etc. + validations: + required: false + + - type: input + id: os + attributes: + label: Host OS / environment + placeholder: "e.g. macOS 14, Windows 11, Ubuntu 22.04, Docker on Linux" + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml new file mode 100644 index 000000000..0e3b8d100 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -0,0 +1,28 @@ +title: "" +labels: ["general"] +body: + - type: markdown + attributes: + value: | + ## General discussion + For open-ended conversations that don't fit another category: + project direction, community topics, suggestions, or anything else. + + If your post turns out to be a feature proposal, a maintainer may move it to + **RFCs & Design**. If it is a question about using utPLSQL, consider posting + in **Q&A** instead so a helpful answer can be marked. + + - type: textarea + id: body + attributes: + label: What's on your mind? + validations: + required: true + + - type: textarea + id: context + attributes: + label: Additional context + description: Background, links, related issues or discussions. + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/q-a.yml b/.github/DISCUSSION_TEMPLATE/q-a.yml new file mode 100644 index 000000000..e4ff1d452 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/q-a.yml @@ -0,0 +1,87 @@ +title: "[Q&A] " +labels: ["question"] +body: + - type: markdown + attributes: + value: | + ## Question & Answer + Ask anything about **using** utPLSQL — installation, writing tests, CI integration, + reporters, annotations, code coverage, etc. + + **Tips for a fast answer:** + - Include your utPLSQL version and Oracle version. + - Paste a minimal reproducer (test package + expected vs actual output). + - Check the [documentation](https://utplsql.github.io/utPLSQL/) and + [closed Q&A discussions](../../discussions/categories/q-a?discussions_q=is%3Aclosed) first. + + > If this turns out to be a **bug**, a maintainer will convert this discussion into an Issue. + + - type: input + id: utplsql_version + attributes: + label: utPLSQL version + placeholder: "e.g. 3.1.13" + validations: + required: true + + - type: dropdown + id: oracle_version + attributes: + label: Oracle version + options: + - Oracle 11g + - Oracle 12c + - Oracle 18c + - Oracle 19c + - Oracle 21c + - Oracle 23c / 23ai + - Other / unsure + validations: + required: true + + - type: textarea + id: question + attributes: + label: Question + description: Describe what you are trying to do and what you have tried so far. + validations: + required: true + + - type: textarea + id: reproducer + attributes: + label: Minimal reproducer + description: | + Paste a minimal test package and/or the relevant ut_runner call. + Include the full error message or unexpected output if applicable. + render: sql + validations: + required: false + + - type: textarea + id: expected + attributes: + label: Expected behaviour + validations: + required: false + + - type: textarea + id: actual + attributes: + label: Actual behaviour / error + validations: + required: false + + - type: dropdown + id: install_method + attributes: + label: Installation method + options: + - utPLSQL-cli + - SQL*Plus script + - Docker / utPLSQL-docker + - Liquibase / Flyway + - Other + - N/A + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/release-planning.yml b/.github/DISCUSSION_TEMPLATE/release-planning.yml new file mode 100644 index 000000000..5663d7613 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/release-planning.yml @@ -0,0 +1,90 @@ +title: "[Release] v" +labels: ["release-planning"] +body: + - type: markdown + attributes: + value: | + ## Release planning discussion + Use this template to discuss the scope of an upcoming release: + what goes in, what gets deferred, and what the acceptance criteria are. + + **Maintainers:** pin this discussion and link it from the corresponding GitHub Milestone. + + - type: input + id: version + attributes: + label: Target version + placeholder: "e.g. 3.2.0" + validations: + required: true + + - type: dropdown + id: release_type + attributes: + label: Release type + options: + - Major (breaking changes) + - Minor (new features, backward-compatible) + - Patch (bug fixes only) + validations: + required: true + + - type: textarea + id: goals + attributes: + label: Release goals + description: What are the 2–4 key things this release should achieve? + placeholder: | + 1. + 2. + 3. + validations: + required: true + + - type: textarea + id: scope_in + attributes: + label: In scope (proposed issues / PRs) + description: | + Link the GitHub Issues and PRs targeted for this release. + Use the format: `- [ ] #123 — short description` + placeholder: | + - [ ] #123 — ... + - [ ] #456 — ... + validations: + required: false + + - type: textarea + id: scope_out + attributes: + label: Out of scope / explicitly deferred + description: Issues that were considered but will not be included — and why. + validations: + required: false + + - type: input + id: target_date + attributes: + label: Target release date (approximate) + placeholder: "e.g. 2025-Q2" + validations: + required: false + + - type: textarea + id: oracle_matrix + attributes: + label: Oracle version test matrix + description: Which Oracle versions must pass CI before this release ships? + placeholder: | + - [ ] Oracle 19c + - [ ] Oracle 21c + - [ ] Oracle 23ai + validations: + required: false + + - type: textarea + id: notes + attributes: + label: Additional notes + validations: + required: false diff --git a/.github/DISCUSSION_TEMPLATE/rfcs-design.yml b/.github/DISCUSSION_TEMPLATE/rfcs-design.yml new file mode 100644 index 000000000..32c0a33c7 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/rfcs-design.yml @@ -0,0 +1,88 @@ +title: "[RFC] " +labels: ["rfc", "design"] +body: + - type: markdown + attributes: + value: | + ## Request for Comments — design proposal + Use this template to propose a new feature, a change to existing behaviour, or a significant refactoring. + Once there is consensus and a clear scope, a maintainer will convert this discussion into one or more GitHub Issues. + + **Before posting:** search existing RFCs and open issues to avoid duplicates. + + - type: input + id: summary + attributes: + label: Summary + description: One sentence — what are you proposing? + placeholder: "Add support for ..." + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem / motivation + description: What problem does this solve? Who is affected and how often? + placeholder: | + Currently, when ... it is not possible to ... + This forces users to ... + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: Describe the solution in as much detail as you have. Pseudo-code, SQL, or PL/SQL snippets are welcome. + placeholder: | + ```sql + -- example of the proposed API + ``` + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: What other approaches did you look at? Why did you rule them out? + validations: + required: false + + - type: textarea + id: breaking + attributes: + label: Breaking-change impact + description: | + Does this change affect existing annotations, package APIs, or test output formats? + List affected public symbols (ut_runner, ut, annotations, reporters …). + validations: + required: false + + - type: dropdown + id: oracle_versions + attributes: + label: Oracle version relevance + description: Which Oracle versions does this apply to? + multiple: true + options: + - All supported versions + - Oracle 11g + - Oracle 12c + - Oracle 18c + - Oracle 19c + - Oracle 21c + - Oracle 23c / 23ai + validations: + required: true + + - type: checkboxes + id: checklist + attributes: + label: Checklist + options: + - label: I have searched existing discussions and issues for duplicates + required: true + - label: I am willing to help implement or review this feature + required: false diff --git a/.github/DISCUSSION_TEMPLATE/show-and-tell.yml b/.github/DISCUSSION_TEMPLATE/show-and-tell.yml new file mode 100644 index 000000000..4443c5de6 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/show-and-tell.yml @@ -0,0 +1,79 @@ +title: "[Show & Tell] " +labels: ["show-and-tell"] +body: + - type: markdown + attributes: + value: | + ## Show & Tell + Share how you are using utPLSQL in the wild — CI pipelines, IDE integrations, + custom reporters, coverage setups, framework wrappers, or anything else the + community might learn from. + + Posts here are a great source of real-world examples for the documentation. + + - type: input + id: title_short + attributes: + label: What are you sharing? + placeholder: "e.g. utPLSQL + GitHub Actions CI pipeline for Oracle 23ai" + validations: + required: true + + - type: dropdown + id: category + attributes: + label: Category + multiple: true + options: + - CI/CD integration + - IDE / SQL client integration + - Custom reporter + - Code coverage setup + - Framework wrapper / helper library + - Docker / containerised testing + - Annotation patterns + - Performance / large test suite + - Other + validations: + required: true + + - type: textarea + id: description + attributes: + label: Description + description: Describe what you built or configured and why it might be useful to others. + validations: + required: true + + - type: textarea + id: snippet + attributes: + label: Code or configuration snippet + description: Paste the most relevant excerpt. Link to a repo or Gist if you have one. + render: yaml + validations: + required: false + + - type: input + id: utplsql_version + attributes: + label: utPLSQL version used + placeholder: "e.g. 3.1.13" + validations: + required: false + + - type: input + id: oracle_version + attributes: + label: Oracle version + placeholder: "e.g. Oracle 19c" + validations: + required: false + + - type: textarea + id: links + attributes: + label: Links + description: Repository, blog post, documentation page, etc. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 681bc7f3a..f0335781e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -23,4 +23,4 @@ Add any other context or screenshots about the feature request here. > Please do not create issues for generic SQL or PL/SQL questions. There are other forums and communities to help you with those. See [ASKTom](https://asktom.oracle.com) for example. **Want to discuss** -If you want to discuss your issue, join [our SLACK chat](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww). +If you want to discuss a problem, please go to [utPLSQL discussions](https://github.com/utPLSQL/utPLSQL/discussions) diff --git a/docs/about/authors.md b/docs/about/authors.md index 3c0117b09..f752302de 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -20,7 +20,7 @@ Many thanks to all the [contributors](https://github.com/utPLSQL/utPLSQL/graphs/ ### Special thanks to prior major contributors -- Steven Feuerstein - Original Author +- Steven Feuerstein - Original Author of utPLSQL v1 and v2 - Chris Rimmer - Patrick Barel - Paul Walker diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 26c89912d..976f8bc99 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -4,7 +4,7 @@ [![chat](http://img.shields.io/badge/GitHub_Project-Active-blue.svg)](https://github.com/utPLSQL/utPLSQL) [![license](http://img.shields.io/badge/license-apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0) -[![chat](http://img.shields.io/badge/chat-slack-blue.svg)](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww) +[![GitHub Discussions](https://img.shields.io/github/discussions/utPLSQL/utPLSQL)](https://github.com/utPLSQL/utPLSQL/discussions) [![twitter](https://img.shields.io/twitter/follow/utPLSQL.svg?style=social&label=Follow)](https://twitter.com/utPLSQL) diff --git a/mkdocs.yml b/mkdocs.yml index 713722620..49356fd4e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,7 +8,7 @@ edit_uri: "" site_url: http://utPLSQL.org/ site_name: utPLSQL-framework site_description: utPLSQL Ultimate Testing Framework for Oracle PL/SQL & SQL -copyright: Copyright © 2016 - 2022 utPLSQL Team +copyright: Copyright © 2016 - 2026 utPLSQL Team repo_url: https://github.com/utPLSQL/utPLSQL extra_css: - stylesheets/extra.css @@ -44,8 +44,8 @@ extra: social: - icon: fontawesome/brands/twitter link: https://twitter.com/utPLSQL - - icon: fontawesome/brands/slack - link: https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww + - icon: fontawesome/regular/comment + link: https://github.com/utPLSQL/utPLSQL/discussions - icon: fontawesome/brands/github link: https://github.com/utPLSQL - icon: fontawesome/solid/envelope diff --git a/mkdocs_offline.yml b/mkdocs_offline.yml index 31c90615e..9f0ef57af 100644 --- a/mkdocs_offline.yml +++ b/mkdocs_offline.yml @@ -44,8 +44,8 @@ extra: social: - icon: fontawesome/brands/twitter link: https://twitter.com/utPLSQL - - icon: fontawesome/brands/slack - link: https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww + - icon: fontawesome/regular/comment + link: https://github.com/utPLSQL/utPLSQL/discussions - icon: fontawesome/brands/github link: https://github.com/utPLSQL - icon: fontawesome/solid/envelope diff --git a/readme.md b/readme.md index 3c2d7fb3a..a8523b4d7 100644 --- a/readme.md +++ b/readme.md @@ -5,7 +5,7 @@ [![license](https://img.shields.io/github/license/utPLSQL/utPLSQL.svg)](https://www.apache.org/licenses/LICENSE-2.0) [![latest-release](https://img.shields.io/github/release/utPLSQL/utPLSQL.svg)](https://github.com/utPLSQL/utPLSQL/releases) [![Download statistics](https://img.shields.io/github/downloads/utPLSQL/utPLSQL/total.svg)](http://gra.caldis.me/?url=https://github.com/utPLSQL/utPLSQL) -[![chat](http://img.shields.io/badge/slack-team--chat-blue.svg)](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww) +[![GitHub Discussions](https://img.shields.io/github/discussions/utPLSQL/utPLSQL)](https://github.com/utPLSQL/utPLSQL/discussions) [![twitter](https://img.shields.io/twitter/follow/utPLSQL.svg?style=social&label=Follow)](https://twitter.com/utPLSQL) [![build](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml/badge.svg)](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml) @@ -161,8 +161,7 @@ Finished in .036027 seconds We welcome new developers to join our community and contribute to the utPLSQL project. If you are interested in helping please read our [guide to contributing](CONTRIBUTING.md) The best place to start is to read the documentation and get familiar with the existing code base. -A [slack chat](https://utplsql.slack.com/) is the place to go if you want to talk with team members. -To sign up to the chat use [this link](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww). +[Github discussions](https://github.com/utPLSQL/utPLSQL/discussions) is the place to go if you want to talk with team members. ---------- @@ -183,8 +182,6 @@ __Project Directories__ ---------- -If you have a great feature in mind, that you would like to see in utPLSQL v3 please create an [issue on GitHub](https://github.com/utPLSQL/utPLSQL/issues) or discuss it with us in the [slack chat rooms](https://utplsql.slack.com/). Use [invite link](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww) to join the chat. - # Version 2 to Version 3 Comparison From 707fadd55cc93b475efaf30ebc00382d4468b20c Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Mon, 16 Mar 2026 10:49:55 +0100 Subject: [PATCH 88/98] Added empty lines at the end --- source/reporters/ut_tap_reporter.tpb | 2 +- source/reporters/ut_tap_reporter.tps | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/reporters/ut_tap_reporter.tpb b/source/reporters/ut_tap_reporter.tpb index 5a75fcac8..ff095a369 100644 --- a/source/reporters/ut_tap_reporter.tpb +++ b/source/reporters/ut_tap_reporter.tpb @@ -121,4 +121,4 @@ create or replace type body ut_tap_reporter is self.lvl := 0; end; end; -/ \ No newline at end of file +/ diff --git a/source/reporters/ut_tap_reporter.tps b/source/reporters/ut_tap_reporter.tps index e38d809f9..bed809059 100644 --- a/source/reporters/ut_tap_reporter.tps +++ b/source/reporters/ut_tap_reporter.tps @@ -15,4 +15,4 @@ create or replace type ut_tap_reporter under ut_documentation_reporter( ) not final -/ \ No newline at end of file +/ From e539ed0981c204580f596985b16ad097a3894451 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Mar 2026 11:00:19 +0000 Subject: [PATCH 89/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index fda0cb436..22543040d 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4298 +4339 diff --git a/docs/about/authors.md b/docs/about/authors.md index f752302de..4f1e4c0b7 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 1e030f3f5..717cc388a 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 976f8bc99..b69bf3235 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 058b84479..9383d5c01 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 53f4c94aa..b5b393656 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 5de9fb7fb..fdfe3c26b 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 0c7c469ee..4b5be5595 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index bd09e2d83..1688ea95e 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 0ea6a1208..10a75ebed 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index e4143411e..078973d65 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index bf9f29504..2bbcbcf12 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index c710607bc..5488dc66f 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 423eccea4..3416f60bc 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index bef1e2156..4c9bef2ef 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index f86bce299..6d2e166e9 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 750497394..6f216032d 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 9effdcdbc..a4449fa26 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4298--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index a0d1e612c..2e220f148 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4298-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4339-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 93e3b1ad4754a894f04be1a43346973df142a586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 16 Mar 2026 13:03:42 +0200 Subject: [PATCH 90/98] Removing the uncessary setup of Python --- .github/workflows/build.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 796017d5c..be6e18ca2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -247,12 +247,6 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" - - name: Setup Python for docs - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' - - name: Build and publish documentation run: | pip install mkdocs From 0dda69a2de27e183d935245385dc434425467937 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Mar 2026 11:27:46 +0000 Subject: [PATCH 91/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index 22543040d..f60afa776 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4339 +4340 diff --git a/docs/about/authors.md b/docs/about/authors.md index 4f1e4c0b7..a996db919 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 717cc388a..cc562f01d 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index b69bf3235..2631bae92 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 9383d5c01..670377f05 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index b5b393656..616eeeb8f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index fdfe3c26b..e2e9cf4c3 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 4b5be5595..9e240b337 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 1688ea95e..054875070 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 10a75ebed..c6c6a94c8 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 078973d65..b5b119fba 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 2bbcbcf12..b723bb29b 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 5488dc66f..253d6aec2 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 3416f60bc..ac2064011 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 4c9bef2ef..66dca6bf3 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 6d2e166e9..79e9d8fa7 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 6f216032d..3fc402e56 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index a4449fa26..1a5c9ed05 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4339--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 2e220f148..22d43aece 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4339-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4340-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From e1d039dffadb69bdf3f4d87670e8a43e789f9508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 16 Mar 2026 14:24:32 +0200 Subject: [PATCH 92/98] Update of documentation to remove references to SLACK. --- docs/about/support.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/about/support.md b/docs/about/support.md index 670377f05..e628c86a7 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -2,5 +2,6 @@ # How to get support -- Feel free to post questions, bugs or issues in the [issues area of GitHub](https://github.com/utPLSQL/utPLSQL/issues) -- [Join](https://join.slack.com/t/utplsql/shared_invite/zt-xwm68udy-4cF_3PNEyczYEbWr38W5ww) developers team on [utPLSQL Slack](https://utplsql.slack.com/) +- Look into [utPLSQL github discussions](https://github.com/utPLSQL/utPLSQL/discussions) to find support, ask questions and share ideas +- If needed open a new [issue on github](https://github.com/utPLSQL/utPLSQL/issues) for bugs or feature requests + From adeedf1091ea24010640103714d267a422f0c2ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Mar 2026 12:30:47 +0000 Subject: [PATCH 93/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index f60afa776..cbc92e381 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4340 +4341 diff --git a/docs/about/authors.md b/docs/about/authors.md index a996db919..45d729d3d 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index cc562f01d..37c7ed3b8 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 2631bae92..9765acd75 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index e628c86a7..feb3051b4 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 616eeeb8f..ebe93b0fe 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index e2e9cf4c3..caefa6622 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 9e240b337..b56c3622e 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 054875070..3ea8a286b 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index c6c6a94c8..18583b6b0 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index b5b119fba..cecb2bdfd 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index b723bb29b..3e5cd70c2 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 253d6aec2..15ec2b881 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index ac2064011..9da2da1c8 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 66dca6bf3..829f8bcac 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 79e9d8fa7..f46556c22 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 3fc402e56..bb39a331c 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 1a5c9ed05..68bcab1f4 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4340--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 22d43aece..32555e6aa 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4340-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4341-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 92336cb3ca454b43fba3512e2b6c92d58b7212b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Mon, 16 Mar 2026 18:19:48 +0200 Subject: [PATCH 94/98] Update badge --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index a8523b4d7..1ca252558 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,7 @@ [![twitter](https://img.shields.io/twitter/follow/utPLSQL.svg?style=social&label=Follow)](https://twitter.com/utPLSQL) [![build](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml/badge.svg)](https://github.com/utPLSQL/utPLSQL/actions/workflows/build.yml) -[![QualityGate](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=utPLSQL) +[![QualityGate](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=utPLSQL_utPLSQL) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=utPLSQL_utPLSQL&metric=coverage)](https://sonarcloud.io/summary/new_code?id=utPLSQL_utPLSQL) ---------- From c36fbb31401bb7678f7a0477b31c30035c278b50 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Mar 2026 16:26:31 +0000 Subject: [PATCH 95/98] Updated project version after build [skip ci] --- BUILD_NO | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/BUILD_NO b/BUILD_NO index cbc92e381..2bfcb2370 100644 --- a/BUILD_NO +++ b/BUILD_NO @@ -1 +1 @@ -4341 +4342 diff --git a/docs/about/authors.md b/docs/about/authors.md index 45d729d3d..2c2abf826 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 37c7ed3b8..0485779e5 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 9765acd75..81e4f976e 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index feb3051b4..4ac661e10 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index ebe93b0fe..459bc9535 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ## What is utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index caefa6622..c0cbffb0e 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index b56c3622e..3dc42e429 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) Annotations are used to configure tests and suites in a declarative way similar to modern OOP languages. This way, test configuration is stored along with the test logic inside the test package. No additional configuration files or tables are needed for test cases. The annotation names are based on popular testing frameworks such as JUnit. diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 3ea8a286b..45be3be59 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) The following are best practices we at utPLSQL have learned about PL/SQL and Unit Testing. diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 18583b6b0..adf36baa6 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting uses package DBMS_PROFILER (and DBMS_PLSQL_CODE_COVERAGE on Oracle database version 12.2 and above) provided with Oracle database. Code coverage is gathered for the following source types: diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index cecb2bdfd..e042d61ed 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) utPLSQL is responsible for handling exceptions wherever they occur in the test run. The framework is trapping most of the exceptions so that the test execution is not affected by individual tests or test packages throwing an exception. The framework provides a full stacktrace for every exception that was thrown. The reported stacktrace does not include any utPLSQL library calls in it. diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 3e5cd70c2..0ea5e2e73 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ## Expectation concepts diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 15ec2b881..cd4feb46a 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 9da2da1c8..6724ac6ab 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ## Supported database versions diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 829f8bcac..0cdc2d7fa 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) ## Obtaining information about suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index f46556c22..fe9143fe7 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) utPLSQL provides several reporting formats. The sections below describe most of them. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index bb39a331c..28e02d5b8 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) utPLSQL framework provides two main entry points to run unit tests from within the database: diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 68bcab1f4..818a592bc 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.14.4341--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.14.4342--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 32555e6aa..9615c7b4d 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.14.4341-develop'; + gc_version constant varchar2(50) := 'v3.1.14.4342-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 7ddbacc4b02faadb614e2855758724d47f99dc75 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 17 Mar 2026 11:34:59 +0100 Subject: [PATCH 96/98] Added tests for contexts and suites --- test/ut3_user/reporters/test_tap_reporter.pkb | 34 +++++++++++++++++-- test/ut3_user/reporters/test_tap_reporter.pks | 8 ++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index 87ec1dd9d..ed10a5aaf 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -159,7 +159,7 @@ create or replace package body test_tap_reporter as end escape_multiple_characters_test_name; - procedure special_characters_in_deisabled_reason as + procedure special_characters_in_disabled_reason as l_output_data ut3_develop.ut_varchar2_list; l_expected varchar2(32767); begin @@ -170,7 +170,7 @@ create or replace package body test_tap_reporter as from table(ut3_develop.ut.run('test_tap_escaping.not_skipping_escapes',ut3_develop.ut_tap_reporter())); ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); - end special_characters_in_deisabled_reason; + end special_characters_in_disabled_reason; procedure special_characters_in_comment as @@ -187,6 +187,36 @@ create or replace package body test_tap_reporter as end special_characters_in_comment; + procedure context_as_commented_subtests as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%# Subtest: A suite for testing different outcomes from reporters%# Subtest: A description of some context%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.passing_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + + end context_as_commented_subtests; + + + procedure suitepath_as_chopped_subtests as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[.*# Subtest: org.*1\s{5}# Subtest: utplsql.*1\s{9}# Subtest: tests.*1\s{13}# Subtest: helpers.*1\s{17}# Subtest: A suite for testing different outcomes from reporters.*]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_reporters.passing_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected, 'n'); + + end suitepath_as_chopped_subtests; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index aef27fa0a..d24c76e32 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -31,11 +31,17 @@ create or replace package test_tap_reporter as procedure escape_multiple_characters_test_name; --%test(Disabled Test with special characters in disable reason) - procedure special_characters_in_deisabled_reason; + procedure special_characters_in_disabled_reason; --%test(Don't escape special characters in comment) procedure special_characters_in_comment; + --%test(Include context as commented subtests) + procedure context_as_commented_subtests; + + --%test(Suitepath as chopped subtests) + procedure suitepath_as_chopped_subtests; + --%afterall procedure drop_help_tests; From 3d38fbe72cf28bd2b8af08bd8fb4e2d3b92122b4 Mon Sep 17 00:00:00 2001 From: Jakob Drees Date: Tue, 17 Mar 2026 11:50:51 +0100 Subject: [PATCH 97/98] Added TAP subtests to documentation --- docs/images/tap_reporter_suitepath.png | Bin 0 -> 43331 bytes docs/userguide/reporters.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 docs/images/tap_reporter_suitepath.png diff --git a/docs/images/tap_reporter_suitepath.png b/docs/images/tap_reporter_suitepath.png new file mode 100644 index 0000000000000000000000000000000000000000..488c7cfbf9486c2e641177c61ad6480e8546af4f GIT binary patch literal 43331 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 Date: Tue, 17 Mar 2026 11:58:37 +0100 Subject: [PATCH 98/98] Added test for including context when it only contains skipped tests --- test/ut3_user/reporters/test_tap_reporter.pkb | 28 +++++++++++++++++++ test/ut3_user/reporters/test_tap_reporter.pks | 3 ++ 2 files changed, 31 insertions(+) diff --git a/test/ut3_user/reporters/test_tap_reporter.pkb b/test/ut3_user/reporters/test_tap_reporter.pkb index ed10a5aaf..786c53ee0 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pkb +++ b/test/ut3_user/reporters/test_tap_reporter.pkb @@ -20,6 +20,14 @@ create or replace package body test_tap_reporter as --%test(Escaped Comments) procedure escaped_comments; + + --%context(Some context) + + --%test(Another disabled test) + --%disabled + procedure another_disabled_test; + + --%endcontext end test_tap_escaping; ]'; @@ -42,6 +50,11 @@ create or replace package body test_tap_reporter as dbms_output.put_line('This \ and # should not be escaped, and this not as well!!!'); ut.expect(1).to_equal(1); end escaped_comments; + + procedure another_disabled_test as + begin + ut.expect(10).to_equal(1); + end; end test_tap_escaping; ]'; @@ -217,6 +230,21 @@ create or replace package body test_tap_reporter as end suitepath_as_chopped_subtests; + procedure include_context_with_skipped_tests as + l_output_data ut3_develop.ut_varchar2_list; + l_expected varchar2(32767); + begin + l_expected := q'[%# Subtest: Some context%]'; + + select * + bulk collect into l_output_data + from table(ut3_develop.ut.run('test_tap_escaping.another_disabled_test',ut3_develop.ut_tap_reporter())); + + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + + end include_context_with_skipped_tests; + + procedure drop_help_tests as pragma autonomous_transaction; begin diff --git a/test/ut3_user/reporters/test_tap_reporter.pks b/test/ut3_user/reporters/test_tap_reporter.pks index d24c76e32..27f9651bc 100644 --- a/test/ut3_user/reporters/test_tap_reporter.pks +++ b/test/ut3_user/reporters/test_tap_reporter.pks @@ -42,6 +42,9 @@ create or replace package test_tap_reporter as --%test(Suitepath as chopped subtests) procedure suitepath_as_chopped_subtests; + --%test(Include context with only skipped tests in output) + procedure include_context_with_skipped_tests; + --%afterall procedure drop_help_tests;