This commit is contained in:
2026-04-25 21:31:50 +02:00
parent 4931c55338
commit 4b998ea5be
16 changed files with 697 additions and 75 deletions

View File

@@ -0,0 +1,216 @@
<?php
declare(strict_types=1);
namespace Tests\Unit;
use App\Modules\Accounting\ReceiptRepository;
use App\Modules\Accounting\ReceiptService;
use App\Modules\Automation\AutomationEmailOnceRepository;
use App\Modules\Automation\AutomationExecutionLogRepository;
use App\Modules\Automation\AutomationRepository;
use App\Modules\Automation\AutomationService;
use App\Modules\Email\EmailSendingService;
use App\Modules\Orders\OrdersRepository;
use App\Modules\Settings\CompanySettingsRepository;
use App\Modules\Settings\ReceiptConfigRepository;
use App\Modules\Shipments\ShipmentPackageRepository;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
final class AutomationServiceTest extends TestCase
{
private AutomationRepository&MockObject $automationRepository;
private AutomationExecutionLogRepository&MockObject $executionLogRepository;
private AutomationEmailOnceRepository&MockObject $emailOnceRepository;
private EmailSendingService&MockObject $emailService;
private OrdersRepository&MockObject $ordersRepository;
private CompanySettingsRepository&MockObject $companySettingsRepository;
private ReceiptRepository&MockObject $receiptRepository;
private ReceiptConfigRepository&MockObject $receiptConfigRepository;
private ShipmentPackageRepository&MockObject $shipmentPackageRepository;
private ReceiptService&MockObject $receiptService;
private AutomationService $service;
protected function setUp(): void
{
$this->automationRepository = $this->createMock(AutomationRepository::class);
$this->executionLogRepository = $this->createMock(AutomationExecutionLogRepository::class);
$this->emailOnceRepository = $this->createMock(AutomationEmailOnceRepository::class);
$this->emailService = $this->createMock(EmailSendingService::class);
$this->ordersRepository = $this->createMock(OrdersRepository::class);
$this->companySettingsRepository = $this->createMock(CompanySettingsRepository::class);
$this->receiptRepository = $this->createMock(ReceiptRepository::class);
$this->receiptConfigRepository = $this->createMock(ReceiptConfigRepository::class);
$this->shipmentPackageRepository = $this->createMock(ShipmentPackageRepository::class);
$this->receiptService = $this->createMock(ReceiptService::class);
$this->service = new AutomationService(
$this->automationRepository,
$this->executionLogRepository,
$this->emailOnceRepository,
$this->emailService,
$this->ordersRepository,
$this->companySettingsRepository,
$this->receiptRepository,
$this->receiptConfigRepository,
$this->shipmentPackageRepository,
$this->receiptService
);
}
public function testSendEmailActionWithSendOncePerOrderSendsOnlyFirstTime(): void
{
$rule = [
'id' => 7,
'name' => 'Regula 1',
'conditions' => [],
'actions' => [[
'id' => 11,
'action_type' => 'send_email',
'action_config' => [
'template_id' => 3,
'recipient' => 'client',
'send_once_per_order' => 1,
],
]],
];
$this->automationRepository
->expects($this->exactly(2))
->method('findActiveByEvent')
->with('order.status_aged')
->willReturn([$rule]);
$this->ordersRepository
->expects($this->exactly(2))
->method('findDetails')
->with(123)
->willReturn(['order' => ['id' => 123, 'integration_id' => 1]]);
$this->emailOnceRepository
->expects($this->exactly(2))
->method('wasSent')
->with(7, 11, 123)
->willReturnOnConsecutiveCalls(false, true);
$this->emailService
->expects($this->once())
->method('send')
->with(123, 3, null, 'Automatyzacja: Regula 1')
->willReturn(['success' => true, 'error' => null, 'log_id' => 1]);
$this->emailOnceRepository
->expects($this->once())
->method('markSent')
->with(7, 11, 123);
$this->executionLogRepository
->expects($this->exactly(2))
->method('create');
$this->service->trigger('order.status_aged', 123, ['days_in_status' => 6]);
$this->service->trigger('order.status_aged', 123, ['days_in_status' => 7]);
}
public function testSendEmailActionWithoutSendOncePerOrderKeepsSending(): void
{
$rule = [
'id' => 8,
'name' => 'Regula 2',
'conditions' => [],
'actions' => [[
'id' => 12,
'action_type' => 'send_email',
'action_config' => [
'template_id' => 4,
'recipient' => 'client',
'send_once_per_order' => 0,
],
]],
];
$this->automationRepository
->expects($this->exactly(2))
->method('findActiveByEvent')
->with('order.status_aged')
->willReturn([$rule]);
$this->ordersRepository
->expects($this->exactly(2))
->method('findDetails')
->with(123)
->willReturn(['order' => ['id' => 123, 'integration_id' => 1]]);
$this->emailOnceRepository
->expects($this->never())
->method('wasSent');
$this->emailOnceRepository
->expects($this->never())
->method('markSent');
$this->emailService
->expects($this->exactly(2))
->method('send')
->with(123, 4, null, 'Automatyzacja: Regula 2')
->willReturn(['success' => true, 'error' => null, 'log_id' => 2]);
$this->executionLogRepository
->expects($this->exactly(2))
->method('create');
$this->service->trigger('order.status_aged', 123, ['days_in_status' => 6]);
$this->service->trigger('order.status_aged', 123, ['days_in_status' => 7]);
}
public function testOrderStatusConditionForOrderStatusAgedUsesCurrentStatus(): void
{
$rule = [
'id' => 9,
'name' => 'Regula 3',
'conditions' => [[
'id' => 21,
'condition_type' => 'order_status',
'condition_value' => [
'order_status_codes' => ['w_realizacji'],
],
]],
'actions' => [[
'id' => 13,
'action_type' => 'send_email',
'action_config' => [
'template_id' => 5,
'recipient' => 'client',
'send_once_per_order' => 0,
],
]],
];
$this->automationRepository
->expects($this->once())
->method('findActiveByEvent')
->with('order.status_aged')
->willReturn([$rule]);
$this->ordersRepository
->expects($this->once())
->method('findDetails')
->with(123)
->willReturn(['order' => ['id' => 123, 'integration_id' => 1]]);
$this->emailService
->expects($this->once())
->method('send')
->with(123, 5, null, 'Automatyzacja: Regula 3')
->willReturn(['success' => true, 'error' => null, 'log_id' => 3]);
$this->executionLogRepository
->expects($this->once())
->method('create');
$this->service->trigger('order.status_aged', 123, [
'days_in_status' => 7,
'current_status' => 'w_realizacji',
]);
}
}