@@ -90,6 +90,11 @@ protected function setUp(): void {
9090 'label ' => 'Main navigation ' ,
9191 ])->save ();
9292
93+ Menu::create ([
94+ 'id ' => 'empty ' ,
95+ 'label ' => 'Empty menu ' ,
96+ ])->save ();
97+
9398 Node::create ([
9499 'type ' => 'page ' ,
95100 'title ' => 'About Us ' ,
@@ -139,6 +144,18 @@ protected function setUp(): void {
139144 ]);
140145 $ external ->save ();
141146 $ this ->ids ['external ' ] = 'menu_link_content: ' . $ external ->uuid ();
147+
148+ $ login = MenuLinkContent::create ([
149+ 'title ' => 'Login ' ,
150+ 'menu_name ' => 'main ' ,
151+ 'link ' => ['uri ' => 'internal:/user/login ' ],
152+ ]);
153+ $ login ->save ();
154+ $ this ->ids ['login ' ] = 'menu_link_content: ' . $ login ->uuid ();
155+
156+ $ this ->config ('jsonapi_frontend.settings ' )
157+ ->set ('drupal_base_url ' , 'https://cms.example.com ' )
158+ ->save ();
142159 }
143160
144161 public function testMenuActiveTrailAndResolve (): void {
@@ -187,6 +204,54 @@ public function testMenuActiveTrailAndResolve(): void {
187204 $ this ->assertNull ($ external ['resolve ' ]);
188205 }
189206
207+ public function testMenuNotFoundReturns404 (): void {
208+ $ this ->container ->get ('current_user ' )->setAccount (new AnonymousUserSession ());
209+
210+ $ controller = \Drupal \jsonapi_frontend_menu \Controller \MenuController::create ($ this ->container );
211+ $ request = Request::create ('/jsonapi/menu/does-not-exist ' , 'GET ' , [
212+ '_format ' => 'json ' ,
213+ ]);
214+
215+ $ response = $ controller ->menu ($ request , 'does-not-exist ' );
216+ $ this ->assertSame (404 , $ response ->getStatusCode ());
217+ }
218+
219+ public function testEmptyMenuReturns200WithNoItems (): void {
220+ $ this ->container ->get ('current_user ' )->setAccount (new AnonymousUserSession ());
221+
222+ $ controller = \Drupal \jsonapi_frontend_menu \Controller \MenuController::create ($ this ->container );
223+ $ request = Request::create ('/jsonapi/menu/empty ' , 'GET ' , [
224+ '_format ' => 'json ' ,
225+ ]);
226+
227+ $ response = $ controller ->menu ($ request , 'empty ' );
228+ $ this ->assertSame (200 , $ response ->getStatusCode ());
229+
230+ $ payload = json_decode ((string ) $ response ->getContent (), TRUE );
231+ $ this ->assertIsArray ($ payload );
232+ $ this ->assertSame ('empty ' , $ payload ['meta ' ]['menu ' ]);
233+ $ this ->assertSame ([], $ payload ['data ' ]);
234+ }
235+
236+ public function testUnresolvedInternalLinksFallBackToRouteKind (): void {
237+ $ this ->container ->get ('current_user ' )->setAccount (new AnonymousUserSession ());
238+
239+ $ controller = \Drupal \jsonapi_frontend_menu \Controller \MenuController::create ($ this ->container );
240+ $ request = Request::create ('/jsonapi/menu/main ' , 'GET ' , [
241+ '_format ' => 'json ' ,
242+ ]);
243+
244+ $ response = $ controller ->menu ($ request , 'main ' );
245+ $ payload = json_decode ((string ) $ response ->getContent (), TRUE );
246+
247+ $ login = $ this ->findItemById ($ payload ['data ' ], $ this ->ids ['login ' ]);
248+ $ this ->assertNotNull ($ login );
249+
250+ $ this ->assertTrue ($ login ['resolve ' ]['resolved ' ]);
251+ $ this ->assertSame ('route ' , $ login ['resolve ' ]['kind ' ]);
252+ $ this ->assertStringContainsString ('/user/login ' , (string ) $ login ['resolve ' ]['drupal_url ' ]);
253+ }
254+
190255 public function testResolveCanBeDisabled (): void {
191256 $ this ->container ->get ('current_user ' )->setAccount (new AnonymousUserSession ());
192257
0 commit comments