143 lines
5.8 KiB
Python
143 lines
5.8 KiB
Python
|
# 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")
|