Fork me on GitHub

Basic PageModel Test


@BrxmPageModelTest  // Zero-config for standard project layouts
class PageModelTest {

    @Test
    void testPageModelApi(DynamicPageModelTest brxm) throws Exception {
        PageModelResponse pageModel = brxm.request()
            .get("/site/resourceapi/news")
            .executeAsPageModel();

        assertNotNull(pageModel.getRootComponent());
        assertTrue(pageModel.getComponentCount() > 0);
    }
}
        

PageModelResponse API

Method Returns Description
getRootComponent() PageComponent Root of component tree
findComponentByName(name) Optional<PageComponent> Find component anywhere in tree
getChildComponents(parent) List<PageComponent> Direct children of component
getComponentCount() int Total components in tree
getLinks() Map Self/canonical links

Component Tree Traversal


@Test
void testComponentStructure(DynamicPageModelTest brxm) throws Exception {
    PageModelResponse pageModel = brxm.request()
        .get("/site/resourceapi/")
        .executeAsPageModel();

    // Navigate component tree
    PageComponent root = pageModel.getRootComponent();
    List<PageComponent> children = pageModel.getChildComponents(root);

    List<String> containerNames = children.stream()
        .map(PageComponent::getName)
        .toList();

    assertThat(containerNames).contains("main");

    // Navigate deeper
    PageComponent main = pageModel.findComponentByName("main").orElseThrow();
    List<PageComponent> mainChildren = pageModel.getChildComponents(main);

    assertThat(mainChildren).isNotEmpty();
}
        

Model Extraction


private static final ObjectMapper MAPPER = new ObjectMapper();

@Test
void testModelContent(DynamicPageModelTest brxm) throws Exception {
    PageModelResponse pageModel = brxm.request()
        .get("/site/resourceapi/")
        .executeAsPageModel();

    // Find component
    PageComponent heroBanner = pageModel.findComponentByName("HeroBanner").orElseThrow();

    // Get model data
    Map<String, Object> model = heroBanner.getModel("heroBanner");

    // Map to POJO
    HeroBannerContent content = MAPPER.convertValue(model, HeroBannerContent.class);

    assertThat(content.getTitle()).isNotBlank();
    assertThat(content.getCallToAction()).isNotNull();
}
        

POJO for Model Mapping


public class HeroBannerContent {
    private String title;
    private String description;
    private CallToAction callToAction;

    // Getters and setters...

    public static class CallToAction {
        private String title;
        private String externalLink;
        // Getters and setters...
    }
}
          

Authentication


@BrxmPageModelTest(loadProjectContent = true)
class SecurePageModelTest {

    @Test
    void premiumUser_seesExclusiveContent(DynamicPageModelTest brxm) throws Exception {
        PageModelResponse pageModel = brxm.request()
            .get("/site/resourceapi/premium")
            .asUser("subscriber", "premium-tier")
            .executeAsPageModel();

        assertThat(pageModel.findComponentByName("ExclusiveContent")).isPresent();
    }

    @Test
    void anonymousUser_seesPromotionalContent(DynamicPageModelTest brxm) throws Exception {
        PageModelResponse pageModel = brxm.request()
            .get("/site/resourceapi/")
            .executeAsPageModel();

        PageComponent heroBanner = pageModel.findComponentByName("HeroBanner").orElseThrow();
        Map<String, Object> model = heroBanner.getModel("heroBanner");

        assertThat(model.get("ctaTitle")).isEqualTo("Get Started Free");
    }
}
        

Annotation Options

Parameter Type Default Description
beanPackages String[] auto-detected HST content bean packages
hstRoot String auto-detected HST configuration root
springConfig String auto-detected Spring XML config for PageModel pipeline
loadProjectContent boolean false Load real HCM modules

PageComponent API

Method Description
getName() Component name (matches HST config)
getId() Unique component ID
getComponentClass() Java class name
getModel(key) Get model data by attribute name
getLabels() CMS labels for component

Common Patterns

Verify Page Structure


@Test
void testPageStructure(DynamicPageModelTest brxm) throws Exception {
    PageModelResponse pageModel = brxm.request()
        .get("/site/resourceapi/dashboard")
        .executeAsPageModel();

    // Check expected components exist
    assertThat(pageModel.findComponentByName("Header")).isPresent();
    assertThat(pageModel.findComponentByName("Footer")).isPresent();
    assertThat(pageModel.findComponentByName("MainContent")).isPresent();
}
          

Verify Links


@Test
void testPageLinks(DynamicPageModelTest brxm) throws Exception {
    PageModelResponse pageModel = brxm.request()
        .get("/site/resourceapi/")
        .executeAsPageModel();

    assertThat(pageModel.getLinks()).containsKey("self");
}
          

Related