1import unittest
2
3from pony.orm.core import *
4from pony.orm.tests.testutils import *
5from pony.orm.tests import setup_database, teardown_database
6
7db = Database()
8
9class Group(db.Entity):
10    students = Set('Student')
11
12class Student(db.Entity):
13    first_name = Required(str)
14    last_name = Required(str)
15    login = Optional(str, nullable=True)
16    graduated = Optional(bool, default=False)
17    group = Required(Group)
18    passport = Optional('Passport', column='passport')
19
20class Passport(db.Entity):
21    student = Optional(Student)
22
23
24class TestExists(unittest.TestCase):
25    @classmethod
26    def setUpClass(cls):
27        setup_database(db)
28        with db_session:
29            g1 = Group(id=1)
30            g2 = Group(id=2)
31
32            p = Passport(id=1)
33
34            Student(id=1, first_name='Mashu', last_name='Kyrielight', login='Shielder', group=g1)
35            Student(id=2, first_name='Okita', last_name='Souji', login='Sakura', group=g1)
36            Student(id=3, first_name='Francis', last_name='Drake', group=g2, graduated=True)
37            Student(id=4, first_name='Oda', last_name='Nobunaga', group=g2, graduated=True)
38            Student(id=5, first_name='William', last_name='Shakespeare', group=g2, graduated=True, passport=p)
39
40    @classmethod
41    def tearDownClass(cls):
42        teardown_database(db)
43
44    def setUp(self):
45        rollback()
46        db_session.__enter__()
47
48    def tearDown(self):
49        rollback()
50        db_session.__exit__()
51
52    def test_1(self):
53        q = select(g for g in Group if exists(s.login for s in g.students))[:]
54        self.assertEqual(q[0], Group[1])
55
56    def test_2(self):
57        q = select(g for g in Group if exists(s.graduated for s in g.students))[:]
58        self.assertEqual(q[0], Group[2])
59
60    def test_3(self):
61        q = select(s for s in Student if
62                   exists(len(s2.first_name) == len(s.first_name) and s != s2 for s2 in Student))[:]
63        self.assertEqual(set(q), {Student[1], Student[2], Student[3], Student[5]})
64
65    def test_4(self):
66        q = select(g for g in Group if not exists(not s.graduated for s in g.students))[:]
67        self.assertEqual(q[0], Group[2])
68
69    def test_5(self):
70        q = select(g for g in Group if exists(s for s in g.students))[:]
71        self.assertEqual(set(q), {Group[1], Group[2]})
72
73    def test_6(self):
74        q = select(g for g in Group if exists(s.login for s in g.students if s.first_name != 'Okita') and g.id != 10)[:]
75        self.assertEqual(q[0], Group[1])
76
77    def test_7(self):
78        q = select(g for g in Group if exists(s.passport for s in g.students))[:]
79        self.assertEqual(q[0], Group[2])