1
0
forked from erp-dev/erp

feat: added wecom notify when printing_job production was completed(new status) and shipment was created

This commit is contained in:
2026-04-09 17:35:14 +08:00
parent 76ea445880
commit 646dbe7f18
27 changed files with 1122 additions and 13 deletions

View File

@@ -0,0 +1,136 @@
from unittest.mock import patch
from django.contrib.auth import get_user_model
from django.db import transaction
from django.test import TestCase, TransactionTestCase, override_settings
from basic_info import models as basic_models
from printing import handlers
from printing import models as printing_models
from printing import tasks as printing_tasks
from shipment import models as shipment_models
class PrintingJobProductionCompletedWeComServiceTestCase(TestCase):
def setUp(self):
self.user = get_user_model().objects.create_user(username="notify-user", password="pass")
self.merchant = basic_models.Merchant.objects.create(
name="测试印花厂",
type=basic_models.MerchantTypeEnum.FACTORY,
)
basic_models.Employee.objects.create(
sys_user=self.user,
merchant=self.merchant,
name="测试员工",
status=basic_models.EmployeeStatusEnum.ACTIVE,
)
self.customer = basic_models.Customer.objects.create(
merchant=self.merchant,
name="测试客户",
)
self.category = basic_models.ProductCategory.objects.create(
merchant=self.merchant,
name="测试分类",
)
self.product = basic_models.Product.objects.create(
merchant=self.merchant,
category=self.category,
name="测试产品",
)
def test_send_printing_job_production_completed_wecom_fallbacks_to_order_id(self):
order = printing_models.PrintingOrder.objects.create(
merchant=self.merchant,
customer=self.customer,
fabric="棉布",
width="150cm",
external_order_id="",
)
job = printing_models.PrintingJob.objects.create(
merchant=self.merchant,
printing_order=order,
product=self.product,
quantity=10,
unit="",
)
shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name="未出货销售品1",
quantity="50.50",
unit=shipment_models.UnitChoices.METER,
printing_job_id=job.id,
created_by=self.user,
)
shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name="未出货销售品2",
quantity="38.00",
unit=shipment_models.UnitChoices.METER,
printing_job_id=job.id,
created_by=self.user,
)
from printing.services import send_printing_job_production_completed_wecom
payload = send_printing_job_production_completed_wecom(
printing_job_id=job.id,
triggered_by_id=self.user.id,
dry_run=True,
)
self.assertEqual(payload["printing_order_identifier"], str(order.id))
self.assertEqual(payload["product_name"], self.product.name)
self.assertEqual(payload["unshipped_sales_items_count"], 2)
self.assertEqual(payload["unshipped_sales_items_quantity"], "88.50")
self.assertEqual(payload["sender_label"], "测试员工")
@override_settings(
CELERY_TASK_ALWAYS_EAGER=True,
CELERY_TASK_EAGER_PROPAGATES=True,
)
class PrintingJobProductionCompletedWeComTaskTestCase(TestCase):
def test_task_delegates_to_service(self):
with patch(
"printing.tasks.send_printing_job_production_completed_wecom"
) as mock_sync:
mock_sync.return_value = {"printing_job_id": 123, "ok": True}
async_result = printing_tasks.notify_printing_job_production_completed_wecom.delay(
printing_job_id=123,
triggered_by_id=456,
)
payload = async_result.get(timeout=5)
mock_sync.assert_called_once_with(
printing_job_id=123,
triggered_by_id=456,
)
self.assertEqual(payload["printing_job_id"], 123)
self.assertIn("task_id", payload)
@override_settings(
TESTING=False,
PRINTING_JOB_PRODUCTION_COMPLETED_WECOM_NOTIFY_ENABLED=True,
)
class PrintingJobProductionCompletedHandlerTestCase(TransactionTestCase):
def test_handler_enqueues_task_on_commit(self):
job = type("Job", (), {"id": 321})()
user = type("User", (), {"id": 654})()
with patch(
"printing.tasks.notify_printing_job_production_completed_wecom.delay"
) as mock_delay:
with transaction.atomic():
handlers.on_printing_job_production_completed(
sender=printing_models.PrintingJob,
instance=job,
triggered_by=user,
)
self.assertFalse(mock_delay.called)
mock_delay.assert_called_once_with(
printing_job_id=321,
triggered_by_id=654,
)