13 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
13 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
14 # details. |
14 # details. |
15 # |
15 # |
16 # You should have received a copy of the GNU Lesser General Public License along |
16 # You should have received a copy of the GNU Lesser General Public License along |
17 # with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
17 # with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
|
18 |
|
19 from logilab.common.decorators import clear_cache |
|
20 |
18 from cubicweb.devtools import init_test_database |
21 from cubicweb.devtools import init_test_database |
19 from cubicweb.devtools.repotest import BasePlannerTC, test_plan |
22 from cubicweb.devtools.repotest import BasePlannerTC, test_plan |
20 |
23 |
21 class _SetGenerator(object): |
24 class _SetGenerator(object): |
22 """singleton to easily create set using "s[0]" or "s[0,1,2]" for instance |
25 """singleton to easily create set using "s[0]" or "s[0,1,2]" for instance |
43 |
46 |
44 class FakeCardSource(AbstractSource): |
47 class FakeCardSource(AbstractSource): |
45 uri = 'ccc' |
48 uri = 'ccc' |
46 support_entities = {'Card': True, 'Note': True, 'State': True} |
49 support_entities = {'Card': True, 'Note': True, 'State': True} |
47 support_relations = {'in_state': True, 'multisource_rel': True, 'multisource_inlined_rel': True, |
50 support_relations = {'in_state': True, 'multisource_rel': True, 'multisource_inlined_rel': True, |
48 'multisource_crossed_rel': True} |
51 'multisource_crossed_rel': True,} |
49 dont_cross_relations = set(('fiche', 'state_of')) |
52 dont_cross_relations = set(('fiche', 'state_of')) |
50 cross_relations = set(('multisource_crossed_rel',)) |
53 cross_relations = set(('multisource_crossed_rel',)) |
51 |
54 |
52 def syntax_tree_search(self, *args, **kwargs): |
55 def syntax_tree_search(self, *args, **kwargs): |
53 return [] |
56 return [] |
1024 ('FetchStep', |
1029 ('FetchStep', |
1025 [('Any X,XT WHERE X title XT, X is Card', [{'X': 'Card', 'XT': 'String'}])], |
1030 [('Any X,XT WHERE X title XT, X is Card', [{'X': 'Card', 'XT': 'String'}])], |
1026 [self.cards, self.system], None, {'X': 'table1.C0', 'X.title': 'table1.C1', 'XT': 'table1.C1'}, []), |
1031 [self.cards, self.system], None, {'X': 'table1.C0', 'X.title': 'table1.C1', 'XT': 'table1.C1'}, []), |
1027 ('OneFetchStep', |
1032 ('OneFetchStep', |
1028 [('Any X,XT,U WHERE X owned_by U?, X title XT, X is Card', |
1033 [('Any X,XT,U WHERE X owned_by U?, X title XT, X is Card', |
1029 [{'X': 'Card', 'XT': 'String'}])], |
1034 [{'X': 'Card', 'U': 'CWUser', 'XT': 'String'}])], |
1030 None, None, [self.system], {'L': 'table0.C1', |
1035 None, None, [self.system], {'L': 'table0.C1', |
1031 'U': 'table0.C0', |
1036 'U': 'table0.C0', |
1032 'X': 'table1.C0', |
1037 'X': 'table1.C0', |
1033 'X.title': 'table1.C1', |
1038 'X.title': 'table1.C1', |
1034 'XT': 'table1.C1'}, []) |
1039 'XT': 'table1.C1'}, []) |
1434 [{'T': 'String', 'X': 'Bookmark'}])], |
1439 [{'T': 'String', 'X': 'Bookmark'}])], |
1435 [self.system], {}, {'N': 'table0.C1', 'X': 'table0.C0', 'X.name': 'table0.C1'}, []), |
1440 [self.system], {}, {'N': 'table0.C1', 'X': 'table0.C0', 'X.name': 'table0.C1'}, []), |
1436 ('FetchStep', |
1441 ('FetchStep', |
1437 [('Any B,C WHERE B login C, B is CWUser', [{'B': 'CWUser', 'C': 'String'}])], |
1442 [('Any B,C WHERE B login C, B is CWUser', [{'B': 'CWUser', 'C': 'String'}])], |
1438 [self.ldap, self.system], None, {'B': 'table1.C0', 'B.login': 'table1.C1', 'C': 'table1.C1'}, []), |
1443 [self.ldap, self.system], None, {'B': 'table1.C0', 'B.login': 'table1.C1', 'C': 'table1.C1'}, []), |
1439 ('OneFetchStep', [('DISTINCT Any B,C ORDERBY C WHERE A created_by B, B login C, EXISTS(B owned_by 5), B is CWUser', |
1444 ('OneFetchStep', [('DISTINCT Any B,C ORDERBY C WHERE A created_by B, B login C, EXISTS(B owned_by 5), B is CWUser, A is IN(Bookmark, Tag)', |
1440 [{'A': 'Bookmark', 'B': 'CWUser', 'C': 'String'}, |
1445 [{'A': 'Bookmark', 'B': 'CWUser', 'C': 'String'}, |
1441 {'A': 'Tag', 'B': 'CWUser', 'C': 'String'}])], |
1446 {'A': 'Tag', 'B': 'CWUser', 'C': 'String'}])], |
1442 None, None, [self.system], |
1447 None, None, [self.system], |
1443 {'A': 'table0.C0', |
1448 {'A': 'table0.C0', |
1444 'B': 'table1.C0', 'B.login': 'table1.C1', |
1449 'B': 'table1.C0', 'B.login': 'table1.C1', |
1468 'X.title': 'table0.C1'}, []), |
1473 'X.title': 'table0.C1'}, []), |
1469 ]), |
1474 ]), |
1470 ('FetchStep', |
1475 ('FetchStep', |
1471 [('Any B,C WHERE B login C, B is CWUser', [{'B': 'CWUser', 'C': 'String'}])], |
1476 [('Any B,C WHERE B login C, B is CWUser', [{'B': 'CWUser', 'C': 'String'}])], |
1472 [self.ldap, self.system], None, {'B': 'table1.C0', 'B.login': 'table1.C1', 'C': 'table1.C1'}, []), |
1477 [self.ldap, self.system], None, {'B': 'table1.C0', 'B.login': 'table1.C1', 'C': 'table1.C1'}, []), |
1473 ('OneFetchStep', [('DISTINCT Any B,C ORDERBY C WHERE A created_by B, B login C, EXISTS(B owned_by 5), B is CWUser', |
1478 ('OneFetchStep', [('DISTINCT Any B,C ORDERBY C WHERE A created_by B, B login C, EXISTS(B owned_by 5), B is CWUser, A is IN(Card, Tag)', |
1474 [{'A': 'Card', 'B': 'CWUser', 'C': 'String'}, |
1479 [{'A': 'Card', 'B': 'CWUser', 'C': 'String'}, |
1475 {'A': 'Tag', 'B': 'CWUser', 'C': 'String'}])], |
1480 {'A': 'Tag', 'B': 'CWUser', 'C': 'String'}])], |
1476 None, None, [self.system], |
1481 None, None, [self.system], |
1477 {'A': 'table0.C0', |
1482 {'A': 'table0.C0', |
1478 'B': 'table1.C0', 'B.login': 'table1.C1', |
1483 'B': 'table1.C0', 'B.login': 'table1.C1', |
1754 # ('OneFetchStep', [('DISTINCT Any X,%s WHERE X is CWUser' % activatedeid, |
1759 # ('OneFetchStep', [('DISTINCT Any X,%s WHERE X is CWUser' % activatedeid, |
1755 # [{'X': 'CWUser'}])], |
1760 # [{'X': 'CWUser'}])], |
1756 # None, None, [self.system], {}, []), |
1761 # None, None, [self.system], {}, []), |
1757 # ]), |
1762 # ]), |
1758 # ]) |
1763 # ]) |
|
1764 |
|
1765 def test_ldap_user_related_to_invariant_and_dont_cross_rel(self): |
|
1766 self.repo._type_source_cache[999999] = ('Note', 'cards', 999999) |
|
1767 self.cards.dont_cross_relations.add('created_by') |
|
1768 try: |
|
1769 self._test('Any X,XL WHERE E eid %(x)s, E created_by X, X login XL', |
|
1770 [('FetchStep', [('Any X,XL WHERE X login XL, X is CWUser', |
|
1771 [{'X': 'CWUser', 'XL': 'String'}])], |
|
1772 [self.ldap, self.system], None, |
|
1773 {'X': 'table0.C0', 'X.login': 'table0.C1', 'XL': 'table0.C1'}, |
|
1774 []), |
|
1775 ('OneFetchStep', |
|
1776 [('Any X,XL WHERE 999999 created_by X, X login XL, X is CWUser', |
|
1777 [{'X': 'CWUser', 'XL': 'String'}])], |
|
1778 None, None, |
|
1779 [self.system], |
|
1780 {'X': 'table0.C0', 'X.login': 'table0.C1', 'XL': 'table0.C1'}, |
|
1781 [])], |
|
1782 {'x': 999999}) |
|
1783 finally: |
|
1784 self.cards.dont_cross_relations.remove('created_by') |
|
1785 |
|
1786 def test_ambigous_cross_relation(self): |
|
1787 self.repo._type_source_cache[999999] = ('Note', 'cards', 999999) |
|
1788 self.cards.support_relations['see_also'] = True |
|
1789 self.cards.cross_relations.add('see_also') |
|
1790 try: |
|
1791 self._test('Any X,AA ORDERBY AA WHERE E eid %(x)s, E see_also X, X modification_date AA', |
|
1792 [('FetchStep', [('Any X,AA WHERE X modification_date AA, X is Note', |
|
1793 [{'AA': 'Datetime', 'X': 'Note'}])], |
|
1794 [self.cards, self.system], None, |
|
1795 {'AA': 'table0.C1', 'X': 'table0.C0', |
|
1796 'X.modification_date': 'table0.C1'}, |
|
1797 []), |
|
1798 ('AggrStep', 'SELECT table1.C0, table1.C1 FROM table1 ORDER BY table1.C1', |
|
1799 None, |
|
1800 [('FetchStep', [('Any X,AA WHERE 999999 see_also X, X modification_date AA, X is IN(Bookmark)', |
|
1801 [{'AA': 'Datetime', 'X': 'Bookmark'}])], |
|
1802 [self.cards, self.system], |
|
1803 {}, |
|
1804 {'AA': 'table1.C1', |
|
1805 'X': 'table1.C0', 'X.modification_date': 'table1.C1'}, |
|
1806 []), |
|
1807 ('FetchStep', |
|
1808 [('Any X,AA WHERE 999999 see_also X, X modification_date AA, X is IN(Note)', |
|
1809 [{'AA': 'Datetime', 'X': 'Note'}])], |
|
1810 [self.cards], |
|
1811 None, |
|
1812 {'AA': 'table1.C1', |
|
1813 'X': 'table1.C0', 'X.modification_date': 'table1.C1'}, |
|
1814 []), |
|
1815 ('FetchStep', |
|
1816 [('Any X,AA WHERE 999999 see_also X, X modification_date AA, X is IN(Note)', |
|
1817 [{'AA': 'Datetime', 'X': 'Note'}])], |
|
1818 [self.system], |
|
1819 {'AA': 'table0.C1', |
|
1820 'X': 'table0.C0', 'X.modification_date': 'table0.C1'}, |
|
1821 {'AA': 'table1.C1', |
|
1822 'X': 'table1.C0', 'X.modification_date': 'table1.C1'}, |
|
1823 [])] |
|
1824 )], |
|
1825 {'x': 999999}) |
|
1826 finally: |
|
1827 del self.cards.support_relations['see_also'] |
|
1828 self.cards.cross_relations.remove('see_also') |
1759 |
1829 |
1760 # non regression tests #################################################### |
1830 # non regression tests #################################################### |
1761 |
1831 |
1762 def test_nonregr1(self): |
1832 def test_nonregr1(self): |
1763 self._test('Any X, Y WHERE X copain Y, X login "syt", Y login "cochon"', |
1833 self._test('Any X, Y WHERE X copain Y, X login "syt", Y login "cochon"', |