[FIX] integrate web tests into buildbot runner, fix broken tests
* Remove deprecated tests and dead code * Fix usage of mock * Moar fixes bzr revid: xmo@openerp.com-20120910105129-rxh3jqwkewh65rl3
This commit is contained in:
parent
bf7f9a0ee7
commit
a933c17e54
|
@ -484,15 +484,13 @@ def fix_view_modes(action):
|
||||||
if not action.get('views'):
|
if not action.get('views'):
|
||||||
generate_views(action)
|
generate_views(action)
|
||||||
|
|
||||||
id_form = None
|
|
||||||
for index, (id, mode) in enumerate(action['views']):
|
|
||||||
if mode == 'form':
|
|
||||||
id_form = id
|
|
||||||
break
|
|
||||||
|
|
||||||
if action.pop('view_type', 'form') != 'form':
|
if action.pop('view_type', 'form') != 'form':
|
||||||
return action
|
return action
|
||||||
|
|
||||||
|
if 'view_mode' in action:
|
||||||
|
action['view_mode'] = ','.join(
|
||||||
|
mode if mode != 'tree' else 'list'
|
||||||
|
for mode in action['view_mode'].split(','))
|
||||||
action['views'] = [
|
action['views'] = [
|
||||||
[id, mode if mode != 'tree' else 'list']
|
[id, mode if mode != 'tree' else 'list']
|
||||||
for id, mode in action['views']
|
for id, mode in action['views']
|
||||||
|
@ -1351,27 +1349,6 @@ class View(openerpweb.Controller):
|
||||||
def load(self, req, model, view_id, view_type, toolbar=False):
|
def load(self, req, model, view_id, view_type, toolbar=False):
|
||||||
return self.fields_view_get(req, model, view_id, view_type, toolbar=toolbar)
|
return self.fields_view_get(req, model, view_id, view_type, toolbar=toolbar)
|
||||||
|
|
||||||
class ListView(View):
|
|
||||||
_cp_path = "/web/listview"
|
|
||||||
|
|
||||||
def process_colors(self, view, row, context):
|
|
||||||
colors = view['arch']['attrs'].get('colors')
|
|
||||||
|
|
||||||
if not colors:
|
|
||||||
return None
|
|
||||||
|
|
||||||
color = [
|
|
||||||
pair.split(':')[0]
|
|
||||||
for pair in colors.split(';')
|
|
||||||
if eval(pair.split(':')[1], dict(context, **row))
|
|
||||||
]
|
|
||||||
|
|
||||||
if not color:
|
|
||||||
return None
|
|
||||||
elif len(color) == 1:
|
|
||||||
return color[0]
|
|
||||||
return 'maroon'
|
|
||||||
|
|
||||||
class TreeView(View):
|
class TreeView(View):
|
||||||
_cp_path = "/web/treeview"
|
_cp_path = "/web/treeview"
|
||||||
|
|
||||||
|
|
|
@ -480,7 +480,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
|
||||||
if (this.embedded_view) {
|
if (this.embedded_view) {
|
||||||
return $.Deferred().then(callback).resolve(this.embedded_view);
|
return $.Deferred().then(callback).resolve(this.embedded_view);
|
||||||
} else {
|
} else {
|
||||||
return this.rpc('/web/listview/load', {
|
return this.rpc('/web/view/load', {
|
||||||
model: this.model,
|
model: this.model,
|
||||||
view_id: this.view_id,
|
view_id: this.view_id,
|
||||||
view_type: "tree",
|
view_type: "tree",
|
||||||
|
|
|
@ -192,7 +192,7 @@ $(document).ready(function () {
|
||||||
|
|
||||||
var records = {};
|
var records = {};
|
||||||
_.extend(instance.session.responses, {
|
_.extend(instance.session.responses, {
|
||||||
'/web/listview/load': function () {
|
'/web/view/load': function () {
|
||||||
return {result: {
|
return {result: {
|
||||||
type: 'tree',
|
type: 'tree',
|
||||||
fields: {
|
fields: {
|
||||||
|
@ -268,7 +268,7 @@ $(document).ready(function () {
|
||||||
setup: function () {
|
setup: function () {
|
||||||
baseSetup();
|
baseSetup();
|
||||||
_.extend(instance.session.responses, {
|
_.extend(instance.session.responses, {
|
||||||
'/web/listview/load': function () {
|
'/web/view/load': function () {
|
||||||
return {result: {
|
return {result: {
|
||||||
type: 'tree',
|
type: 'tree',
|
||||||
fields: {
|
fields: {
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
|
@ -1,81 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import mock
|
|
||||||
import unittest2
|
|
||||||
import web.controllers.main
|
|
||||||
|
|
||||||
class TestDataSetController(unittest2.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.dataset = web.controllers.main.DataSet()
|
|
||||||
self.request = mock.Mock()
|
|
||||||
self.read = self.request.session.model().read
|
|
||||||
self.search = self.request.session.model().search
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_empty_find(self):
|
|
||||||
self.search.return_value = []
|
|
||||||
self.read.return_value = []
|
|
||||||
|
|
||||||
self.assertFalse(self.dataset.do_search_read(self.request, 'fake.model'))
|
|
||||||
self.read.assert_called_once_with([], False, self.request.context)
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_regular_find(self):
|
|
||||||
self.search.return_value = [1, 2, 3]
|
|
||||||
|
|
||||||
self.dataset.do_search_read(self.request, 'fake.model')
|
|
||||||
self.read.assert_called_once_with([1, 2, 3], False,
|
|
||||||
self.request.context)
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_ids_shortcut(self):
|
|
||||||
self.search.return_value = [1, 2, 3]
|
|
||||||
self.read.return_value = [
|
|
||||||
{'id': 1, 'name': 'foo'},
|
|
||||||
{'id': 2, 'name': 'bar'},
|
|
||||||
{'id': 3, 'name': 'qux'}
|
|
||||||
]
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
self.dataset.do_search_read(self.request, 'fake.model', ['id']),
|
|
||||||
[{'id': 1}, {'id': 2}, {'id': 3}])
|
|
||||||
self.assertFalse(self.read.called)
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_get(self):
|
|
||||||
self.read.return_value = [
|
|
||||||
{'id': 1, 'name': 'baz'},
|
|
||||||
{'id': 3, 'name': 'foo'},
|
|
||||||
{'id': 2, 'name': 'bar'}
|
|
||||||
]
|
|
||||||
|
|
||||||
result = self.dataset.do_get(
|
|
||||||
self.request, 'fake.model', [3, 2, 1])
|
|
||||||
self.read.assert_called_once_with(
|
|
||||||
[3, 2, 1], False)
|
|
||||||
self.assertFalse(self.search.called)
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
result,
|
|
||||||
[
|
|
||||||
{'id': 3, 'name': 'foo'},
|
|
||||||
{'id': 2, 'name': 'bar'},
|
|
||||||
{'id': 1, 'name': 'baz'}
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_get_missing_result(self):
|
|
||||||
self.read.return_value = [
|
|
||||||
{'id': 1, 'name': 'baz'},
|
|
||||||
{'id': 2, 'name': 'bar'}
|
|
||||||
]
|
|
||||||
|
|
||||||
result = self.dataset.do_get(
|
|
||||||
self.request, 'fake.model', [3, 2, 1])
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
result,
|
|
||||||
[
|
|
||||||
{'id': 2, 'name': 'bar'},
|
|
||||||
{'id': 1, 'name': 'baz'}
|
|
||||||
]
|
|
||||||
)
|
|
|
@ -1,248 +0,0 @@
|
||||||
import copy
|
|
||||||
import xml.etree.ElementTree
|
|
||||||
import mock
|
|
||||||
|
|
||||||
import unittest2
|
|
||||||
import simplejson
|
|
||||||
|
|
||||||
import web.controllers.main
|
|
||||||
from ..common import nonliterals, session as s
|
|
||||||
|
|
||||||
def field_attrs(fields_view_get, fieldname):
|
|
||||||
(field,) = filter(lambda f: f['attrs'].get('name') == fieldname,
|
|
||||||
fields_view_get['arch']['children'])
|
|
||||||
return field['attrs']
|
|
||||||
|
|
||||||
#noinspection PyCompatibility
|
|
||||||
class DomainsAndContextsTest(unittest2.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.view = web.controllers.main.View()
|
|
||||||
|
|
||||||
def test_convert_literal_domain(self):
|
|
||||||
e = xml.etree.ElementTree.Element(
|
|
||||||
'field', domain=" [('somefield', '=', 3)] ")
|
|
||||||
self.view.parse_domains_and_contexts(e, None)
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
e.get('domain'),
|
|
||||||
[('somefield', '=', 3)])
|
|
||||||
|
|
||||||
def test_convert_complex_domain(self):
|
|
||||||
e = xml.etree.ElementTree.Element(
|
|
||||||
'field',
|
|
||||||
domain="[('account_id.type','in',['receivable','payable']),"
|
|
||||||
"('reconcile_id','=',False),"
|
|
||||||
"('reconcile_partial_id','=',False),"
|
|
||||||
"('state', '=', 'valid')]"
|
|
||||||
)
|
|
||||||
self.view.parse_domains_and_contexts(e, None)
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
e.get('domain'),
|
|
||||||
[('account_id.type', 'in', ['receivable', 'payable']),
|
|
||||||
('reconcile_id', '=', False),
|
|
||||||
('reconcile_partial_id', '=', False),
|
|
||||||
('state', '=', 'valid')]
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_retrieve_nonliteral_domain(self):
|
|
||||||
session = mock.Mock(spec=s.OpenERPSession)
|
|
||||||
session.domains_store = {}
|
|
||||||
domain_string = ("[('month','=',(datetime.date.today() - "
|
|
||||||
"datetime.timedelta(365/12)).strftime('%%m'))]")
|
|
||||||
e = xml.etree.ElementTree.Element(
|
|
||||||
'field', domain=domain_string)
|
|
||||||
|
|
||||||
self.view.parse_domains_and_contexts(e, session)
|
|
||||||
|
|
||||||
self.assertIsInstance(e.get('domain'), nonliterals.Domain)
|
|
||||||
self.assertEqual(
|
|
||||||
nonliterals.Domain(
|
|
||||||
session, key=e.get('domain').key).get_domain_string(),
|
|
||||||
domain_string)
|
|
||||||
|
|
||||||
def test_convert_literal_context(self):
|
|
||||||
e = xml.etree.ElementTree.Element(
|
|
||||||
'field', context=" {'some_prop': 3} ")
|
|
||||||
self.view.parse_domains_and_contexts(e, None)
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
e.get('context'),
|
|
||||||
{'some_prop': 3})
|
|
||||||
|
|
||||||
def test_convert_complex_context(self):
|
|
||||||
e = xml.etree.ElementTree.Element(
|
|
||||||
'field',
|
|
||||||
context="{'account_id.type': ['receivable','payable'],"
|
|
||||||
"'reconcile_id': False,"
|
|
||||||
"'reconcile_partial_id': False,"
|
|
||||||
"'state': 'valid'}"
|
|
||||||
)
|
|
||||||
self.view.parse_domains_and_contexts(e, None)
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
e.get('context'),
|
|
||||||
{'account_id.type': ['receivable', 'payable'],
|
|
||||||
'reconcile_id': False,
|
|
||||||
'reconcile_partial_id': False,
|
|
||||||
'state': 'valid'}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_retrieve_nonliteral_context(self):
|
|
||||||
session = mock.Mock(spec=s.OpenERPSession)
|
|
||||||
session.contexts_store = {}
|
|
||||||
context_string = ("{'month': (datetime.date.today() - "
|
|
||||||
"datetime.timedelta(365/12)).strftime('%%m')}")
|
|
||||||
e = xml.etree.ElementTree.Element(
|
|
||||||
'field', context=context_string)
|
|
||||||
|
|
||||||
self.view.parse_domains_and_contexts(e, session)
|
|
||||||
|
|
||||||
self.assertIsInstance(e.get('context'), nonliterals.Context)
|
|
||||||
self.assertEqual(
|
|
||||||
nonliterals.Context(
|
|
||||||
session, key=e.get('context').key).get_context_string(),
|
|
||||||
context_string)
|
|
||||||
|
|
||||||
class AttrsNormalizationTest(unittest2.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.view = web.controllers.main.View()
|
|
||||||
|
|
||||||
def test_identity(self):
|
|
||||||
web_view = """
|
|
||||||
<form string="Title">
|
|
||||||
<group>
|
|
||||||
<field name="some_field"/>
|
|
||||||
<field name="some_other_field"/>
|
|
||||||
</group>
|
|
||||||
<field name="stuff"/>
|
|
||||||
</form>
|
|
||||||
"""
|
|
||||||
|
|
||||||
pristine = xml.etree.ElementTree.fromstring(web_view)
|
|
||||||
transformed = self.view.transform_view(web_view, None)
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
xml.etree.ElementTree.tostring(transformed),
|
|
||||||
xml.etree.ElementTree.tostring(pristine)
|
|
||||||
)
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_transform_states(self):
|
|
||||||
element = xml.etree.ElementTree.Element(
|
|
||||||
'field', states="open,closed")
|
|
||||||
self.view.normalize_attrs(element, {})
|
|
||||||
|
|
||||||
self.assertIsNone(element.get('states'))
|
|
||||||
self.assertEqual(
|
|
||||||
simplejson.loads(element.get('attrs')),
|
|
||||||
{'invisible': [['state', 'not in', ['open', 'closed']]]})
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_transform_invisible(self):
|
|
||||||
element = xml.etree.ElementTree.Element(
|
|
||||||
'field', invisible="context.get('invisible_country', False)")
|
|
||||||
|
|
||||||
empty_context = copy.deepcopy(element)
|
|
||||||
self.view.normalize_attrs(empty_context, {})
|
|
||||||
self.assertEqual(empty_context.get('invisible'), None)
|
|
||||||
|
|
||||||
full_context = copy.deepcopy(element)
|
|
||||||
self.view.normalize_attrs(full_context, {'invisible_country': True})
|
|
||||||
self.assertEqual(full_context.get('invisible'), '1')
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_transform_invisible_list_column(self):
|
|
||||||
req = mock.Mock()
|
|
||||||
req.context = {'set_editable':True, 'set_visible':True,
|
|
||||||
'gtd_visible':True, 'user_invisible':True}
|
|
||||||
req.session.evaluation_context = \
|
|
||||||
s.OpenERPSession().evaluation_context
|
|
||||||
req.session.model('project.task').fields_view_get.return_value = {
|
|
||||||
'arch': '''
|
|
||||||
<tree colors="grey:state in ('cancelled','done');blue:state == 'pending';red:date_deadline and (date_deadline<current_date) and (state in ('draft','pending','open'))" string="Tasks">
|
|
||||||
<field name="sequence" invisible="not context.get('seq_visible', False)"/>
|
|
||||||
<field name="user_id" invisible="context.get('user_invisible', False)"/>
|
|
||||||
<field name="delegated_user_id" invisible="context.get('show_delegated', True)"/>
|
|
||||||
<field name="total_hours" invisible="1"/>
|
|
||||||
<field name="date_deadline" invisible="context.get('deadline_visible',True)"/>
|
|
||||||
<field name="type_id" invisible="context.get('set_visible',False)"/>
|
|
||||||
</tree>
|
|
||||||
'''}
|
|
||||||
parsed_view = web.controllers.main.View().fields_view_get(
|
|
||||||
req, 'project.task', 42, 'tree')
|
|
||||||
|
|
||||||
self.assertTrue(field_attrs(parsed_view, 'sequence')['invisible'])
|
|
||||||
self.assertTrue(field_attrs(parsed_view, 'user_id')['invisible'])
|
|
||||||
self.assertTrue(
|
|
||||||
field_attrs(parsed_view, 'delegated_user_id')['invisible'])
|
|
||||||
self.assertTrue(field_attrs(parsed_view, 'total_hours')['invisible'])
|
|
||||||
self.assertTrue(
|
|
||||||
field_attrs(parsed_view, 'date_deadline')['invisible'])
|
|
||||||
self.assertTrue(field_attrs(parsed_view, 'type_id')['invisible'])
|
|
||||||
|
|
||||||
class ListViewTest(unittest2.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.view = web.controllers.main.ListView()
|
|
||||||
self.request = mock.Mock()
|
|
||||||
self.request.context = {'set_editable': True}
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_no_editable_editable_context(self):
|
|
||||||
self.request.session.model('fake').fields_view_get.return_value = \
|
|
||||||
{'arch': '<tree><field name="foo"/></tree>'}
|
|
||||||
view = self.view.fields_view_get(self.request, 'fake', False, False)
|
|
||||||
|
|
||||||
self.assertEqual(view['arch']['attrs']['editable'],
|
|
||||||
'bottom')
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_editable_top_editable_context(self):
|
|
||||||
self.request.session.model('fake').fields_view_get.return_value = \
|
|
||||||
{'arch': '<tree editable="top"><field name="foo"/></tree>'}
|
|
||||||
view = self.view.fields_view_get(self.request, 'fake', False)
|
|
||||||
|
|
||||||
self.assertEqual(view['arch']['attrs']['editable'],
|
|
||||||
'top')
|
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_editable_bottom_editable_context(self):
|
|
||||||
self.request.session.model('fake').fields_view_get.return_value = \
|
|
||||||
{'arch': '<tree editable="bottom"><field name="foo"/></tree>'}
|
|
||||||
view = self.view.fields_view_get(self.request, 'fake', False)
|
|
||||||
|
|
||||||
self.assertEqual(view['arch']['attrs']['editable'],
|
|
||||||
'bottom')
|
|
||||||
|
|
||||||
def test_color_nocolor(self):
|
|
||||||
self.assertEqual(
|
|
||||||
self.view.process_colors(
|
|
||||||
{'arch': {'attrs': {}, 'children': []}}, {}, {}),
|
|
||||||
None)
|
|
||||||
def test_color_literal(self):
|
|
||||||
self.assertEqual(
|
|
||||||
self.view.process_colors(
|
|
||||||
{'arch': {'attrs': {'colors': 'black:1'}}, 'children': []},
|
|
||||||
{}, {}),
|
|
||||||
'black')
|
|
||||||
def test_color_miss(self):
|
|
||||||
self.assertEqual(
|
|
||||||
self.view.process_colors(
|
|
||||||
{'arch': {'attrs': {'colors': "grey:state in ('cancelled','done');blue:state in ('pending')"}},
|
|
||||||
'children': []
|
|
||||||
}, {'state': 'open'}, {}),
|
|
||||||
None)
|
|
||||||
def test_color_compute(self):
|
|
||||||
self.assertEqual(
|
|
||||||
self.view.process_colors(
|
|
||||||
{'arch': {'attrs': {'colors': "grey:state in ('cancelled','done');blue:state in ('pending')"}},
|
|
||||||
'children': []
|
|
||||||
}, {'state': 'done'}, {}),
|
|
||||||
'grey')
|
|
||||||
def test_color_multiple(self):
|
|
||||||
self.assertEqual(
|
|
||||||
self.view.process_colors(
|
|
||||||
{'arch': {'attrs': {'colors': "grey:state in ('cancelled','done');blue:state in ('done')"}},
|
|
||||||
'children': []
|
|
||||||
}, {'state': 'done'}, {}),
|
|
||||||
'maroon')
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import test_dataset, test_menu, test_serving_base, test_view
|
||||||
|
|
||||||
|
fast_suite = []
|
||||||
|
checks = [
|
||||||
|
test_dataset,
|
||||||
|
test_menu,
|
||||||
|
test_serving_base,
|
||||||
|
test_view,
|
||||||
|
]
|
|
@ -0,0 +1,41 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import mock
|
||||||
|
import unittest2
|
||||||
|
import web.controllers.main
|
||||||
|
|
||||||
|
class TestDataSetController(unittest2.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.dataset = web.controllers.main.DataSet()
|
||||||
|
self.request = mock.Mock()
|
||||||
|
self.read = self.request.session.model().read
|
||||||
|
self.search = self.request.session.model().search
|
||||||
|
|
||||||
|
def test_empty_find(self):
|
||||||
|
self.search.return_value = []
|
||||||
|
self.read.return_value = []
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self.dataset.do_search_read(self.request, 'fake.model'),
|
||||||
|
{'records': [], 'length': 0})
|
||||||
|
self.read.assert_called_once_with(
|
||||||
|
[], False, self.request.session.eval_context())
|
||||||
|
|
||||||
|
def test_regular_find(self):
|
||||||
|
self.search.return_value = [1, 2, 3]
|
||||||
|
|
||||||
|
self.dataset.do_search_read(self.request, 'fake.model')
|
||||||
|
self.read.assert_called_once_with(
|
||||||
|
[1, 2, 3], False,self.request.session.eval_context())
|
||||||
|
|
||||||
|
def test_ids_shortcut(self):
|
||||||
|
self.search.return_value = [1, 2, 3]
|
||||||
|
self.read.return_value = [
|
||||||
|
{'id': 1, 'name': 'foo'},
|
||||||
|
{'id': 2, 'name': 'bar'},
|
||||||
|
{'id': 3, 'name': 'qux'}
|
||||||
|
]
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self.dataset.do_search_read(self.request, 'fake.model', ['id']),
|
||||||
|
{'records': [{'id': 1}, {'id': 2}, {'id': 3}], 'length': 3})
|
||||||
|
self.assertFalse(self.read.called)
|
|
@ -1,4 +1,5 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import collections
|
||||||
import mock
|
import mock
|
||||||
import unittest2
|
import unittest2
|
||||||
|
|
||||||
|
@ -13,42 +14,56 @@ class Placeholder(object):
|
||||||
class LoadTest(unittest2.TestCase):
|
class LoadTest(unittest2.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.menu = main.Menu()
|
self.menu = main.Menu()
|
||||||
self.menus_mock = mock.Mock()
|
self.request = mock.Mock()
|
||||||
self.request = Placeholder(session=OpenERPSession())
|
|
||||||
|
# Have self.request.session.model() return a different mock object for
|
||||||
|
# each model (but always the same mock for a given model name)
|
||||||
|
models = collections.defaultdict(mock.Mock)
|
||||||
|
model = self.request.session.model.side_effect = \
|
||||||
|
lambda model_name: models[model_name]
|
||||||
|
|
||||||
|
self.MockMenus = model('ir.ui.menu')
|
||||||
|
# Mock the absence of custom menu
|
||||||
|
model('res.users').read.return_value = [{
|
||||||
|
'menu_id': False
|
||||||
|
}]
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
del self.request
|
del self.request
|
||||||
del self.menus_mock
|
del self.MockMenus
|
||||||
del self.menu
|
del self.menu
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_empty(self):
|
def test_empty(self):
|
||||||
self.menus_mock.search = mock.Mock(return_value=[])
|
self.MockMenus.search.return_value = []
|
||||||
self.menus_mock.read = mock.Mock(return_value=[])
|
self.MockMenus.read.return_value = []
|
||||||
|
|
||||||
root = self.menu.do_load(self.request)
|
root = self.menu.do_load(self.request)
|
||||||
|
|
||||||
self.menus_mock.search.assert_called_with([])
|
self.MockMenus.search.assert_called_with(
|
||||||
self.menus_mock.read.assert_called_with(
|
[], 0, False, False, self.request.session.eval_context())
|
||||||
[], ['name', 'sequence', 'parent_id'])
|
self.MockMenus.read.assert_called_with(
|
||||||
|
[], ['name', 'sequence', 'parent_id',
|
||||||
|
'action', 'needaction_enabled', 'needaction_counter'],
|
||||||
|
self.request.session.eval_context())
|
||||||
|
|
||||||
self.assertListEqual(
|
self.assertListEqual(
|
||||||
root['children'],
|
root['children'],
|
||||||
[])
|
[])
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_applications_sort(self):
|
def test_applications_sort(self):
|
||||||
self.menus_mock.search = mock.Mock(return_value=[1, 2, 3])
|
self.MockMenus.search.return_value = [1, 2, 3]
|
||||||
self.menus_mock.read = mock.Mock(return_value=[
|
self.MockMenus.read.side_effect = lambda *args: [
|
||||||
{'id': 2, 'sequence': 3, 'parent_id': False},
|
|
||||||
{'id': 3, 'sequence': 2, 'parent_id': False},
|
|
||||||
{'id': 1, 'sequence': 1, 'parent_id': False},
|
{'id': 1, 'sequence': 1, 'parent_id': False},
|
||||||
])
|
{'id': 3, 'sequence': 2, 'parent_id': False},
|
||||||
|
{'id': 2, 'sequence': 3, 'parent_id': False},
|
||||||
|
]
|
||||||
|
|
||||||
root = self.menu.do_load(self.request)
|
root = self.menu.do_load(self.request)
|
||||||
|
|
||||||
self.menus_mock.read.assert_called_with(
|
self.MockMenus.read.assert_called_with(
|
||||||
[1, 2, 3], ['name', 'sequence', 'parent_id'])
|
[1, 2, 3], ['name', 'sequence', 'parent_id',
|
||||||
|
'action', 'needaction_enabled', 'needaction_counter'],
|
||||||
|
self.request.session.eval_context())
|
||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
root['children'],
|
root['children'],
|
||||||
|
@ -63,10 +78,13 @@ class LoadTest(unittest2.TestCase):
|
||||||
'parent_id': False, 'children': []
|
'parent_id': False, 'children': []
|
||||||
}])
|
}])
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_deep(self):
|
def test_deep(self):
|
||||||
self.menus_mock.search = mock.Mock(return_value=[1, 2, 3, 4])
|
self.MockMenus.search.side_effect = lambda domain, *args: (
|
||||||
self.menus_mock.read = mock.Mock(return_value=[
|
[1] if domain == [('parent_id', '=', False)] else [1, 2, 3, 4])
|
||||||
|
|
||||||
|
root = {'id': 1, 'sequence': 1, 'parent_id': False}
|
||||||
|
self.MockMenus.read.side_effect = lambda ids, *args: (
|
||||||
|
[root] if ids == [1] else [
|
||||||
{'id': 1, 'sequence': 1, 'parent_id': False},
|
{'id': 1, 'sequence': 1, 'parent_id': False},
|
||||||
{'id': 2, 'sequence': 2, 'parent_id': [1, '']},
|
{'id': 2, 'sequence': 2, 'parent_id': [1, '']},
|
||||||
{'id': 3, 'sequence': 1, 'parent_id': [2, '']},
|
{'id': 3, 'sequence': 1, 'parent_id': [2, '']},
|
||||||
|
@ -117,7 +135,6 @@ class ActionMungerTest(unittest2.TestCase):
|
||||||
|
|
||||||
self.assertEqual(changed, action)
|
self.assertEqual(changed, action)
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_list_view(self):
|
def test_list_view(self):
|
||||||
action = {
|
action = {
|
||||||
"views": [[False, "tree"], [False, "form"],
|
"views": [[False, "tree"], [False, "form"],
|
||||||
|
@ -135,7 +152,6 @@ class ActionMungerTest(unittest2.TestCase):
|
||||||
"view_mode": "list,form,calendar"
|
"view_mode": "list,form,calendar"
|
||||||
})
|
})
|
||||||
|
|
||||||
@unittest2.skip
|
|
||||||
def test_redundant_views(self):
|
def test_redundant_views(self):
|
||||||
|
|
||||||
action = {
|
action = {
|
|
@ -3,7 +3,7 @@
|
||||||
import random
|
import random
|
||||||
import unittest2
|
import unittest2
|
||||||
|
|
||||||
from ..controllers.main import topological_sort
|
from ..controllers.main import module_topological_sort as sort
|
||||||
|
|
||||||
def sample(population):
|
def sample(population):
|
||||||
return random.sample(
|
return random.sample(
|
||||||
|
@ -22,7 +22,7 @@ class TestModulesLoading(unittest2.TestCase):
|
||||||
ms = dict(modules)
|
ms = dict(modules)
|
||||||
|
|
||||||
seen = set()
|
seen = set()
|
||||||
sorted_modules = topological_sort(ms)
|
sorted_modules = sort(ms)
|
||||||
for module in sorted_modules:
|
for module in sorted_modules:
|
||||||
deps = ms[module]
|
deps = ms[module]
|
||||||
self.assertGreaterEqual(
|
self.assertGreaterEqual(
|
|
@ -0,0 +1,128 @@
|
||||||
|
import copy
|
||||||
|
import xml.etree.ElementTree
|
||||||
|
import mock
|
||||||
|
|
||||||
|
import unittest2
|
||||||
|
import simplejson
|
||||||
|
|
||||||
|
import web.controllers.main
|
||||||
|
from ..common import nonliterals, session as s
|
||||||
|
|
||||||
|
def field_attrs(fields_view_get, fieldname):
|
||||||
|
(field,) = filter(lambda f: f['attrs'].get('name') == fieldname,
|
||||||
|
fields_view_get['arch']['children'])
|
||||||
|
return field['attrs']
|
||||||
|
|
||||||
|
#noinspection PyCompatibility
|
||||||
|
class DomainsAndContextsTest(unittest2.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.view = web.controllers.main.View()
|
||||||
|
|
||||||
|
def test_convert_literal_domain(self):
|
||||||
|
e = xml.etree.ElementTree.Element(
|
||||||
|
'field', domain=" [('somefield', '=', 3)] ")
|
||||||
|
self.view.parse_domains_and_contexts(e, None)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
e.get('domain'),
|
||||||
|
[('somefield', '=', 3)])
|
||||||
|
|
||||||
|
def test_convert_complex_domain(self):
|
||||||
|
e = xml.etree.ElementTree.Element(
|
||||||
|
'field',
|
||||||
|
domain="[('account_id.type','in',['receivable','payable']),"
|
||||||
|
"('reconcile_id','=',False),"
|
||||||
|
"('reconcile_partial_id','=',False),"
|
||||||
|
"('state', '=', 'valid')]"
|
||||||
|
)
|
||||||
|
self.view.parse_domains_and_contexts(e, None)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
e.get('domain'),
|
||||||
|
[('account_id.type', 'in', ['receivable', 'payable']),
|
||||||
|
('reconcile_id', '=', False),
|
||||||
|
('reconcile_partial_id', '=', False),
|
||||||
|
('state', '=', 'valid')]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_retrieve_nonliteral_domain(self):
|
||||||
|
session = mock.Mock(spec=s.OpenERPSession)
|
||||||
|
session.domains_store = {}
|
||||||
|
domain_string = ("[('month','=',(datetime.date.today() - "
|
||||||
|
"datetime.timedelta(365/12)).strftime('%%m'))]")
|
||||||
|
e = xml.etree.ElementTree.Element(
|
||||||
|
'field', domain=domain_string)
|
||||||
|
|
||||||
|
self.view.parse_domains_and_contexts(e, session)
|
||||||
|
|
||||||
|
self.assertIsInstance(e.get('domain'), nonliterals.Domain)
|
||||||
|
self.assertEqual(
|
||||||
|
nonliterals.Domain(
|
||||||
|
session, key=e.get('domain').key).get_domain_string(),
|
||||||
|
domain_string)
|
||||||
|
|
||||||
|
def test_convert_literal_context(self):
|
||||||
|
e = xml.etree.ElementTree.Element(
|
||||||
|
'field', context=" {'some_prop': 3} ")
|
||||||
|
self.view.parse_domains_and_contexts(e, None)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
e.get('context'),
|
||||||
|
{'some_prop': 3})
|
||||||
|
|
||||||
|
def test_convert_complex_context(self):
|
||||||
|
e = xml.etree.ElementTree.Element(
|
||||||
|
'field',
|
||||||
|
context="{'account_id.type': ['receivable','payable'],"
|
||||||
|
"'reconcile_id': False,"
|
||||||
|
"'reconcile_partial_id': False,"
|
||||||
|
"'state': 'valid'}"
|
||||||
|
)
|
||||||
|
self.view.parse_domains_and_contexts(e, None)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
e.get('context'),
|
||||||
|
{'account_id.type': ['receivable', 'payable'],
|
||||||
|
'reconcile_id': False,
|
||||||
|
'reconcile_partial_id': False,
|
||||||
|
'state': 'valid'}
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_retrieve_nonliteral_context(self):
|
||||||
|
session = mock.Mock(spec=s.OpenERPSession)
|
||||||
|
session.contexts_store = {}
|
||||||
|
context_string = ("{'month': (datetime.date.today() - "
|
||||||
|
"datetime.timedelta(365/12)).strftime('%%m')}")
|
||||||
|
e = xml.etree.ElementTree.Element(
|
||||||
|
'field', context=context_string)
|
||||||
|
|
||||||
|
self.view.parse_domains_and_contexts(e, session)
|
||||||
|
|
||||||
|
self.assertIsInstance(e.get('context'), nonliterals.Context)
|
||||||
|
self.assertEqual(
|
||||||
|
nonliterals.Context(
|
||||||
|
session, key=e.get('context').key).get_context_string(),
|
||||||
|
context_string)
|
||||||
|
|
||||||
|
class AttrsNormalizationTest(unittest2.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.view = web.controllers.main.View()
|
||||||
|
|
||||||
|
def test_identity(self):
|
||||||
|
web_view = """
|
||||||
|
<form string="Title">
|
||||||
|
<group>
|
||||||
|
<field name="some_field"/>
|
||||||
|
<field name="some_other_field"/>
|
||||||
|
</group>
|
||||||
|
<field name="stuff"/>
|
||||||
|
</form>
|
||||||
|
"""
|
||||||
|
|
||||||
|
pristine = xml.etree.ElementTree.fromstring(web_view)
|
||||||
|
transformed = self.view.transform_view(web_view, None)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
xml.etree.ElementTree.tostring(transformed),
|
||||||
|
xml.etree.ElementTree.tostring(pristine)
|
||||||
|
)
|
Loading…
Reference in New Issue