File: test_link_tracker.py

package info (click to toggle)
odoo 18.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 878,716 kB
  • sloc: javascript: 927,937; python: 685,670; xml: 388,524; sh: 1,033; sql: 415; makefile: 26
file content (263 lines) | stat: -rw-r--r-- 11,109 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo.addons.link_tracker.tests.common import MockLinkTracker
from odoo.exceptions import UserError
from odoo.tests import common, tagged


@tagged('link_tracker')
class TestLinkTracker(common.TransactionCase, MockLinkTracker):

    def setUp(self):
        super(TestLinkTracker, self).setUp()
        self._web_base_url = 'https://test.odoo.com'
        self.env['ir.config_parameter'].sudo().set_param('web.base.url', self._web_base_url)

    def test_absolute_url(self):
        """
        Test the absolute url of a link tracker having scheme in url and then removing the
        scheme to give the absolute_url as a combination of the system parameter and tracker's url
        """
        # Creating a link tracker with url having the scheme
        link_tracker = self.env['link.tracker'].create({
            'url': 'https://odoo.com',
            'title': 'Odoo',
        })
        # Validate the absolute url
        self.assertEqual(link_tracker.absolute_url, link_tracker.url)

        # Make the scheme as an empty string by removing the http:// from the url
        link_tracker.write({'url': "odoo"})
        # Validate the absolute url is the combination of system parameter and link tracker's url
        self.assertEqual(link_tracker.absolute_url, f'{self._web_base_url}/odoo')

    def test_create(self):
        link_trackers = self.env['link.tracker'].create([
            {
                'url': 'odoo.com',
                'title': 'Odoo',
            }, {
                'url': 'example.com',
                'title': 'Odoo',
            }, {
                'url': 'http://test.example.com',
                'title': 'Odoo',
            },
        ])

        self.assertEqual(
            link_trackers.mapped('url'),
            ['http://odoo.com', 'http://example.com', 'http://test.example.com'],
        )

        self.assertEqual(len(set(link_trackers.mapped('code'))), 3)

    def test_search_or_create(self):
        values_1, values_2, values_3 = [
            {'url': 'https://odoo.com', 'title': 'Odoo'},
            {'url': 'https://odoo.be', 'title': 'Odoo'},
            {'url': 'https://odoo.com', 'title': 'Odoo New', 'label': 'New one!'}  # title is not in unique constraint
        ]
        expected_values_1, expected_values_2, expected_values_3 = [
            {
                'campaign_id': self.env['utm.campaign'],
                'label': False,
                'medium_id': self.env['utm.medium'],
                'source_id': self.env['utm.source'],
                'title': 'Odoo',
                'url': 'https://odoo.com',
            }, {
                'campaign_id': self.env['utm.campaign'],
                'label': False,
                'medium_id': self.env['utm.medium'],
                'source_id': self.env['utm.source'],
                'title': 'Odoo',
                'url': 'https://odoo.be',
            }, {
                'campaign_id': self.env['utm.campaign'],
                'label': 'New one!',
                'medium_id': self.env['utm.medium'],
                'source_id': self.env['utm.source'],
                'title': 'Odoo New',
                'url': 'https://odoo.com',
            },
        ]
        link_tracker_1 = self.env['link.tracker'].create(values_1)
        link_tracker_1_dupe = self.env['link.tracker'].search_or_create([values_1])
        self.assertEqual(link_tracker_1, link_tracker_1_dupe)
        for fname, value in expected_values_1.items():
            self.assertEqual(link_tracker_1[fname], value)

        link_tracker_2 = self.env['link.tracker'].search_or_create([values_2])
        self.assertNotEqual(link_tracker_1, link_tracker_2)
        for fname, value in expected_values_2.items():
            self.assertEqual(link_tracker_2[fname], value)

        # Two different checks that order is preserved
        vals_456 = [values_2, values_3, values_1]
        # When created records need to be created
        link_tracker_4, link_tracker_5, link_tracker_6 = self.env['link.tracker'].search_or_create(vals_456)
        self.assertEqual(link_tracker_4, link_tracker_2,
                         'Is coming from values_2, created before')
        self.assertEqual(link_tracker_6, link_tracker_1,
                         'Is coming from values_1, created before')
        self.assertNotIn(link_tracker_5, link_tracker_1 + link_tracker_2,
                         'Is a new one due to label diff')
        for fname, value in expected_values_3.items():
            self.assertEqual(link_tracker_5[fname], value)

        # When records are found, but not in order of vals_list in database
        link_tracker_7, link_tracker_8, link_tracker_9 = self.env['link.tracker'].search_or_create(vals_456)
        self.assertListEqual((link_tracker_7 + link_tracker_8 + link_tracker_9).ids,
                             (link_tracker_4 + link_tracker_5 + link_tracker_6).ids)

        # Also handles duplicates
        vals_3131 = [values_3, values_1, values_3, values_1]
        trackers_3131 = self.env['link.tracker'].search_or_create(vals_3131)
        self.assertListEqual(trackers_3131.ids, (link_tracker_5 + link_tracker_1 + link_tracker_5 + link_tracker_1).ids)

        # Also handles duplicates in non-existing records mixed with existing records
        values_4 = {'url': 'https://odoo.com', 'label': 'A different one'}
        vals_3434 = [values_3, values_4, values_3, values_4]
        trackers_3434 = self.env['link.tracker'].search_or_create(vals_3434)
        new_tracker = trackers_3434[1]
        self.assertListEqual(trackers_3434.ids, (link_tracker_5 + new_tracker + link_tracker_5 + new_tracker).ids)

        # Also if only non-existing records values are passed
        values_5 = {'url': 'https://odoo.com', 'label': 'Yet another label'}
        expected_values_5 = {
            'campaign_id': self.env['utm.campaign'],
            'label': 'Yet another label',
            'medium_id': self.env['utm.medium'],
            'source_id': self.env['utm.source'],
            'title': 'Test_TITLE',
            'url': 'https://odoo.com',
        }
        vals_55 = [values_5, values_5]
        trackers_55 = self.env['link.tracker'].search_or_create(vals_55)
        new_tracker = trackers_55[0]
        self.assertListEqual(trackers_55.ids, (new_tracker + new_tracker).ids)
        for fname, value in expected_values_5.items():
            self.assertEqual(new_tracker[fname], value)

    def test_constraint(self):
        campaign_id = self.env['utm.campaign'].search([], limit=1)

        self.env['link.tracker'].create({
            'url': 'https://odoo.com',
            'title': 'Odoo',
        })

        link_1 = self.env['link.tracker'].create({
            'url': '2nd url',
            'title': 'Odoo',
            'campaign_id': campaign_id.id,
        })
        self.assertEqual(link_1.label, False)

        with self.assertRaises(UserError):
            self.env['link.tracker'].create({
                'url': 'https://odoo.com',
                'title': 'Odoo',
            })

        with self.assertRaises(UserError):
            self.env['link.tracker'].create({
                'url': 'https://odoo.com',
                'title': 'Odoo',
                'label': '',
            })

        with self.assertRaises(UserError):
            self.env['link.tracker'].create({
                'url': '2nd url',
                'title': 'Odoo',
                'campaign_id': campaign_id.id,
            })

        link_2 = self.env['link.tracker'].create({
                'url': '2nd url',
                'title': 'Odoo',
                'campaign_id': campaign_id.id,
                'medium_id': self.env['utm.medium'].search([], limit=1).id,
                'label': ''
            })

        # test in batch
        with self.assertRaises(UserError):
            # both link trackers on which we write will have the same values
            (link_1 | link_2).write({'campaign_id': False, 'medium_id': False})

        with self.assertRaises(UserError):
            (link_1 | link_2).write({'medium_id': False})

        # Adding a label on one makes them different
        link_1.label = 'Something'
        (link_1 | link_2).write({'medium_id': False})

    def test_no_external_tracking(self):
        self.env['ir.config_parameter'].set_param('link_tracker.no_external_tracking', '1')

        campaign = self.env['utm.campaign'].create({'name': 'campaign'})
        source = self.env['utm.source'].create({'name': 'source'})
        medium = self.env['utm.medium'].create({'name': 'medium'})

        expected_utm_params = {
            'utm_campaign': campaign.name,
            'utm_source': source.name,
            'utm_medium': medium.name,
        }

        # URL to an external website -> UTM parameters should no be added
        # because the system parameter "no_external_tracking" is set
        link = self.env['link.tracker'].create({
            'url': 'http://external.com/test?a=example.com',
            'campaign_id': campaign.id,
            'source_id': source.id,
            'medium_id': medium.id,
            'title': 'Title',
        })
        self.assertLinkParams(
            'http://external.com/test',
            link,
            {'a': 'example.com'}
        )

        # URL to the local website -> UTM parameters should be added since we know we handle them
        # even though the parameter "no_external_tracking" is enabled
        link.url = f'{self._web_base_url}/test?a=example.com'
        self.assertLinkParams(
            f'{self._web_base_url}/test',
            link,
            {**expected_utm_params, 'a': 'example.com'}
        )

        # Relative URL to the local website -> UTM parameters should be added since we know we handle them
        # even though the parameter "no_external_tracking" is enabled
        link.url = '/test?a=example.com'

        self.assertLinkParams(
            '/test',
            link,
            {**expected_utm_params, 'a': 'example.com'}
        )

        # Deactivate the system parameter
        self.env['ir.config_parameter'].set_param('link_tracker.no_external_tracking', False)

        # URL to an external website -> UTM parameters should be added since
        # the system  parameter "link_tracker.no_external_tracking" is disabled
        link.url = 'http://external.com/test?a=example.com'
        self.assertLinkParams(
            'http://external.com/test',
            link,
            {**expected_utm_params, 'a': 'example.com'}
        )

    def test_no_loop(self):
        """ Ensure that we cannot register a link that would loop on itself """
        self.assertRaises(UserError, self.env['link.tracker'].create, {'url': '?'})
        self.assertRaises(UserError, self.env['link.tracker'].create, {'url': '?debug=1'})
        self.assertRaises(UserError, self.env['link.tracker'].create, {'url': '#'})
        self.assertRaises(UserError, self.env['link.tracker'].create, {'url': '#model=project.task&id=3603607'})