Skip to content

Commit

Permalink
Improve resources tests with mutation testing
Browse files Browse the repository at this point in the history
  • Loading branch information
gehrisandro committed Nov 22, 2023
1 parent f6b7f39 commit 73ad0eb
Show file tree
Hide file tree
Showing 10 changed files with 39 additions and 24 deletions.
24 changes: 18 additions & 6 deletions tests/Pest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,45 @@
use OpenAI\ValueObjects\Transporter\Response;
use Psr\Http\Message\ResponseInterface;

function mockClient(string $method, string $resource, array $params, Response|ResponseInterface|string $response, $methodName = 'requestObject')
function mockClient(string $method, string $resource, array $params, Response|ResponseInterface|string $response, $methodName = 'requestObject', bool $validateParams = true)
{
$transporter = Mockery::mock(TransporterContract::class);

$transporter
->shouldReceive($methodName)
->once()
->withArgs(function (Payload $payload) use ($method, $resource) {
->withArgs(function (Payload $payload) use ($validateParams, $method, $resource, $params) {
$baseUri = BaseUri::from('api.openai.com/v1');
$headers = Headers::withAuthorization(ApiKey::from('foo'));
$queryParams = QueryParams::create();

$request = $payload->toRequest($baseUri, $headers, $queryParams);

if ($validateParams) {
if (in_array($method, ['GET', 'DELETE'])) {
if ($request->getUri()->getQuery() !== http_build_query($params)) {
return false;
}
} else {
if ($request->getBody()->getContents() !== json_encode($params)) {
return false;
}
}
}

return $request->getMethod() === $method
&& $request->getUri()->getPath() === "/v1/$resource";
})->andReturn($response);

return new Client($transporter);
}

function mockContentClient(string $method, string $resource, array $params, string $response)
function mockContentClient(string $method, string $resource, array $params, string $response, bool $validateParams = true)
{
return mockClient($method, $resource, $params, $response, 'requestContent');
return mockClient($method, $resource, $params, $response, 'requestContent', $validateParams);
}

function mockStreamClient(string $method, string $resource, array $params, ResponseInterface $response)
function mockStreamClient(string $method, string $resource, array $params, ResponseInterface $response, bool $validateParams = true)
{
return mockClient($method, $resource, $params, $response, 'requestStream');
return mockClient($method, $resource, $params, $response, 'requestStream', $validateParams);
}
12 changes: 6 additions & 6 deletions tests/Resources/Audio.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
'file' => audioFileResource(),
'model' => 'whisper-1',
'response_format' => 'text',
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranscriptionText(), metaHeaders()));
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranscriptionText(), metaHeaders()), validateParams: false);

$result = $client->audio()->transcribe([
'file' => audioFileResource(),
Expand All @@ -36,7 +36,7 @@
'file' => audioFileResource(),
'model' => 'whisper-1',
'response_format' => 'json',
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranscriptionJson(), metaHeaders()));
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranscriptionJson(), metaHeaders()), validateParams: false);

$result = $client->audio()->transcribe([
'file' => audioFileResource(),
Expand All @@ -61,7 +61,7 @@
'file' => audioFileResource(),
'model' => 'whisper-1',
'response_format' => 'verbose_json',
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranscriptionVerboseJson(), metaHeaders()));
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranscriptionVerboseJson(), metaHeaders()), validateParams: false);

$result = $client->audio()->transcribe([
'file' => audioFileResource(),
Expand Down Expand Up @@ -104,7 +104,7 @@
'file' => audioFileResource(),
'model' => 'whisper-1',
'response_format' => 'text',
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranslationText(), metaHeaders()));
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranslationText(), metaHeaders()), validateParams: false);

$result = $client->audio()->translate([
'file' => audioFileResource(),
Expand All @@ -129,7 +129,7 @@
'file' => audioFileResource(),
'model' => 'whisper-1',
'response_format' => 'json',
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranslationJson(), metaHeaders()));
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranslationJson(), metaHeaders()), validateParams: false);

$result = $client->audio()->translate([
'file' => audioFileResource(),
Expand All @@ -154,7 +154,7 @@
'file' => audioFileResource(),
'model' => 'whisper-1',
'response_format' => 'verbose_json',
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranslationVerboseJson(), metaHeaders()));
], \OpenAI\ValueObjects\Transporter\Response::from(audioTranslationVerboseJson(), metaHeaders()), validateParams: false);

$result = $client->audio()->translate([
'file' => audioFileResource(),
Expand Down
4 changes: 3 additions & 1 deletion tests/Resources/Chat.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
'messages' => ['role' => 'user', 'content' => 'Hello!'],
'stream' => true,
]);
})->expectException(\OpenAI\Exceptions\InvalidArgumentException::class);
})->throws(OpenAI\Exceptions\InvalidArgumentException::class, 'Stream option is not supported. Please use the createStreamed() method instead.');

test('create streamed', function () {
$response = new Response(
Expand All @@ -64,6 +64,7 @@
$client = mockStreamClient('POST', 'chat/completions', [
'model' => 'gpt-3.5-turbo',
'messages' => ['role' => 'user', 'content' => 'Hello!'],
'stream' => true,
], $response);

$result = $client->chat()->createStreamed([
Expand Down Expand Up @@ -107,6 +108,7 @@
$client = mockStreamClient('POST', 'chat/completions', [
'model' => 'gpt-3.5-turbo',
'messages' => ['role' => 'user', 'content' => 'Hello!'],
'stream' => true,
], $response);

$result = $client->chat()->createStreamed([
Expand Down
1 change: 1 addition & 0 deletions tests/Resources/Completions.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
$client = mockStreamClient('POST', 'completions', [
'model' => 'gpt-3.5-turbo-instruct',
'prompt' => 'hi',
'stream' => true,
], $response);

$result = $client->completions()->createStreamed([
Expand Down
6 changes: 3 additions & 3 deletions tests/Resources/Edits.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
], \OpenAI\ValueObjects\Transporter\Response::from(edit(), metaHeaders()));

$result = $client->edits()->create([
'object' => 'edit',
'created' => 1664135921,
'choices' => [],
'model' => 'text-davinci-edit-001',
'input' => 'What day of the wek is it?',
'instruction' => 'Fix the spelling mistakes',
]);

expect($result)
Expand Down
2 changes: 1 addition & 1 deletion tests/Resources/Files.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
$client = mockClient('POST', 'files', [
'purpose' => 'fine-tune',
'file' => fileResourceResource(),
], \OpenAI\ValueObjects\Transporter\Response::from(fileResource(), metaHeaders()));
], \OpenAI\ValueObjects\Transporter\Response::from(fileResource(), metaHeaders()), validateParams: false);

$result = $client->files()->upload([
'purpose' => 'fine-tune',
Expand Down
2 changes: 1 addition & 1 deletion tests/Resources/FineTunes.php
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@
headers: metaHeaders(),
);

$client = mockStreamClient('GET', 'fine-tunes/ft-MaoEAULREoazpupm8uB7qoIl/events', [], $response);
$client = mockStreamClient('GET', 'fine-tunes/ft-MaoEAULREoazpupm8uB7qoIl/events', ['stream' => 'true'], $response);

$result = $client->fineTunes()->listEventsStreamed('ft-MaoEAULREoazpupm8uB7qoIl');

Expand Down
4 changes: 2 additions & 2 deletions tests/Resources/FineTuning.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
});

test('list jobs with params', function () {
$client = mockClient('GET', 'fine_tuning/jobs', [], \OpenAI\ValueObjects\Transporter\Response::from(fineTuningJobListResource(), metaHeaders()));
$client = mockClient('GET', 'fine_tuning/jobs', ['limit' => 3], \OpenAI\ValueObjects\Transporter\Response::from(fineTuningJobListResource(), metaHeaders()));

$result = $client->fineTuning()->listJobs(['limit' => 3]);

Expand Down Expand Up @@ -171,7 +171,7 @@
});

test('list job events with params', function () {
$client = mockClient('GET', 'fine_tuning/jobs/ft-AF1WoRqd3aJAHsqc9NY7iL8F/events', [], \OpenAI\ValueObjects\Transporter\Response::from(fineTuningJobListEventsResource(), metaHeaders()));
$client = mockClient('GET', 'fine_tuning/jobs/ft-AF1WoRqd3aJAHsqc9NY7iL8F/events', ['limit' => 3], \OpenAI\ValueObjects\Transporter\Response::from(fineTuningJobListEventsResource(), metaHeaders()));

$result = $client->fineTuning()->listJobEvents('ft-AF1WoRqd3aJAHsqc9NY7iL8F', ['limit' => 3]);

Expand Down
4 changes: 2 additions & 2 deletions tests/Resources/Images.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
'n' => 1,
'size' => '256x256',
'response_format' => 'url',
], \OpenAI\ValueObjects\Transporter\Response::from(imageEditWithUrl(), metaHeaders()));
], \OpenAI\ValueObjects\Transporter\Response::from(imageEditWithUrl(), metaHeaders()), validateParams: false);

$result = $client->images()->edit([
'image' => fileResourceResource(),
Expand Down Expand Up @@ -74,7 +74,7 @@
'n' => 1,
'size' => '256x256',
'response_format' => 'url',
], \OpenAI\ValueObjects\Transporter\Response::from(imageVariationWithUrl(), metaHeaders()));
], \OpenAI\ValueObjects\Transporter\Response::from(imageVariationWithUrl(), metaHeaders()), validateParams: false);

$result = $client->images()->variation([
'image' => fileResourceResource(),
Expand Down
4 changes: 2 additions & 2 deletions tests/Resources/ThreadsRuns.php
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@
$client = mockClient('POST', 'threads/thread_agvtHUGezjTCt4SKgQg0NJ2Y/runs/run_4RCYyYzX9m41WQicoJtUQAb8/submit_tool_outputs', [
'tool_outputs' => [
[
'tool_call_id' => 'call_KSg14X7kZF2WDzlPhpQ168Mj',
'output' => '12',
'tool_call_id' => 'tool_1',
'output' => 'This is the output of tool 1',
],
],
], Response::from(threadRunResource(), metaHeaders()));
Expand Down

0 comments on commit 73ad0eb

Please sign in to comment.