22# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
33
44import json
5- from unittest import mock
65from unittest .mock import patch
76
87import freezegun
1110import odoo .tests .common as common
1211from odoo import fields
1312
14- from odoo .addons .web .controllers .export import ExcelExport
13+ # This is the key import for fixing "object unbound"
14+ from odoo .addons .website .tools import MockRequest
1515
16- # Reformatting CSV export data
16+ # Data definitions
1717data_csv = {
1818 "data" : json .dumps (
1919 {
3434 )
3535}
3636
37- # Reformatting XLS export data
3837data_xls = {
3938 "data" : json .dumps (
4039 {
@@ -61,54 +60,68 @@ def setUp(self):
6160 super ().setUp ()
6261 self .delay_export_obj = self .env ["delay.export" ]
6362 self .job_obj = self .env ["queue.job" ]
64- with patch ("odoo.http._request_stack" ) as mock_request_stack :
65- mock_request = mock .Mock (env = self .env )
66- mock_request_stack .push (mock_request )
67- self .addCleanup (mock_request_stack .pop )
63+
64+ # We use MockRequest as a context manager to bind the request object correctly
65+ self .mock_request_stack = MockRequest (self .env )
66+ self .mock_request_stack .__enter__ ()
67+ self .addCleanup (self .mock_request_stack .__exit__ , None , None , None )
6868
6969 def test_delay_export (self ):
70- """Check that the call create a new JOB"""
71- nbr_job = len ( self .job_obj .search ([]) )
70+ """Check that the call creates a new JOB"""
71+ nbr_job = self .job_obj .search_count ([])
7272 self .delay_export_obj .delay_export (data_csv )
73- new_nbr_job = len ( self .job_obj .search ([]) )
73+ new_nbr_job = self .job_obj .search_count ([])
7474 self .assertEqual (new_nbr_job , nbr_job + 1 )
7575
7676 def test_export_csv (self ):
77- """Check that the export generate an attachment and email"""
77+ """Check that the export generates an attachment and email"""
7878 params = json .loads (data_csv .get ("data" ))
7979 mails = self .env ["mail.mail" ].search ([])
8080 attachments = self .env ["ir.attachment" ].search ([])
81+
8182 self .delay_export_obj .export (params )
83+
8284 new_mail = self .env ["mail.mail" ].search ([]) - mails
8385 new_attachment = self .env ["ir.attachment" ].search ([]) - attachments
86+
8487 self .assertEqual (len (new_mail ), 1 )
8588 self .assertEqual (new_attachment .name , "res.partner.csv" )
8689
8790 def test_export_xls (self ):
88- """Check that the export generate an attachment and email"""
91+ """Check that the export generates an attachment and email"""
8992 params = json .loads (data_xls .get ("data" ))
9093 mails = self .env ["mail.mail" ].search ([])
9194 attachments = self .env ["ir.attachment" ].search ([])
92- with patch .object (ExcelExport , "from_data" , return_value = b"\x41 \x42 \x43 \x44 " ):
95+
96+ # Patch the class method directly
97+ with patch (
98+ "odoo.addons.web.controllers.export.ExcelExport.from_data" ,
99+ return_value = b"\x41 \x42 \x43 \x44 " ,
100+ ):
93101 self .delay_export_obj .export (params )
102+
94103 new_mail = self .env ["mail.mail" ].search ([]) - mails
95104 new_attachment = self .env ["ir.attachment" ].search ([]) - attachments
105+
96106 self .assertEqual (len (new_mail ), 1 )
97107 self .assertEqual (new_attachment .name , "res.partner.xls" )
98108
99109 def test_cron_delete (self ):
100110 """Check that cron delete attachment after TTL"""
101111 params = json .loads (data_csv .get ("data" ))
102112 attachments = self .env ["ir.attachment" ].search ([])
113+
103114 self .delay_export_obj .export (params )
104115 new_attachment = self .env ["ir.attachment" ].search ([]) - attachments
116+
105117 time_to_live = (
106118 self .env ["ir.config_parameter" ].sudo ().get_param ("attachment.ttl" , 7 )
107119 )
120+
108121 date_today = fields .Datetime .now ()
109- date_past_ttl = date_today + relativedelta (days = int (time_to_live ))
122+ date_past_ttl = date_today + relativedelta (days = int (time_to_live ) + 1 )
123+
110124 with freezegun .freeze_time (date_past_ttl ):
111125 self .delay_export_obj .cron_delete ()
112126
113- # The attachment must be deleted
114127 self .assertFalse (new_attachment .exists ())
0 commit comments