[IMP] website_slides: add tests

Currently website_slides module lacks tests. This commit adds base for tests
and add some tests related to recently cleaned access rules and rights.

Future commits will gradually add more tests to the module as it evolves
towards a more broad and up-to-date application.

This commit is linked to task ID 1937411 and PR #30847.
This commit is contained in:
Thibault Delavallée
2019-02-07 13:45:57 +00:00
parent 748b9072d6
commit b91add891c
3 changed files with 205 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import common
from . import test_security
+67
View File
@@ -0,0 +1,67 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from contextlib import contextmanager
from functools import partial
from odoo.tests import common, new_test_user
slides_new_test_user = partial(new_test_user, context={'mail_create_nolog': True, 'mail_create_nosubscribe': True, 'mail_notrack': True, 'no_reset_password': True})
class SlidesCase(common.SavepointCase):
def setUp(self):
super(SlidesCase, self).setUp()
self.user_publisher = slides_new_test_user(
self.env, name='Paul Publisher', login='user_publisher', email='publisher@example.com',
groups='base.group_user,website.group_website_publisher'
)
self.user_emp = slides_new_test_user(
self.env, name='Eglantine Employee', login='user_emp', email='employee@example.com',
groups='base.group_user'
)
self.user_portal = slides_new_test_user(
self.env, name='Patrick Portal', login='user_portal', email='portal@example.com',
groups='base.group_portal'
)
self.user_public = slides_new_test_user(
self.env, name='Pauline Public', login='user_public', email='public@example.com',
groups='base.group_public'
)
self.customer = self.env['res.partner'].create({
'name': 'Caroline Customer',
'email': 'customer@example.com',
'customer': True,
})
self.channel = self.env['slide.channel'].sudo(self.user_publisher).create({
'name': 'Test Channel',
'promote_strategy': 'most_voted',
'visibility': 'public',
'website_published': True,
})
self.slide = self.env['slide.slide'].sudo(self.user_publisher).create({
'name': 'How To Cook Humans',
'channel_id': self.channel.id,
'slide_type': 'presentation',
'website_published': True,
})
@contextmanager
def sudo(self, user):
""" Quick sudo environment """
old_uid = self.uid
try:
self.uid = user.id
self.env = self.env(user=self.uid)
yield
finally:
# back
self.uid = old_uid
self.env = self.env(user=self.uid)
@@ -0,0 +1,133 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.website_slides.tests import common
from odoo.exceptions import AccessError, UserError
from odoo.tests import tagged
from odoo.tests.common import users
from odoo.tools import mute_logger
@tagged('security')
class TestAccess(common.SlidesCase):
@mute_logger('odoo.models')
def test_access_channel_invite(self):
""" Invite channels don't give visibility if not member """
self.channel.write({'visibility': 'invite'})
self.channel.sudo(self.user_publisher).read(['name'])
self.channel.sudo(self.user_emp).read(['name'])
self.channel.sudo(self.user_portal).read(['name'])
self.channel.sudo(self.user_public).read(['name'])
self.slide.sudo(self.user_publisher).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_emp).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_portal).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_portal).read(['name'])
# if member -> can read
membership = self.env['slide.channel.partner'].create({
'channel_id': self.channel.id,
'state': 'confirmed',
'partner_id': self.user_emp.partner_id.id,
})
self.channel.sudo(self.user_emp).read(['name'])
self.slide.sudo(self.user_emp).read(['name'])
# unvalidated member -> cannot read
membership.write({
'state': 'draft',
})
self.channel.sudo(self.user_emp).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_emp).read(['name'])
# not member anymore -> cannot read
membership.unlink()
self.channel.sudo(self.user_emp).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_emp).read(['name'])
@mute_logger('odoo.models')
def test_access_channel_public(self):
""" Public channels don't give visibility if not member """
self.channel.write({'visibility': 'public'})
self.channel.sudo(self.user_publisher).read(['name'])
self.channel.sudo(self.user_emp).read(['name'])
self.channel.sudo(self.user_portal).read(['name'])
self.channel.sudo(self.user_public).read(['name'])
self.slide.sudo(self.user_publisher).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_emp).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_portal).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_public).read(['name'])
@mute_logger('odoo.models')
def test_access_channel_publish(self):
""" Unpublished channels and their content are visible only to website people """
self.channel.write({'website_published': False, 'visibility': 'public'})
# channel available only to website
self.channel.sudo(self.user_publisher).read(['name'])
with self.assertRaises(AccessError):
self.channel.sudo(self.user_emp).read(['name'])
with self.assertRaises(AccessError):
self.channel.sudo(self.user_portal).read(['name'])
with self.assertRaises(AccessError):
self.channel.sudo(self.user_public).read(['name'])
# slide available only to website
self.slide.sudo(self.user_publisher).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_emp).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_portal).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_public).read(['name'])
# even members cannot see unpublished content
self.env['slide.channel.partner'].create({
'channel_id': self.channel.id,
'state': 'confirmed',
'partner_id': self.user_emp.partner_id.id,
})
with self.assertRaises(AccessError):
self.channel.sudo(self.user_emp).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_emp).read(['name'])
# publish channel but content unpublished (even if can be previewed) still unavailable
self.channel.write({'website_published': True})
self.slide.write({
'is_preview': True,
'website_published': False,
})
self.slide.sudo(self.user_publisher).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_emp).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_portal).read(['name'])
with self.assertRaises(AccessError):
self.slide.sudo(self.user_public).read(['name'])
@mute_logger('odoo.models')
def test_access_slide_preview(self):
""" Slides with preview flag are always visible even to non members if published """
self.channel.write({'visibility': 'invite'})
self.slide.write({'is_preview': True})
self.slide.sudo(self.user_publisher).read(['name'])
self.slide.sudo(self.user_emp).read(['name'])
self.slide.sudo(self.user_portal).read(['name'])
self.slide.sudo(self.user_public).read(['name'])