OLD | NEW |
(Empty) | |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is govered by a BSD-style |
| 3 # license that can be found in the LICENSE file or at |
| 4 # https://developers.google.com/open-source/licenses/bsd |
| 5 |
| 6 """Tests for the ast2sort module.""" |
| 7 |
| 8 import unittest |
| 9 |
| 10 from search import ast2sort |
| 11 from search import query2ast |
| 12 |
| 13 |
| 14 BUILTIN_ISSUE_FIELDS = query2ast.BUILTIN_ISSUE_FIELDS |
| 15 ANY_FIELD = query2ast.BUILTIN_ISSUE_FIELDS['any_field'] |
| 16 |
| 17 |
| 18 class AST2SortTest(unittest.TestCase): |
| 19 |
| 20 def setUp(self): |
| 21 self.harmonized_labels = [ |
| 22 (101, 0, 'Hot'), (102, 1, 'Cold'), (103, None, 'Odd')] |
| 23 self.harmonized_statuses = [ |
| 24 (201, 0, 'New'), (202, 1, 'Assigned'), (203, None, 'OnHold')] |
| 25 self.harmonized_fields = [] |
| 26 self.fmt = lambda string, **kwords: string |
| 27 |
| 28 def testBuildSortClauses_EmptySortDirectives(self): |
| 29 left_joins, order_by = ast2sort.BuildSortClauses( |
| 30 [], self.harmonized_labels, self.harmonized_statuses, |
| 31 self.harmonized_fields) |
| 32 self.assertEqual([], left_joins) |
| 33 self.assertEqual([], order_by) |
| 34 |
| 35 def testBuildSortClauses_Normal(self): |
| 36 left_joins, order_by = ast2sort.BuildSortClauses( |
| 37 ['stars', 'status', 'pri', 'reporter', 'id'], self.harmonized_labels, |
| 38 self.harmonized_statuses, self.harmonized_fields) |
| 39 expected_left_joins = [ |
| 40 ('User AS Sort3 ON Issue.reporter_id = Sort3.user_id', [])] |
| 41 expected_order_by = [ |
| 42 ('Issue.star_count ASC', []), |
| 43 ('FIELD(IF(ISNULL(Issue.status_id), Issue.derived_status_id, ' |
| 44 'Issue.status_id), %s,%s) DESC', [201, 202]), |
| 45 ('FIELD(IF(ISNULL(Issue.status_id), Issue.derived_status_id, ' |
| 46 'Issue.status_id), %s) DESC', [203]), |
| 47 ('ISNULL(Sort3.email) ASC', []), |
| 48 ('Sort3.email ASC', []), |
| 49 ('Issue.local_id ASC', [])] |
| 50 self.assertEqual(expected_left_joins, left_joins) |
| 51 self.assertEqual(expected_order_by, order_by) |
| 52 |
| 53 def testProcessProjectSD(self): |
| 54 left_joins, order_by = ast2sort._ProcessProjectSD(self.fmt) |
| 55 self.assertEqual([], left_joins) |
| 56 self.assertEqual( |
| 57 [('Issue.project_id {sort_dir}', [])], |
| 58 order_by) |
| 59 |
| 60 def testProcessReporterSD(self): |
| 61 left_joins, order_by = ast2sort._ProcessReporterSD(self.fmt) |
| 62 self.assertEqual( |
| 63 [('User AS {alias} ON Issue.reporter_id = {alias}.user_id', [])], |
| 64 left_joins) |
| 65 self.assertEqual( |
| 66 [('ISNULL({alias}.email) {sort_dir}', []), |
| 67 ('{alias}.email {sort_dir}', [])], |
| 68 order_by) |
| 69 |
| 70 def testProcessOwnerSD(self): |
| 71 left_joins, order_by = ast2sort._ProcessOwnerSD(self.fmt) |
| 72 self.assertEqual( |
| 73 [('User AS {alias} ON (Issue.owner_id = {alias}.user_id OR ' |
| 74 'Issue.derived_owner_id = {alias}.user_id)', [])], |
| 75 left_joins) |
| 76 self.assertEqual( |
| 77 [('ISNULL({alias}.email) {sort_dir}', []), |
| 78 ('{alias}.email {sort_dir}', [])], |
| 79 order_by) |
| 80 |
| 81 def testProcessCcSD(self): |
| 82 left_joins, order_by = ast2sort._ProcessCcSD(self.fmt) |
| 83 self.assertEqual( |
| 84 [('Issue2Cc AS {alias} ON Issue.id = {alias}.issue_id ' |
| 85 'LEFT JOIN User AS {alias}_user ' |
| 86 'ON {alias}.cc_id = {alias}_user.user_id', [])], |
| 87 left_joins) |
| 88 self.assertEqual( |
| 89 [('ISNULL({alias}_user.email) {sort_dir}', []), |
| 90 ('{alias}_user.email {sort_dir}', [])], |
| 91 order_by) |
| 92 |
| 93 def testProcessComponentSD(self): |
| 94 left_joins, order_by = ast2sort._ProcessComponentSD(self.fmt) |
| 95 self.assertEqual( |
| 96 [('Issue2Component AS {alias} ON Issue.id = {alias}.issue_id ' |
| 97 'LEFT JOIN ComponentDef AS {alias}_component ' |
| 98 'ON {alias}.component_id = {alias}_component.id', [])], |
| 99 left_joins) |
| 100 self.assertEqual( |
| 101 [('ISNULL({alias}_component.path) {sort_dir}', []), |
| 102 ('{alias}_component.path {sort_dir}', [])], |
| 103 order_by) |
| 104 |
| 105 def testProcessSummarySD(self): |
| 106 left_joins, order_by = ast2sort._ProcessSummarySD(self.fmt) |
| 107 self.assertEqual( |
| 108 [('IssueSummary AS {alias} ON Issue.id = {alias}.issue_id', [])], |
| 109 left_joins) |
| 110 self.assertEqual( |
| 111 [('{alias}.summary {sort_dir}', [])], |
| 112 order_by) |
| 113 |
| 114 def testProcessStatusSD(self): |
| 115 pass # TODO(jrobbins): fill in this test case |
| 116 |
| 117 def testProcessBlockedSD(self): |
| 118 left_joins, order_by = ast2sort._ProcessBlockedSD(self.fmt) |
| 119 self.assertEqual( |
| 120 [('IssueRelation AS {alias} ON Issue.id = {alias}.issue_id ' |
| 121 'AND {alias}.kind = %s', ['blockedon'])], |
| 122 left_joins) |
| 123 self.assertEqual( |
| 124 [('ISNULL({alias}.dst_issue_id) {sort_dir}', [])], |
| 125 order_by) |
| 126 |
| 127 def testProcessBlockedOnSD(self): |
| 128 left_joins, order_by = ast2sort._ProcessBlockedOnSD(self.fmt) |
| 129 self.assertEqual( |
| 130 [('IssueRelation AS {alias} ON Issue.id = {alias}.issue_id ' |
| 131 'AND {alias}.kind = %s', ['blockedon'])], |
| 132 left_joins) |
| 133 self.assertEqual( |
| 134 [('ISNULL({alias}.dst_issue_id) {sort_dir}', []), |
| 135 ('{alias}.dst_issue_id {sort_dir}', [])], |
| 136 order_by) |
| 137 |
| 138 def testProcessBlockingSD(self): |
| 139 left_joins, order_by = ast2sort._ProcessBlockingSD(self.fmt) |
| 140 self.assertEqual( |
| 141 [('IssueRelation AS {alias} ON Issue.id = {alias}.dst_issue_id ' |
| 142 'AND {alias}.kind = %s', ['blockedon'])], |
| 143 left_joins) |
| 144 self.assertEqual( |
| 145 [('ISNULL({alias}.issue_id) {sort_dir}', []), |
| 146 ('{alias}.issue_id {sort_dir}', [])], |
| 147 order_by) |
| 148 |
| 149 def testProcessCustomAndLabelSD(self): |
| 150 pass # TODO(jrobbins): fill in this test case |
| 151 |
| 152 def testLabelSortClauses_NoSuchLabels(self): |
| 153 sd = 'somethingelse' |
| 154 harmonized_labels = [ |
| 155 (101, 0, 'Type-Defect'), |
| 156 (102, 1, 'Type-Enhancement'), |
| 157 (103, 2, 'Type-Task'), |
| 158 (104, 0, 'Priority-High'), |
| 159 (199, None, 'Type-Laundry'), |
| 160 ] |
| 161 left_joins, order_by = ast2sort._LabelSortClauses( |
| 162 sd, harmonized_labels, self.fmt) |
| 163 self.assertEqual([], left_joins) |
| 164 self.assertEqual([], order_by) |
| 165 |
| 166 def testLabelSortClauses_Normal(self): |
| 167 sd = 'type' |
| 168 harmonized_labels = [ |
| 169 (101, 0, 'Type-Defect'), |
| 170 (102, 1, 'Type-Enhancement'), |
| 171 (103, 2, 'Type-Task'), |
| 172 (104, 0, 'Priority-High'), |
| 173 (199, None, 'Type-Laundry'), |
| 174 ] |
| 175 left_joins, order_by = ast2sort._LabelSortClauses( |
| 176 sd, harmonized_labels, self.fmt) |
| 177 self.assertEqual(1, len(left_joins)) |
| 178 self.assertEqual( |
| 179 ('Issue2Label AS {alias} ON Issue.id = {alias}.issue_id AND ' |
| 180 '{alias}.label_id IN ({all_label_ph})', |
| 181 [101, 102, 103, 199]), |
| 182 left_joins[0]) |
| 183 self.assertEqual(2, len(order_by)) |
| 184 self.assertEqual( |
| 185 ('FIELD({alias}.label_id, {wk_label_ph}) {rev_sort_dir}', |
| 186 [101, 102, 103]), |
| 187 order_by[0]) |
| 188 self.assertEqual( |
| 189 ('FIELD({alias}.label_id, {odd_label_ph}) {rev_sort_dir}', |
| 190 [199]), |
| 191 order_by[1]) |
| 192 |
| 193 def testOneSortDirective_NativeSortable(self): |
| 194 left_joins, order_by = ast2sort._OneSortDirective( |
| 195 1, 'opened', self.harmonized_labels, self.harmonized_statuses, |
| 196 self.harmonized_fields) |
| 197 self.assertEqual([], left_joins) |
| 198 self.assertEqual([('Issue.opened ASC', [])], order_by) |
| 199 |
| 200 left_joins, order_by = ast2sort._OneSortDirective( |
| 201 1, 'stars', self.harmonized_labels, self.harmonized_statuses, |
| 202 self.harmonized_fields) |
| 203 self.assertEqual([], left_joins) |
| 204 self.assertEqual([('Issue.star_count ASC', [])], order_by) |
| 205 |
| 206 left_joins, order_by = ast2sort._OneSortDirective( |
| 207 1, '-stars', self.harmonized_labels, self.harmonized_statuses, |
| 208 self.harmonized_fields) |
| 209 self.assertEqual([], left_joins) |
| 210 self.assertEqual([('Issue.star_count DESC', [])], order_by) |
| 211 |
| 212 |
| 213 if __name__ == '__main__': |
| 214 unittest.main() |
OLD | NEW |