web/test/unittest_magicsearch.py
branchtls-sprint
changeset 1398 5fe84a5f7035
parent 0 b97547f5f1fa
child 1654 57b9fd2462b8
equal deleted inserted replaced
1397:6cbc7bc8ea6d 1398:5fe84a5f7035
     9 
     9 
    10 from cubicweb.devtools.apptest import EnvBasedTC, TestEnvironment
    10 from cubicweb.devtools.apptest import EnvBasedTC, TestEnvironment
    11 
    11 
    12 
    12 
    13 translations = {
    13 translations = {
    14     u'EUser' : u"Utilisateur",
    14     u'CWUser' : u"Utilisateur",
    15 #    u'Workcase' : u"Affaire",
    15 #    u'Workcase' : u"Affaire",
    16     u'EmailAddress' : u"Adresse",
    16     u'EmailAddress' : u"Adresse",
    17 #    u'Division' : u"Division",
    17 #    u'Division' : u"Division",
    18 #    u'Comment' : u"Commentaire",
    18 #    u'Comment' : u"Commentaire",
    19     u'name' : u"nom",
    19     u'name' : u"nom",
    52         rql = "Any P WHERE P adel C, C is EmailAddress, C nom 'Logilab'"
    52         rql = "Any P WHERE P adel C, C is EmailAddress, C nom 'Logilab'"
    53         rql, = self.proc.preprocess_query(rql, self.req)
    53         rql, = self.proc.preprocess_query(rql, self.req)
    54         self.assertEquals(rql, "Any P WHERE P use_email C, C is EmailAddress, C alias 'Logilab'")
    54         self.assertEquals(rql, "Any P WHERE P use_email C, C is EmailAddress, C alias 'Logilab'")
    55         rql = "Any P WHERE P is Utilisateur, P adel C, P nom 'Smith'"
    55         rql = "Any P WHERE P is Utilisateur, P adel C, P nom 'Smith'"
    56         rql, = self.proc.preprocess_query(rql, self.req)
    56         rql, = self.proc.preprocess_query(rql, self.req)
    57         self.assertEquals(rql, "Any P WHERE P is EUser, P use_email C, P surname 'Smith'")
    57         self.assertEquals(rql, "Any P WHERE P is CWUser, P use_email C, P surname 'Smith'")
    58 
    58 
    59 
    59 
    60 class QSPreProcessorTC(EnvBasedTC):
    60 class QSPreProcessorTC(EnvBasedTC):
    61     """test suite for QSPreProcessor"""
    61     """test suite for QSPreProcessor"""
    62     def setUp(self):
    62     def setUp(self):
    77         self.assertRaises(BadRQLQuery, translate, 'whatever')
    77         self.assertRaises(BadRQLQuery, translate, 'whatever')
    78 
    78 
    79     def test_attribute_translation(self):
    79     def test_attribute_translation(self):
    80         """tests QSPreProcessor._get_attribute_name"""
    80         """tests QSPreProcessor._get_attribute_name"""
    81         translate = self.proc._get_attribute_name
    81         translate = self.proc._get_attribute_name
    82         eschema = self.schema.eschema('EUser')
    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")
    93     def test_one_word_query(self):
    93     def test_one_word_query(self):
    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('EUser'),
    98         self.assertEquals(transform('CWUser'),
    99                           ('EUser E',))
    99                           ('CWUser E',))
   100         self.assertEquals(transform('Utilisateur'),
   100         self.assertEquals(transform('Utilisateur'),
   101                           ('EUser E',))
   101                           ('CWUser E',))
   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')
   107 
   107 
   108     def test_two_words_query(self):
   108     def test_two_words_query(self):
   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('EUser', 'E'),
   111         self.assertEquals(transform('CWUser', 'E'),
   112                           ("EUser E",))
   112                           ("CWUser E",))
   113         self.assertEquals(transform('EUser', 'Smith'),
   113         self.assertEquals(transform('CWUser', 'Smith'),
   114                           ('EUser E WHERE E has_text %(text)s', {'text': 'Smith'}))
   114                           ('CWUser E WHERE E has_text %(text)s', {'text': 'Smith'}))
   115         self.assertEquals(transform('utilisateur', 'Smith'),
   115         self.assertEquals(transform('utilisateur', 'Smith'),
   116                           ('EUser E WHERE E has_text %(text)s', {'text': 'Smith'}))
   116                           ('CWUser E WHERE E 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")
   122         #self.assertEquals(transform('EUser', '%mi'), 'EUser E WHERE P surname LIKE "%mi"')
   122         #self.assertEquals(transform('CWUser', '%mi'), 'CWUser E WHERE P surname LIKE "%mi"')
   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                           ('EUser E WHERE E firstname %(text)s', {'text': 'cubicweb'}))
   128                           ('CWUser E WHERE E firstname %(text)s', {'text': 'cubicweb'}))
   129         self.assertEquals(transform('utilisateur', 'nom', 'cubicweb'),
   129         self.assertEquals(transform('utilisateur', 'nom', 'cubicweb'),
   130                           ('EUser E WHERE E surname %(text)s', {'text': 'cubicweb'}))
   130                           ('CWUser E WHERE E 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                           ('EUser E WHERE E firstname LIKE %(text)s', {'text': 'cubicweb%'}))
   136                           ('CWUser E WHERE E firstname LIKE %(text)s', {'text': 'cubicweb%'}))
   137         # expanded shortcuts
   137         # expanded shortcuts
   138         self.assertEquals(transform('EUser', 'use_email', 'Logilab'),
   138         self.assertEquals(transform('CWUser', 'use_email', 'Logilab'),
   139                           ('EUser E WHERE E use_email E1, E1 has_text %(text)s', {'text': 'Logilab'}))
   139                           ('CWUser E WHERE E use_email E1, E1 has_text %(text)s', {'text': 'Logilab'}))
   140         self.assertEquals(transform('EUser', 'use_email', '%Logilab'),
   140         self.assertEquals(transform('CWUser', 'use_email', '%Logilab'),
   141                           ('EUser E WHERE E use_email E1, E1 alias LIKE %(text)s', {'text': '%Logilab'}))
   141                           ('CWUser E WHERE E use_email E1, E1 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']),
   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"', ('EUser E WHERE E firstname %(text)s', {'text': 'Jean Paul'})),
   153             (u'Utilisateur prénom "Jean Paul"', ('CWUser E WHERE E firstname %(text)s', {'text': 'Jean Paul'})),
   154             (u'Utilisateur firstname "Jean Paul"', ('EUser E WHERE E firstname %(text)s', {'text': 'Jean Paul'})),
   154             (u'Utilisateur firstname "Jean Paul"', ('CWUser E WHERE E firstname %(text)s', {'text': 'Jean Paul'})),
   155             (u'EUser firstname "Jean Paul"', ('EUser E WHERE E firstname %(text)s', {'text': 'Jean Paul'})),
   155             (u'CWUser firstname "Jean Paul"', ('CWUser E WHERE E 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, 'EUser 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"EUser E",)),
   167             (u'Utilisateur', (u"CWUser E",)),
   168             (u'Utilisateur P', (u"EUser P",)),
   168             (u'Utilisateur P', (u"CWUser P",)),
   169             (u'Utilisateur cubicweb', (u'EUser E WHERE E has_text %(text)s', {'text': u'cubicweb'})),
   169             (u'Utilisateur cubicweb', (u'CWUser E WHERE E has_text %(text)s', {'text': u'cubicweb'})),
   170             (u'EUser prénom cubicweb', (u'EUser E WHERE E firstname %(text)s', {'text': 'cubicweb'},)),
   170             (u'CWUser prénom cubicweb', (u'CWUser E WHERE E 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         
   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              ('EUser E WHERE E has_text %(text)s', {'text': u'Smith'})),
   198              ('CWUser E WHERE E has_text %(text)s', {'text': u'Smith'})),
   199             (u'utilisateur nom Smith',
   199             (u'utilisateur nom Smith',
   200              ('EUser E WHERE E surname %(text)s', {'text': u'Smith'})),
   200              ('CWUser E WHERE E 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 EUser, 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)
   206             self.assertEquals((rset.rql, rset.args), expected)
   206             self.assertEquals((rset.rql, rset.args), expected)
   207 
   207 
   211         self.assertEquals(rset.rql, "Any X WHERE X has_text %(text)s")
   211         self.assertEquals(rset.rql, "Any X WHERE X has_text %(text)s")
   212         self.assertEquals(rset.args, {'text': u'écrire'})
   212         self.assertEquals(rset.args, {'text': u'écrire'})
   213 
   213 
   214     def test_explicit_component(self):
   214     def test_explicit_component(self):
   215         self.assertRaises(RQLSyntaxError,
   215         self.assertRaises(RQLSyntaxError,
   216                           self.proc.process_query, u'rql: EUser E WHERE E noattr "Smith",', self.req)
   216                           self.proc.process_query, u'rql: CWUser E WHERE E noattr "Smith",', self.req)
   217         self.assertRaises(BadRQLQuery,
   217         self.assertRaises(BadRQLQuery,
   218                           self.proc.process_query, u'rql: EUser 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__':