diff --git a/package.json b/package.json index 232175818..45d3438b9 100644 --- a/package.json +++ b/package.json @@ -92,9 +92,7 @@ "sinon": "^7.2.2" }, "scripts": { - "migrate_local": "DATABASE_URL=mysql://root:@localhost/box node_modules/.bin/db-migrate up", - "migrate_test": "BOX_ENV=test DATABASE_URL=mysql://root:@localhost/boxtest node_modules/.bin/db-migrate up", - "test": "npm run migrate_test && src/test/setupTest && BOX_ENV=test ./node_modules/istanbul/lib/cli.js test $1 ./node_modules/mocha/bin/_mocha -- --no-timeouts --exit -R spec ./src/test ./src/routes/test/[^a]*js", + "test": "src/test/setupTest && BOX_ENV=test ./node_modules/istanbul/lib/cli.js test $1 ./node_modules/mocha/bin/_mocha -- --no-timeouts --exit -R spec ./src/test ./src/routes/test/[^a]*js", "postmerge": "/bin/true", "precommit": "/bin/true", "prepush": "npm test", diff --git a/src/config.js b/src/config.js index e84e70244..c5da60262 100644 --- a/src/config.js +++ b/src/config.js @@ -119,8 +119,9 @@ function initConfig() { if (exports.TEST) { data.port = 5454; data.apiServerOrigin = 'http://localhost:6060'; // hock doesn't support https - data.database.password = ''; - data.database.name = 'boxtest'; + + // see setupTest script how the mysql-server is run + data.database.hostname = require('child_process').execSync('docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" mysql-server').toString().trim(); } // overwrite defaults with saved config diff --git a/src/database.js b/src/database.js index 72c4685dc..611a1b3ca 100644 --- a/src/database.js +++ b/src/database.js @@ -85,7 +85,7 @@ function reconnect(callback) { function clear(callback) { assert.strictEqual(typeof callback, 'function'); - var cmd = util.format('mysql --host=%s --user="%s" --password="%s" -Nse "SHOW TABLES" %s | grep -v "^migrations$" | while read table; do mysql --host=%s --user="%s" --password="%s" -e "SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE $table" %s; done', + var cmd = util.format('mysql --host="%s" --user="%s" --password="%s" -Nse "SHOW TABLES" %s | grep -v "^migrations$" | while read table; do mysql --host="%s" --user="%s" --password="%s" -e "SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE $table" %s; done', config.database().hostname, config.database().username, config.database().password, config.database().name, config.database().hostname, config.database().username, config.database().password, config.database().name); @@ -177,9 +177,7 @@ function importFromFile(file, callback) { assert.strictEqual(typeof file, 'string'); assert.strictEqual(typeof callback, 'function'); - var password = config.database().password ? '-p' + config.database().password : '--skip-password'; - - var cmd = `/usr/bin/mysql -u ${config.database().username} ${password} ${config.database().name} < ${file}`; + var cmd = `/usr/bin/mysql -h "${config.database().hostname}" -u ${config.database().username} -p${config.database().password} ${config.database().name} < ${file}`; async.series([ query.bind(null, 'CREATE DATABASE IF NOT EXISTS box'), @@ -191,9 +189,7 @@ function exportToFile(file, callback) { assert.strictEqual(typeof file, 'string'); assert.strictEqual(typeof callback, 'function'); - var password = config.database().password ? '-p' + config.database().password : '--skip-password'; - var cmd = `/usr/bin/mysqldump -u root ${password} --single-transaction --routines \ - --triggers ${config.database().name} > "${file}"`; + var cmd = `/usr/bin/mysqldump -h "${config.database().hostname}" -u root -p${config.database().password} --single-transaction --routines --triggers ${config.database().name} > "${file}"`; child_process.exec(cmd, callback); } diff --git a/src/test/setupTest b/src/test/setupTest index efd8e8e34..d0a580e15 100755 --- a/src/test/setupTest +++ b/src/test/setupTest @@ -19,3 +19,26 @@ openssl req -x509 -newkey rsa:2048 -keyout platformdata/nginx/cert/host.key -out # create docker network (while the infra code does this, most tests skip infra setup) docker network create --subnet=172.18.0.0/16 cloudron || true + +# create the same mysql server version to test with +OUT=`docker inspect mysql-server` || true +if [[ "${OUT}" = "[]" ]]; then + echo "Starting mysql-server..." + docker run --name mysql-server -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7 +else + echo "mysql-server already running. If you want to start fresh, run 'docker rm --force mysql-server'" +fi + +export MYSQL_IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-server` + +echo "Waiting for mysql server to be ready..." +while ! mysqladmin ping -h"${MYSQL_IP}" --silent; do + sleep 1 +done + +echo "Ensure database" +mysql -h"${MYSQL_IP}" -uroot -ppassword -e 'CREATE DATABASE IF NOT EXISTS box' + +echo "Run database migrations" +cd "${source_dir}" +BOX_ENV=test DATABASE_URL=mysql://root:password@${MYSQL_IP}/box node_modules/.bin/db-migrate up \ No newline at end of file