Files
ladill-woo-manager/tests/Feature/WooIntegrationsTest.php
T
isaaccladandCursor 1e97f129e9
Deploy Ladill Woo Manager / deploy (push) Successful in 1m4s
Handle Woo plugin connection timeouts without 500 errors.
Treat unreachable WordPress stores as unavailable during integrations refresh instead of throwing when the site times out.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 11:02:06 +00:00

174 lines
6.5 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\User;
use App\Models\WooStore;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
use Tests\TestCase;
class WooIntegrationsTest extends TestCase
{
use RefreshDatabase;
public function test_guest_is_redirected_from_integrations(): void
{
$this->get(route('woo.integrations.index'))
->assertRedirect(route('sso.connect', ['redirect' => route('woo.integrations.index')]));
}
public function test_integrations_page_without_store_shows_catalog(): void
{
$user = User::factory()->create();
$this->actingAs($user)
->get(route('woo.integrations.index'))
->assertOk()
->assertSee('Integrations')
->assertSee('Google for WooCommerce')
->assertSee('Pinterest for WooCommerce')
->assertSee('Snapchat for WooCommerce')
->assertSee('TikTok for WooCommerce')
->assertSee('Reddit for WooCommerce')
->assertSee('Meta for WooCommerce')
->assertSee('Connect a WooCommerce store');
}
public function test_integrations_page_fetches_status_from_plugin(): void
{
$user = User::factory()->create();
$store = WooStore::create([
'user_id' => $user->id,
'site_url' => 'https://shop.example.com',
'site_name' => 'Example Shop',
'status' => WooStore::STATUS_ACTIVE,
'connected_at' => now(),
'public_id' => 'store-public-id',
]);
Http::fake([
'https://shop.example.com/wp-json/ladill-woo/v1/integrations/status' => Http::response([
'integrations' => [
'shipping' => [
'state' => 'connected',
'installed' => true,
'connected' => true,
'manage_url' => 'https://shop.example.com/wp-admin/admin.php?page=wc-settings&tab=shipping',
'summary' => '2 zones, 4 methods',
'details' => ['zones' => 2, 'methods' => 4],
],
'google' => [
'state' => 'needs_setup',
'installed' => true,
'connected' => false,
'manage_url' => 'https://shop.example.com/wp-admin/admin.php?page=wc-admin&path=/google/start',
'summary' => 'Installed — finish setup in WordPress.',
'details' => [],
],
'pinterest' => [
'state' => 'not_installed',
'installed' => false,
'connected' => false,
'manage_url' => null,
'summary' => 'Extension is not installed on this store.',
'details' => [],
],
'snapchat' => [
'state' => 'connected',
'installed' => true,
'connected' => true,
'manage_url' => 'https://shop.example.com/wp-admin/admin.php?page=wc-admin&path=/snapchat/setup',
'summary' => 'Connected and ready.',
'details' => [],
],
],
], 200),
]);
$this->actingAs($user)
->get(route('woo.integrations.index'))
->assertOk()
->assertSee('Example Shop')
->assertSee('2 zones, 4 methods')
->assertSee('Needs setup')
->assertSee('Not installed')
->assertSee('Connected')
->assertSee('Manage in WordPress');
Http::assertSentCount(1);
}
public function test_integrations_status_is_cached_until_refresh(): void
{
config(['woo.integrations_cache_ttl_seconds' => 300]);
$user = User::factory()->create();
$store = WooStore::create([
'user_id' => $user->id,
'site_url' => 'https://shop.example.com',
'site_name' => 'Example Shop',
'status' => WooStore::STATUS_ACTIVE,
'connected_at' => now(),
'public_id' => 'store-public-id',
]);
Http::fake([
'https://shop.example.com/wp-json/ladill-woo/v1/integrations/status' => Http::response([
'integrations' => [
'shipping' => [
'state' => 'connected',
'installed' => true,
'connected' => true,
'manage_url' => 'https://shop.example.com/wp-admin/admin.php?page=wc-settings&tab=shipping',
'summary' => '1 zone, 2 methods',
'details' => ['zones' => 1, 'methods' => 2],
],
],
], 200),
]);
$this->actingAs($user)->get(route('woo.integrations.index'))->assertOk();
$this->actingAs($user)->get(route('woo.integrations.index'))->assertOk();
Http::assertSentCount(1);
$this->actingAs($user)
->post(route('woo.integrations.refresh'))
->assertRedirect(route('woo.integrations.index'));
$this->actingAs($user)->get(route('woo.integrations.index'))->assertOk();
Http::assertSentCount(2);
$this->assertTrue(Cache::has('woo.integrations.'.$store->id));
}
public function test_integrations_refresh_survives_store_connection_timeout(): void
{
$user = User::factory()->create();
WooStore::create([
'user_id' => $user->id,
'site_url' => 'https://shop.example.com',
'site_name' => 'Example Shop',
'status' => WooStore::STATUS_ACTIVE,
'connected_at' => now(),
'public_id' => 'store-public-id',
]);
Http::fake([
'https://shop.example.com/wp-json/ladill-woo/v1/integrations/status' => function () {
throw new \Illuminate\Http\Client\ConnectionException(
new \Exception('cURL error 28: Operation timed out')
);
},
]);
$this->actingAs($user)
->from(route('woo.integrations.index'))
->post(route('woo.integrations.refresh'))
->assertRedirect(route('woo.integrations.index'))
->assertSessionHas('success');
}
}