Bug === If you send a URL (which will be transformed into a link tracker) to an external website (e.g. in mass mailing, social, ...), the UTM values will be added in the GET parameters of the URL. The external website might crash if those parameters are not supported by it. We want to add a system parameter `link_tracker.no_external_tracking` to be able to not add those UTM values in the redirected URL. This is done only for external website, because it will never be an issue if the URL redirect to Odoo. Task-2657413 closes odoo/odoo#78616 X-original-commit: c8363b7bb74ace4e77b593efc3a9104143240141 Signed-off-by: awa-odoo <awa-odoo@users.noreply.github.com>
151 lines
5.0 KiB
Python
151 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from .common import MockLinkTracker
|
|
from odoo.tests import common
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class TestLinkTracker(common.TransactionCase, MockLinkTracker):
|
|
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):
|
|
link_tracker_1 = self.env['link.tracker'].create({
|
|
'url': 'https://odoo.com',
|
|
'title': 'Odoo',
|
|
})
|
|
|
|
link_tracker_2 = self.env['link.tracker'].search_or_create({
|
|
'url': 'https://odoo.com',
|
|
'title': 'Odoo',
|
|
})
|
|
|
|
self.assertEqual(link_tracker_1, link_tracker_2)
|
|
|
|
link_tracker_3 = self.env['link.tracker'].search_or_create({
|
|
'url': 'https://odoo.be',
|
|
'title': 'Odoo',
|
|
})
|
|
|
|
self.assertNotEqual(link_tracker_1, link_tracker_3)
|
|
|
|
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,
|
|
})
|
|
|
|
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': '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
|
|
})
|
|
|
|
# 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})
|
|
|
|
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 = 'https://test.odoo.com/test?a=example.com'
|
|
self.assertLinkParams(
|
|
'https://test.odoo.com/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'}
|
|
)
|