diff --git a/plugins/CoreUpdater/CoreUpdater.php b/plugins/CoreUpdater/CoreUpdater.php index 584a465130231189cae0ecd5b0f8a098a6403557..8fc3f0d92f38f59769bb8f10e1a0f5f9c4d3e557 100644 --- a/plugins/CoreUpdater/CoreUpdater.php +++ b/plugins/CoreUpdater/CoreUpdater.php @@ -10,6 +10,7 @@ namespace Piwik\Plugins\CoreUpdater; use Exception; use Piwik\Access; +use Piwik\API\ResponseBuilder; use Piwik\Common; use Piwik\Filesystem; use Piwik\FrontController; @@ -73,6 +74,15 @@ class CoreUpdater extends \Piwik\Plugin if (FrontController::shouldRethrowException()) { throw new Exception("Piwik and/or some plugins have been upgraded to a new version. \n" . "--> Please run the update process first. See documentation: http://piwik.org/docs/update/ \n"); + } elseif ($module === 'API') { + + $outputFormat = strtolower(Common::getRequestVar('format', 'xml', 'string', $_GET + $_POST)); + $response = new ResponseBuilder($outputFormat); + $e = new Exception('Database Upgrade Required. Your Piwik database is out-of-date, and must be upgraded before you can continue.'); + echo $response->getResponseException($e); + Common::sendResponseCode(503); + exit; + } else { Piwik::redirectToModule('CoreUpdater'); } diff --git a/tests/UI/specs/CoreUpdaterDb_spec.js b/tests/UI/specs/CoreUpdaterDb_spec.js index f77776a4ca493709b453ac7153b88d137d450140..98586a7ca506221c86a3987e8b0adcd131046c17 100644 --- a/tests/UI/specs/CoreUpdaterDb_spec.js +++ b/tests/UI/specs/CoreUpdaterDb_spec.js @@ -17,6 +17,18 @@ describe("CoreUpdaterDb", function () { testEnvironment.save(); }); + function apiUpgradeTest(format) { + it("should start the updater when an old version of Piwik is detected in the DB", function (done) { + expect.file('CoreUpdater.API.ErrorMessage' + format + '.txt').to.be.pageContents(function (page) { + page.load(''); + page.downloadUrl('?module=API&method=API.getPiwikVersion&format=' + format); + }, done); + }); + } + + var formats = ['CSV', 'TSV', 'XML', 'JSON', 'PHP']; + formats.forEach(apiUpgradeTest); + it("should start the updater when an old version of Piwik is detected in the DB", function (done) { expect.screenshot("main").to.be.capture(function (page) { page.load(""); diff --git a/tests/lib/screenshot-testing/support/page-renderer.js b/tests/lib/screenshot-testing/support/page-renderer.js index 16db97d7f18856e16124c1bd3a47e8dba4111926..3a0ef301d0866fcd9bd04a93e8328848fa3b625a 100644 --- a/tests/lib/screenshot-testing/support/page-renderer.js +++ b/tests/lib/screenshot-testing/support/page-renderer.js @@ -114,6 +114,10 @@ PageRenderer.prototype.downloadLink = function (selector, waitTime) { this.queuedEvents.push([this._downloadLink, waitTime, selector]); }; +PageRenderer.prototype.downloadUrl = function (url, waitTime) { + this.queuedEvents.push([this._downloadUrl, waitTime, url]); +}; + PageRenderer.prototype.dragDrop = function (startSelector, endSelector, waitTime) { this.mousedown(startSelector, waitTime); this.mouseMove(endSelector, waitTime); @@ -220,16 +224,23 @@ PageRenderer.prototype._evaluate = function (impl, callback) { }; PageRenderer.prototype._downloadLink = function (str, callback) { - var response = this.webpage.evaluate(function (selector) { - var $ = window.jQuery, - url = $(selector).attr('href'); + var url = this.webpage.evaluate(function (selector) { + return $(selector).attr('href'); + }, str); + + this._downloadUrl(url, callback); +}; + +PageRenderer.prototype._downloadUrl = function (url, callback) { + var response = this.webpage.evaluate(function (url) { + var $ = window.jQuery; return $.ajax({ type: "GET", url: url, async: false }).responseText; - }, str); + }, url); this.downloadedContents = response;