teknolis / tests /Feature /FreepikMediaServiceTest.php
OpenAI Codex
Fix storage symlink and adapt cron status for Spaces
1501522
Raw
History Blame Contribute Delete
5.2 kB
<?php
namespace Tests\Feature;
use App\Services\FreepikImageService;
use App\Services\FreepikVideoService;
use Illuminate\Http\Client\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
class FreepikMediaServiceTest extends TestCase
{
public function test_freepik_image_service_uses_configured_endpoint_and_returns_multiple_variants(): void
{
$diskRoot = sys_get_temp_dir().'/dev-local-public-'.uniqid();
if (! is_dir($diskRoot)) {
mkdir($diskRoot, 0777, true);
}
config([
'services.freepik.api_key' => 'test-freepik-key',
'services.freepik.base_url' => 'https://api.freepik.com/v1/ai/text-to-image',
'services.freepik.timeout' => 30,
'filesystems.disks.public.root' => $diskRoot,
'filesystems.disks.public.url' => '/storage',
]);
$createCount = 0;
Http::fake(function (Request $request) use (&$createCount) {
if ($request->method() === 'POST' && $request->url() === 'https://api.freepik.com/v1/ai/text-to-image') {
$createCount++;
return Http::response([
'data' => [
[
'base64' => base64_encode('fake-image-'.$createCount.'-a'),
],
[
'base64' => base64_encode('fake-image-'.$createCount.'-b'),
],
],
], 200);
}
return Http::response(['message' => 'Unexpected request'], 500);
});
$service = app(FreepikImageService::class);
$urls = $service->generate('Premium social story visual', 'portrait', 2);
$this->assertCount(2, $urls);
foreach ($urls as $url) {
$relativePath = ltrim((string) str_replace('/storage/', '', parse_url($url, PHP_URL_PATH) ?: ''), '/');
$this->assertTrue(Storage::disk('public')->exists($relativePath));
}
Http::assertSentCount(1);
Http::assertSent(function (Request $request) {
return $request->method() === 'POST'
&& $request->url() === 'https://api.freepik.com/v1/ai/text-to-image'
&& $request['width'] === 768
&& $request['height'] === 1344
&& $request['num_images'] === 2;
});
}
public function test_freepik_video_service_downloads_remote_video_to_public_storage(): void
{
$diskRoot = sys_get_temp_dir().'/dev-local-public-'.uniqid();
if (! is_dir($diskRoot)) {
mkdir($diskRoot, 0777, true);
}
config([
'services.freepik.api_key' => 'test-freepik-key',
'services.freepik.base_url' => 'https://api.freepik.com/v1/ai/text-to-image',
'services.freepik.timeout' => 30,
'filesystems.disks.public.root' => $diskRoot,
'filesystems.disks.public.url' => '/storage',
]);
Http::fake(function (Request $request) {
if ($request->method() === 'POST' && $request->url() === 'https://api.freepik.com/v1/ai/text-to-video/runway-4-5') {
return Http::response([
'data' => [
'task_id' => 'video-task-1',
'status' => 'CREATED',
'generated' => [],
],
], 200);
}
if ($request->method() === 'GET' && $request->url() === 'https://api.freepik.com/v1/ai/text-to-video/runway-4-5/video-task-1') {
return Http::response([
'data' => [
'task_id' => 'video-task-1',
'status' => 'COMPLETED',
'generated' => [
'https://cdn.example.com/story.mp4',
],
],
], 200);
}
if ($request->method() === 'GET' && $request->url() === 'https://cdn.example.com/story.mp4') {
return Http::response('fake-video-binary', 200, [
'Content-Type' => 'video/mp4',
]);
}
return Http::response(['message' => 'Unexpected request'], 500);
});
$service = app(FreepikVideoService::class);
$video = $service->generate('Vertical software launch ad');
$this->assertSame('freepik-runway', $video['provider']);
$this->assertSame('9:16', $video['aspect']);
$this->assertSame(5, $video['duration_seconds']);
$relativePath = ltrim((string) str_replace('/storage/', '', parse_url((string) $video['url'], PHP_URL_PATH) ?: ''), '/');
$this->assertTrue(Storage::disk('public')->exists($relativePath));
Http::assertSent(function (Request $request) {
return $request->method() === 'POST'
&& $request->url() === 'https://api.freepik.com/v1/ai/text-to-video/runway-4-5'
&& $request['ratio'] === '720:1280'
&& $request['duration'] === 5;
});
}
}