Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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."
        )
Example #4
0
    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.")
Example #5
0
    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.'
        )
Example #6
0
    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,
                }),
            ],
        })
Example #7
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"