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

Reply via email to