PROD-22452: Add scenario in filter community events behat test for di… #139
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: 'Behat' | |
# Controls when the workflow will run | |
on: | |
# Triggers the workflow on all pull request events | |
pull_request: { } | |
# Trigger workflow for release branches. | |
push: | |
branches: | |
- main | |
- "[0-9]+.[0-9]+.x" | |
# github.head_ref is only set when the workflow was triggered by a pull_request and it contains the value of the source branch of the PR. | |
# github.ref_name will than only be used if the workflow was not triggered by a pull_request and it also just contains the branch name. | |
env: | |
BRANCH_NAME: ${{ github.head_ref || github.ref_name }} | |
# A workflow run is made up of one or more jobs that can run sequentially or in parallel | |
jobs: | |
feature_discovery: | |
name: "Feature Discovery" | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- run: sudo apt-get install jq | |
- name: Find feature files | |
id: set-matrix | |
run: | | |
echo -n "features=" >> $GITHUB_OUTPUT | |
cd tests/behat/features/capabilities | |
find * -type d -exec sh -c "ls {} | grep '\.feature$' > /dev/null" ';' -print | jq -R -s -c 'split("\n") | map(select(length > 0))' >> $GITHUB_OUTPUT | |
outputs: | |
features: ${{ steps.set-matrix.outputs.features }} | |
install_open_social: | |
name: "Install Open Social" | |
runs-on: ubuntu-22.04 | |
container: | |
image: goalgorilla/open_social_docker:ci-php7 | |
volumes: | |
- ${{ github.workspace }}:/var/www | |
strategy: | |
matrix: | |
update: | |
- "" | |
- "update" | |
with_optional: | |
- "" | |
- "with-optional" | |
services: | |
db: | |
image: mariadb:10.7 | |
env: | |
MYSQL_ROOT_PASSWORD: root | |
MYSQL_DATABASE: social | |
mailcatcher: | |
image: schickling/mailcatcher | |
env: | |
VIRTUAL_HOST: mailcatcher.social.dev | |
VIRTUAL_PORT: 1080 | |
ports: | |
- "1080" | |
redis: | |
image: redis:latest | |
defaults: | |
run: | |
shell: bash | |
working-directory: /var/www | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
path: ${{ github.workspace }}/tmp | |
# Checkout Drupal Social. | |
- name: Prepare composer | |
run: | | |
cp tmp/tests/composer.json composer.json | |
- name: Set-up the previous major version of Open Social and update to HEAD | |
if: ${{ matrix.update == 'update' }} | |
run: | | |
set -e | |
apt-get install -y jq | |
# This gets all version info from composer for Open Social. We then | |
# use jq to traverse and manipulate the JSON data to find ourselves | |
# the last stable major version before the current stable major | |
# version. | |
PREVIOUS_MAJOR=`composer info -a --format json goalgorilla/open_social | jq '.versions | map(select(contains("-") == false)) | map(split(".")[0] | tonumber) | unique | reverse | .[1]'` | |
echo "Setting up update test from Open Social $PREVIOUS_MAJOR" | |
composer require goalgorilla/open_social:^$PREVIOUS_MAJOR | |
# Installation | |
# This is purposefully duplicated because we may change how | |
# installation works between major versions, so this provides us the | |
# flexibility to reflect that in the workflow. | |
cp tmp/tests/default.settings.php /var/www/html/sites/default/default.settings.php | |
mkdir /var/www/files_private | |
export OPTIONAL="" | |
if [[ "${{ matrix.with_optional }}" == "with-optional" ]]; then | |
export OPTIONAL="social_module_configure_form.select_all='TRUE'" | |
fi | |
drush site-install -y social --db-url=mysql://root:root@db:3306/social $OPTIONAL install_configure_form.update_status_module='array(FALSE,FALSE)' --site-name='Open Social'; | |
# Create swiftmailer-spool directory for behat tests | |
if [[ ! -d /var/www/html/profiles/contrib/social/tests/behat/features/swiftmailer-spool ]]; then | |
mkdir /var/www/html/profiles/contrib/social/tests/behat/features/swiftmailer-spool | |
fi | |
chown -R www-data:www-data /var/www/html/profiles/contrib/social/tests/behat/features/swiftmailer-spool | |
chmod +w -R /var/www/html/profiles/contrib/social/tests/behat/features/swiftmailer-spool | |
# Make sure swiftmailer is configured for our CI. | |
drush cset -y swiftmailer.transport transport 'smtp' | |
drush cset -y swiftmailer.transport smtp_host 'mailcatcher' | |
drush cset -y swiftmailer.transport smtp_port 1025 | |
# Dump the database to our test-output folder so that we can locally | |
# debug if the update fails. | |
mkdir -p behat-test-output | |
if [[ "${{ matrix.with_optional }}" == "with-optional" ]]; then | |
drush sql-dump > behat-test-output/pre-update-with-optional.sql | |
else | |
drush sql-dump > behat-test-output/pre-update.sql | |
fi | |
# Composer has special handling for "version-like" branch names | |
if [[ $BRANCH_NAME =~ [0-9]+\.[0-9]+\.x ]]; then | |
export OPEN_SOCIAL_VERSION=$BRANCH_NAME-dev | |
else | |
export OPEN_SOCIAL_VERSION=dev-$BRANCH_NAME | |
fi | |
# We update the composer.json manually using jq and then update with composer | |
# This is because there's a difference in composer's dependency resolution through | |
# require --update-* and update. That difference can cause require to consider | |
# transient dependencies locked when they shouldn't be. | |
jq "(.require.\"goalgorilla/open_social\") |= \"$OPEN_SOCIAL_VERSION\"" < composer.json > composer.json.tmp | |
mv composer.json.tmp composer.json | |
composer update --with-all-dependencies | |
vendor/bin/drush updb -y | |
- name: Set-up a new Open Social installation at HEAD | |
if: ${{ matrix.update == '' }} | |
run: | | |
set -e | |
# Composer has special handling for "version-like" branch names | |
if [[ $BRANCH_NAME =~ [0-9]+\.[0-9]+\.x ]]; then | |
composer require goalgorilla/open_social:$BRANCH_NAME-dev | |
else | |
composer require goalgorilla/open_social:dev-$BRANCH_NAME | |
fi | |
# Installation | |
# This is purposefully duplicated because we may change how | |
# installation works between major versions, so this provides us the | |
# flexibility to reflect that in the workflow. | |
cp tmp/tests/default.settings.php /var/www/html/sites/default/default.settings.php | |
mkdir /var/www/files_private | |
export OPTIONAL="" | |
if [[ "${{ matrix.with_optional }}" == "with-optional" ]]; then | |
export OPTIONAL="social_module_configure_form.select_all='TRUE'" | |
fi | |
drush site-install -y social --db-url=mysql://root:root@db:3306/social $OPTIONAL install_configure_form.update_status_module='array(FALSE,FALSE)' --site-name='Open Social'; | |
# Create swiftmailer-spool directory for behat tests | |
if [[ ! -d /var/www/html/profiles/contrib/social/tests/behat/features/swiftmailer-spool ]]; then | |
mkdir /var/www/html/profiles/contrib/social/tests/behat/features/swiftmailer-spool | |
fi | |
chown -R www-data:www-data /var/www/html/profiles/contrib/social/tests/behat/features/swiftmailer-spool | |
chmod +w -R /var/www/html/profiles/contrib/social/tests/behat/features/swiftmailer-spool | |
# Make sure swiftmailer is configured for our CI. | |
drush cset -y swiftmailer.transport transport 'smtp' | |
drush cset -y swiftmailer.transport smtp_host 'mailcatcher' | |
drush cset -y swiftmailer.transport smtp_port 1025 | |
- name: Clean up checkout | |
run: rm -r tmp | |
- name: Dump Database | |
run: drush sql:dump --result-file=../installation.sql | |
- name: Fix owner of web files | |
run: chown -R www-data:www-data /var/www | |
- name: Package up site | |
uses: actions/cache@v3 | |
with: | |
path: ${{ github.workspace }} | |
key: ${{ github.sha }}-test-setup-${{ matrix.update}}${{ matrix.with_optional }} | |
- name: Upload Installation database | |
if: failure() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: behat-test-output | |
path: behat-test-output | |
# This workflow contains a single job called "Running tests" | |
tests: | |
needs: [feature_discovery, install_open_social] | |
name: 'Tests' | |
runs-on: ubuntu-22.04 | |
container: | |
image: goalgorilla/open_social_docker:ci | |
volumes: | |
- ${{ github.workspace }}:/var/www | |
strategy: | |
fail-fast: false | |
matrix: | |
feature: ${{ fromJson(needs.feature_discovery.outputs.features) }} | |
update: | |
- "" | |
- "update" | |
with_optional: | |
- "" | |
- "with-optional" | |
services: | |
web: | |
image: goalgorilla/open_social_docker:ci | |
env: | |
DRUPAL_SETTINGS: production | |
volumes: | |
- ${{ github.workspace }}:/var/www | |
ports: | |
- "80" | |
db: | |
image: mariadb:10.7 | |
env: | |
MYSQL_ROOT_PASSWORD: root | |
MYSQL_DATABASE: social | |
mailcatcher: | |
image: schickling/mailcatcher | |
env: | |
VIRTUAL_HOST: mailcatcher.social.dev | |
VIRTUAL_PORT: 1080 | |
ports: | |
- "1080" | |
redis: | |
image: redis:latest | |
chrome: | |
# We use an image based on zenika/alpine-chrome:latest so we can add | |
# the start-up arguments that we need. | |
image: kingdutch/social-docker-chrome | |
ports: | |
- '9222:9222' | |
defaults: | |
run: | |
shell: bash | |
working-directory: /var/www | |
steps: | |
- name: Download Site | |
uses: actions/cache@v3 | |
with: | |
path: ${{ github.workspace }} | |
key: ${{ github.sha }}-test-setup-${{ matrix.update}}${{ matrix.with_optional }} | |
# We could run all tests at once by passing the folder directly to behat | |
# however, by doing this manually in a loop we have the ability to ensure | |
# each test runs against a clean database cheaply. | |
- name: Run Integration test | |
run: | | |
export TEST_DATABASE=`pwd`/installation.sql | |
vendor/bin/behat --version | |
for test in html/profiles/contrib/social/tests/behat/features/capabilities/${{ matrix.feature }}/*.feature; do | |
if head -n1 $test | grep -q "@disabled"; then | |
echo "$test - Skipping disabled test" | |
continue | |
fi | |
# If we're testing a clean install (i.e. not updating) then ignore | |
# any tests that have opted out of install testing. | |
if [[ -z "${{ matrix.update }}" ]]; then | |
export TAGS="--tags=~no-install" | |
# Do the same when we are testing with an update. | |
else | |
export TAGS="--tags=~no-update" | |
fi | |
# Tests with the @no-database tag import their own scaffold so they | |
# ignore the databases provided by our test matrix, that's why we | |
# only run them once when all our matrix values are off. | |
if [[ ! -z "${{ matrix.update }}" ]] || [[ ! -z "${{ matrix.with_optional }}" ]]; then | |
export TAGS="$TAGS&&~no-database" | |
fi | |
echo "::group::$test" | |
# Run in subshell to make the test command visible and copyable. | |
(set -x; vendor/bin/behat -vv --config html/profiles/contrib/social/tests/behat/behat.yml --colors --allow-empty $TAGS $test) | |
echo "::endgroup::" | |
done | |
- name: Move test artifacts into upload folder | |
if: failure() | |
run: | | |
set -e | |
# Make the output folder | |
if [[ ! -z "${{ matrix.update }}" ]] && [[ ! -z "${{ matrix.with_optional }}" ]]; then | |
export OUTPUT_FOLDER=behat-test-output/${{ matrix.feature }}/update-with-optional | |
elif [[ ! -z "${{ matrix.update }}" ]]; then | |
export OUTPUT_FOLDER=behat-test-output/${{ matrix.feature }}/update | |
elif [[ ! -z "${{ matrix.with_optional }}" ]]; then | |
export OUTPUT_FOLDER=behat-test-output/${{ matrix.feature }}/with-optional | |
else | |
export OUTPUT_FOLDER=behat-test-output/${{ matrix.feature }} | |
fi | |
mkdir -p $OUTPUT_FOLDER | |
# Move test results to the output folder if they exist | |
if (shopt -s nullglob; f=(tests/behat/logs/*); ((${#f[@]}))); then | |
mv html/profiles/contrib/social/tests/behat/logs/* $OUTPUT_FOLDER/ | |
fi | |
# Copy the installation database to the output folder | |
# this makes local reproduction easier. | |
cp `pwd`/installation.sql $OUTPUT_FOLDER/ | |
# Dump the database with the state of the test failure to allow for | |
# local inspection. | |
drush sql-dump > $OUTPUT_FOLDER/at-test-failure.sql | |
- name: Upload Behat Test Output | |
if: failure() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: behat-test-output | |
path: behat-test-output |