1515
1616use ApiPlatform \Symfony \Bundle \Test \ApiTestCase ;
1717use ApiPlatform \Tests \Fixtures \TestBundle \Document \SearchFilterParameterDocument ;
18+ use ApiPlatform \Tests \Fixtures \TestBundle \Entity \FilterWithStateOptionsEntity ;
1819use ApiPlatform \Tests \Fixtures \TestBundle \Entity \SearchFilterParameter ;
1920use Doctrine \ORM \EntityManagerInterface ;
2021use Doctrine \ORM \Tools \SchemaTool ;
22+ use Symfony \Component \DependencyInjection \ContainerInterface ;
2123
2224final class DoctrineTest extends ApiTestCase
2325{
2426 public function testDoctrineEntitySearchFilter (): void
2527 {
26- $ this ->recreateSchema ();
27- $ container = static ::getContainer ();
28- $ route = 'mongodb ' === $ container ->getParameter ('kernel.environment ' ) ? 'search_filter_parameter_document ' : 'search_filter_parameter ' ;
28+ static ::bootKernel ();
29+ $ container = static ::$ kernel ->getContainer ();
30+ $ resource = $ this ->isMongoDb ($ container ) ? SearchFilterParameterDocument::class : SearchFilterParameter::class;
31+ $ this ->recreateSchema ($ resource );
32+ $ this ->createFixture ($ resource );
33+ $ route = $ this ->isMongoDb ($ container ) ? 'search_filter_parameter_document ' : 'search_filter_parameter ' ;
2934 $ response = self ::createClient ()->request ('GET ' , $ route .'?foo=bar ' );
3035 $ a = $ response ->toArray ();
3136 $ this ->assertCount (2 , $ a ['hydra:member ' ]);
@@ -69,9 +74,12 @@ public function testGraphQl(): void
6974 $ this ->markTestSkipped ('Parameters are not supported in BC mode. ' );
7075 }
7176
72- $ this ->recreateSchema ();
73- $ container = static ::getContainer ();
74- $ object = 'mongodb ' === $ container ->getParameter ('kernel.environment ' ) ? 'searchFilterParameterDocuments ' : 'searchFilterParameters ' ;
77+ static ::bootKernel ();
78+ $ container = static ::$ kernel ->getContainer ();
79+ $ resource = $ this ->isMongoDb ($ container ) ? SearchFilterParameterDocument::class : SearchFilterParameter::class;
80+ $ this ->recreateSchema ($ resource );
81+ $ this ->createFixture ($ resource );
82+ $ object = $ this ->isMongoDb ($ container ) ? 'searchFilterParameterDocuments ' : 'searchFilterParameters ' ;
7583 $ response = self ::createClient ()->request ('POST ' , '/graphql ' , ['json ' => [
7684 'query ' => \sprintf ('{ %s(foo: "bar") { edges { node { id foo createdAt } } } } ' , $ object ),
7785 ]]);
@@ -93,31 +101,54 @@ public function testGraphQl(): void
93101 $ this ->assertArraySubset (['foo ' => 'bar ' , 'createdAt ' => '2024-01-21T00:00:00+00:00 ' ], $ response ->toArray ()['data ' ][$ object ]['edges ' ][0 ]['node ' ]);
94102 }
95103
96- /**
97- * @param array<string, mixed> $options kernel options
98- */
99- private function recreateSchema (array $ options = []): void
104+ public function testStateOptions (): void
100105 {
101- self ::bootKernel ($ options );
106+ static ::bootKernel ();
107+ $ container = static ::$ kernel ->getContainer ();
108+ $ this ->recreateSchema (FilterWithStateOptionsEntity::class);
109+ $ registry = $ this ->isMongoDb ($ container ) ? $ container ->get ('doctrine_mongodb ' ) : $ container ->get ('doctrine ' );
110+ $ manager = $ registry ->getManager ();
111+ $ d = new \DateTimeImmutable ();
112+ $ manager ->persist (new FilterWithStateOptionsEntity (dummyDate: $ d , name: 'current ' ));
113+ $ manager ->persist (new FilterWithStateOptionsEntity (name: 'null ' ));
114+ $ manager ->persist (new FilterWithStateOptionsEntity (dummyDate: $ d ->add (\DateInterval::createFromDateString ('1 day ' )), name: 'after ' ));
115+ $ manager ->flush ();
116+ $ response = self ::createClient ()->request ('GET ' , 'filter_with_state_options?date[before]= ' .$ d ->format ('Y-m-d ' ));
117+ $ a = $ response ->toArray ();
118+ $ this ->assertEquals ('/filter_with_state_options{?date[before],date[strictly_before],date[after],date[strictly_after]} ' , $ a ['hydra:search ' ]['hydra:template ' ]);
119+ $ this ->assertCount (1 , $ a ['hydra:member ' ]);
120+ $ this ->assertEquals ('current ' , $ a ['hydra:member ' ][0 ]['name ' ]);
121+ $ response = self ::createClient ()->request ('GET ' , 'filter_with_state_options?date[strictly_after]= ' .$ d ->format ('Y-m-d ' ));
122+ $ a = $ response ->toArray ();
123+ $ this ->assertCount (1 , $ a ['hydra:member ' ]);
124+ $ this ->assertEquals ('after ' , $ a ['hydra:member ' ][0 ]['name ' ]);
125+ }
102126
103- $ container = static ::getContainer ();
104- $ registry = $ this ->getContainer ()->get ('mongodb ' === $ container ->getParameter ('kernel.environment ' ) ? 'doctrine_mongodb ' : 'doctrine ' );
105- $ resource = 'mongodb ' === $ container ->getParameter ('kernel.environment ' ) ? SearchFilterParameterDocument::class : SearchFilterParameter::class;
127+ private function recreateSchema (string $ resourceClass ): void
128+ {
129+ $ container = static ::$ kernel ->getContainer ();
130+ $ registry = $ this ->isMongoDb ($ container ) ? $ container ->get ('doctrine_mongodb ' ) : $ container ->get ('doctrine ' );
106131 $ manager = $ registry ->getManager ();
107132
108133 if ($ manager instanceof EntityManagerInterface) {
109- $ classes = $ manager ->getClassMetadata ($ resource );
134+ $ classes = $ manager ->getClassMetadata ($ resourceClass );
110135 $ schemaTool = new SchemaTool ($ manager );
111136 @$ schemaTool ->dropSchema ([$ classes ]);
112137 @$ schemaTool ->createSchema ([$ classes ]);
113138 } else {
114139 $ schemaManager = $ manager ->getSchemaManager ();
115140 $ schemaManager ->dropCollections ();
116141 }
142+ }
117143
144+ public function createFixture (string $ resourceClass ): void
145+ {
146+ $ container = static ::$ kernel ->getContainer ();
147+ $ registry = $ this ->isMongoDb ($ container ) ? $ container ->get ('doctrine_mongodb ' ) : $ container ->get ('doctrine ' );
148+ $ manager = $ registry ->getManager ();
118149 $ date = new \DateTimeImmutable ('2024-01-21 ' );
119150 foreach (['foo ' , 'foo ' , 'foo ' , 'bar ' , 'bar ' , 'baz ' ] as $ t ) {
120- $ s = new $ resource ();
151+ $ s = new $ resourceClass ();
121152 $ s ->setFoo ($ t );
122153 if ('bar ' === $ t ) {
123154 $ s ->setCreatedAt ($ date );
@@ -128,4 +159,9 @@ private function recreateSchema(array $options = []): void
128159 }
129160 $ manager ->flush ();
130161 }
162+
163+ private function isMongoDb (ContainerInterface $ container ): bool
164+ {
165+ return 'mongodb ' === $ container ->getParameter ('kernel.environment ' );
166+ }
131167}
0 commit comments