@@ -64,6 +64,7 @@ public class FragmentImplTest {
6464 private static final String PATH_FRAGMENT_DAMPATH = CONTENT_ROOT + "/fragment-dampath" ;
6565 private static final String PATH_FRAGMENT_WITHOUT_FIELDTYPE = CONTENT_ROOT + "/fragment-without-fieldtype" ;
6666 private static final String PATH_FRAGMENT_WITH_FRAGMENT_PATH = CONTENT_ROOT + "/fragment-with-fragment-path" ;
67+ private static final String PATH_FRAGMENT_WITH_INVALID_PATH = CONTENT_ROOT + "/fragment-with-invalid-path" ;
6768 private final AemContext context = FormsCoreComponentTestContext .newAemContext ();
6869
6970 @ BeforeEach
@@ -273,4 +274,64 @@ void testGetFragmentContainerI18n() throws Exception {
273274 I18n result5 = (I18n ) getFragmentContainerI18nMethod .invoke (fragmentImpl , "" );
274275 Assertions .assertNotNull (result5 , "getFragmentContainerI18n should handle empty string localeLang" );
275276 }
277+
278+ @ Test
279+ void testNullFragmentContainerHandling () throws Exception {
280+ // This test verifies the fix when fragmentContainer is null
281+ Fragment fragment = Utils .getComponentUnderTest (PATH_FRAGMENT_WITH_INVALID_PATH , Fragment .class , context );
282+ FragmentImpl fragmentImpl = (FragmentImpl ) fragment ;
283+
284+ // Verify that fragmentContainer is null due to invalid path
285+ Assertions .assertNull (fragmentImpl .getFragmentContainer (),
286+ "Fragment container should be null for invalid fragment path" );
287+
288+ // Test that getChildrenModels returns empty map instead of throwing NPE
289+ Map <String , ComponentExporter > childrenModels = fragmentImpl .getChildrenModels (context .request (),
290+ ComponentExporter .class );
291+ Assertions .assertNotNull (childrenModels , "getChildrenModels should return non-null map even with null fragmentContainer" );
292+ Assertions .assertTrue (childrenModels .isEmpty (),
293+ "getChildrenModels should return empty map when fragmentContainer is null" );
294+
295+ // Test that getExportedItems doesn't throw NPE
296+ Map <String , ? extends ComponentExporter > exportedItems = fragmentImpl .getExportedItems ();
297+ Assertions .assertNotNull (exportedItems , "getExportedItems should return non-null map even with null fragmentContainer" );
298+ Assertions .assertTrue (exportedItems .isEmpty (),
299+ "getExportedItems should return empty map when fragmentContainer is null" );
300+
301+ // Test that getExportedItemsOrder doesn't throw NPE
302+ String [] exportedItemsOrder = fragmentImpl .getExportedItemsOrder ();
303+ Assertions .assertNotNull (exportedItemsOrder , "getExportedItemsOrder should return non-null array even with null fragmentContainer" );
304+ Assertions .assertEquals (0 , exportedItemsOrder .length ,
305+ "getExportedItemsOrder should return empty array when fragmentContainer is null" );
306+
307+ // Test getFragmentContainerI18n with null fragmentContainer
308+ Method getFragmentContainerI18nMethod = FragmentImpl .class .getDeclaredMethod ("getFragmentContainerI18n" , String .class );
309+ getFragmentContainerI18nMethod .setAccessible (true );
310+
311+ // Should not throw NPE and should return non-null I18n object
312+ I18n result = (I18n ) getFragmentContainerI18nMethod .invoke (fragmentImpl , "en" );
313+ Assertions .assertNotNull (result ,
314+ "getFragmentContainerI18n should return non-null I18n object even when fragmentContainer is null" );
315+ }
316+
317+ @ Test
318+ void testNullFragmentContainerWithNullRequest () throws Exception {
319+ // Test with null request to cover both code paths
320+ Resource resource = context .resourceResolver ().getResource (PATH_FRAGMENT_WITH_INVALID_PATH );
321+ Fragment fragment = resource .adaptTo (Fragment .class );
322+ Assertions .assertNotNull (fragment , "Fragment should be created even with invalid path" );
323+
324+ FragmentImpl fragmentImpl = (FragmentImpl ) fragment ;
325+
326+ // Verify that fragmentContainer is null
327+ Assertions .assertNull (fragmentImpl .getFragmentContainer (),
328+ "Fragment container should be null for invalid fragment path" );
329+
330+ // Test that getChildrenModels with null request returns empty map instead of throwing NPE
331+ Map <String , TextInput > childrenModels = fragmentImpl .getChildrenModels (null , TextInput .class );
332+ Assertions .assertNotNull (childrenModels ,
333+ "getChildrenModels should return non-null map with null request and null fragmentContainer" );
334+ Assertions .assertTrue (childrenModels .isEmpty (),
335+ "getChildrenModels should return empty map when fragmentContainer is null and request is null" );
336+ }
276337}
0 commit comments