Skip to content

Commit 61301d9

Browse files
committed
test(laravel): test to change the name converter
1 parent 767fa92 commit 61301d9

File tree

3 files changed

+84
-7
lines changed

3 files changed

+84
-7
lines changed

src/Laravel/ApiPlatformProvider.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,10 @@ public function register(): void
211211
);
212212
});
213213

214-
$this->app->singleton(ModelMetadata::class);
214+
$this->app->singleton(ModelMetadata::class, function () {
215+
return new ModelMetadata();
216+
});
217+
215218
$this->app->bind(LoaderInterface::class, AttributeLoader::class);
216219
$this->app->bind(ClassMetadataFactoryInterface::class, ClassMetadataFactory::class);
217220
$this->app->singleton(ClassMetadataFactory::class, function (Application $app) {
@@ -314,9 +317,13 @@ public function register(): void
314317
$this->app->bind(NameConverterInterface::class, function (Application $app) {
315318
$config = $app['config'];
316319
$nameConverter = $config->get('api-platform.name_converter', SnakeCaseToCamelCaseNameConverter::class);
320+
if ($nameConverter && class_exists($nameConverter)) {
321+
$nameConverter = $app->make($nameConverter);
322+
}
323+
317324
$defaultContext = $config->get('api-platform.serializer', []);
318325

319-
return new HydraPrefixNameConverter(new MetadataAwareNameConverter($app->make(ClassMetadataFactoryInterface::class), $app->make($nameConverter)), $defaultContext);
326+
return new HydraPrefixNameConverter(new MetadataAwareNameConverter($app->make(ClassMetadataFactoryInterface::class), $nameConverter), $defaultContext);
320327
});
321328

322329
$this->app->singleton(OperationMetadataFactory::class, function (Application $app) {

src/Laravel/Eloquent/Metadata/ModelMetadata.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313

1414
namespace ApiPlatform\Laravel\Eloquent\Metadata;
1515

16-
use ApiPlatform\Metadata\Util\CamelCaseToSnakeCaseNameConverter;
1716
use Illuminate\Database\Eloquent\Model;
1817
use Illuminate\Database\Eloquent\Relations\Relation;
1918
use Illuminate\Support\Collection;
2019
use Illuminate\Support\Str;
20+
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
21+
use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
2122

2223
/**
2324
* Inspired from Illuminate\Database\Console\ShowModelCommand.
@@ -26,8 +27,6 @@
2627
*/
2728
final class ModelMetadata
2829
{
29-
private CamelCaseToSnakeCaseNameConverter $relationNameConverter;
30-
3130
/**
3231
* @var array<class-string, Collection<string, mixed>>
3332
*/
@@ -57,9 +56,8 @@ final class ModelMetadata
5756
'morphedByMany',
5857
];
5958

60-
public function __construct()
59+
public function __construct(private NameConverterInterface $relationNameConverter = new CamelCaseToSnakeCaseNameConverter())
6160
{
62-
$this->relationNameConverter = new CamelCaseToSnakeCaseNameConverter();
6361
}
6462

6563
/**
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
use ApiPlatform\Laravel\Test\ApiTestAssertionsTrait;
15+
use Illuminate\Contracts\Config\Repository;
16+
use Illuminate\Foundation\Application;
17+
use Illuminate\Foundation\Testing\RefreshDatabase;
18+
use Illuminate\Support\Str;
19+
use Orchestra\Testbench\Concerns\WithWorkbench;
20+
use Orchestra\Testbench\TestCase;
21+
22+
class SnakeCaseApiTest extends TestCase
23+
{
24+
use ApiTestAssertionsTrait;
25+
use RefreshDatabase;
26+
use WithWorkbench;
27+
28+
/**
29+
* @param Application $app
30+
*/
31+
protected function defineEnvironment($app): void
32+
{
33+
tap($app['config'], function (Repository $config): void {
34+
$config->set('api-platform.name_converter', null);
35+
$config->set('api-platform.formats', ['jsonld' => ['application/ld+json']]);
36+
$config->set('api-platform.docs_formats', ['jsonld' => ['application/ld+json']]);
37+
});
38+
}
39+
40+
public function testRelationIsHandledOnCreateWithNestedDataSnakeCase(): void
41+
{
42+
$cartData = [
43+
'product_sku' => 'SKU_TEST_001',
44+
'quantity' => 2,
45+
'price_at_addition' => '19.99',
46+
'shopping_cart' => [
47+
'user_identifier' => 'user-'.Str::uuid()->toString(),
48+
'status' => 'active',
49+
],
50+
];
51+
52+
$response = $this->postJson('/api/cart_items', $cartData, ['accept' => 'application/ld+json', 'content-type' => 'application/ld+json']);
53+
$response->assertStatus(201);
54+
55+
$response
56+
->assertJson([
57+
'@context' => '/api/contexts/CartItem',
58+
'@id' => '/api/cart_items/1',
59+
'@type' => 'CartItem',
60+
'id' => 1,
61+
'product_sku' => 'SKU_TEST_001',
62+
'quantity' => 2,
63+
'price_at_addition' => 19.99,
64+
'shopping_cart' => [
65+
'@id' => '/api/shopping_carts/1',
66+
'@type' => 'ShoppingCart',
67+
'user_identifier' => $cartData['shopping_cart']['user_identifier'],
68+
'status' => 'active',
69+
],
70+
]);
71+
}
72+
}

0 commit comments

Comments
 (0)