[REF] Refactoring according to the review of CHS
[odoo/odoo.git] / openerp / tests / test_fields.py
1 #
2 # test cases for fields access, etc.
3 #
4 import common
5
6 from openerp.osv import fields
7
8 class TestRelatedField(common.TransactionCase):
9
10     def setUp(self):
11         super(TestRelatedField, self).setUp()
12         self.partner = self.registry('res.partner')
13         self.company = self.registry('res.company')
14
15     def test_0_related(self):
16         """ test an usual related field """
17         # add a related field test_related_company_id on res.partner
18         old_columns = self.partner._columns
19         self.partner._columns = dict(old_columns)
20         self.partner._columns.update({
21             'related_company_partner_id': fields.related('company_id', 'partner_id', type='many2one', obj='res.partner'),
22         })
23
24         # find a company with a non-null partner_id
25         ids = self.company.search(self.cr, self.uid, [('partner_id', '!=', False)], limit=1)
26         id = ids[0]
27
28         # find partners that satisfy [('partner_id.company_id', '=', id)]
29         company_ids = self.company.search(self.cr, self.uid, [('partner_id', '=', id)])
30         partner_ids1 = self.partner.search(self.cr, self.uid, [('company_id', 'in', company_ids)])
31         partner_ids2 = self.partner.search(self.cr, self.uid, [('related_company_partner_id', '=', id)])
32         self.assertEqual(partner_ids1, partner_ids2)
33
34         # restore res.partner fields
35         self.partner._columns = old_columns
36
37     def do_test_company_field(self, field):
38         # get a partner with a non-null company_id
39         ids = self.partner.search(self.cr, self.uid, [('company_id', '!=', False)], limit=1)
40         partner = self.partner.browse(self.cr, self.uid, ids[0])
41
42         # check reading related field
43         self.assertEqual(partner[field], partner.company_id)
44
45         # check that search on related field is equivalent to original field
46         ids1 = self.partner.search(self.cr, self.uid, [('company_id', '=', partner.company_id.id)])
47         ids2 = self.partner.search(self.cr, self.uid, [(field, '=', partner.company_id.id)])
48         self.assertEqual(ids1, ids2)
49
50     def test_1_single_related(self):
51         """ test a related field with a single indirection like fields.related('foo') """
52         # add a related field test_related_company_id on res.partner
53         # and simulate a _inherits_reload() to populate _all_columns.
54         old_columns = self.partner._columns
55         old_all_columns = self.partner._all_columns
56         self.partner._columns = dict(old_columns)
57         self.partner._all_columns = dict(old_all_columns)
58         self.partner._columns.update({
59             'single_related_company_id': fields.related('company_id', type='many2one', obj='res.company'),
60         })
61         self.partner._all_columns.update({
62             'single_related_company_id': fields.column_info('single_related_company_id', self.partner._columns['single_related_company_id'], None, None, None)
63         })
64
65         self.do_test_company_field('single_related_company_id')
66
67         # restore res.partner fields
68         self.partner._columns = old_columns
69         self.partner._all_columns = old_all_columns
70
71     def test_2_related_related(self):
72         """ test a related field referring to a related field """
73         # add a related field on a related field on res.partner
74         # and simulate a _inherits_reload() to populate _all_columns.
75         old_columns = self.partner._columns
76         old_all_columns = self.partner._all_columns
77         self.partner._columns = dict(old_columns)
78         self.partner._all_columns = dict(old_all_columns)
79         self.partner._columns.update({
80             'single_related_company_id': fields.related('company_id', type='many2one', obj='res.company'),
81             'related_related_company_id': fields.related('single_related_company_id', type='many2one', obj='res.company'),
82         })
83         self.partner._all_columns.update({
84             'single_related_company_id': fields.column_info('single_related_company_id', self.partner._columns['single_related_company_id'], None, None, None),
85             'related_related_company_id': fields.column_info('related_related_company_id', self.partner._columns['related_related_company_id'], None, None, None)
86         })
87
88         self.do_test_company_field('related_related_company_id')
89
90         # restore res.partner fields
91         self.partner._columns = old_columns
92         self.partner._all_columns = old_all_columns
93
94     def test_3_read_write(self):
95         """ write on a related field """
96         # add a related field test_related_company_id on res.partner
97         old_columns = self.partner._columns
98         self.partner._columns = dict(old_columns)
99         self.partner._columns.update({
100             'related_company_partner_id': fields.related('company_id', 'partner_id', type='many2one', obj='res.partner'),
101         })
102
103         # find a company with a non-null partner_id
104         company_ids = self.company.search(self.cr, self.uid, [('partner_id', '!=', False)], limit=1)
105         company = self.company.browse(self.cr, self.uid, company_ids[0])
106
107         # find partners that satisfy [('partner_id.company_id', '=', company.id)]
108         partner_ids = self.partner.search(self.cr, self.uid, [('related_company_partner_id', '=', company.id)])
109         partner = self.partner.browse(self.cr, self.uid, partner_ids[0])
110
111         # create a new partner, and assign it to company
112         new_partner_id = self.partner.create(self.cr, self.uid, {'name': 'Foo'})
113         partner.write({'related_company_partner_id': new_partner_id})
114
115         company = self.company.browse(self.cr, self.uid, company_ids[0])
116         self.assertEqual(company.partner_id.id, new_partner_id)
117
118         partner = self.partner.browse(self.cr, self.uid, partner_ids[0])
119         self.assertEqual(partner.related_company_partner_id.id, new_partner_id)
120
121         # restore res.partner fields
122         self.partner._columns = old_columns
123
124 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: