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'); } }