From 4d41c474b49690cdc2ce625200f24f46a67221e2 Mon Sep 17 00:00:00 2001 From: Ivan Moroz Date: Wed, 3 Jun 2026 16:36:16 +0300 Subject: [PATCH] CONV-303: Add file target formats endpoint Co-Authored-By: Claude Sonnet 4.6 --- routes/api.php | 1 + .../Api/V1/FileTargetsEndpointTest.php | 62 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 tests/Feature/Api/V1/FileTargetsEndpointTest.php diff --git a/routes/api.php b/routes/api.php index 4c4714b..757feca 100644 --- a/routes/api.php +++ b/routes/api.php @@ -27,5 +27,6 @@ Route::get('/converters/{source}/{target}/schema', [ConverterController::class, 'schema'])->name('converters.schema'); Route::post('/files', [FileController::class, 'store'])->name('files.store'); + Route::get('/files/{file}/targets', [FileController::class, 'targets'])->name('files.targets'); }); }); diff --git a/tests/Feature/Api/V1/FileTargetsEndpointTest.php b/tests/Feature/Api/V1/FileTargetsEndpointTest.php new file mode 100644 index 0000000..e33fe2b --- /dev/null +++ b/tests/Feature/Api/V1/FileTargetsEndpointTest.php @@ -0,0 +1,62 @@ +create(['plan' => Plan::Pro]); + $token = app(ApiKeyGenerator::class)->create($user, 'API')->plainToken; + + $file = FileRecord::factory()->for($user)->create([ + 'extension' => 'png', + 'mime_type' => 'image/png', + ]); + + $response = $this->withToken($token) + ->getJson("/api/v1/files/{$file->id}/targets") + ->assertOk() + ->assertJsonStructure([ + 'data' => [ + '*' => ['target_format', 'label', 'description', 'recommended'], + ], + ]); + + $formats = collect($response->json('data'))->pluck('target_format')->toArray(); + expect($formats)->toContain('jpg'); +}); + +it('does not return targets for another users file', function () { + $owner = User::factory()->create(['plan' => Plan::Pro]); + $other = User::factory()->create(['plan' => Plan::Pro]); + + $file = FileRecord::factory()->for($owner)->create(['extension' => 'png']); + $token = app(ApiKeyGenerator::class)->create($other, 'Other')->plainToken; + + $this->withToken($token) + ->getJson("/api/v1/files/{$file->id}/targets") + ->assertForbidden(); +}); + +it('requires api key to get file targets', function () { + $user = User::factory()->create(['plan' => Plan::Pro]); + $file = FileRecord::factory()->for($user)->create(['extension' => 'png']); + + $this->getJson("/api/v1/files/{$file->id}/targets") + ->assertUnauthorized(); +}); + +it('returns empty list for unsupported source format', function () { + $user = User::factory()->create(['plan' => Plan::Pro]); + $token = app(ApiKeyGenerator::class)->create($user, 'API')->plainToken; + + $file = FileRecord::factory()->for($user)->create(['extension' => 'xyz']); + + $this->withToken($token) + ->getJson("/api/v1/files/{$file->id}/targets") + ->assertOk() + ->assertJsonPath('data', []); +});