Skip to content

Commit 52ef504

Browse files
committed
test: adds DTO tests
1 parent a36f93a commit 52ef504

File tree

7 files changed

+2648
-0
lines changed

7 files changed

+2648
-0
lines changed
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WordPress\AiClient\Tests\unit\Providers\DTO;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use WordPress\AiClient\Providers\DTO\ProviderMetadata;
9+
use WordPress\AiClient\Providers\Enums\ProviderTypeEnum;
10+
11+
/**
12+
* @covers \WordPress\AiClient\Providers\DTO\ProviderMetadata
13+
*/
14+
class ProviderMetadataTest extends TestCase
15+
{
16+
/**
17+
* Tests constructor and getter methods.
18+
*
19+
* @return void
20+
*/
21+
public function testConstructorAndGetters(): void
22+
{
23+
$id = 'openai';
24+
$name = 'OpenAI';
25+
$type = ProviderTypeEnum::cloud();
26+
27+
$metadata = new ProviderMetadata($id, $name, $type);
28+
29+
$this->assertEquals($id, $metadata->getId());
30+
$this->assertEquals($name, $metadata->getName());
31+
$this->assertSame($type, $metadata->getType());
32+
$this->assertTrue($metadata->getType()->isCloud());
33+
}
34+
35+
/**
36+
* Tests different provider types.
37+
*
38+
* @return void
39+
*/
40+
public function testDifferentProviderTypes(): void
41+
{
42+
// Test cloud provider
43+
$cloudProvider = new ProviderMetadata('google', 'Google AI', ProviderTypeEnum::cloud());
44+
$this->assertTrue($cloudProvider->getType()->isCloud());
45+
$this->assertFalse($cloudProvider->getType()->isServer());
46+
$this->assertFalse($cloudProvider->getType()->isClient());
47+
48+
// Test server provider
49+
$serverProvider = new ProviderMetadata('llama', 'LLaMA', ProviderTypeEnum::server());
50+
$this->assertFalse($serverProvider->getType()->isCloud());
51+
$this->assertTrue($serverProvider->getType()->isServer());
52+
$this->assertFalse($serverProvider->getType()->isClient());
53+
54+
// Test client provider
55+
$clientProvider = new ProviderMetadata('browser-ai', 'Browser AI', ProviderTypeEnum::client());
56+
$this->assertFalse($clientProvider->getType()->isCloud());
57+
$this->assertFalse($clientProvider->getType()->isServer());
58+
$this->assertTrue($clientProvider->getType()->isClient());
59+
}
60+
61+
/**
62+
* Tests JSON schema generation.
63+
*
64+
* @return void
65+
*/
66+
public function testGetJsonSchema(): void
67+
{
68+
$schema = ProviderMetadata::getJsonSchema();
69+
70+
$this->assertIsArray($schema);
71+
$this->assertEquals('object', $schema['type']);
72+
73+
// Check properties
74+
$this->assertArrayHasKey('properties', $schema);
75+
$this->assertArrayHasKey('id', $schema['properties']);
76+
$this->assertArrayHasKey('name', $schema['properties']);
77+
$this->assertArrayHasKey('type', $schema['properties']);
78+
79+
// Check property types
80+
$this->assertEquals('string', $schema['properties']['id']['type']);
81+
$this->assertEquals('string', $schema['properties']['name']['type']);
82+
$this->assertEquals('string', $schema['properties']['type']['type']);
83+
84+
// Check enum values for type
85+
$this->assertArrayHasKey('enum', $schema['properties']['type']);
86+
$this->assertEquals(ProviderTypeEnum::getValues(), $schema['properties']['type']['enum']);
87+
88+
// Check required fields
89+
$this->assertArrayHasKey('required', $schema);
90+
$this->assertEquals(['id', 'name', 'type'], $schema['required']);
91+
}
92+
93+
/**
94+
* Tests array conversion.
95+
*
96+
* @return void
97+
*/
98+
public function testToArray(): void
99+
{
100+
$metadata = new ProviderMetadata('anthropic', 'Anthropic', ProviderTypeEnum::cloud());
101+
$array = $metadata->toArray();
102+
103+
$this->assertIsArray($array);
104+
$this->assertEquals('anthropic', $array['id']);
105+
$this->assertEquals('Anthropic', $array['name']);
106+
$this->assertEquals('cloud', $array['type']);
107+
$this->assertCount(3, $array);
108+
}
109+
110+
/**
111+
* Tests creating from array.
112+
*
113+
* @return void
114+
*/
115+
public function testFromArray(): void
116+
{
117+
$data = [
118+
'id' => 'custom-provider',
119+
'name' => 'Custom Provider',
120+
'type' => 'server'
121+
];
122+
123+
$metadata = ProviderMetadata::fromArray($data);
124+
125+
$this->assertInstanceOf(ProviderMetadata::class, $metadata);
126+
$this->assertEquals('custom-provider', $metadata->getId());
127+
$this->assertEquals('Custom Provider', $metadata->getName());
128+
$this->assertTrue($metadata->getType()->isServer());
129+
}
130+
131+
/**
132+
* Tests round-trip array transformation.
133+
*
134+
* @return void
135+
*/
136+
public function testArrayRoundTrip(): void
137+
{
138+
$original = new ProviderMetadata('test-provider', 'Test Provider', ProviderTypeEnum::client());
139+
$array = $original->toArray();
140+
$restored = ProviderMetadata::fromArray($array);
141+
142+
$this->assertEquals($original->getId(), $restored->getId());
143+
$this->assertEquals($original->getName(), $restored->getName());
144+
$this->assertEquals($original->getType()->value, $restored->getType()->value);
145+
}
146+
147+
/**
148+
* Tests JSON serialization.
149+
*
150+
* @return void
151+
*/
152+
public function testJsonSerialize(): void
153+
{
154+
$metadata = new ProviderMetadata('json-provider', 'JSON Provider', ProviderTypeEnum::cloud());
155+
$json = json_encode($metadata);
156+
$decoded = json_decode($json, true);
157+
158+
$this->assertIsString($json);
159+
$this->assertIsArray($decoded);
160+
$this->assertEquals('json-provider', $decoded['id']);
161+
$this->assertEquals('JSON Provider', $decoded['name']);
162+
$this->assertEquals('cloud', $decoded['type']);
163+
}
164+
165+
/**
166+
* Tests with special characters in names.
167+
*
168+
* @return void
169+
*/
170+
public function testSpecialCharactersInNames(): void
171+
{
172+
$metadata = new ProviderMetadata(
173+
'special-chars',
174+
'Provider with "quotes" & special <chars>',
175+
ProviderTypeEnum::cloud()
176+
);
177+
178+
$array = $metadata->toArray();
179+
$this->assertEquals('Provider with "quotes" & special <chars>', $array['name']);
180+
181+
$restored = ProviderMetadata::fromArray($array);
182+
$this->assertEquals($metadata->getName(), $restored->getName());
183+
}
184+
185+
/**
186+
* Tests with empty strings.
187+
*
188+
* @return void
189+
*/
190+
public function testEmptyStrings(): void
191+
{
192+
$metadata = new ProviderMetadata('', '', ProviderTypeEnum::cloud());
193+
194+
$this->assertEquals('', $metadata->getId());
195+
$this->assertEquals('', $metadata->getName());
196+
197+
$array = $metadata->toArray();
198+
$this->assertEquals('', $array['id']);
199+
$this->assertEquals('', $array['name']);
200+
}
201+
202+
/**
203+
* Tests implements correct interfaces.
204+
*
205+
* @return void
206+
*/
207+
public function testImplementsCorrectInterfaces(): void
208+
{
209+
$metadata = new ProviderMetadata('test', 'Test', ProviderTypeEnum::cloud());
210+
211+
$this->assertInstanceOf(
212+
\WordPress\AiClient\Common\Contracts\WithArrayTransformationInterface::class,
213+
$metadata
214+
);
215+
$this->assertInstanceOf(
216+
\WordPress\AiClient\Common\Contracts\WithJsonSchemaInterface::class,
217+
$metadata
218+
);
219+
$this->assertInstanceOf(
220+
\JsonSerializable::class,
221+
$metadata
222+
);
223+
}
224+
}
225+

0 commit comments

Comments
 (0)