Skip to content
Snippets Groups Projects
mk-drupal-test-site 4.22 KiB
Newer Older
  • Learn to ignore specific revisions
  • totten's avatar
    totten committed
    #!/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 <domain.name> <db_name> </path/to/drupal> </path/to/civi>
    
    ## 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"
    
    totten's avatar
    totten committed
    popd
    
    ## Create CiviCRM config
    cat > "$CIVI_ROOT/bin/setup.conf" << EOF
      SVNROOT="$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
    <?php
    define('CIVICRM_DSN', "mysql://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME}");
    define('CIVICRM_TEMPLATE_COMPILEDIR', '${DRUPAL_ROOT}/sites/${SITE_URL}/files/civicrm/templates_c');
    define('DONT_DOCUMENT_TEST_CONFIG', TRUE);
    EOF
    
    cat > "$CIVI_ROOT/tests/phpunit/CiviTest/CiviSeleniumSettings.php" << EOF
    <?php
    class CiviSeleniumSettings {
    	var \$publicSandbox  = false;
    	var \$browser = '*firefox';
    	var \$sandboxURL = 'http://${SITE_URL}';
    	var \$sandboxPATH = '';
    	var \$username = 'demo';
    	var \$password = 'demo';
    	var \$adminUsername = '${ADMIN_USER}';
    	var \$adminPassword = '${ADMIN_PASS}';
            var \$UFemail = 'noreply@civicrm.org';
    	function __construct() {
    		\$this->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
    popd