You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

123 lines
4.6 KiB

# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
import mock
from odoo import _
from odoo.exceptions import AccessError
from odoo.tests.common import HttpCase, TransactionCase
class TestExport(TransactionCase):
def setUp(self):
super(TestExport, self).setUp()
export_group = self.env.ref('base_export_security.export_group')
self.authorized_user = self.env['res.users'].create({
'login': 'exporttestuser',
'partner_id': self.env['res.partner'].create({
'name': "Export Test User"
}).id,
'groups_id': [(4, export_group.id, 0)],
})
self.unauthorized_user = self.env['res.users'].create({
'login': 'unauthorizedexporttestuser',
'partner_id': self.env['res.partner'].create({
'name': "Unauthorized Export Test User"
}).id,
})
self.model_name = 'ir.module.module'
self.recordset = self.env[self.model_name].search([])
self.field_names = ['name', 'id']
self.model = self.env['ir.model'].search([
('model', '=', self.model_name),
])
self.records = self.env['ir.model.data'].search([
('model', '=', self.model_name),
('res_id', 'in', self.recordset.ids),
])
self.fields = self.env['ir.model.fields'].search([
('model', '=', self.model_name),
('name', 'in', self.field_names),
])
def test_log_export(self):
"""It should create a new Export record with correct data"""
log = self.env['export.event'].sudo(self.authorized_user).log_export(
self.recordset,
self.field_names,
)
self.assertEqual(
[log.model_id, log.field_ids, log.record_ids, log.user_id],
[self.model, self.fields, self.records, self.authorized_user],
'Log not created properly',
)
def test_log_export_posts_notification(self):
"""It should call post_notification method"""
post_notification_mock = mock.MagicMock()
self.env['export.event']._patch_method(
'post_notification',
post_notification_mock,
)
self.env['export.event'].sudo(self.authorized_user).log_export(
self.recordset,
self.field_names,
)
post_notification_mock.assert_called_once_with()
self.env['export.event']._revert_method('post_notification')
def test_post_notification(self):
"""It should post a notification with appropriate data
to the #data export channel"""
export = self.env['export.event'].create({
'model_id': self.model.id,
'field_ids': [(4, self.fields.ids)],
'record_ids': [(4, self.records.ids)],
'user_id': self.authorized_user.id,
})
message = export.sudo().post_notification()
field_labels = ', '.join(
self.fields.sorted().mapped('field_description'),
)
message_data = {
'records': len(self.records.ids),
'model': self.model.name,
'user': self.authorized_user.name,
'fields': field_labels,
}
message_body = _(
'<p>%(records)d <b>%(model)s</b> records exported by <b>%(user)s'
'</b>.<br><b>Fields exported:</b> %(fields)s</p>'
) % message_data
self.assertEqual(
[message.body, message.message_type, message.model],
[message_body, 'notification', 'mail.channel'],
'Message not posted properly',
)
def test_export_data_access(self):
"""It should raise AccessError if user does not have export rights"""
with self.assertRaises(AccessError):
self.env[self.model_name].sudo(
self.unauthorized_user
).export_data(self, None)
def test_export_data_calls_log_export(self):
"""It should call log_export if user has export rights"""
log_export_mock = mock.MagicMock()
self.env['export.event']._patch_method('log_export', log_export_mock)
model = self.env[self.model_name]
model.sudo(self.authorized_user).export_data(self.field_names)
log_export_mock.assert_called_once_with(model, self.field_names)
self.env['export.event']._revert_method('log_export')
class TestJS(HttpCase):
def test_export_visibility(self):
"""Test visibility of export menu item"""
self.phantom_js(
"/web/tests?debug=assets&module=base_export_security",
"",
login="admin",
)