1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/documents_account/tests/test_documents.py
2024-12-10 09:04:09 +07:00

444 lines
23 KiB
Python

# -*- coding: utf-8 -*-
import base64
from odoo.tests import Form
from odoo.exceptions import UserError
from odoo.tests.common import tagged
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
GIF = b"R0lGODdhAQABAIAAAP///////ywAAAAAAQABAAACAkQBADs="
TEXT = base64.b64encode(bytes("workflow bridge account", 'utf-8'))
PDF = 'JVBERi0xLjYNJeLjz9MNCjI0IDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9GaXJzdCA0L0xlbmd0aCAyMTYvTiAxL1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjePI9RS8MwFIX/yn1bi9jepCQ6GYNpFBTEMsW97CVLbjWYNpImmz/fVsXXcw/f/c4SEFarepPTe4iFok8dU09DgtDBQx6TMwT74vaLTE7uSPDUdXM0Xe/73r1FnVwYYEtHR6d9WdY3kX4ipRMV6oojSmxQMoGyac5RLBAXf63p38aGA7XPorLewyvFcYaJile8rB+D/YcwiRdMMGScszO8/IW0MdhsaKKYGA46gXKTr/cUQVY4We/cYMNpnLVeXPJUXHs9fECr7kAFk+eZ5Xr9LcAAfKpQrA0KZW5kc3RyZWFtDWVuZG9iag0yNSAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgNC9MZW5ndGggNDkvTiAxL1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjeslAwULCx0XfOL80rUTDU985MKY42NAIKBsXqh1QWpOoHJKanFtvZAQQYAN/6C60NCmVuZHN0cmVhbQ1lbmRvYmoNMjYgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDkvTGVuZ3RoIDQyL04gMi9UeXBlL09ialN0bT4+c3RyZWFtDQpo3jJTMFAwVzC0ULCx0fcrzS2OBnENFIJi7eyAIsH6LnZ2AAEGAI2FCDcNCmVuZHN0cmVhbQ1lbmRvYmoNMjcgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDUvTGVuZ3RoIDEyMC9OIDEvVHlwZS9PYmpTdG0+PnN0cmVhbQ0KaN4yNFIwULCx0XfOzytJzSspVjAyBgoE6TsX5Rc45VdEGwB5ZoZGCuaWRrH6vqkpmYkYogGJRUCdChZgfUGpxfmlRcmpxUAzA4ryk4NTS6L1A1zc9ENSK0pi7ez0g/JLEktSFQz0QyoLUoF601Pt7AACDADYoCeWDQplbmRzdHJlYW0NZW5kb2JqDTIgMCBvYmoNPDwvTGVuZ3RoIDM1MjUvU3VidHlwZS9YTUwvVHlwZS9NZXRhZGF0YT4+c3RyZWFtDQo8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjQtYzAwNSA3OC4xNDczMjYsIDIwMTIvMDgvMjMtMTM6MDM6MDMgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnBkZj0iaHR0cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPHBkZjpQcm9kdWNlcj5BY3JvYmF0IERpc3RpbGxlciA2LjAgKFdpbmRvd3MpPC9wZGY6UHJvZHVjZXI+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDA2LTAzLTA2VDE1OjA2OjMzLTA1OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZVBTNS5kbGwgVmVyc2lvbiA1LjIuMjwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNi0wNy0xNVQxMDoxMjoyMSswODowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTYtMDctMTVUMTA6MTI6MjErMDg6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnV1aWQ6ZmYzZGNmZDEtMjNmYS00NzZmLTgzOWEtM2U1Y2FlMmRhMmViPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD51dWlkOjM1OTM1MGIzLWFmNDAtNGQ4YS05ZDZjLTAzMTg2YjRmZmIzNjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPGRjOmZvcm1hdD5hcHBsaWNhdGlvbi9wZGY8L2RjOmZvcm1hdD4KICAgICAgICAgPGRjOnRpdGxlPgogICAgICAgICAgICA8cmRmOkFsdD4KICAgICAgICAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij5CbGFuayBQREYgRG9jdW1lbnQ8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6QWx0PgogICAgICAgICA8L2RjOnRpdGxlPgogICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGk+RGVwYXJ0bWVudCBvZiBKdXN0aWNlIChFeGVjdXRpdmUgT2ZmaWNlIG9mIEltbWlncmF0aW9uIFJldmlldyk8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L2RjOmNyZWF0b3I+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgog' + 682 * 'ICAg' + 'Cjw/eHBhY2tldCBlbmQ9InciPz4NCmVuZHN0cmVhbQ1lbmRvYmoNMTEgMCBvYmoNPDwvTWV0YWRhdGEgMiAwIFIvUGFnZUxhYmVscyA2IDAgUi9QYWdlcyA4IDAgUi9UeXBlL0NhdGFsb2c+Pg1lbmRvYmoNMjMgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxMD4+c3RyZWFtDQpIiQIIMAAAAAABDQplbmRzdHJlYW0NZW5kb2JqDTI4IDAgb2JqDTw8L0RlY29kZVBhcm1zPDwvQ29sdW1ucyA0L1ByZWRpY3RvciAxMj4+L0ZpbHRlci9GbGF0ZURlY29kZS9JRFs8REI3Nzc1Q0NFMjI3RjZCMzBDNDQwREY0MjIxREMzOTA+PEJGQ0NDRjNGNTdGNjEzNEFCRDNDMDRBOUU0Q0ExMDZFPl0vSW5mbyA5IDAgUi9MZW5ndGggODAvUm9vdCAxMSAwIFIvU2l6ZSAyOS9UeXBlL1hSZWYvV1sxIDIgMV0+PnN0cmVhbQ0KaN5iYgACJjDByGzIwPT/73koF0wwMUiBWYxA4v9/EMHA9I/hBVCxoDOQeH8DxH2KrIMIglFwIpD1vh5IMJqBxPpArHYgwd/KABBgAP8bEC0NCmVuZHN0cmVhbQ1lbmRvYmoNc3RhcnR4cmVmDQo0NTc2DQolJUVPRg0K'
@tagged('post_install', '-at_install', 'test_document_bridge')
class TestCaseDocumentsBridgeAccount(AccountTestInvoicingCommon):
@classmethod
def setUpClass(cls, chart_template_ref=None):
super().setUpClass(chart_template_ref=chart_template_ref)
cls.folder_a = cls.env['documents.folder'].create({
'name': 'folder A',
})
cls.folder_a_a = cls.env['documents.folder'].create({
'name': 'folder A - A',
'parent_folder_id': cls.folder_a.id,
})
cls.document_txt = cls.env['documents.document'].create({
'datas': TEXT,
'name': 'file.txt',
'mimetype': 'text/plain',
'folder_id': cls.folder_a_a.id,
})
cls.document_gif = cls.env['documents.document'].create({
'datas': GIF,
'name': 'file.gif',
'mimetype': 'image/gif',
'folder_id': cls.folder_a.id,
})
cls.workflow_rule_vendor_bill = cls.env['documents.workflow.rule'].create({
'domain_folder_id': cls.folder_a.id,
'name': 'workflow rule create vendor bill on f_a',
'create_model': 'account.move.in_invoice',
})
def test_bridge_folder_workflow(self):
"""
tests the create new business model (vendor bill & credit note).
"""
self.assertEqual(self.document_txt.res_model, 'documents.document', "failed at default res model")
multi_return = self.workflow_rule_vendor_bill.apply_actions([self.document_txt.id, self.document_gif.id])
self.assertEqual(multi_return.get('type'), 'ir.actions.act_window',
'failed at invoice workflow return value type')
self.assertEqual(multi_return.get('res_model'), 'account.move',
'failed at invoice workflow return value res model')
self.assertEqual(self.document_txt.res_model, 'account.move', "failed at workflow_bridge_dms_account"
" new res_model")
vendor_bill_txt = self.env['account.move'].search([('id', '=', self.document_txt.res_id)])
self.assertTrue(vendor_bill_txt.exists(), 'failed at workflow_bridge_dms_account vendor_bill')
self.assertEqual(self.document_txt.res_id, vendor_bill_txt.id, "failed at workflow_bridge_dms_account res_id")
self.assertEqual(vendor_bill_txt.move_type, 'in_invoice', "failed at workflow_bridge_dms_account vendor_bill type")
vendor_bill_gif = self.env['account.move'].search([('id', '=', self.document_gif.res_id)])
self.assertEqual(self.document_gif.res_id, vendor_bill_gif.id, "failed at workflow_bridge_dms_account res_id")
single_return = self.workflow_rule_vendor_bill.apply_actions([self.document_txt.id])
self.assertEqual(single_return.get('res_model'), 'account.move',
'failed at invoice res_model action from workflow create model')
invoice = self.env[single_return['res_model']].browse(single_return.get('res_id'))
attachments = self.env['ir.attachment'].search([('res_model', '=', 'account.move'), ('res_id', '=', invoice.id)])
self.assertEqual(len(attachments), 1, 'there should only be one ir attachment matching')
def test_bridge_account_account_settings_on_write(self):
"""
Makes sure the settings apply their values when an ir_attachment is set as message_main_attachment_id
on invoices.
"""
folder_test = self.env['documents.folder'].create({'name': 'folder_test'})
self.env.user.company_id.documents_account_settings = True
for invoice_type in ['in_invoice', 'out_invoice', 'in_refund', 'out_refund']:
invoice_test = self.env['account.move'].with_context(default_move_type=invoice_type).create({
'name': 'invoice_test',
'move_type': invoice_type,
})
setting = self.env['documents.account.folder.setting'].create({
'folder_id': folder_test.id,
'journal_id': invoice_test.journal_id.id,
})
attachments = self.env["ir.attachment"]
for i in range(3):
attachment = self.env["ir.attachment"].create({
"datas": TEXT,
"name": f"fileText_test{i}.txt",
"mimetype": "text/plain",
"res_model": "account.move",
"res_id": invoice_test.id,
})
attachment.register_as_main_attachment(force=False)
attachments |= attachment
document = self.env["documents.document"].search(
[("attachment_id", "=", attachments[0].id)]
)
self.assertEqual(
document.folder_id, folder_test, "the text test document have a folder"
)
def check_main_attachment_and_document(
main_attachment, doc_attachment, previous_attachment_ids
):
self.assertRecordValues(
invoice_test,
[{"message_main_attachment_id": main_attachment.id}],
)
self.assertRecordValues(
document,
[
{
"attachment_id": doc_attachment.id,
"previous_attachment_ids": previous_attachment_ids,
}
],
)
# Ensure the main attachment is the first one and ensure the document is correctly linked
check_main_attachment_and_document(attachments[0], attachments[0], [])
# Switch the main attachment to the second one and ensure the document is updated correctly
invoice_test.write({"message_main_attachment_id": attachments[1].id})
check_main_attachment_and_document(
attachments[1], attachments[1], attachments[0].ids
)
# Switch the main attachment to the third one and ensure the document is updated correctly
attachments[2].register_as_main_attachment(force=True)
check_main_attachment_and_document(
attachments[2], attachments[2], (attachments[0] + attachments[1]).ids
)
# Ensure all attachments are still linked to the invoice
attachments = self.env["ir.attachment"].search(
[("res_model", "=", "account.move"), ("res_id", "=", invoice_test.id)]
)
self.assertEqual(
len(attachments),
3,
"there should be 3 attachments linked to the invoice",
)
# deleting the setting to prevent duplicate settings.
setting.unlink()
def test_bridge_account_account_settings_on_write_with_versioning(self):
"""
With accounting-document centralization activated, make sure that the right attachment
is set as main attachment on the invoice when versioning is involved and only one document
is being created and updated.
"""
folder_test = self.env["documents.folder"].create({"name": "folder_test"})
self.env.user.company_id.documents_account_settings = True
invoice_test = (
self.env["account.move"]
.with_context(default_move_type="in_invoice")
.create({
"name": "invoice_test",
"move_type": "in_invoice",
})
)
self.env["documents.account.folder.setting"].create({
"folder_id": folder_test.id,
"journal_id": invoice_test.journal_id.id,
})
attachments = self.env["ir.attachment"]
for i in range(1, 3):
attachment = self.env["ir.attachment"].create({
"datas": TEXT,
"name": f"attachment-{i}.txt",
"mimetype": "text/plain",
"res_model": "account.move",
"res_id": invoice_test.id,
})
attachment.register_as_main_attachment(force=False)
attachments |= attachment
first_attachment, second_attachment = attachments[0], attachments[1]
document = self.env["documents.document"].search(
[("res_model", "=", "account.move"), ("res_id", "=", invoice_test.id)]
)
self.assertEqual(
len(document), 1, "there should be 1 document linked to the invoice"
)
self.assertEqual(
document.folder_id, folder_test, "the text test document have a folder"
)
def check_main_attachment_and_document(
main_attachment, doc_attachment, previous_attachment_ids
):
self.assertRecordValues(
invoice_test,
[{"message_main_attachment_id": main_attachment.id}],
)
self.assertRecordValues(
document,
[
{
"attachment_id": doc_attachment.id,
"previous_attachment_ids": previous_attachment_ids,
}
],
)
# Ensure the main attachment is attachment-1
check_main_attachment_and_document(first_attachment, first_attachment, [])
# Version the main attachment:
# attachment-1 become attachment-3
# version attachement become attachment-1
document.write({
"datas": TEXT,
"name": "attachment-3.txt",
"mimetype": "text/plain",
})
third_attachment = document.attachment_id
first_attachment = document.previous_attachment_ids[0]
check_main_attachment_and_document(
third_attachment, third_attachment, first_attachment.ids
)
# Switch main attachment to attachment-2
second_attachment.register_as_main_attachment(force=True)
check_main_attachment_and_document(
second_attachment,
second_attachment,
(first_attachment + third_attachment).ids,
)
# restore versioned attachment (attachment-1)
document.write({"attachment_id": document.previous_attachment_ids[0].id})
check_main_attachment_and_document(
second_attachment,
first_attachment,
(third_attachment + second_attachment).ids,
)
# Switch main attachment to attachment-3
third_attachment.register_as_main_attachment(force=True)
check_main_attachment_and_document(
third_attachment,
third_attachment,
(second_attachment + first_attachment).ids,
)
# Ensure there is still only one document linked to the invoice
document = self.env["documents.document"].search(
[("res_model", "=", "account.move"), ("res_id", "=", invoice_test.id)]
)
self.assertEqual(
len(document), 1, "there should be 1 document linked to the invoice"
)
def test_journal_entry(self):
"""
Makes sure the settings apply their values when an ir_attachment is set as message_main_attachment_id
on invoices.
"""
folder_test = self.env['documents.folder'].create({'name': 'Bills'})
self.env.user.company_id.documents_account_settings = True
invoice_test = self.env['account.move'].with_context(default_move_type='entry').create({
'name': 'Journal Entry',
'move_type': 'entry',
})
setting = self.env['documents.account.folder.setting'].create({
'folder_id': folder_test.id,
'journal_id': invoice_test.journal_id.id,
})
attachments = self.env['ir.attachment'].create([{
'datas': TEXT,
'name': 'fileText_test.txt',
'mimetype': 'text/plain',
'res_model': 'account.move',
'res_id': invoice_test.id
}, {
'datas': TEXT,
'name': 'fileText_test2.txt',
'mimetype': 'text/plain',
'res_model': 'account.move',
'res_id': invoice_test.id
}])
documents = self.env['documents.document'].search([('attachment_id', 'in', attachments.ids)])
self.assertEqual(len(documents), 2)
setting.unlink()
def test_bridge_account_workflow_settings_on_write(self):
"""
Tests that tags added by a workflow action are not completely overridden by the settings.
"""
self.env.user.company_id.documents_account_settings = True
tag_category_a = self.env['documents.facet'].create({
'folder_id': self.folder_a.id,
'name': "categ_a",
})
tag_a = self.env['documents.tag'].create({
'facet_id': tag_category_a.id,
'name': "tag_a",
})
tag_b = self.env['documents.tag'].create({
'facet_id': tag_category_a.id,
'name': "tag_b",
})
tag_action_a = self.env['documents.workflow.action'].create({
'action': 'add',
'facet_id': tag_category_a.id,
'tag_id': tag_a.id,
})
self.workflow_rule_vendor_bill.tag_action_ids += tag_action_a
invoice_test = self.env['account.move'].with_context(default_move_type='in_invoice').create({
'name': 'invoice_test',
'move_type': 'in_invoice',
})
self.env['documents.account.folder.setting'].create({
'folder_id': self.folder_a.id,
'journal_id': invoice_test.journal_id.id,
'tag_ids': tag_b,
})
document_test = self.env['documents.document'].create({
'name': 'test reconciliation workflow',
'folder_id': self.folder_a.id,
'datas': TEXT,
})
self.workflow_rule_vendor_bill.apply_actions([document_test.id])
self.assertEqual(document_test.tag_ids, tag_a | tag_b,
"The document should have the workflow action's tag(s)")
def test_bridge_account_sync_partner(self):
"""
Tests that the partner is always synced on the document, regardless of settings
"""
partner_1, partner_2 = self.env['res.partner'].create([{'name': 'partner_1'}, {'name': 'partner_2'}])
self.document_txt.partner_id = partner_1
self.workflow_rule_vendor_bill.apply_actions([self.document_txt.id, self.document_gif.id])
move = self.env['account.move'].browse(self.document_txt.res_id)
self.assertEqual(move.partner_id, partner_1)
move.partner_id = partner_2
self.assertEqual(self.document_txt.partner_id, partner_2)
def test_workflow_create_misc_entry(self):
misc_entry_rule = self.env.ref('documents_account.misc_entry_rule')
misc_entry_rule.journal_id = misc_entry_rule.suitable_journal_ids[0]
misc_entry_action = misc_entry_rule.apply_actions([self.document_txt.id, self.document_gif.id])
move = self.env['account.move'].browse(self.document_txt.res_id)
self.assertEqual(misc_entry_action.get('res_model'), 'account.move')
self.assertEqual(move.move_type, 'entry')
self.assertTrue(move.journal_id in misc_entry_rule.suitable_journal_ids)
def test_workflow_create_bank_statement_raise(self):
with self.assertRaises(UserError): # Could not make sense of the given file.
self.env.ref('documents_account.bank_statement_rule').apply_actions([self.document_txt.id, self.document_gif.id])
def test_workflow_create_vendor_bill(self):
vendor_bill_entry_rule = self.env.ref('documents_account.vendor_bill_rule_financial')
vendor_bill_entry_action = vendor_bill_entry_rule.apply_actions([self.document_txt.id])
move = self.env['account.move'].browse(self.document_txt.res_id)
self.assertEqual(vendor_bill_entry_action.get('res_model'), 'account.move')
self.assertEqual(move.move_type, 'in_invoice')
self.assertTrue(move.journal_id in vendor_bill_entry_rule.suitable_journal_ids)
def test_workflow_create_vendor_receipt(self):
# Activate the group for the vendor receipt
self.env['res.config.settings'].create({'group_show_purchase_receipts': True}).execute()
self.assertTrue(self.env.user.has_group('account.group_purchase_receipts'), 'The "purchase Receipt" feature should be enabled.')
vendor_receipt_rule = self.env.ref('documents_account.documents_vendor_receipt_rule')
vendor_receipt_action = vendor_receipt_rule.apply_actions([self.document_txt.id])
move = self.env['account.move'].browse(self.document_txt.res_id)
self.assertEqual(vendor_receipt_action.get('res_model'), 'account.move')
self.assertEqual(move.move_type, 'in_receipt')
self.assertTrue(move.journal_id in vendor_receipt_rule.suitable_journal_ids)
def test_workflow_rule_form_journal(self):
rule_financial = self.env.ref('documents_account.vendor_bill_rule_financial')
rule_financial.journal_id = rule_financial.suitable_journal_ids[0]
with Form(rule_financial) as rule:
# our accounting action has a journal_id
self.assertTrue(rule.journal_id)
# switching it to non-accouting action resets its journal_id on write/create
rule.create_model = 'link.to.record'
rule.save()
self.assertFalse(rule.journal_id)
# switching back gives us the rigth journal_id on write/create
rule.create_model = 'account.move.out_invoice'
rule.save()
self.assertTrue(rule.journal_id.type == 'sale')
self.assertTrue(rule.journal_id in rule.suitable_journal_ids)
def test_documents_xml_attachment(self):
"""
Makes sure pdf and xml created by the system will create a document
"""
folder_test = self.env['documents.folder'].create({'name': 'Bills'})
self.env.user.company_id.documents_account_settings = True
invoice = self.init_invoice("out_invoice", amounts=[1000], post=True)
setting = self.env['documents.account.folder.setting'].create({
'folder_id': folder_test.id,
'journal_id': invoice.journal_id.id,
})
att_ids = []
for fmt in ('xml', 'txt'):
attachment = self.env["ir.attachment"].create({
"raw": "<text/>",
"name": f"attachment-{fmt}.txt",
"mimetype": f"application/{fmt}",
"res_model": "account.move",
"res_id": invoice.id,
})
att_ids.append(attachment.id)
documents = self.env['documents.document'].search([('attachment_id', 'in', att_ids)])
self.assertEqual(len(documents), 1, "TXT should not create a document")
attachment_pdf = self.env['ir.attachment'].create({
'datas': PDF,
'name': 'file.pdf',
'mimetype': 'application/pdf',
'res_model': invoice._name,
'res_id': invoice.id,
})
documents = self.env['documents.document'].search([('attachment_id', '=', attachment_pdf.id)])
self.assertFalse(documents, "pdf should not be attached if not main attachment")
attachment_pdf.register_as_main_attachment(force=False)
documents = self.env['documents.document'].search([('attachment_id', '=', attachment_pdf.id)])
self.assertTrue(documents, "Pdf registered as main attachment did not create a document")
setting.unlink()