Files
fotospiel-app/tests/Feature/SyncPackageToLemonSqueezyJobTest.php
Codex Agent 10c99de1e2
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled
Migrate billing from Paddle to Lemon Squeezy
2026-02-03 10:59:54 +01:00

84 lines
3.1 KiB
PHP

<?php
namespace Tests\Feature;
use App\Jobs\SyncPackageToLemonSqueezy;
use App\Models\Package;
use App\Services\LemonSqueezy\LemonSqueezyCatalogService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Mockery;
use Tests\TestCase;
class SyncPackageToLemonSqueezyJobTest extends TestCase
{
use RefreshDatabase;
protected function tearDown(): void
{
parent::tearDown();
Mockery::close();
}
public function test_job_creates_product_and_price_and_updates_package(): void
{
$package = Package::factory()->create([
'lemonsqueezy_product_id' => null,
'lemonsqueezy_variant_id' => null,
'price' => 15.50,
'slug' => 'silver-plan',
]);
$service = Mockery::mock(LemonSqueezyCatalogService::class);
$service->shouldReceive('createProduct')
->once()
->withArgs(function ($pkg, $overrides) use ($package) {
return $pkg->is($package) && $overrides === [];
})
->andReturn(['id' => 'pro_123']);
$service->shouldReceive('createPrice')
->once()
->withArgs(function ($pkg, $productId, $overrides) use ($package) {
return $pkg->is($package) && $productId === 'pro_123' && $overrides === [];
})
->andReturn(['id' => 'pri_123']);
$service->shouldReceive('buildProductPayload')
->andReturn(['payload' => 'product']);
$service->shouldReceive('buildPricePayload')
->andReturn(['payload' => 'price']);
$job = new SyncPackageToLemonSqueezy($package->id);
$job->handle($service);
$package->refresh();
$this->assertSame('pro_123', $package->lemonsqueezy_product_id);
$this->assertSame('pri_123', $package->lemonsqueezy_variant_id);
$this->assertSame('synced', $package->lemonsqueezy_sync_status);
$this->assertNotNull($package->lemonsqueezy_synced_at);
$this->assertSame(['payload' => 'product'], $package->lemonsqueezy_snapshot['payload']['product']);
$this->assertSame(['payload' => 'price'], $package->lemonsqueezy_snapshot['payload']['price']);
}
public function test_dry_run_stores_snapshot_without_calling_lemonsqueezy(): void
{
$package = Package::factory()->create([
'slug' => 'gold-plan',
]);
$service = Mockery::mock(LemonSqueezyCatalogService::class);
$service->shouldReceive('buildProductPayload')->andReturn(['payload' => 'product']);
$service->shouldReceive('buildPricePayload')->andReturn(['payload' => 'price']);
$job = new SyncPackageToLemonSqueezy($package->id, ['dry_run' => true]);
$job->handle($service);
$package->refresh();
$this->assertSame('dry-run', $package->lemonsqueezy_sync_status);
$this->assertTrue($package->lemonsqueezy_snapshot['dry_run']);
$this->assertSame(['payload' => 'product'], $package->lemonsqueezy_snapshot['payload']['product']);
$this->assertSame(['payload' => 'price'], $package->lemonsqueezy_snapshot['payload']['price']);
}
}