Odoo18-Base/addons/website/tests/test_get_current_website.py

143 lines
5.8 KiB
Python
Raw Permalink Normal View History

2025-01-06 10:57:38 +07:00
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import json
from odoo import Command
from odoo.addons.website.tools import MockRequest
from odoo.tests import tagged
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
@tagged('post_install', '-at_install')
class TestGetCurrentWebsite(HttpCaseWithUserDemo):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.website = cls.env.ref('website.default_website')
def test_01_get_current_website_id(self):
"""Make sure `_get_current_website_id works`."""
Website = self.env['website']
# clean initial state
website1 = self.website
website1.domain = False
website2 = Website.create({'name': 'My Website 2'})
# CASE: no domain: get first
self.assertEqual(Website._get_current_website_id(''), website1.id)
# setup domain
website1.domain = 'my-site-1.fr'
website2.domain = 'https://my2ndsite.com:80'
# CASE: domain set: get matching domain
self.assertEqual(Website._get_current_website_id('my-site-1.fr'), website1.id)
# CASE: domain set: get matching domain (scheme and port supported)
self.assertEqual(Website._get_current_website_id('my-site-1.fr:8069'), website1.id)
self.assertEqual(Website._get_current_website_id('my2ndsite.com:80'), website2.id)
self.assertEqual(Website._get_current_website_id('my2ndsite.com:8069'), website2.id)
self.assertEqual(Website._get_current_website_id('my2ndsite.com'), website2.id)
# CASE: domain set, wrong domain: get first
self.assertEqual(Website._get_current_website_id('test.com'), website1.id)
# CASE: subdomain: not supported
self.assertEqual(Website._get_current_website_id('www.my2ndsite.com'), website1.id)
# CASE: domain set: get by domain in priority
self.assertEqual(Website._get_current_website_id('my2ndsite.com'), website2.id)
self.assertEqual(Website._get_current_website_id('my-site-1.fr'), website1.id)
# CASE: overlapping domain: get exact match
website1.domain = 'site-1.com'
website2.domain = 'even-better-site-1.com'
self.assertEqual(Website._get_current_website_id('site-1.com'), website1.id)
self.assertEqual(Website._get_current_website_id('even-better-site-1.com'), website2.id)
# CASE: case insensitive
website1.domain = 'Site-1.com'
website2.domain = 'Even-Better-site-1.com'
self.assertEqual(Website._get_current_website_id('sitE-1.com'), website1.id)
self.assertEqual(Website._get_current_website_id('even-beTTer-site-1.com'), website2.id)
# CASE: same domain, different port
website1.domain = 'site-1.com:80'
website2.domain = 'site-1.com:81'
self.assertEqual(Website._get_current_website_id('site-1.com:80'), website1.id)
self.assertEqual(Website._get_current_website_id('site-1.com:81'), website2.id)
self.assertEqual(Website._get_current_website_id('site-1.com:82'), website1.id)
self.assertEqual(Website._get_current_website_id('site-1.com'), website1.id)
def test_02_signup_user_website_id(self):
website = self.website
website.specific_user_account = True
user = self.env['res.users'].create({
'website_id': website.id,
'login': 'sad@mail.com',
'name': 'Hope Fully',
'groups_id': [
Command.link(self.env.ref('base.group_portal').id),
Command.unlink(self.env.ref('base.group_user').id),
],
})
self.assertTrue(user.website_id == user.partner_id.website_id == website)
def test_03_rpc_signin_user_website_id(self):
def rpc_login_user_demo():
"""
Login with demo using JSON-RPC
:return: the user's id or False if login failed
"""
response = self.url_open('/jsonrpc', data=json.dumps({
"params": {
"service": "common",
"method": "login",
"args": [self.env.cr.dbname, 'demo', 'demo']
},
}), headers={"Content-Type": "application/json"})
return response.json()['result']
website1 = self.website
website1.domain = self.base_url()
website2 = self.env['website'].create({'name': 'My Website 2'})
website2.domain = False
# It should login successfully since the host used in the RPC call is
# the same as the website set on the user.
self.user_demo.website_id = website1
self.assertTrue(rpc_login_user_demo())
# It should not login since the website set on the user has no domain.
self.user_demo.website_id = website2
self.assertFalse(rpc_login_user_demo())
def test_recursive_current_website(self):
Website = self.env['website']
self.env['ir.rule'].create({
'name': 'Recursion Test',
'model_id': self.env.ref('website.model_website').id,
'domain_force': [(1, '=', 1)],
'groups': [],
})
# Ensure the cache is invalidated, it is not needed at the time but some
# code might one day go through get_current_website_id before reaching
# this code, making this test useless
self.env.registry.clear_cache()
failed = False
# website is added in ir.rule context only when in frontend
with MockRequest(self.env, website=self.website):
try:
Website.with_user(self.env.ref('base.public_user').id).search([])
except RecursionError:
# Do not fail test from here to avoid dumping huge stack.
failed = True
if failed:
self.fail("There should not be a RecursionError")