bemade-addons/bemade_quotation_alternative/tests/test_migration_odoo18.py
2025-09-22 14:44:48 -04:00

166 lines
6.4 KiB
Python

# -*- coding: utf-8 -*-
from odoo.tests.common import TransactionCase
from odoo.exceptions import ValidationError
from markupsafe import Markup
class TestQuotationAlternativeMigration(TransactionCase):
"""Tests de migration vers Odoo 18.0 pour bemade_quotation_alternative"""
def setUp(self):
super().setUp()
# Créer des données de test
self.partner = self.env['res.partner'].create({
'name': 'Test Customer',
'email': 'test@example.com'
})
self.product = self.env['product.product'].create({
'name': 'Test Product',
'type': 'product',
'list_price': 100.0,
})
# Créer un devis original
self.original_order = self.env['sale.order'].create({
'partner_id': self.partner.id,
'name': 'SO001',
'order_line': [(0, 0, {
'product_id': self.product.id,
'product_uom_qty': 2,
'price_unit': 100.0,
})]
})
def test_wizard_creation(self):
"""Test de création du wizard de duplication"""
wizard = self.env['sale.order.duplication.wizard'].create({
'original_order_id': self.original_order.id,
'purpose': 'Test migration Odoo 18',
'note': '<p>Test note HTML</p>',
})
self.assertEqual(wizard.original_order_id, self.original_order)
self.assertTrue(wizard.duplicate_all_lines)
self.assertEqual(len(wizard.lines_to_duplicate), 1)
def test_name_generation_logic(self):
"""Test de la logique améliorée de génération des noms"""
wizard = self.env['sale.order.duplication.wizard'].create({
'original_order_id': self.original_order.id,
})
# Le nom généré devrait être SO001-REV1
self.assertEqual(wizard.new_quot, 'SO001-REV1')
# Créer un devis avec ce nom pour tester l'anti-doublon
self.env['sale.order'].create({
'partner_id': self.partner.id,
'name': 'SO001-REV1',
})
# Créer un nouveau wizard
wizard2 = self.env['sale.order.duplication.wizard'].create({
'original_order_id': self.original_order.id,
})
# Le nom généré devrait maintenant être SO001-REV2
self.assertEqual(wizard2.new_quot, 'SO001-REV2')
def test_markup_compatibility(self):
"""Test de compatibilité Markup() avec Odoo 18"""
wizard = self.env['sale.order.duplication.wizard'].create({
'original_order_id': self.original_order.id,
})
# Simuler la création de messages comme dans action_duplicate_order
test_markup = Markup(
"Test message <a href='#' data-oe-model='sale.order' "
"data-oe-id='%s'>#%s</a> created."
) % (self.original_order.id, self.original_order.name)
# Vérifier que Markup fonctionne correctement
self.assertIsInstance(test_markup, Markup)
self.assertIn('SO001', str(test_markup))
self.assertIn('data-oe-model', str(test_markup))
def test_duplication_all_lines(self):
"""Test de duplication avec toutes les lignes"""
wizard = self.env['sale.order.duplication.wizard'].create({
'original_order_id': self.original_order.id,
'duplicate_all_lines': True,
'purpose': 'Test duplication complète',
})
result = wizard.action_duplicate_order()
# Vérifier que l'action retourne bien une fenêtre
self.assertEqual(result['type'], 'ir.actions.act_window')
self.assertEqual(result['res_model'], 'sale.order')
# Récupérer le nouveau devis
new_order = self.env['sale.order'].browse(result['res_id'])
# Vérifications
self.assertEqual(new_order.partner_id, self.original_order.partner_id)
self.assertEqual(len(new_order.order_line), len(self.original_order.order_line))
self.assertEqual(new_order.purpose, 'Test duplication complète')
self.assertTrue(new_order.name.startswith('SO001-REV'))
def test_duplication_selective_lines(self):
"""Test de duplication sélective des lignes"""
# Ajouter une deuxième ligne au devis original
self.env['sale.order.line'].create({
'order_id': self.original_order.id,
'product_id': self.product.id,
'product_uom_qty': 1,
'price_unit': 50.0,
})
wizard = self.env['sale.order.duplication.wizard'].create({
'original_order_id': self.original_order.id,
'duplicate_all_lines': False,
})
# Désélectionner la première ligne
wizard.lines_to_duplicate[0].to_duplicate = False
result = wizard.action_duplicate_order()
new_order = self.env['sale.order'].browse(result['res_id'])
# Vérifier qu'une seule ligne a été dupliquée
self.assertEqual(len(new_order.order_line), 1)
self.assertEqual(new_order.order_line.price_unit, 50.0)
def test_chatter_messages(self):
"""Test des messages dans le chatter"""
wizard = self.env['sale.order.duplication.wizard'].create({
'original_order_id': self.original_order.id,
})
# Compter les messages avant duplication
original_messages_count = len(self.original_order.message_ids)
result = wizard.action_duplicate_order()
new_order = self.env['sale.order'].browse(result['res_id'])
# Vérifier que des messages ont été ajoutés
self.assertGreater(len(self.original_order.message_ids), original_messages_count)
self.assertGreater(len(new_order.message_ids), 0)
# Vérifier le contenu des messages
original_last_message = self.original_order.message_ids[0].body
new_last_message = new_order.message_ids[0].body
self.assertIn('new quotation', original_last_message.lower())
self.assertIn('duplicating', new_last_message.lower())
def test_error_handling(self):
"""Test de gestion d'erreurs"""
# Test avec un devis inexistant
with self.assertRaises(ValidationError):
wizard = self.env['sale.order.duplication.wizard'].create({
'original_order_id': 99999, # ID inexistant
})
wizard.action_duplicate_order()