123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- # -*- coding: utf-8 -*-
- # Part of Odoo. See LICENSE file for full copyright and licensing details.
- from odoo.addons.account_edi.tests.common import AccountEdiTestCommon
- from odoo.addons.base.tests.test_ir_cron import CronMixinCase
- from odoo.tests import tagged
- @tagged('post_install', '-at_install')
- class TestAccountEdi(AccountEdiTestCommon, CronMixinCase):
- @classmethod
- def setUpClass(cls, chart_template_ref=None, edi_format_ref=None):
- super().setUpClass(chart_template_ref=chart_template_ref, edi_format_ref=edi_format_ref)
- cls.env['account.edi.document'].search([]).unlink()
- cls.env['account.edi.format'].search([]).unlink()
- cls.test_edi_format = cls.env['account.edi.format'].sudo().create({
- 'name': 'test_edi_format',
- 'code': 'test_edi_format',
- })
- cls.company_data['default_journal_sale'].edi_format_ids |= cls.test_edi_format
- def test_export_edi(self):
- invoice = self.init_invoice('out_invoice', products=self.product_a)
- self.assertEqual(len(invoice.edi_document_ids), 0)
- with self.with_custom_method('_get_move_applicability', lambda edi_format, inv: {'post': edi_format._test_edi_post_invoice}), \
- self.with_custom_method('_test_edi_post_invoice', lambda edi_format, inv: {inv: {'success': True}}):
- invoice.action_post()
- self.assertEqual(len(invoice.edi_document_ids), 1)
- def test_prepare_jobs_no_batching(self):
- invoice1 = self.init_invoice('out_invoice', products=self.product_a)
- invoice2 = self.init_invoice('out_invoice', products=self.product_a)
- with self.with_custom_method('_get_move_applicability', lambda edi_format, inv: {'post': edi_format._test_edi_post_invoice}), \
- self.with_custom_method('_test_edi_post_invoice', lambda edi_format, inv: {inv: {'success': True}}), \
- self.with_custom_method('_needs_web_services', lambda edi_format: True):
- (invoice1 + invoice2).action_post()
- jobs = (invoice1 + invoice2).edi_document_ids._prepare_jobs()
- self.assertEqual(len(jobs), 2)
- def test_prepare_jobs_batching(self):
- invoice1 = self.init_invoice('out_invoice', products=self.product_a)
- invoice2 = self.init_invoice('out_invoice', products=self.product_a)
- with self.with_custom_method('_get_move_applicability',
- lambda edi_format, inv: {
- 'post': edi_format._test_edi_post_invoice,
- 'post_batching': lambda inv: (inv.partner_id,),
- }), \
- self.with_custom_method('_test_edi_post_invoice', lambda edi_format, inv: {inv: {'success': True}}), \
- self.with_custom_method('_needs_web_services', lambda edi_format: True):
- (invoice1 + invoice2).action_post()
- jobs = (invoice1 + invoice2).edi_document_ids._prepare_jobs()
- self.assertEqual(len(jobs), 1)
- def test_warning_is_retried(self):
- invoice = self.init_invoice('out_invoice', products=self.product_a)
- with self.with_custom_method('_get_move_applicability', lambda edi_format, inv: {'post': edi_format._test_edi_post_invoice}), \
- self.with_custom_method('_needs_web_services', lambda edi_format: True):
- with self.with_custom_method('_test_edi_post_invoice',
- lambda edi_format, inv: {inv: {'error': "turlututu", 'blocking_level': 'warning'}}):
- invoice.action_post()
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'to_send'}])
- with self.with_custom_method('_test_edi_post_invoice', lambda edi_format, inv: {inv: {'success': True}}):
- invoice.action_process_edi_web_services(with_commit=False)
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'sent'}])
- def test_edi_flow(self):
- invoice = self.init_invoice('out_invoice', products=self.product_a)
- with self.with_custom_method('_get_move_applicability', lambda edi_format, inv: {
- 'post': edi_format._test_edi_post_invoice,
- 'cancel': edi_format._test_edi_cancel_invoice,
- }), \
- self.with_custom_method('_needs_web_services', lambda edi_format: True), \
- self.with_custom_method('_test_edi_post_invoice', lambda edi_format, inv: {inv: {'success': True}}), \
- self.with_custom_method('_test_edi_cancel_invoice', lambda edi_format, inv: {inv: {'success': True}}):
- invoice.action_post()
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'to_send'}])
- invoice.action_process_edi_web_services(with_commit=False)
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'sent'}])
- invoice.button_cancel_posted_moves()
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'to_cancel'}])
- invoice.button_abandon_cancel_posted_posted_moves()
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'sent'}])
- invoice.button_cancel_posted_moves()
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'to_cancel'}])
- invoice.action_process_edi_web_services(with_commit=False)
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'cancelled'}])
- def test_edi_flow_two_steps(self):
- def step1(edi_format, invoice):
- return {invoice: {'error': "step1 done", 'blocking_level': 'info'}}
- def step2(edi_format, invoice):
- return {invoice: {'success': True}}
- def get_move_applicability(edi_format, invoice):
- if "step1" in (invoice.edi_document_ids.error or ''):
- return {'post': edi_format._test_edi_post_invoice_step2}
- else:
- return {'post': edi_format._test_edi_post_invoice_step1}
- invoice = self.init_invoice('out_invoice', products=self.product_a)
- with self.with_custom_method('_get_move_applicability', get_move_applicability), \
- self.with_custom_method('_needs_web_services', lambda edi_format: True), \
- self.with_custom_method('_test_edi_post_invoice_step1', step1), \
- self.with_custom_method('_test_edi_post_invoice_step2', step2):
- invoice.action_post()
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'to_send'}])
- invoice.action_process_edi_web_services(with_commit=False)
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'to_send'}])
- invoice.action_process_edi_web_services(with_commit=False)
- self.assertRecordValues(invoice.edi_document_ids, [{'state': 'sent'}])
- def test_cron_triggers(self):
- invoice = self.init_invoice('out_invoice', products=self.product_a)
- with self.with_custom_method('_get_move_applicability', lambda edi_format, inv: {'post': edi_format._test_edi_post_invoice}), \
- self.with_custom_method('_needs_web_services', lambda edi_format: True), \
- self.with_custom_method('_test_edi_post_invoice', lambda edi_format, inv: {inv: {'success': True}}), \
- self.capture_triggers('account_edi.ir_cron_edi_network') as capt:
- invoice.action_post()
- capt.records.ensure_one()
- def test_cron_self_trigger(self):
- # Process single job by CRON call (and thus, disable the auto-commit).
- edi_cron = self.env.ref('account_edi.ir_cron_edi_network')
- edi_cron.code = 'model._cron_process_documents_web_services(job_count=1)'
- invoice1 = self.init_invoice('out_invoice', products=self.product_a)
- invoice2 = self.init_invoice('out_invoice', products=self.product_a)
- with self.with_custom_method('_get_move_applicability', lambda edi_format, inv: {'post': edi_format._test_edi_post_invoice}), \
- self.with_custom_method('_needs_web_services', lambda edi_format: True), \
- self.with_custom_method('_test_edi_post_invoice', lambda edi_format, inv: {inv: {'success': True}}), \
- self.capture_triggers('account_edi.ir_cron_edi_network') as capt:
- (invoice1 + invoice2).action_post()
- self.env.ref('account_edi.ir_cron_edi_network').method_direct_trigger()
- self.assertEqual(
- len(capt.records), 2,
- "Not all records have been processed in this run, the cron should re-trigger itself to process some"
- " more later",
- )
- def test_invoice_ready_to_be_sent(self):
- invoice = self.init_invoice('out_invoice', products=self.product_a)
- with self.with_custom_method('_get_move_applicability', lambda edi_format, inv: {'post': edi_format._test_edi_post_invoice}), \
- self.with_custom_method('_needs_web_services', lambda edi_format: True), \
- self.with_custom_method('_test_edi_post_invoice', lambda edi_format, inv: {inv: {'success': True}}):
- invoice.action_post()
- self.assertFalse(invoice._is_ready_to_be_sent())
- invoice.action_process_edi_web_services(with_commit=False)
- self.assertTrue(invoice._is_ready_to_be_sent())
|