| OLD | NEW |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import calendar |
| 6 from datetime import datetime |
| 7 |
| 5 from google.appengine.api import users | 8 from google.appengine.api import users |
| 6 import webapp2 | 9 import webapp2 |
| 7 | 10 |
| 8 from testing_utils import testing | 11 from testing_utils import testing |
| 9 | 12 |
| 10 from common import time_util | 13 from common import time_util |
| 11 from handlers.crash import fracas_result_feedback | 14 from handlers.crash import fracas_result_feedback |
| 12 from model import analysis_status | 15 from model import analysis_status |
| 16 from model import triage_status |
| 13 from model.crash.fracas_crash_analysis import FracasCrashAnalysis | 17 from model.crash.fracas_crash_analysis import FracasCrashAnalysis |
| 14 | 18 |
| 15 | 19 |
| 16 class FracasResultFeedbackTest(testing.AppengineTestCase): | 20 class FracasResultFeedbackTest(testing.AppengineTestCase): |
| 17 app_module = webapp2.WSGIApplication( | 21 app_module = webapp2.WSGIApplication( |
| 18 [('/fracas-result-feedback', | 22 [('/fracas-result-feedback', |
| 19 fracas_result_feedback.FracasResultFeedback)], debug=True) | 23 fracas_result_feedback.FracasResultFeedback)], debug=True) |
| 20 | 24 |
| 21 def setUp(self): | 25 def setUp(self): |
| 22 super(FracasResultFeedbackTest, self).setUp() | 26 super(FracasResultFeedbackTest, self).setUp() |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 self.assertEqual(200, response.status_int) | 67 self.assertEqual(200, response.status_int) |
| 64 | 68 |
| 65 def _GenerateDisplayData(self): | 69 def _GenerateDisplayData(self): |
| 66 analysis = self.analysis | 70 analysis = self.analysis |
| 67 return { | 71 return { |
| 68 'signature': analysis.signature, | 72 'signature': analysis.signature, |
| 69 'version': analysis.crashed_version, | 73 'version': analysis.crashed_version, |
| 70 'channel': analysis.channel, | 74 'channel': analysis.channel, |
| 71 'platform': analysis.platform, | 75 'platform': analysis.platform, |
| 72 'regression_range': analysis.result.get('regression_range'), | 76 'regression_range': analysis.result.get('regression_range'), |
| 77 'culprit_regression_range': analysis.culprit_regression_range, |
| 73 'historical_metadata': analysis.historical_metadata, | 78 'historical_metadata': analysis.historical_metadata, |
| 74 'stack_trace': analysis.stack_trace, | 79 'stack_trace': analysis.stack_trace, |
| 75 'suspected_cls': analysis.result.get('suspected_cls'), | 80 'suspected_cls': analysis.result.get('suspected_cls'), |
| 81 'culprit_cls': analysis.culprit_cls, |
| 76 'suspected_project': analysis.result.get('suspected_project'), | 82 'suspected_project': analysis.result.get('suspected_project'), |
| 83 'culprit_project': analysis.culprit_project, |
| 77 'suspected_components': analysis.result.get('suspected_components'), | 84 'suspected_components': analysis.result.get('suspected_components'), |
| 85 'culprit_components': analysis.culprit_components, |
| 78 'request_time': time_util.FormatDatetime(analysis.requested_time), | 86 'request_time': time_util.FormatDatetime(analysis.requested_time), |
| 79 'analysis_completed': analysis.completed, | 87 'analysis_completed': analysis.completed, |
| 80 'analysis_failed': analysis.failed, | 88 'analysis_failed': analysis.failed, |
| 89 'triage_history': fracas_result_feedback._GetTriageHistory(analysis), |
| 90 'analysis_correct': { |
| 91 'regression_range': analysis.regression_range_triage_status, |
| 92 'suspected_cls': analysis.suspected_cls_triage_status, |
| 93 'suspected_project': analysis.suspected_project_triage_status, |
| 94 'suspected_components': analysis.suspected_components_triage_status, |
| 95 }, |
| 96 'note': analysis.note, |
| 97 'key': analysis.key.urlsafe(), |
| 81 } | 98 } |
| 82 | 99 |
| 83 def testDisplayAnanlysisResult(self): | 100 def testDisplayAnanlysisResult(self): |
| 84 expected_result = self._GenerateDisplayData() | 101 expected_result = self._GenerateDisplayData() |
| 85 response_json = self.test_app.get('/fracas-result-feedback?format=json&' | 102 response_json = self.test_app.get('/fracas-result-feedback?format=json&' |
| 86 'key=%s' % self.analysis.key.urlsafe()) | 103 'key=%s' % self.analysis.key.urlsafe()) |
| 87 self.assertEqual(200, response_json.status_int) | 104 self.assertEqual(200, response_json.status_int) |
| 88 self.assertEqual(expected_result, response_json.json_body) | 105 self.assertEqual(expected_result, response_json.json_body) |
| 106 |
| 107 def testDisplayTriageHistory(self): |
| 108 |
| 109 def _MockIsCurrectUserAdmin(*_): |
| 110 return True |
| 111 |
| 112 self.mock(users, 'is_current_user_admin', _MockIsCurrectUserAdmin) |
| 113 |
| 114 self.analysis.triage_history = [{ |
| 115 'triage_timestamp': calendar.timegm(datetime.utcnow().timetuple()), |
| 116 'result_property': 'regression_range', |
| 117 'user_name': 'test', |
| 118 'triage_status': triage_status.TRIAGED_CORRECT |
| 119 }] |
| 120 self.analysis.put() |
| 121 expected_result = self._GenerateDisplayData() |
| 122 response_json = self.test_app.get('/fracas-result-feedback?format=json&' |
| 123 'key=%s' % self.analysis.key.urlsafe()) |
| 124 self.assertEqual(200, response_json.status_int) |
| 125 self.assertEqual(expected_result, response_json.json_body) |
| OLD | NEW |