def setUpClass(cls): super().setUpClass() cls.company_a = cls.env.company cls.company_b = cls.env['res.company'].create( {'name': "Odoo Inc (TEST)"}) cls.user_company_a = cls.internal_user cls.user_company_b = cls.env['res.users'].create({ 'name': f"{cls.company_b.name} User (TEST)", 'login': '******', 'password': '******', 'company_id': cls.company_b.id, 'company_ids': [Command.set(cls.company_b.ids)], 'groups_id': [Command.link(cls.group_user.id)], }) cls.user_multi_company = cls.env['res.users'].create({ 'name': "Multi Company User (TEST)", 'login': '******', 'password': '******', 'company_id': cls.company_a.id, 'company_ids': [Command.set([cls.company_a.id, cls.company_b.id])], 'groups_id': [Command.link(cls.group_user.id)], }) cls.acquirer_company_b = cls._prepare_acquirer(company=cls.company_b)
def setUpClass(cls, chart_template_ref=None): super().setUpClass(chart_template_ref=chart_template_ref) cls.company_a = cls.company_data['company'] cls.company_b = cls.company_data_2['company'] cls.user_company_a = cls.internal_user cls.user_company_b = cls.env['res.users'].create({ 'name': f"{cls.company_b.name} User (TEST)", 'login': '******', 'password': '******', 'company_id': cls.company_b.id, 'company_ids': [Command.set(cls.company_b.ids)], 'groups_id': [Command.link(cls.group_user.id)], }) cls.user_multi_company = cls.env['res.users'].create({ 'name': "Multi Company User (TEST)", 'login': '******', 'password': '******', 'company_id': cls.company_a.id, 'company_ids': [Command.set([cls.company_a.id, cls.company_b.id])], 'groups_id': [Command.link(cls.group_user.id)], }) cls.acquirer_company_b = cls._prepare_acquirer(company=cls.company_b)
def test_cyclic_dependencies(self): """ Test the cyclic dependencies Test Case: ========= 1) Check initial setting on three tasks 2) Add task2 as dependency in task1 3) Add task3 as dependency in task2 4) Add task1 as dependency in task3 and check a validation error is raised 5) Add task1 as dependency in task2 and check a validation error is raised """ # 1) Check initial setting on three tasks self.assertTrue( len(self.task_1.depend_on_ids) == len(self.task_2.depend_on_ids) == len(self.task_3.depend_on_ids) == 0, "The three tasks should depend on no tasks.") self.assertTrue(self.task_1.allow_task_dependencies, 'The task dependencies feature should be enable.') self.assertTrue(self.task_2.allow_task_dependencies, 'The task dependencies feature should be enable.') self.assertTrue(self.task_3.allow_task_dependencies, 'The task dependencies feature should be enable.') # 2) Add task2 as dependency in task1 self.task_1.write({ 'depend_on_ids': [Command.link(self.task_2.id)], }) self.assertEqual(len(self.task_1.depend_on_ids), 1, 'The task 1 should have one dependency.') # 3) Add task3 as dependency in task2 self.task_2.write({ 'depend_on_ids': [Command.link(self.task_3.id)], }) self.assertEqual(len(self.task_2.depend_on_ids), 1, "The task 2 should have one dependency.") # 4) Add task1 as dependency in task3 and check a validation error is raised with self.assertRaises(ValidationError), self.cr.savepoint(): self.task_3.write({ 'depend_on_ids': [Command.link(self.task_1.id)], }) self.assertEqual( len(self.task_3.depend_on_ids), 0, "The dependency should not be added in the task 3 because of a cyclic dependency." ) # 5) Add task1 as dependency in task2 and check a validation error is raised with self.assertRaises(ValidationError), self.cr.savepoint(): self.task_2.write({ 'depend_on_ids': [Command.link(self.task_1.id)], }) self.assertEqual( len(self.task_2.depend_on_ids), 1, "The number of dependencies should no change in the task 2 because of a cyclic dependency." )
def test_task_dependencies(self): """ Test the task dependencies feature Test Case: ========= 1) Add task2 as dependency in task1 2) Checks if the task1 has the task in depend_on_ids field. """ self.assertEqual(len(self.task_1.depend_on_ids), 0, "The task 1 should not have any dependency.") self.task_1.write({ 'depend_on_ids': [Command.link(self.task_2.id)], }) self.assertEqual(len(self.task_1.depend_on_ids), 1, "The task 1 should have a dependency.") self.task_1.write({ 'depend_on_ids': [Command.link(self.task_3.id)], }) self.assertEqual(len(self.task_1.depend_on_ids), 2, "The task 1 should have two dependencies.")
def test_tracking_dependencies(self): # Enable the company setting self.env['res.config.settings'].create({ 'group_project_task_dependencies': True }).execute() # `depend_on_ids` is tracked self.task_1.with_context(mail_notrack=True).write( {'depend_on_ids': [Command.link(self.task_2.id)]}) self.cr.precommit.clear() # Check that changing a dependency tracked field in task_2 logs a message in task_1. self.task_2.write({'date_deadline': date(1983, 3, 1)}) # + 1 message in task_1 and task_2 self.flush_tracking() self.assertEqual( len(self.task_1.message_ids), 1, 'Changing the deadline on task 2 should have logged a message in task 1.' ) # Check that changing a dependency tracked field in task_1 does not log a message in task_2. self.task_1.date_deadline = date(2020, 1, 2) # + 1 message in task_1 self.flush_tracking() self.assertEqual( len(self.task_2.message_ids), 1, 'Changing the deadline on task 1 should not have logged a message in task 2.' ) # Check that changing a field that is not tracked at all on task 2 does not impact task 1. self.task_2.color = 100 # no new message self.flush_tracking() self.assertEqual( len(self.task_1.message_ids), 2, 'Changing the color on task 2 should not have logged a message in task 1 since it is not tracked.' ) # Check that changing multiple fields does not log more than one message. self.task_2.write({ 'date_deadline': date(2020, 1, 1), 'kanban_state': 'blocked', }) # + 1 message in task_1 and task_2 self.flush_tracking() self.assertEqual( len(self.task_1.message_ids), 3, 'Changing multiple fields on task 2 should only log one message in task 1.' )
def setUpClass(cls, chart_template_ref=None): super().setUpClass(chart_template_ref=chart_template_ref) Method_get_payment_method_information = AccountPaymentMethod._get_payment_method_information def _get_payment_method_information(self): res = Method_get_payment_method_information(self) res['none'] = {'mode': 'multi', 'domain': [('type', '=', 'bank')]} return res cls.currency_euro = cls._prepare_currency('EUR') cls.currency_usd = cls._prepare_currency('USD') cls.country_belgium = cls.env.ref('base.be') cls.country_france = cls.env.ref('base.fr') cls.europe = cls.env.ref('base.europe') cls.group_user = cls.env.ref('base.group_user') cls.group_portal = cls.env.ref('base.group_portal') cls.group_public = cls.env.ref('base.group_public') cls.admin_user = cls.env.ref('base.user_admin') cls.internal_user = cls.env['res.users'].create({ 'name': 'Internal User (Test)', 'login': '******', 'password': '******', 'groups_id': [Command.link(cls.group_user.id)] }) cls.portal_user = cls.env['res.users'].create({ 'name': 'Portal User (Test)', 'login': '******', 'password': '******', 'groups_id': [Command.link(cls.group_portal.id)] }) cls.public_user = cls.env.ref('base.public_user') cls.admin_partner = cls.admin_user.partner_id cls.internal_partner = cls.internal_user.partner_id cls.portal_partner = cls.portal_user.partner_id cls.default_partner = cls.env['res.partner'].create({ 'name': 'Norbert Buyer', 'lang': 'en_US', 'email': '*****@*****.**', 'street': 'Huge Street', 'street2': '2/543', 'phone': '0032 12 34 56 78', 'city': 'Sin City', 'zip': '1000', 'country_id': cls.country_belgium.id, }) # Create a dummy acquirer to allow basic tests without any specific acquirer implementation arch = """ <form action="dummy" method="post"> <input type="hidden" name="view_id" t-att-value="viewid"/> <input type="hidden" name="user_id" t-att-value="user_id.id"/> </form> """ # We exploit the default values `viewid` and `user_id` from QWeb's rendering context redirect_form = cls.env['ir.ui.view'].create({ 'name': "Dummy Redirect Form", 'type': 'qweb', 'arch': arch, }) with patch.object(AccountPaymentMethod, '_get_payment_method_information', _get_payment_method_information): cls.env['account.payment.method'].create({ 'name': 'Dummy method', 'code': 'none', 'payment_type': 'inbound' }) cls.dummy_acquirer = cls.env['payment.acquirer'].create({ 'name': "Dummy Acquirer", 'provider': 'none', 'state': 'test', 'allow_tokenization': True, 'redirect_form_view_id': redirect_form.id, 'journal_id': cls.company_data['default_journal_bank'].id, }) cls.acquirer = cls.dummy_acquirer cls.amount = 1111.11 cls.company = cls.env.company cls.currency = cls.currency_euro cls.partner = cls.default_partner cls.reference = "Test Transaction" cls.account = cls.company.account_journal_payment_credit_account_id cls.invoice = cls.env['account.move'].create({ 'move_type': 'entry', 'date': '2019-01-01', 'line_ids': [ (0, 0, { 'account_id': cls.account.id, 'currency_id': cls.currency_euro.id, 'debit': 100.0, 'credit': 0.0, 'amount_currency': 200.0, }), (0, 0, { 'account_id': cls.account.id, 'currency_id': cls.currency_euro.id, 'debit': 0.0, 'credit': 100.0, 'amount_currency': -200.0, }), ], })
def setUpClass(cls): super().setUpClass() cls.currency_euro = cls._prepare_currency('EUR') cls.currency_usd = cls._prepare_currency('USD') cls.country_belgium = cls.env.ref('base.be') cls.country_france = cls.env.ref('base.fr') cls.europe = cls.env.ref('base.europe') cls.group_user = cls.env.ref('base.group_user') cls.group_portal = cls.env.ref('base.group_portal') cls.group_public = cls.env.ref('base.group_public') cls.admin_user = cls.env.ref('base.user_admin') cls.internal_user = cls.env['res.users'].create({ 'name': 'Internal User (Test)', 'login': '******', 'password': '******', 'groups_id': [Command.link(cls.group_user.id)] }) cls.portal_user = cls.env['res.users'].create({ 'name': 'Portal User (Test)', 'login': '******', 'password': '******', 'groups_id': [Command.link(cls.group_portal.id)] }) cls.public_user = cls.env.ref('base.public_user') cls.admin_partner = cls.admin_user.partner_id cls.internal_partner = cls.internal_user.partner_id cls.portal_partner = cls.portal_user.partner_id cls.default_partner = cls.env['res.partner'].create({ 'name': 'Norbert Buyer', 'lang': 'en_US', 'email': '*****@*****.**', 'street': 'Huge Street', 'street2': '2/543', 'phone': '0032 12 34 56 78', 'city': 'Sin City', 'zip': '1000', 'country_id': cls.country_belgium.id, }) # Create a dummy acquirer to allow basic tests without any specific acquirer implementation arch = """ <form action="dummy" method="post"> <input type="hidden" name="view_id" t-att-value="viewid"/> <input type="hidden" name="user_id" t-att-value="user_id.id"/> </form> """ # We exploit the default values `viewid` and `user_id` from QWeb's rendering context redirect_form = cls.env['ir.ui.view'].create({ 'name': "Dummy Redirect Form", 'type': 'qweb', 'arch': arch, }) journal = cls.env['account.journal'].search( [('company_id', '=', cls.env.company.id), ('type', 'in', ['bank', 'cash'])], limit=1) cls.dummy_acquirer = cls.env['payment.acquirer'].create({ 'name': "Dummy Acquirer", 'provider': 'none', 'state': 'test', 'allow_tokenization': True, 'redirect_form_view_id': redirect_form.id, 'journal_id': journal.id, }) cls.acquirer = cls.dummy_acquirer cls.amount = 1111.11 cls.company = cls.env.company cls.currency = cls.currency_euro cls.partner = cls.default_partner cls.reference = "Test Transaction"