web/test/unittest_magicsearch.py
branchtls-sprint
changeset 1654 57b9fd2462b8
parent 1398 5fe84a5f7035
child 1977 606923dff11b
equal deleted inserted replaced
1653:8b82227719f0 1654:57b9fd2462b8
    31 
    31 
    32 from cubicweb.web.views.magicsearch import translate_rql_tree, QSPreProcessor, QueryTranslator
    32 from cubicweb.web.views.magicsearch import translate_rql_tree, QSPreProcessor, QueryTranslator
    33 
    33 
    34 class QueryTranslatorTC(EnvBasedTC):
    34 class QueryTranslatorTC(EnvBasedTC):
    35     """test suite for QueryTranslatorTC"""
    35     """test suite for QueryTranslatorTC"""
    36     
    36 
    37     def setUp(self):
    37     def setUp(self):
    38         super(QueryTranslatorTC, self).setUp()
    38         super(QueryTranslatorTC, self).setUp()
    39         self.req = self.env.create_request()
    39         self.req = self.env.create_request()
    40         self.vreg.config.translations = {'en': _translate}
    40         self.vreg.config.translations = {'en': _translate}
    41         proc = self.vreg.select_component('magicsearch', self.req)
    41         proc = self.vreg.select_component('magicsearch', self.req)
    81         translate = self.proc._get_attribute_name
    81         translate = self.proc._get_attribute_name
    82         eschema = self.schema.eschema('CWUser')
    82         eschema = self.schema.eschema('CWUser')
    83         self.assertEquals(translate(u'prénom', eschema), "firstname")
    83         self.assertEquals(translate(u'prénom', eschema), "firstname")
    84         self.assertEquals(translate(u'nom', eschema), 'surname')
    84         self.assertEquals(translate(u'nom', eschema), 'surname')
    85         #self.assert_(translate(u'nom') in ('name', 'surname'))
    85         #self.assert_(translate(u'nom') in ('name', 'surname'))
    86         eschema = self.schema.eschema('EmailAddress')        
    86         eschema = self.schema.eschema('EmailAddress')
    87         self.assertEquals(translate(u'adresse', eschema), "address")
    87         self.assertEquals(translate(u'adresse', eschema), "address")
    88         self.assertEquals(translate(u'nom', eschema), 'alias')
    88         self.assertEquals(translate(u'nom', eschema), 'alias')
    89         # should fail if the name is not an attribute for the given entity schema
    89         # should fail if the name is not an attribute for the given entity schema
    90         self.assertRaises(BadRQLQuery, translate, 'whatever', eschema)
    90         self.assertRaises(BadRQLQuery, translate, 'whatever', eschema)
    91         self.assertRaises(BadRQLQuery, translate, 'prénom', eschema)
    91         self.assertRaises(BadRQLQuery, translate, 'prénom', eschema)
    94         """tests the 'one word shortcut queries'"""
    94         """tests the 'one word shortcut queries'"""
    95         transform = self.proc._one_word_query
    95         transform = self.proc._one_word_query
    96         self.assertEquals(transform('123'),
    96         self.assertEquals(transform('123'),
    97                           ('Any X WHERE X eid %(x)s', {'x': 123}, 'x'))
    97                           ('Any X WHERE X eid %(x)s', {'x': 123}, 'x'))
    98         self.assertEquals(transform('CWUser'),
    98         self.assertEquals(transform('CWUser'),
    99                           ('CWUser E',))
    99                           ('CWUser C',))
   100         self.assertEquals(transform('Utilisateur'),
   100         self.assertEquals(transform('Utilisateur'),
   101                           ('CWUser E',))
   101                           ('CWUser C',))
   102         self.assertEquals(transform('Adresse'),
   102         self.assertEquals(transform('Adresse'),
   103                           ('EmailAddress E',))
   103                           ('EmailAddress E',))
   104         self.assertEquals(transform('adresse'),
   104         self.assertEquals(transform('adresse'),
   105                           ('EmailAddress E',))
   105                           ('EmailAddress E',))
   106         self.assertRaises(BadRQLQuery, transform, 'Workcases')
   106         self.assertRaises(BadRQLQuery, transform, 'Workcases')
   109         """tests the 'two words shortcut queries'"""
   109         """tests the 'two words shortcut queries'"""
   110         transform = self.proc._two_words_query
   110         transform = self.proc._two_words_query
   111         self.assertEquals(transform('CWUser', 'E'),
   111         self.assertEquals(transform('CWUser', 'E'),
   112                           ("CWUser E",))
   112                           ("CWUser E",))
   113         self.assertEquals(transform('CWUser', 'Smith'),
   113         self.assertEquals(transform('CWUser', 'Smith'),
   114                           ('CWUser E WHERE E has_text %(text)s', {'text': 'Smith'}))
   114                           ('CWUser C WHERE C has_text %(text)s', {'text': 'Smith'}))
   115         self.assertEquals(transform('utilisateur', 'Smith'),
   115         self.assertEquals(transform('utilisateur', 'Smith'),
   116                           ('CWUser E WHERE E has_text %(text)s', {'text': 'Smith'}))
   116                           ('CWUser C WHERE C has_text %(text)s', {'text': 'Smith'}))
   117         self.assertEquals(transform(u'adresse', 'Logilab'),
   117         self.assertEquals(transform(u'adresse', 'Logilab'),
   118                           ('EmailAddress E WHERE E has_text %(text)s', {'text': 'Logilab'}))
   118                           ('EmailAddress E WHERE E has_text %(text)s', {'text': 'Logilab'}))
   119         self.assertEquals(transform(u'adresse', 'Logi%'),
   119         self.assertEquals(transform(u'adresse', 'Logi%'),
   120                           ('EmailAddress E WHERE E alias LIKE %(text)s', {'text': 'Logi%'}))
   120                           ('EmailAddress E WHERE E alias LIKE %(text)s', {'text': 'Logi%'}))
   121         self.assertRaises(BadRQLQuery, transform, "pers", "taratata")
   121         self.assertRaises(BadRQLQuery, transform, "pers", "taratata")
   123 
   123 
   124     def test_three_words_query(self):
   124     def test_three_words_query(self):
   125         """tests the 'three words shortcut queries'"""
   125         """tests the 'three words shortcut queries'"""
   126         transform = self.proc._three_words_query
   126         transform = self.proc._three_words_query
   127         self.assertEquals(transform('utilisateur', u'prénom', 'cubicweb'),
   127         self.assertEquals(transform('utilisateur', u'prénom', 'cubicweb'),
   128                           ('CWUser E WHERE E firstname %(text)s', {'text': 'cubicweb'}))
   128                           ('CWUser C WHERE C firstname %(text)s', {'text': 'cubicweb'}))
   129         self.assertEquals(transform('utilisateur', 'nom', 'cubicweb'),
   129         self.assertEquals(transform('utilisateur', 'nom', 'cubicweb'),
   130                           ('CWUser E WHERE E surname %(text)s', {'text': 'cubicweb'}))
   130                           ('CWUser C WHERE C surname %(text)s', {'text': 'cubicweb'}))
   131         self.assertEquals(transform(u'adresse', 'nom', 'cubicweb'),
   131         self.assertEquals(transform(u'adresse', 'nom', 'cubicweb'),
   132                           ('EmailAddress E WHERE E alias %(text)s', {'text': 'cubicweb'}))
   132                           ('EmailAddress E WHERE E alias %(text)s', {'text': 'cubicweb'}))
   133         self.assertEquals(transform('EmailAddress', 'nom', 'cubicweb'),
   133         self.assertEquals(transform('EmailAddress', 'nom', 'cubicweb'),
   134                           ('EmailAddress E WHERE E alias %(text)s', {'text': 'cubicweb'})) 
   134                           ('EmailAddress E WHERE E alias %(text)s', {'text': 'cubicweb'}))
   135         self.assertEquals(transform('utilisateur', u'prénom', 'cubicweb%'),
   135         self.assertEquals(transform('utilisateur', u'prénom', 'cubicweb%'),
   136                           ('CWUser E WHERE E firstname LIKE %(text)s', {'text': 'cubicweb%'}))
   136                           ('CWUser C WHERE C firstname LIKE %(text)s', {'text': 'cubicweb%'}))
   137         # expanded shortcuts
   137         # expanded shortcuts
   138         self.assertEquals(transform('CWUser', 'use_email', 'Logilab'),
   138         self.assertEquals(transform('CWUser', 'use_email', 'Logilab'),
   139                           ('CWUser E WHERE E use_email E1, E1 has_text %(text)s', {'text': 'Logilab'}))
   139                           ('CWUser C WHERE C use_email C1, C1 has_text %(text)s', {'text': 'Logilab'}))
   140         self.assertEquals(transform('CWUser', 'use_email', '%Logilab'),
   140         self.assertEquals(transform('CWUser', 'use_email', '%Logilab'),
   141                           ('CWUser E WHERE E use_email E1, E1 alias LIKE %(text)s', {'text': '%Logilab'}))
   141                           ('CWUser C WHERE C use_email C1, C1 alias LIKE %(text)s', {'text': '%Logilab'}))
   142         self.assertRaises(BadRQLQuery, transform, 'word1', 'word2', 'word3')
   142         self.assertRaises(BadRQLQuery, transform, 'word1', 'word2', 'word3')
   143         
   143 
   144     def test_multiple_words_query(self):
   144     def test_multiple_words_query(self):
   145         """tests multiple_words_query()"""
   145         """tests multiple_words_query()"""
   146         self.assertEquals(self.proc._multiple_words_query(['a', 'b', 'c', 'd', 'e']),
   146         self.assertEquals(self.proc._multiple_words_query(['a', 'b', 'c', 'd', 'e']),
   147                           ('a b c d e',))
   147                           ('a b c d e',))
   148 
   148 
   149     def test_quoted_queries(self):
   149     def test_quoted_queries(self):
   150         """tests how quoted queries are handled"""
   150         """tests how quoted queries are handled"""
   151         queries = [
   151         queries = [
   152             (u'Adresse "My own EmailAddress"', ('EmailAddress E WHERE E has_text %(text)s', {'text': u'My own EmailAddress'})),
   152             (u'Adresse "My own EmailAddress"', ('EmailAddress E WHERE E has_text %(text)s', {'text': u'My own EmailAddress'})),
   153             (u'Utilisateur prénom "Jean Paul"', ('CWUser E WHERE E firstname %(text)s', {'text': 'Jean Paul'})),
   153             (u'Utilisateur prénom "Jean Paul"', ('CWUser C WHERE C firstname %(text)s', {'text': 'Jean Paul'})),
   154             (u'Utilisateur firstname "Jean Paul"', ('CWUser E WHERE E firstname %(text)s', {'text': 'Jean Paul'})),
   154             (u'Utilisateur firstname "Jean Paul"', ('CWUser C WHERE C firstname %(text)s', {'text': 'Jean Paul'})),
   155             (u'CWUser firstname "Jean Paul"', ('CWUser E WHERE E firstname %(text)s', {'text': 'Jean Paul'})),
   155             (u'CWUser firstname "Jean Paul"', ('CWUser C WHERE C firstname %(text)s', {'text': 'Jean Paul'})),
   156             ]
   156             ]
   157         transform = self.proc._quoted_words_query
   157         transform = self.proc._quoted_words_query
   158         for query, expected in queries:
   158         for query, expected in queries:
   159             self.assertEquals(transform(query), expected)
   159             self.assertEquals(transform(query), expected)
   160         self.assertRaises(BadRQLQuery, transform, "unquoted rql")
   160         self.assertRaises(BadRQLQuery, transform, "unquoted rql")
   161         self.assertRaises(BadRQLQuery, transform, 'pers "Jean Paul"')
   161         self.assertRaises(BadRQLQuery, transform, 'pers "Jean Paul"')
   162         self.assertRaises(BadRQLQuery, transform, 'CWUser firstname other "Jean Paul"')
   162         self.assertRaises(BadRQLQuery, transform, 'CWUser firstname other "Jean Paul"')
   163     
   163 
   164     def test_process_query(self):
   164     def test_process_query(self):
   165         """tests how queries are processed"""
   165         """tests how queries are processed"""
   166         queries = [
   166         queries = [
   167             (u'Utilisateur', (u"CWUser E",)),
   167             (u'Utilisateur', (u"CWUser C",)),
   168             (u'Utilisateur P', (u"CWUser P",)),
   168             (u'Utilisateur P', (u"CWUser P",)),
   169             (u'Utilisateur cubicweb', (u'CWUser E WHERE E has_text %(text)s', {'text': u'cubicweb'})),
   169             (u'Utilisateur cubicweb', (u'CWUser C WHERE C has_text %(text)s', {'text': u'cubicweb'})),
   170             (u'CWUser prénom cubicweb', (u'CWUser E WHERE E firstname %(text)s', {'text': 'cubicweb'},)),
   170             (u'CWUser prénom cubicweb', (u'CWUser C WHERE C firstname %(text)s', {'text': 'cubicweb'},)),
   171             (u'Any X WHERE X is Something', (u"Any X WHERE X is Something",)),
   171             (u'Any X WHERE X is Something', (u"Any X WHERE X is Something",)),
   172             ]
   172             ]
   173         for query, expected in queries:
   173         for query, expected in queries:
   174             self.assertEquals(self.proc.preprocess_query(query, self.req), expected)
   174             self.assertEquals(self.proc.preprocess_query(query, self.req), expected)
   175         
   175 
   176 
   176 
   177 
   177 
   178 ## Processor Chains tests ############################################
   178 ## Processor Chains tests ############################################
   179         
   179 
   180 
   180 
   181 class ProcessorChainTC(EnvBasedTC):
   181 class ProcessorChainTC(EnvBasedTC):
   182     """test suite for magic_search's processor chains"""
   182     """test suite for magic_search's processor chains"""
   183 
   183 
   184     def setUp(self):
   184     def setUp(self):
   193             (u'foo',
   193             (u'foo',
   194              ("Any X WHERE X has_text %(text)s", {'text': u'foo'})),
   194              ("Any X WHERE X has_text %(text)s", {'text': u'foo'})),
   195             # XXX this sounds like a language translator test...
   195             # XXX this sounds like a language translator test...
   196             # and it fail
   196             # and it fail
   197             (u'Utilisateur Smith',
   197             (u'Utilisateur Smith',
   198              ('CWUser E WHERE E has_text %(text)s', {'text': u'Smith'})),
   198              ('CWUser C WHERE C has_text %(text)s', {'text': u'Smith'})),
   199             (u'utilisateur nom Smith',
   199             (u'utilisateur nom Smith',
   200              ('CWUser E WHERE E surname %(text)s', {'text': u'Smith'})),
   200              ('CWUser C WHERE C surname %(text)s', {'text': u'Smith'})),
   201             (u'Any P WHERE P is Utilisateur, P nom "Smith"',
   201             (u'Any P WHERE P is Utilisateur, P nom "Smith"',
   202              ('Any P WHERE P is CWUser, P surname "Smith"', None)),
   202              ('Any P WHERE P is CWUser, P surname "Smith"', None)),
   203             ]
   203             ]
   204         for query, expected in queries:
   204         for query, expected in queries:
   205             rset = self.proc.process_query(query, self.req)
   205             rset = self.proc.process_query(query, self.req)
   217         self.assertRaises(BadRQLQuery,
   217         self.assertRaises(BadRQLQuery,
   218                           self.proc.process_query, u'rql: CWUser E WHERE E noattr "Smith"', self.req)
   218                           self.proc.process_query, u'rql: CWUser E WHERE E noattr "Smith"', self.req)
   219         rset = self.proc.process_query(u'text: utilisateur Smith', self.req)
   219         rset = self.proc.process_query(u'text: utilisateur Smith', self.req)
   220         self.assertEquals(rset.rql, 'Any X WHERE X has_text %(text)s')
   220         self.assertEquals(rset.rql, 'Any X WHERE X has_text %(text)s')
   221         self.assertEquals(rset.args, {'text': u'utilisateur Smith'})
   221         self.assertEquals(rset.args, {'text': u'utilisateur Smith'})
   222                           
   222 
   223 if __name__ == '__main__':
   223 if __name__ == '__main__':
   224     unittest_main()
   224     unittest_main()