1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
# -*- 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):
super().setUpClass()
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())
|