Milimetric has submitted this change and it was merged.
Change subject: tests and fixes, coverage up to 77
......................................................................
tests and fixes, coverage up to 77
Change-Id: I6f197efeebbb2c7622073e568e00c7504dd51737
---
M tests/test_controllers/test_reports.py
M wikimetrics/controllers/authentication.py
M wikimetrics/controllers/reports.py
3 files changed, 104 insertions(+), 24 deletions(-)
Approvals:
Milimetric: Verified; Looks good to me, approved
diff --git a/tests/test_controllers/test_reports.py
b/tests/test_controllers/test_reports.py
index 188a614..cce7361 100644
--- a/tests/test_controllers/test_reports.py
+++ b/tests/test_controllers/test_reports.py
@@ -1,7 +1,13 @@
-from nose.tools import assert_true, assert_equal, nottest
-from tests.fixtures import WebTest
import json
import celery
+import time
+from nose.tools import assert_true, assert_equal, nottest
+from tests.fixtures import WebTest
+from wikimetrics.models import PersistentReport
+from wikimetrics.controllers.reports import (
+ get_celery_task,
+ get_celery_task_result
+)
def filterStatus(collection, status):
@@ -38,7 +44,7 @@
)
def test_list_success(self):
- response = self.app.get('/reports/list', follow_redirects=True)
+ response = self.app.get('/reports/list/')
parsed = json.loads(response.data)
assert_equal(
len(filterStatus(parsed['reports'], celery.states.SUCCESS)),
@@ -46,3 +52,79 @@
'/reports/list should return a list of report objects,'
'but instead returned:\n{0}'.format(response.data)
)
+
+ def test_report_request_get(self):
+ response = self.app.get('/reports/create/')
+ assert_equal(response.status_code, 200)
+ assert_true(response.data.find('Create Analysis Report') >= 0)
+
+ def test_full_report_create_and_result(self):
+ # Make the request
+ desired_responses = [{
+ 'name': 'Edits - test',
+ 'cohort': {
+ 'id': self.test_cohort_id,
+ },
+ 'metric': {
+ 'name': 'NamespaceEdits',
+ 'namespaces': [0, 1, 2],
+ 'start_date': '2013-06-01',
+ 'end_date': '2013-09-01',
+ 'individualResults': True,
+ 'aggregateResults': True,
+ 'aggregateSum': True,
+ 'aggregateAverage': True,
+ 'aggregateStandardDeviation': True,
+ },
+ }]
+ json_to_post = json.dumps(desired_responses)
+
+ response = self.app.post('/reports/create/', data=dict(
+ responses=json_to_post
+ ))
+ assert_equal(response.status_code, 200)
+ assert_true(response.data.find('isRedirect') >= 0)
+ assert_true(response.data.find('/reports/') >= 0)
+
+ # Wait a second for the task to get processed
+ time.sleep(1)
+
+ # Check that the task has been created
+ response = self.app.get('/reports/list/')
+ parsed = json.loads(response.data)
+ result_key = parsed['reports'][-1]['result_key']
+ task, report = get_celery_task(result_key)
+ assert_true(task is not None)
+
+ # Get the result directly
+ result = get_celery_task_result(task, report)
+ assert_true(result is not None)
+
+ # Check the status via get
+ response = self.app.get('/reports/status/{0}'.format(result_key))
+ assert_true(response.data.find('SUCCESS') >= 0)
+
+ # Check the csv result
+ response = self.app.get('/reports/result/{0}.csv'.format(result_key))
+ assert_true(response.data.find('Average') >= 0)
+
+ # Check the json result
+ response = self.app.get('/reports/result/{0}.json'.format(result_key))
+ assert_true(response.data.find('Average') >= 0)
+
+ # Purposefully change the report status to make sure update_status
works
+ report.status = celery.states.STARTED
+ self.session.add(report)
+ self.session.commit()
+ report_new = self.session.query(PersistentReport).get(report.id)
+ self.session.expunge(report_new)
+ report_new.update_status()
+ assert_equal(report_new.status, celery.states.SUCCESS)
+
+ def test_report_result_csv_error(self):
+ response = self.app.get('/reports/result/blah.csv')
+ assert_true(response.data.find('isError') >= 0)
+
+ def test_report_result_json_error(self):
+ response = self.app.get('/reports/result/blah.json')
+ assert_true(response.data.find('isError') >= 0)
diff --git a/wikimetrics/controllers/authentication.py
b/wikimetrics/controllers/authentication.py
index 9bf74d8..e120ae2 100644
--- a/wikimetrics/controllers/authentication.py
+++ b/wikimetrics/controllers/authentication.py
@@ -102,8 +102,8 @@
an email or username to match their details from the OAuth provider.
"""
if not resp and request.args.get('error') == 'access_denied':
- flash('You need to grant the app permissions in order to login.',
'error')
- return redirect(url_for('login'))
+ flash('You need to grant the app permissions in order to login.',
'error')
+ return redirect(url_for('login'))
access_token = resp['access_token'] or request.args.get('code')
if access_token:
diff --git a/wikimetrics/controllers/reports.py
b/wikimetrics/controllers/reports.py
index bfc25c6..1f3efc4 100644
--- a/wikimetrics/controllers/reports.py
+++ b/wikimetrics/controllers/reports.py
@@ -1,6 +1,7 @@
+import celery
+from sqlalchemy.orm.exc import NoResultFound
from flask import render_template, request, url_for, Response
from flask.ext.login import current_user
-import celery
from celery.task.control import revoke
from ..configurables import app, db
from ..models import Report, RunReport, PersistentReport
@@ -32,14 +33,8 @@
else:
desired_responses = json.loads(request.form['responses'])
jr = RunReport(desired_responses, user_id=current_user.id)
+ jr.task.delay(jr)
- async_response = jr.task.delay(jr)
- app.logger.info(
- 'starting report with celery id: %s, PersistentReport.id: %d',
- async_response.task_id, jr.persistent_id
- )
-
- #return render_template('reports.html')
return json_redirect(url_for('reports_index'))
@@ -72,14 +67,17 @@
Returns
A tuple of the form (celery_task_object, database_report_object)
"""
- db_session = db.get_session()
- pj = db_session.query(PersistentReport)\
- .filter(PersistentReport.result_key == result_key)\
- .one()
-
- celery_task = Report.task.AsyncResult(pj.queue_result_key)
- db_session.close()
- return (celery_task, pj)
+ try:
+ db_session = db.get_session()
+ pj = db_session.query(PersistentReport)\
+ .filter(PersistentReport.result_key == result_key)\
+ .one()
+
+ celery_task = Report.task.AsyncResult(pj.queue_result_key)
+ db_session.close()
+ return (celery_task, pj)
+ except NoResultFound:
+ return (None, None)
def get_celery_task_result(celery_task, db_report):
@@ -176,9 +174,9 @@
return json_response(status=celery_task.status)
[email protected]('/reports/kill/<result_key>')
-def report_kill(result_key):
- return 'not implemented'
+#@app.route('/reports/kill/<result_key>')
+#def report_kill(result_key):
+ #return 'not implemented'
#db_session = db.get_session()
#db_report = db_session.query(PersistentReport).get(result_key)
#if not db_report:
--
To view, visit https://gerrit.wikimedia.org/r/80147
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I6f197efeebbb2c7622073e568e00c7504dd51737
Gerrit-PatchSet: 1
Gerrit-Project: analytics/wikimetrics
Gerrit-Branch: master
Gerrit-Owner: Milimetric <[email protected]>
Gerrit-Reviewer: Milimetric <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits