FreeScoutGPT/vendor/tectalic/openai/tests/Unit/Handlers/AudioTranscriptionsTest.php
Михаил Баринов 7210a52e55 first commit
2023-04-14 01:35:57 +03:00

142 lines
4.3 KiB
PHP

<?php
/**
* Copyright (c) 2022-present Tectalic (https://tectalic.com)
*
* For copyright and license information, please view the LICENSE file that was distributed with this source code.
*
* Please see the README.md file for usage instructions.
*/
declare(strict_types=1);
namespace Tests\Unit\Handlers;
use Http\Mock\Client;
use Nyholm\Psr7\Response;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
use ReflectionObject;
use Tectalic\OpenAi\Authentication;
use Tectalic\OpenAi\ClientException;
use Tectalic\OpenAi\Handlers\AudioTranscriptions;
use Tectalic\OpenAi\Manager;
use Tectalic\OpenAi\Models\AudioTranscriptions\CreateRequest;
use Tests\AssertValidateTrait;
use org\bovigo\vfs\content\LargeFileContent;
use org\bovigo\vfs\vfsStream;
final class AudioTranscriptionsTest extends TestCase
{
use AssertValidateTrait;
/** @var Client */
private $mockClient;
protected function setUp(): void
{
$this->mockClient = new Client();
Manager::build(
$this->mockClient,
new Authentication('token')
);
}
protected function tearDown(): void
{
$reflectionClass = new ReflectionClass(Manager::class);
$reflectionProperty = $reflectionClass->getProperty('client');
$reflectionProperty->setAccessible(true);
$reflectionProperty->setValue(null);
}
public function testMissingRequest(): void
{
$this->expectException(ClientException::class);
$this->expectExceptionMessage('Request not configured.');
(new AudioTranscriptions())->getRequest();
}
public function testUnsupportedContentTypeResponse(): void
{
$this->expectException(ClientException::class);
$this->expectExceptionMessage('Unsupported content type: text/plain');
$handler = new AudioTranscriptions();
$method = (new ReflectionObject($handler))->getMethod('parseResponse');
$method->setAccessible(true);
$method->invoke($handler, new Response(
200,
['Content-Type' => 'text/plain'],
null
));
}
public function testInvalidJsonResponse(): void
{
$this->expectException(ClientException::class);
$this->expectExceptionMessage('Failed to parse JSON response body: Syntax error');
$handler = new AudioTranscriptions();
$method = (new ReflectionObject($handler))->getMethod('parseResponse');
$method->setAccessible(true);
$method->invoke($handler, new Response(
200,
['Content-Type' => 'application/json'],
'invalidJson'
));
}
public function testUnsuccessfulResponseCode(): void
{
$this->expectException(ClientException::class);
$this->expectExceptionMessage("Unsuccessful response. HTTP status code: 418 (I'm a teapot).");
$handler = new AudioTranscriptions();
$property = (new ReflectionObject($handler))->getProperty('response');
$property->setAccessible(true);
$property->setValue($handler, new Response(418));
$handler->toModel();
}
public static function toArrayDataProvider(): array
{
return [
['{}', []],
['[]', []],
['{"a": "b"}', ['a' => 'b']],
];
}
/**
* @dataProvider toArrayDataProvider
*/
public function testToArray(string $rawJsonResponse, array $expected): void
{
$handler = new AudioTranscriptions();
$property = (new ReflectionObject($handler))->getProperty('response');
$property->setAccessible(true);
$property->setValue($handler, new Response(
200,
['Content-Type' => 'application/json'],
$rawJsonResponse
));
$this->assertSame($expected, $handler->toArray());
}
public function testCreateMethod(): void
{
$filesystem = vfsStream::setup();
// Create the file(s) to be uploaded.
$files = ['file'];
foreach ($files as $file) {
vfsStream::newFile($file)
->withContent(LargeFileContent::withKilobytes(1))
->at($filesystem);
}
$request = (new AudioTranscriptions())
->create(new CreateRequest(['file' => 'vfs://root/file', 'model' => 'alpha0']))
->getRequest();
$this->assertValidate($request);
}
}