Index: appengine/monorail/search/test/ast2sort_test.py |
diff --git a/appengine/monorail/search/test/ast2sort_test.py b/appengine/monorail/search/test/ast2sort_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..47b650bbc8d2d9e2715700dc343080c9d6d16bd0 |
--- /dev/null |
+++ b/appengine/monorail/search/test/ast2sort_test.py |
@@ -0,0 +1,214 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is govered by a BSD-style |
+# license that can be found in the LICENSE file or at |
+# https://developers.google.com/open-source/licenses/bsd |
+ |
+"""Tests for the ast2sort module.""" |
+ |
+import unittest |
+ |
+from search import ast2sort |
+from search import query2ast |
+ |
+ |
+BUILTIN_ISSUE_FIELDS = query2ast.BUILTIN_ISSUE_FIELDS |
+ANY_FIELD = query2ast.BUILTIN_ISSUE_FIELDS['any_field'] |
+ |
+ |
+class AST2SortTest(unittest.TestCase): |
+ |
+ def setUp(self): |
+ self.harmonized_labels = [ |
+ (101, 0, 'Hot'), (102, 1, 'Cold'), (103, None, 'Odd')] |
+ self.harmonized_statuses = [ |
+ (201, 0, 'New'), (202, 1, 'Assigned'), (203, None, 'OnHold')] |
+ self.harmonized_fields = [] |
+ self.fmt = lambda string, **kwords: string |
+ |
+ def testBuildSortClauses_EmptySortDirectives(self): |
+ left_joins, order_by = ast2sort.BuildSortClauses( |
+ [], self.harmonized_labels, self.harmonized_statuses, |
+ self.harmonized_fields) |
+ self.assertEqual([], left_joins) |
+ self.assertEqual([], order_by) |
+ |
+ def testBuildSortClauses_Normal(self): |
+ left_joins, order_by = ast2sort.BuildSortClauses( |
+ ['stars', 'status', 'pri', 'reporter', 'id'], self.harmonized_labels, |
+ self.harmonized_statuses, self.harmonized_fields) |
+ expected_left_joins = [ |
+ ('User AS Sort3 ON Issue.reporter_id = Sort3.user_id', [])] |
+ expected_order_by = [ |
+ ('Issue.star_count ASC', []), |
+ ('FIELD(IF(ISNULL(Issue.status_id), Issue.derived_status_id, ' |
+ 'Issue.status_id), %s,%s) DESC', [201, 202]), |
+ ('FIELD(IF(ISNULL(Issue.status_id), Issue.derived_status_id, ' |
+ 'Issue.status_id), %s) DESC', [203]), |
+ ('ISNULL(Sort3.email) ASC', []), |
+ ('Sort3.email ASC', []), |
+ ('Issue.local_id ASC', [])] |
+ self.assertEqual(expected_left_joins, left_joins) |
+ self.assertEqual(expected_order_by, order_by) |
+ |
+ def testProcessProjectSD(self): |
+ left_joins, order_by = ast2sort._ProcessProjectSD(self.fmt) |
+ self.assertEqual([], left_joins) |
+ self.assertEqual( |
+ [('Issue.project_id {sort_dir}', [])], |
+ order_by) |
+ |
+ def testProcessReporterSD(self): |
+ left_joins, order_by = ast2sort._ProcessReporterSD(self.fmt) |
+ self.assertEqual( |
+ [('User AS {alias} ON Issue.reporter_id = {alias}.user_id', [])], |
+ left_joins) |
+ self.assertEqual( |
+ [('ISNULL({alias}.email) {sort_dir}', []), |
+ ('{alias}.email {sort_dir}', [])], |
+ order_by) |
+ |
+ def testProcessOwnerSD(self): |
+ left_joins, order_by = ast2sort._ProcessOwnerSD(self.fmt) |
+ self.assertEqual( |
+ [('User AS {alias} ON (Issue.owner_id = {alias}.user_id OR ' |
+ 'Issue.derived_owner_id = {alias}.user_id)', [])], |
+ left_joins) |
+ self.assertEqual( |
+ [('ISNULL({alias}.email) {sort_dir}', []), |
+ ('{alias}.email {sort_dir}', [])], |
+ order_by) |
+ |
+ def testProcessCcSD(self): |
+ left_joins, order_by = ast2sort._ProcessCcSD(self.fmt) |
+ self.assertEqual( |
+ [('Issue2Cc AS {alias} ON Issue.id = {alias}.issue_id ' |
+ 'LEFT JOIN User AS {alias}_user ' |
+ 'ON {alias}.cc_id = {alias}_user.user_id', [])], |
+ left_joins) |
+ self.assertEqual( |
+ [('ISNULL({alias}_user.email) {sort_dir}', []), |
+ ('{alias}_user.email {sort_dir}', [])], |
+ order_by) |
+ |
+ def testProcessComponentSD(self): |
+ left_joins, order_by = ast2sort._ProcessComponentSD(self.fmt) |
+ self.assertEqual( |
+ [('Issue2Component AS {alias} ON Issue.id = {alias}.issue_id ' |
+ 'LEFT JOIN ComponentDef AS {alias}_component ' |
+ 'ON {alias}.component_id = {alias}_component.id', [])], |
+ left_joins) |
+ self.assertEqual( |
+ [('ISNULL({alias}_component.path) {sort_dir}', []), |
+ ('{alias}_component.path {sort_dir}', [])], |
+ order_by) |
+ |
+ def testProcessSummarySD(self): |
+ left_joins, order_by = ast2sort._ProcessSummarySD(self.fmt) |
+ self.assertEqual( |
+ [('IssueSummary AS {alias} ON Issue.id = {alias}.issue_id', [])], |
+ left_joins) |
+ self.assertEqual( |
+ [('{alias}.summary {sort_dir}', [])], |
+ order_by) |
+ |
+ def testProcessStatusSD(self): |
+ pass # TODO(jrobbins): fill in this test case |
+ |
+ def testProcessBlockedSD(self): |
+ left_joins, order_by = ast2sort._ProcessBlockedSD(self.fmt) |
+ self.assertEqual( |
+ [('IssueRelation AS {alias} ON Issue.id = {alias}.issue_id ' |
+ 'AND {alias}.kind = %s', ['blockedon'])], |
+ left_joins) |
+ self.assertEqual( |
+ [('ISNULL({alias}.dst_issue_id) {sort_dir}', [])], |
+ order_by) |
+ |
+ def testProcessBlockedOnSD(self): |
+ left_joins, order_by = ast2sort._ProcessBlockedOnSD(self.fmt) |
+ self.assertEqual( |
+ [('IssueRelation AS {alias} ON Issue.id = {alias}.issue_id ' |
+ 'AND {alias}.kind = %s', ['blockedon'])], |
+ left_joins) |
+ self.assertEqual( |
+ [('ISNULL({alias}.dst_issue_id) {sort_dir}', []), |
+ ('{alias}.dst_issue_id {sort_dir}', [])], |
+ order_by) |
+ |
+ def testProcessBlockingSD(self): |
+ left_joins, order_by = ast2sort._ProcessBlockingSD(self.fmt) |
+ self.assertEqual( |
+ [('IssueRelation AS {alias} ON Issue.id = {alias}.dst_issue_id ' |
+ 'AND {alias}.kind = %s', ['blockedon'])], |
+ left_joins) |
+ self.assertEqual( |
+ [('ISNULL({alias}.issue_id) {sort_dir}', []), |
+ ('{alias}.issue_id {sort_dir}', [])], |
+ order_by) |
+ |
+ def testProcessCustomAndLabelSD(self): |
+ pass # TODO(jrobbins): fill in this test case |
+ |
+ def testLabelSortClauses_NoSuchLabels(self): |
+ sd = 'somethingelse' |
+ harmonized_labels = [ |
+ (101, 0, 'Type-Defect'), |
+ (102, 1, 'Type-Enhancement'), |
+ (103, 2, 'Type-Task'), |
+ (104, 0, 'Priority-High'), |
+ (199, None, 'Type-Laundry'), |
+ ] |
+ left_joins, order_by = ast2sort._LabelSortClauses( |
+ sd, harmonized_labels, self.fmt) |
+ self.assertEqual([], left_joins) |
+ self.assertEqual([], order_by) |
+ |
+ def testLabelSortClauses_Normal(self): |
+ sd = 'type' |
+ harmonized_labels = [ |
+ (101, 0, 'Type-Defect'), |
+ (102, 1, 'Type-Enhancement'), |
+ (103, 2, 'Type-Task'), |
+ (104, 0, 'Priority-High'), |
+ (199, None, 'Type-Laundry'), |
+ ] |
+ left_joins, order_by = ast2sort._LabelSortClauses( |
+ sd, harmonized_labels, self.fmt) |
+ self.assertEqual(1, len(left_joins)) |
+ self.assertEqual( |
+ ('Issue2Label AS {alias} ON Issue.id = {alias}.issue_id AND ' |
+ '{alias}.label_id IN ({all_label_ph})', |
+ [101, 102, 103, 199]), |
+ left_joins[0]) |
+ self.assertEqual(2, len(order_by)) |
+ self.assertEqual( |
+ ('FIELD({alias}.label_id, {wk_label_ph}) {rev_sort_dir}', |
+ [101, 102, 103]), |
+ order_by[0]) |
+ self.assertEqual( |
+ ('FIELD({alias}.label_id, {odd_label_ph}) {rev_sort_dir}', |
+ [199]), |
+ order_by[1]) |
+ |
+ def testOneSortDirective_NativeSortable(self): |
+ left_joins, order_by = ast2sort._OneSortDirective( |
+ 1, 'opened', self.harmonized_labels, self.harmonized_statuses, |
+ self.harmonized_fields) |
+ self.assertEqual([], left_joins) |
+ self.assertEqual([('Issue.opened ASC', [])], order_by) |
+ |
+ left_joins, order_by = ast2sort._OneSortDirective( |
+ 1, 'stars', self.harmonized_labels, self.harmonized_statuses, |
+ self.harmonized_fields) |
+ self.assertEqual([], left_joins) |
+ self.assertEqual([('Issue.star_count ASC', [])], order_by) |
+ |
+ left_joins, order_by = ast2sort._OneSortDirective( |
+ 1, '-stars', self.harmonized_labels, self.harmonized_statuses, |
+ self.harmonized_fields) |
+ self.assertEqual([], left_joins) |
+ self.assertEqual([('Issue.star_count DESC', [])], order_by) |
+ |
+ |
+if __name__ == '__main__': |
+ unittest.main() |