Skip to content

Commit 4c380a9

Browse files
gzioloclaude
andcommitted
Tests: Add unit tests for _wp_connectors_is_api_key_valid().
Introduces a reusable mock provider trait for registering a controllable test provider in the AI Client registry. Co-Authored-By: Claude Opus 4.6 <[email protected]>
1 parent 0625624 commit 4c380a9

File tree

2 files changed

+241
-0
lines changed

2 files changed

+241
-0
lines changed
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
<?php
2+
/**
3+
* Trait for creating mock providers for testing.
4+
*
5+
* @package WordPress
6+
* @subpackage AI
7+
*/
8+
9+
use WordPress\AiClient\AiClient;
10+
use WordPress\AiClient\Providers\AbstractProvider;
11+
use WordPress\AiClient\Providers\Contracts\ModelMetadataDirectoryInterface;
12+
use WordPress\AiClient\Providers\Contracts\ProviderAvailabilityInterface;
13+
use WordPress\AiClient\Providers\DTO\ProviderMetadata;
14+
use WordPress\AiClient\Providers\Enums\ProviderTypeEnum;
15+
use WordPress\AiClient\Providers\Http\Enums\RequestAuthenticationMethod;
16+
use WordPress\AiClient\Providers\Models\Contracts\ModelInterface;
17+
use WordPress\AiClient\Providers\Models\DTO\ModelMetadata;
18+
19+
/**
20+
* Mock provider availability with a controllable flag.
21+
*
22+
* @since 7.0.0
23+
*/
24+
class Mock_Connectors_Test_Provider_Availability implements ProviderAvailabilityInterface {
25+
26+
/**
27+
* Whether the provider should report as configured.
28+
*
29+
* @var bool
30+
*/
31+
public static bool $is_configured = true;
32+
33+
/**
34+
* Checks if the provider is configured.
35+
*
36+
* @return bool
37+
*/
38+
public function isConfigured(): bool {
39+
return self::$is_configured;
40+
}
41+
}
42+
43+
/**
44+
* Mock model metadata directory that returns an empty list.
45+
*
46+
* @since 7.0.0
47+
*/
48+
class Mock_Connectors_Test_Model_Metadata_Directory implements ModelMetadataDirectoryInterface {
49+
50+
/**
51+
* Lists model metadata.
52+
*
53+
* @return array Empty array.
54+
*/
55+
public function listModelMetadata(): array {
56+
return array();
57+
}
58+
59+
/**
60+
* Checks if a model exists.
61+
*
62+
* @param string $modelId The model ID.
63+
* @return bool Always false.
64+
*/
65+
public function hasModelMetadata( string $modelId ): bool {
66+
return false;
67+
}
68+
69+
/**
70+
* Gets model metadata.
71+
*
72+
* @param string $modelId The model ID.
73+
* @throws \InvalidArgumentException Always, as no models are available.
74+
*/
75+
public function getModelMetadata( string $modelId ): ModelMetadata {
76+
throw new \InvalidArgumentException( 'No models available.' );
77+
}
78+
}
79+
80+
/**
81+
* Minimal mock provider for testing connector functions that interact
82+
* with the AI Client registry.
83+
*
84+
* Uses API key authentication and delegates availability to
85+
* Mock_Connectors_Test_Provider_Availability so tests can toggle
86+
* the configured state.
87+
*
88+
* @since 7.0.0
89+
*/
90+
class Mock_Connectors_Test_Provider extends AbstractProvider {
91+
92+
/**
93+
* Creates the provider metadata.
94+
*
95+
* @return ProviderMetadata
96+
*/
97+
protected static function createProviderMetadata(): ProviderMetadata {
98+
return new ProviderMetadata(
99+
'mock_connectors_test',
100+
'Mock Connectors Test',
101+
ProviderTypeEnum::cloud(),
102+
null,
103+
RequestAuthenticationMethod::apiKey()
104+
);
105+
}
106+
107+
/**
108+
* Creates the provider availability checker.
109+
*
110+
* @return ProviderAvailabilityInterface
111+
*/
112+
protected static function createProviderAvailability(): ProviderAvailabilityInterface {
113+
return new Mock_Connectors_Test_Provider_Availability();
114+
}
115+
116+
/**
117+
* Creates the model metadata directory.
118+
*
119+
* @return ModelMetadataDirectoryInterface
120+
*/
121+
protected static function createModelMetadataDirectory(): ModelMetadataDirectoryInterface {
122+
return new Mock_Connectors_Test_Model_Metadata_Directory();
123+
}
124+
125+
/**
126+
* Creates a model instance.
127+
*
128+
* @param ModelMetadata $modelMetadata The model metadata.
129+
* @param ProviderMetadata $providerMetadata The provider metadata.
130+
* @throws \RuntimeException Always, as model creation is not needed for these tests.
131+
*/
132+
protected static function createModel(
133+
ModelMetadata $modelMetadata,
134+
ProviderMetadata $providerMetadata
135+
): ModelInterface {
136+
throw new \RuntimeException( 'Not implemented.' );
137+
}
138+
}
139+
140+
/**
141+
* Trait providing a mock AI provider for testing connector functions.
142+
*
143+
* Registers a mock provider in the AI Client singleton registry with
144+
* controllable availability. Tests can toggle the configured state via
145+
* set_mock_provider_configured().
146+
*
147+
* @since 7.0.0
148+
*/
149+
trait WP_AI_Client_Mock_Provider_Trait {
150+
151+
/**
152+
* Registers the mock provider in the AI Client registry.
153+
*
154+
* Safe to call multiple times; skips registration if already done.
155+
* Must be called from set_up_before_class() after parent::set_up_before_class().
156+
*/
157+
private static function register_mock_connectors_provider(): void {
158+
$registry = AiClient::defaultRegistry();
159+
if ( ! $registry->hasProvider( 'mock_connectors_test' ) ) {
160+
$registry->registerProvider( Mock_Connectors_Test_Provider::class );
161+
}
162+
}
163+
164+
/**
165+
* Sets whether the mock provider reports as configured.
166+
*
167+
* @param bool $is_configured Whether the provider should be configured.
168+
*/
169+
private static function set_mock_provider_configured( bool $is_configured ): void {
170+
Mock_Connectors_Test_Provider_Availability::$is_configured = $is_configured;
171+
}
172+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
require_once dirname( __DIR__, 2 ) . '/includes/wp-ai-client-mock-provider-trait.php';
4+
5+
/**
6+
* Tests for _wp_connectors_is_api_key_valid().
7+
*
8+
* @group connectors
9+
* @covers ::_wp_connectors_is_api_key_valid
10+
*/
11+
class Tests_Connectors_WpConnectorsIsApiKeyValid extends WP_UnitTestCase {
12+
13+
use WP_AI_Client_Mock_Provider_Trait;
14+
15+
/**
16+
* Registers the mock provider once before any tests in this class run.
17+
*/
18+
public static function set_up_before_class() {
19+
parent::set_up_before_class();
20+
self::register_mock_connectors_provider();
21+
}
22+
23+
/**
24+
* Resets the mock availability flag before each test.
25+
*/
26+
public function set_up() {
27+
parent::set_up();
28+
self::set_mock_provider_configured( true );
29+
}
30+
31+
/**
32+
* Tests that an unregistered provider returns null.
33+
*
34+
* @ticket 64730
35+
*/
36+
public function test_unregistered_provider_returns_null() {
37+
$this->setExpectedIncorrectUsage( '_wp_connectors_is_api_key_valid' );
38+
39+
$result = _wp_connectors_is_api_key_valid( 'test-key', 'nonexistent_provider' );
40+
41+
$this->assertNull( $result );
42+
}
43+
44+
/**
45+
* Tests that a registered and configured provider returns true.
46+
*
47+
* @ticket 64730
48+
*/
49+
public function test_configured_provider_returns_true() {
50+
self::set_mock_provider_configured( true );
51+
52+
$result = _wp_connectors_is_api_key_valid( 'test-key', 'mock_connectors_test' );
53+
54+
$this->assertTrue( $result );
55+
}
56+
57+
/**
58+
* Tests that a registered but unconfigured provider returns false.
59+
*
60+
* @ticket 64730
61+
*/
62+
public function test_unconfigured_provider_returns_false() {
63+
self::set_mock_provider_configured( false );
64+
65+
$result = _wp_connectors_is_api_key_valid( 'test-key', 'mock_connectors_test' );
66+
67+
$this->assertFalse( $result );
68+
}
69+
}

0 commit comments

Comments
 (0)