#!/bin/bash set -ex ## Setup a Drupal site with CiviCRM configured for unit-testing. ## If a site already exists, destroy and recreate it. ## Usage: mk-drupal-test-site ## Pre-requisites: ## - MySQL admin credentials in ~/.my.cnf ## - Apache vhost with mod_rewrite, etc ## - DNS or /etc/hosts entries for "url" ## - Drupal source tree ## - CiviCRM source tree (outside the drupal root) ## - makepasswd ## - drush ## - (strongly recommended) filesystem with "acl" support SITE_URL="$1" DB_NAME="$2" DB_USER="$DB_NAME" DB_PASS=$(makepasswd --chars=12) DB_HOST=localhost DRUPAL_ROOT="$3" CIVI_ROOT="$4" FACL_USERS="www-data $(whoami)" SITE_KEY=$(makepasswd --chars=16) ADMIN_USER="admin" ADMIN_PASS=$(makepasswd --chars=12) if [ -z "$CIVI_ROOT" -o ! -d "$CIVI_ROOT/bin" ]; then echo "Failed to locate civi root: $CIVI_ROOT" exit 1 fi if [ -z "$DB_NAME" ]; then echo "Missing database name" exit 2 fi ## Create database echo "DROP DATABASE IF EXISTS $DB_NAME" | mysql echo "CREATE DATABASE $DB_NAME" | mysql echo "GRANT ALL ON ${DB_NAME}.* TO '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}'" | mysql echo "GRANT SUPER ON *.* TO '${DB_USER}'@'localhost'" | mysql ## Create Drupal site pushd "$DRUPAL_ROOT" if [ -d "sites/$SITE_URL" ]; then chmod u+w "sites/$SITE_URL" rm -rf "sites/$SITE_URL" fi drush site-install -y \ --db-url="mysql://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME}" \ --account-name="$ADMIN_USER" \ --account-pass="$ADMIN_PASS" \ --sites-subdir="$SITE_URL" chmod u+w "sites/$SITE_URL" ## Allow shell and WWW users to both manipulate "files" directory if which setfacl; then for FACL_USER in $FACL_USERS ; do find "$DRUPAL_ROOT/sites/${SITE_URL}/files" -type d | xargs setfacl -m u:${FACL_USER}:rwx -m d:u:${FACL_USER}:rwx done fi ## Create Drupal-CiviCRM dirs and config for SUBDIR in modules files files/civicrm files/civicrm/templates_c ; do if [ ! -d "sites/${SITE_URL}/${SUBDIR}" ]; then mkdir "sites/${SITE_URL}/${SUBDIR}" fi done ln -s "$CIVI_ROOT" "sites/$SITE_URL/modules/" cat "$CIVI_ROOT/templates/CRM/common/civicrm.settings.php.tpl" \ | sed "s;%%baseURL%%;http://${SITE_URL};" \ | sed "s;%%cms%%;Drupal;" \ | sed "s;%%CMSdbHost%%;${DB_HOST};" \ | sed "s;%%CMSdbName%%;${DB_NAME};" \ | sed "s;%%CMSdbPass%%;${DB_PASS};" \ | sed "s;%%CMSdbUser%%;${DB_USER};" \ | sed "s;%%crmRoot%%;${DRUPAL_ROOT}/sites/${SITE_URL}/modules/civicrm;" \ | sed "s;%%dbHost%%;${DB_HOST};" \ | sed "s;%%dbName%%;${DB_NAME};" \ | sed "s;%%dbPass%%;${DB_PASS};" \ | sed "s;%%dbUser%%;${DB_USER};" \ | sed "s;%%siteKey%%;${SITE_KEY};" \ | sed "s;%%templateCompileDir%%;${DRUPAL_ROOT}/sites/${SITE_URL}/files/civicrm/templates_c;" \ > "sites/$SITE_URL/civicrm.settings.php" echo >> "sites/$SITE_URL/civicrm.settings.php" echo "define('CIVICRM_MAIL_LOG', '/dev/null');" >> "sites/$SITE_URL/civicrm.settings.php" popd ## Create CiviCRM config cat > "$CIVI_ROOT/bin/setup.conf" << EOF SVNROOT="$CIVI_ROOT" CIVISOURCEDIR="$CIVI_ROOT" SCHEMA=schema/Schema.xml DBNAME="$DB_NAME" DBUSER="$DB_USER" DBPASS="$DB_PASS" DBARGS="" PHP5PATH= DBLOAD= # DBADD= EOF cat > "$CIVI_ROOT/tests/phpunit/CiviTest/civicrm.settings.local.php" << EOF "$CIVI_ROOT/tests/phpunit/CiviTest/CiviSeleniumSettings.php" << EOF fullSandboxPath = \$this->sandboxURL . \$this->sandboxPATH; } } EOF pushd "$CIVI_ROOT" ./bin/setup.sh popd pushd "$DRUPAL_ROOT" drush -l "${SITE_URL}" -y pm-enable civicrm drush -l "${SITE_URL}" -y pm-enable civicrm_webtest drush -l "${SITE_URL}" -y user-create --password=demo --mail='demo@example.com' demo drush -l "${SITE_URL}" -y user-add-role civicrm_webtest_user demo drush -l "${SITE_URL}" -y -u "$ADMIN_USER" civicrm-api contact.create id=user_contact_id api_key="apikey$ADMIN_PASS" popd