assertFalse(Pro::hasFluxPro()); } public function test_has_font_awesome_pro_returns_false_by_default(): void { $this->assertFalse(Pro::hasFontAwesomePro()); } public function test_has_font_awesome_pro_returns_true_when_configured(): void { config(['core.fontawesome.pro' => true]); Pro::clearCache(); $this->assertTrue(Pro::hasFontAwesomePro()); } public function test_flux_pro_components_returns_expected_components(): void { $components = Pro::fluxProComponents(); $this->assertContains('calendar', $components); $this->assertContains('editor', $components); $this->assertContains('chart', $components); $this->assertContains('kanban', $components); } public function test_requires_flux_pro_returns_true_for_pro_components(): void { $this->assertTrue(Pro::requiresFluxPro('calendar')); $this->assertTrue(Pro::requiresFluxPro('editor')); $this->assertTrue(Pro::requiresFluxPro('chart')); } public function test_requires_flux_pro_returns_false_for_free_components(): void { $this->assertFalse(Pro::requiresFluxPro('button')); $this->assertFalse(Pro::requiresFluxPro('input')); $this->assertFalse(Pro::requiresFluxPro('modal')); } public function test_requires_flux_pro_normalizes_component_prefix(): void { $this->assertTrue(Pro::requiresFluxPro('core:calendar')); $this->assertTrue(Pro::requiresFluxPro('flux:editor')); } public function test_requires_flux_pro_handles_dot_notation(): void { $this->assertTrue(Pro::requiresFluxPro('calendar.month')); $this->assertTrue(Pro::requiresFluxPro('core:calendar.week')); } public function test_require_flux_pro_throws_exception_in_test_environment(): void { $this->expectException(\RuntimeException::class); $this->expectExceptionMessageMatches('/Flux Pro.*requires a licence/'); Pro::requireFluxPro('test-component'); } public function test_require_flux_pro_includes_component_name_in_exception(): void { try { Pro::requireFluxPro('core:calendar'); $this->fail('Expected exception not thrown'); } catch (\RuntimeException $e) { $this->assertStringContainsString('core:calendar', $e->getMessage()); $this->assertStringContainsString('fluxui.dev/pricing', $e->getMessage()); } } public function test_font_awesome_styles_returns_pro_styles_when_pro_enabled(): void { config(['core.fontawesome.pro' => true]); Pro::clearCache(); $styles = Pro::fontAwesomeStyles(); $this->assertContains('light', $styles); $this->assertContains('thin', $styles); $this->assertContains('duotone', $styles); $this->assertContains('sharp', $styles); } public function test_font_awesome_styles_returns_free_styles_when_pro_disabled(): void { config(['core.fontawesome.pro' => false]); Pro::clearCache(); $styles = Pro::fontAwesomeStyles(); $this->assertContains('solid', $styles); $this->assertContains('regular', $styles); $this->assertContains('brands', $styles); $this->assertNotContains('light', $styles); $this->assertNotContains('duotone', $styles); } public function test_font_awesome_fallback_returns_original_style_when_pro(): void { config(['core.fontawesome.pro' => true]); Pro::clearCache(); $this->assertEquals('light', Pro::fontAwesomeFallback('light')); $this->assertEquals('thin', Pro::fontAwesomeFallback('thin')); $this->assertEquals('duotone', Pro::fontAwesomeFallback('duotone')); } public function test_font_awesome_fallback_returns_fallback_when_free(): void { config(['core.fontawesome.pro' => false]); Pro::clearCache(); $this->assertEquals('regular', Pro::fontAwesomeFallback('light')); $this->assertEquals('regular', Pro::fontAwesomeFallback('thin')); $this->assertEquals('solid', Pro::fontAwesomeFallback('duotone')); $this->assertEquals('solid', Pro::fontAwesomeFallback('sharp')); } public function test_font_awesome_fallback_preserves_free_styles(): void { config(['core.fontawesome.pro' => false]); Pro::clearCache(); $this->assertEquals('solid', Pro::fontAwesomeFallback('solid')); $this->assertEquals('regular', Pro::fontAwesomeFallback('regular')); $this->assertEquals('brands', Pro::fontAwesomeFallback('brands')); } public function test_clear_cache_resets_detection(): void { // First call caches the result Pro::hasFluxPro(); Pro::hasFontAwesomePro(); // Clear and reconfigure Pro::clearCache(); config(['core.fontawesome.pro' => true]); // Should reflect new config $this->assertTrue(Pro::hasFontAwesomePro()); } }