{"id":30138432,"url":"https://github.com/tanoconsulting/euts","last_synced_at":"2026-04-13T08:31:50.717Z","repository":{"id":61510793,"uuid":"311687089","full_name":"tanoconsulting/euts","owner":"tanoconsulting","description":"eZPlatform Ultimate Test Stack","archived":false,"fork":false,"pushed_at":"2023-05-09T18:11:12.000Z","size":313,"stargazers_count":2,"open_issues_count":8,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-30T03:48:46.194Z","etag":null,"topics":["ci","continuous-integration","ezplatform","ezpublish","symfony-bundle","testing"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tanoconsulting.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-11-10T14:39:38.000Z","updated_at":"2024-01-12T18:16:14.000Z","dependencies_parsed_at":"2025-08-11T01:14:18.770Z","dependency_job_id":"e45d4de5-f068-4e0c-acb1-e7e19e7e52b6","html_url":"https://github.com/tanoconsulting/euts","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/tanoconsulting/euts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanoconsulting%2Feuts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanoconsulting%2Feuts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanoconsulting%2Feuts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanoconsulting%2Feuts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tanoconsulting","download_url":"https://codeload.github.com/tanoconsulting/euts/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanoconsulting%2Feuts/sbom","scorecard":{"id":868105,"data":{"date":"2025-08-11","repo":{"name":"github.com/tanoconsulting/euts","commit":"fdd4c1693b679fd6d6c6a1aabfc3fa43341be698"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: docker/images/ez/Dockerfile:4","Warn: containerImage not pinned by hash: docker/images/mysql/Dockerfile:4","Warn: containerImage not pinned by hash: docker/images/postgresql/Dockerfile:3","Warn: npmCommand not pinned by hash: bin/setup/ez-config.sh:319","Warn: downloadThenRun not pinned by hash: docker/images/ez/root/build/getnode.sh:37","Warn: downloadThenRun not pinned by hash: docker/images/ez/root/build/getnode.sh:37","Info:   0 out of   3 containerImage dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned","Info:   0 out of   2 downloadThenRun dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}}]},"last_synced_at":"2025-08-24T03:19:58.777Z","repository_id":61510793,"created_at":"2025-08-24T03:19:58.777Z","updated_at":"2025-08-24T03:19:58.777Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31746101,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T06:26:45.479Z","status":"ssl_error","status_checked_at":"2026-04-13T06:26:44.645Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ci","continuous-integration","ezplatform","ezpublish","symfony-bundle","testing"],"created_at":"2025-08-11T01:14:10.533Z","updated_at":"2026-04-13T08:31:50.695Z","avatar_url":"https://github.com/tanoconsulting.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"The eZPlatform Ultimate Test Stack\n==================================\n\nMakes it easy to run _integration_ or _functional_ tests for Ibexa DXP/eZPlatform/eZPublish bundles, both locally (via\nDocker) and on popular CI services (supported: Travis and GitHub Actions), by setting up automatically the CMS and\ndatabase, with all required dependencies.\n\nThe target users are developers of bundles for Ibexa/eZPlatform/eZPublish, who want to make sure their code works with\na specific version of the CMS and database, or on a combination of versions.\n\nFeatures:\n\n* allows to run your bundle's tests on any version of eZPublish-Community, eZPlatform 1, eZPlatform 2, eZPlatform 3 and Ibexa 4\n* allows to run your bundle's tests on multiple versions of Ibexa/eZPlatform/eZPublish from a single source directory\n* allows specifying extra composer packages to be installed and symfony bundles or legacy extensions to be activated\n* allows to run your bundle's tests on many versions of PHP\n* allows to run your bundle's tests on many versions of MySQL/MariaDB (Docker execution only)\n* allows to run your bundle's tests on many versions of Debian/Ubuntu as underlying OS (Docker execution only)\n* provides a single command-line tool for managing the test stack and running tests, including maintenance operations\n  such as database reset, logs cleanup, etc... (Docker execution only)\n* it even allows to test pure-legacy eZ4 extensions on eZPublish-Community\n\nIt works by:\n1. setting up a set of Docker Containers as test environment, with all the components required to run eZ (php, mysql, nodejs, etc...)\n2. downloading and setting up the desired version of eZP and creating the database with the stock schema definition.\nAt this point, the testsuite of the bundle in question can be executed.\n\nStep 1 can be omitted when the tests are run on a server/vm which already has php/mysql installed, such as a CI environment\n(only Ubuntu/Debian servers are supported in that case).\n\nNot (yet) supported:\n- running tests on PostgreSQL instead of MySQL: this is a work in progress\n- running tests which require eZ to be set up with Redis or Memcached: this is a work in progress; see the FAQ later for details\n- running browser-based tests: this has not yet been tested\n\nRequirements\n------------\n\n* Git (for a quick way to download this tool)\n* Bash shell, and a smattering of command-line tools such as `which`, `find`, etc...\n\nFor running tests in Docker containers:\n* Docker version 1.13 or later\n* Docker Compose version 1.x (NB: Docker Compose v2 is not supported yet)\n\nFor running tests without Docker: see the requirements for the version of eZPlatform that you intend to use, including\na database server.\n\nInstallation\n------------\n\nTo install in the `teststack` directory:\n\n    git clone --depth 1 https://github.com/tanoconsulting/euts.git teststack\n\nNote that you can use any other name for the folder where this tool will be installed - it can even be outside your\nproject's root directory.\n\nNote that you might want to check out a specific tag/release of this bundle instead of `main`, to make your CI tests\nrun reliably over time.\n\nQuick Start\n-----------\n\n0. write some tests for your bundle, which can be executed from the command-line\n\n1. create a test stack configuration file\n\n   The test stack is configured by defining environment variables. You will need to set values at the very least for\n   EZ_PACKAGES and EZ_BUNDLES - those are the Composer packages that are required to run your tests and the Symfony\n   bundles that will be loaded in the eZP kernel.\n\n   In order to simplify the management of all the environment variables, the test stack supports usage of a \"dot env\"\n   configuration file, holding values for all the variables you require. Using such a file is a recommended practice.\n   The default name for the configuration file is `.euts.env`.\n\n       touch .euts.env\n\n   Add to the configuration file all required values - the full list of available config variables and their purpose is\n   found in [.euts.env.example](./.euts.env.example). Some example configuration files can be found in the\n   _doc/config_examples_ folder. A note for bundles running on Ibexa DXP: it is recommended _not_ to include `symfony/flex`\n   in the EZ_PACKAGES list, as doing so will result in a polluted top-level directory when building the test stack.\n\n   You can choose to use a different file name or location than `./.euts.env`, in which case you would have to tell it\n   to the `teststack` command, either via usage of the `-e` option, or by setting the environment variable TESTSTACK_CONFIG_FILE.\n\n2. make sure that your project's `composer.json` is compatible with the Test Stack:\n\n   * if you are using phpunit for your tests, your composer.json file should have it in the `require-dev` section\n   * the `require-dev` section should not contain the packages defined in the EZ_PACKAGES config variable (this\n     commonly includes the eZPlatform bundle)\n   * if you are running tests with either eZPublish 5 or the Legacy-Bridge, you should have this configuration:\n\n         \"extra\": {\n             \"ezpublish-legacy-dir\": \"vendor/ezsystems/ezpublish-legacy\"\n         },\n\n   * if you are running tests with eZPublish 5 / CP, and you are getting errors with composer install about\n     roave/security-advisories, add this to composer.json:\n\n         \"repositories\": [\n             {\n                 \"type\": \"vcs\",\n                 \"url\": \"https://github.com/kaliop-uk/SecurityAdvisoriesNoConflicts\",\n                 \"no-api\": true\n             }\n         ],\n\n     and add to the `require-dev` section the following:\n\n          \"roave/security-advisories\": \"dev-disablechecks as dev-master\"\n\n   * if you are running tests with eZPublish CP, and you are getting errors with composer install about\n     behat bundle and ez kernel version, add this to composer.json:\n\n         \"repositories\": [\n             {\n                 \"type\": \"vcs\",\n                 \"url\": \"https://github.com/gggeek/BehatBundle\",\n                 \"no-api\": true\n             }\n         ],\n\n     and require version \u003e= 5.4.2\n\n   * depending on the version of eZP in use, when using the `behat` Symfony environment to run tests, extra bundles will\n     need to be installed, such as `ezsystems/behatbundle`, `sensio/generator-bundle` or `overblog/graphiql-bundle`\n\n3. build the tests stack\n\n       ./teststack/teststack build\n\n   NB: this will take a long time. Also, it is recommended to have available a fast internet connection and lots of disk\n   space.\n\n4. run your tests\n\n       ./teststack/teststack runtests My/Test/Folder\n\n   To make sure that the eZ database is reset and the eZ caches are cleaned on each test run, use:\n\n       ./teststack/teststack -r runtests My/Test/Folder\n\n   NB: this currently assumes that your test suite uses PhpUnit, and that phpunit is part of composer's `require-dev` section.\n   If your tests are driven by any other command, you can use instead:\n\n       ./teststack/teststack exec My/Test/Script\n\n5. stop the test stack\n\n       ./teststack/teststack stop\n\n6. commit the `.euts.env` file into version control. Don't forget to add the `/teststack` folder to your .gitignore file\n   to avoid accidentally committing it to your project's source code\n\n7. Set up your tests to be run on GitHub Actions\n\n   The test stack is available as a custom github action, which can be easily integrated into a GHA workflow. See an\n   example [github_actions.yml](doc/config_examples/github_actions.yml) configuration file.\n\n   Note that, to perform tests on GitHub workers, it is not necessary to run the whole tests stack - for most scenarios\n   eZ can be set up and the test suite execute without building and starting Docker containers.\n   If on the other hand you prefer to run the tests using containers inside the workers, you are free to do that.\n\n8. Set up your tests to be run on Travis\n\n   See an example configuration [.travis.yml](doc/config_examples/.travis.yml) file\n\n   Note that, to perform tests on Travis, it is not necessary to run the whole tests stack - for most scenarios eZ\n   can be set up and the test suite execute without building and starting Docker containers.\n\n\nTroubleshooting\n---------------\n\n* Useful commands if the Test Stack fails building:\n\n      ./teststack/teststack ps\n      ./teststack/teststack logs\n\n* How to run the Symfony console:\n\n       ./teststack/teststack console\n\n* How to connect to the database:\n\n       ./teststack/teststack dbconsole\n\n  (note that the mysql client will be running within the test container, so the path it will 'see' for reading/writing\n  files are not the same as the ones in the host computer).\n\n* How to start a shell session in the container where tests are executed:\n\n      ./teststack/teststack enter\n\n  once you are in the container, an easy way to run the Symfony console, regardless of the eZ version installed, is:\n\n      ../teststack/bin/sfconsole.sh\n\n* If you get an error 'Could not authenticate against github.com', you can set in the .euts.env file something like:\n\n      COMPOSER_AUTH='{\"github-oauth\": {\"github.com\": \"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"}}'\n\nHow It Works\n------------\n\n### Integration tests vs. unit tests\n\n...\n\n### What is the deal with composer.json\n\n...\n\n### What is the deal with the vendor folder?\n\n...\n\n### Build vs. Setup phases\n\n...\n\n### Directory layout on the host\n\n    - Bundle folder (root)\n        - .euts.env (can be in other locations as well)\n        - teststack (can be in other locations as well)\n            - ...\n        - vendor (appears as a broken symlink, but it works within the container!)\n        - vendor_xxx\n            - ezsystems\n                - ezplatform (for eZPlatform)\n                - ezpublish-community (for eZPublish-Community)\n                - ezpublish-legacy (for eZPublish-Community or eZPlatform with LegacyBrdige)\n                - ...\n            - ibexa (for Ibexa DXP)\n                - ...\n            - ... (other dependencies)\n        - ... (your bundle code)\n\n### Directory layout within the eZ (test) Container\n\n    - /home/test\n        - teststack (mount of the 'teststack' host folder)\n            - ...\n        - workspace (mount of the 'bundle root' host folder)\n            - vendor (symlink to vendor_xxx)\n            - vendor_xxx\n            - ...\n\nAdvanced Usage\n--------------\n\n### Defining a Test Matrix: running tests against multiple versions of eZPlatform\n\n...\n\n### Running tests on PostgreSQL\n\n...\n\n### Using custom php configuration for your tests\n\n...\n\n### Using custom Symfony configuration for your tests\n\n...\n\nFAQ\n---\n\nQ: Which Symfony environment is used to run the tests?\n\nA: by default we run all tests and symfony commands using the `behat` symfony environment.\n   You can change this by setting a value for APP_ENV or SYMFONY_ENV in your .euts config file, but be warned that, at\n   least for the moment, the automatic setting up of the configuration files to make eZP work within the test stack\n   environment will still be done for the `behat` symfony environment.\n\nQ: Which eZ Siteaccesses are available to run the tests?\n\nA: behat_site, behat_site_admin as well as behat_site_legacy_admin for eZPublish5 and Legacy-Bridge\n\nQ: What is installed out of the box in the test Container?\n\nA: besides php, you get apache, git, memcached, nodejs, redis, varnish.\n   Installed php extensions are: curl gd intl json memcached mysql pgsql xdebug xsl.\n\nQ: does the test stack provide any phpunit TestCase class or other php helper code with specific support for eZ?\n\nA: no. The goal of the test stack is to allow bundle developers to be able to quickly have a working eZ installation\n   and ake it easy to troubleshoot it. The choice of a testing framework / workflow / pattern is left to each developer.\n   There is a list of bundles using the test stack, provided below, which do have fe. examples of phunit TestCase classes\n   specifically developed to ease execution of symfony console commands.\n   What is provided as part of the test stack is an easy way to reset the eZ database between test runs.\n\nQ: Why not use the Docker containers definition from eZPlatform?\n\nA: Because we have to be able to test against eZPublish-Community, as well as eZPlatform 1 and eZPlatform 2, which do not\n   come with Docker Containers in their source code\n\nQ: Why can't I install the Test Stack via Composer?\n\nA: because of the way we handle installation of Composer dependencies, this tool would have to be installed _before_ all\n   other dependencies as well as in a _separate_ vendor folder. It thus makes little sense to use Composer for it\n\nQ: My tests need to run with eZ configured to use Redis/Memcached for cache (or other). Is it possible?\n\nA: both Redis and Memcached are installed in the test container, and you can provide custom Symfony configuration that\n   is only activated during testing, to make sure that any of those two is used.\n   Otoh this has not been tested yet, and it is possible that you will need to start the Redis/Memcached service by hand.\n\nQ: When I run `teststack start`, there is a long wait while the script says only `Waiting for ez ...` - can I troubleshoot\n   what is going on at that time?\n\nA: sure. Start a second shell, go to the project's folder and run `./teststack/teststack logs ez`\n\nQ: Do you know of any bundles which do make use of this one for testing, so that I can explore how they do it?\n\nA: sure. At least the following ones: https://github.com/kaliop-uk/ezmigrationbundle,\n    https://github.com/kaliop-uk/ezworkflowenginebundle, https://github.com/kaliop-uk/ezloreimpsumbundle,\n    https://github.com/kaliop/ezobjectwrapper, https://github.com/tanoconsulting/ezmigrationbundle2,\n    https://github.com/tanoconsulting/ibexa-migration-bundle or https://github.com/gggeek/ezdbintegrity\n\nQ: When I run the tests on GitHub using Actions, I get an error `Could not authenticate against github.com `\n\nA: in that case, change the action's yml config to pass automatically GitHub's credentials to Composer:\n\n        -\n            run: './teststack/bin/setup.sh'\n            env:\n                GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\nQ: Are there other projects that you know of that have similar goals as this package?\n\nA: certainly there are. Ones that I know of are f.e. https://github.com/Plopix/symfony-bundle-app-wrapper and\n   https://github.com/g1a/composer-test-scenarios\n\nQ: Are you testing this Test Stack itself?\n\nA: inception!!! ;-) In fact, yes, we do to test it, using Github Actions\n\n[![Build Status](https://github.com/tanoconsulting/euts/actions/workflows/ci.yml/badge.svg)](https://github.com/tanoconsulting/euts/actions/workflows/ci.yml)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanoconsulting%2Feuts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanoconsulting%2Feuts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanoconsulting%2Feuts/lists"}