Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace)
This commit is contained in:
201
addons/cetmix_tower_server_queue/tests/test_file.py
Normal file
201
addons/cetmix_tower_server_queue/tests/test_file.py
Normal file
@@ -0,0 +1,201 @@
|
||||
from odoo import exceptions
|
||||
|
||||
from odoo.addons.cetmix_tower_server.tests.common import TestTowerCommon
|
||||
from odoo.addons.queue_job.tests.common import trap_jobs
|
||||
|
||||
|
||||
class TestCxTowerFileQueue(TestTowerCommon):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.file_template = self.FileTemplate.create(
|
||||
{
|
||||
"name": "Test",
|
||||
"file_name": "test.txt",
|
||||
"server_dir": "/var/tmp",
|
||||
"code": "Hello, world!",
|
||||
}
|
||||
)
|
||||
|
||||
def test_async_upload_operations(self):
|
||||
"""Test that upload operations are processed asynchronously"""
|
||||
# Create unique files specifically for this test
|
||||
upload_file = self.File.create(
|
||||
{
|
||||
"source": "tower",
|
||||
"template_id": self.file_template.id,
|
||||
"server_id": self.server_test_1.id,
|
||||
"name": "upload_test_1",
|
||||
"auto_sync": False,
|
||||
}
|
||||
)
|
||||
|
||||
upload_file_2 = self.File.create(
|
||||
{
|
||||
"name": "upload_test_2",
|
||||
"source": "server",
|
||||
"server_id": self.server_test_1.id,
|
||||
"server_dir": "/var/tmp",
|
||||
"auto_sync": False,
|
||||
}
|
||||
)
|
||||
|
||||
with trap_jobs() as trap:
|
||||
upload_file.upload()
|
||||
upload_file_2.upload()
|
||||
|
||||
self.assertEqual(len(trap.enqueued_jobs), 2)
|
||||
|
||||
upload_file.write({"server_response": "ok", "is_being_processed": False})
|
||||
upload_file_2.write({"server_response": "ok", "is_being_processed": False})
|
||||
|
||||
# Refresh records to get updated values
|
||||
upload_file.invalidate_recordset()
|
||||
upload_file_2.invalidate_recordset()
|
||||
|
||||
# Verify the expected state
|
||||
self.assertEqual(upload_file.server_response, "ok")
|
||||
self.assertFalse(upload_file.is_being_processed)
|
||||
|
||||
self.assertEqual(upload_file_2.server_response, "ok")
|
||||
self.assertFalse(upload_file_2.is_being_processed)
|
||||
|
||||
def test_async_download_operations(self):
|
||||
"""Test that download operations are processed asynchronously"""
|
||||
# Create unique files specifically for this test
|
||||
download_file = self.File.create(
|
||||
{
|
||||
"source": "tower",
|
||||
"template_id": self.file_template.id,
|
||||
"server_id": self.server_test_1.id,
|
||||
"name": "download_test_1",
|
||||
"auto_sync": False,
|
||||
}
|
||||
)
|
||||
|
||||
download_file_2 = self.File.create(
|
||||
{
|
||||
"name": "download_test_2",
|
||||
"source": "server",
|
||||
"server_id": self.server_test_1.id,
|
||||
"server_dir": "/var/tmp",
|
||||
"auto_sync": False,
|
||||
}
|
||||
)
|
||||
|
||||
with trap_jobs() as trap:
|
||||
download_file.download()
|
||||
download_file_2.download()
|
||||
|
||||
# Verify jobs were created
|
||||
self.assertEqual(len(trap.enqueued_jobs), 2)
|
||||
|
||||
download_file.write({"server_response": "ok", "is_being_processed": False})
|
||||
download_file_2.write(
|
||||
{"server_response": "ok", "is_being_processed": False}
|
||||
)
|
||||
|
||||
# Refresh records to get updated values
|
||||
download_file.invalidate_recordset()
|
||||
download_file_2.invalidate_recordset()
|
||||
|
||||
# Verify the expected state
|
||||
self.assertEqual(download_file.server_response, "ok")
|
||||
self.assertFalse(download_file.is_being_processed)
|
||||
|
||||
self.assertEqual(download_file_2.server_response, "ok")
|
||||
self.assertFalse(download_file_2.is_being_processed)
|
||||
|
||||
def test_upload_error_handling(self):
|
||||
"""Test error handling in async upload operations"""
|
||||
error_file = self.File.create(
|
||||
{
|
||||
"source": "tower",
|
||||
"template_id": self.file_template.id,
|
||||
"server_id": self.server_test_1.id,
|
||||
"name": "error_handling_test",
|
||||
"auto_sync": False,
|
||||
}
|
||||
)
|
||||
|
||||
# Set context to force the mock in ssh_upload_file to raise error
|
||||
error_context = {"raise_upload_error": "Forced upload error"}
|
||||
|
||||
with trap_jobs() as trap:
|
||||
# This will trigger job creation but the job would fail if executed
|
||||
error_file.with_context(**error_context).upload(raise_error=True)
|
||||
|
||||
# Verify job was created
|
||||
self.assertEqual(len(trap.enqueued_jobs), 1)
|
||||
|
||||
# Simulate what would happen if the job executed and failed
|
||||
error_file.write({"server_response": "error", "is_being_processed": False})
|
||||
error_file.invalidate_recordset()
|
||||
|
||||
self.assertEqual(error_file.server_response, "error")
|
||||
self.assertFalse(error_file.is_being_processed)
|
||||
|
||||
def test_download_error_handling(self):
|
||||
"""Test error handling in async download operations"""
|
||||
error_file = self.File.create(
|
||||
{
|
||||
"source": "server",
|
||||
"server_id": self.server_test_1.id,
|
||||
"server_dir": "/var/tmp",
|
||||
"name": "download_error_test",
|
||||
}
|
||||
)
|
||||
|
||||
# Set context to force the mock in ssh_download_file to raise error
|
||||
error_context = {"raise_download_error": "Forced download error"}
|
||||
|
||||
with trap_jobs() as trap:
|
||||
# This will trigger job creation but the job would fail if executed
|
||||
error_file.with_context(**error_context).download(raise_error=True)
|
||||
|
||||
# Verify job was created
|
||||
self.assertEqual(len(trap.enqueued_jobs), 1)
|
||||
|
||||
# Simulate what would happen if the job executed and failed
|
||||
error_file.write({"server_response": "error", "is_being_processed": False})
|
||||
error_file.invalidate_recordset()
|
||||
|
||||
self.assertEqual(error_file.server_response, "error")
|
||||
self.assertFalse(error_file.is_being_processed)
|
||||
|
||||
def test_already_processing_check(self):
|
||||
"""Test that files being processed cannot be processed again"""
|
||||
processing_file = self.File.create(
|
||||
{
|
||||
"source": "tower",
|
||||
"template_id": self.file_template.id,
|
||||
"server_id": self.server_test_1.id,
|
||||
"name": "processing_test_file",
|
||||
"is_being_processed": True,
|
||||
}
|
||||
)
|
||||
|
||||
self.assertTrue(processing_file.is_being_processed)
|
||||
|
||||
# Test with raising error
|
||||
with self.assertRaises(exceptions.UserError):
|
||||
processing_file.upload(raise_error=True)
|
||||
|
||||
# Test without raising error - should not create job
|
||||
with trap_jobs() as trap:
|
||||
processing_file.upload(raise_error=False)
|
||||
# No job should be created since file is already being processed
|
||||
self.assertEqual(len(trap.enqueued_jobs), 0)
|
||||
|
||||
# Verify still marked as processing
|
||||
self.assertTrue(processing_file.is_being_processed)
|
||||
|
||||
# Same tests for download
|
||||
with self.assertRaises(exceptions.UserError):
|
||||
processing_file.download(raise_error=True)
|
||||
|
||||
with trap_jobs() as trap:
|
||||
processing_file.download(raise_error=False)
|
||||
# No job should be created
|
||||
self.assertEqual(len(trap.enqueued_jobs), 0)
|
||||
|
||||
self.assertTrue(processing_file.is_being_processed)
|
||||
Reference in New Issue
Block a user