Your achievements

Level 1

0% to

Level 2

Tip /
Sign in

Sign in to Community

to gain points, level up, and earn exciting badges like the new
BedrockMission!

Learn more

View all

Sign in to view all badges

SOLVED

Integration Test with Content Fragments - How can I create a Content Fragment?

marie_p_h
Level 1
Level 1

In my integration test I want to create a Content Fragment in a testfolder and then implement this Content Fragment in a testpage. (Sidenote: Manually everything I want to do in this test works.)

So far I managed to create a testpage and a testfolder, but I couldn't find a solution to create a Content Fragment. 

 

This code shows how I created a user (admin).

 

@ClassRule
public static final CQAuthorClassRule cqBaseClassRule = new CQAuthorClassRule();

@Rule
public CQRule cqBaseRule = new CQRule(cqBaseClassRule.authorRule);

static CQClient adminAuthor;

@BeforeClass
public static void beforeClass() {
adminAuthor = cqBaseClassRule.authorRule.getAdminClient(CQClient.class);
}

and here I created a testpage and testfolder in my Test

try {
SlingHttpResponse page = adminAuthor.createPageWithRetry(pageName, pageTitle, pageParentPath, templatePath, MINUTES.toMillis(1), 500, HttpStatus.SC_OK);

String pagePath = page.getSlingLocation();

LOG.info("Created page at {}", pagePath);

// This shows that the page exists
CQAssert.assertCQPageExistsWithTimeout(adminAuthor, pagePath, TIMEOUT, 500);


SlingHttpResponse folder = adminAuthor.createFolder(folderName, folderTitle, folderParentPath, HttpStatus.SC_OK);

String folderPath = folder.getSlingLocation();

LOG.info("Created folder at {}", folderPath);

// This shows that the folder exists
CQAssert.assertFolderExists(adminAuthor, folderPath, folderTitle);
}

 

There is nothing like "createContentFragment" only "createNode"... Bu then I would have to create several Nodes and update these nodes to have the structure I want in my CRX. 
Any idea how I can create this content Fragment? Is there an API to use in integration tests? 

AEM content fragment content fragments integration test testing
1 Accepted Solution
kishorekumar14
Correct answer by
Level 7
Level 7

Hi @marie_p_h ,

 

Could you please check if this helps. 

 

I found some of the test samples from here https://github.com/adobe/aem-test-samples 

 

It has some integration testing samples for content fragments creation. Please refer below link

https://github.com/adobe/aem-test-samples/blob/aem-cloud/cf-smoke/src/main/java/com/adobe/cq/cloud/t... 

View solution in original post

5 Replies
Ritesh_M
Community Advisor
Community Advisor

Hi @marie_p_h ,

 

While creating unit tests for any Content Fragment business logic, we do not create the actual CF but we mock the resource to CF using Mockito.when. Check below example

 

https://github.com/adobe/aem-core-wcm-components/blob/master/bundles/core/src/test/java/com/adobe/cq...

 

 

Though, for actual CF creation for any functionality you can use Content Fragment Server side API, like below 

Imports -

import com.adobe.cq.dam.cfm.ContentFragment;
import com.adobe.cq.dam.cfm.ContentFragmentException;
import com.adobe.cq.dam.cfm.FragmentTemplate;

 

Code snippet-

try (ResourceResolver resourceResolver = getResourceResolverForPage("datawrite")) {


Resource templateRes= resourceResolver.getResource("/conf/myproject/settings/dam/cfm/models/my-cf-model");
Resource cfFolderresource = resourceResolver.getResource("/content/dam/myfolder/myCf");
FragmentTemplate tpl = templateRes.adaptTo(FragmentTemplate.class);
ContentFragment newFragment = tpl.createFragment(cfFolderresource, "myCFName",
"Description");
resourceResolver.commit();

catch (PersistenceException | ContentFragmentException e) {

log.error("Exception occurred while creating CF {}", e.getMessage());

}

 

marie_p_h
Level 1
Level 1

Thank you for your reply! Where does the method "getResourceResolverForPage()" come from?
I was tasked with writing an actual integration test, not a unit test so I can not rely on the AemContext or Mockito...

Ritesh_M
Community Advisor
Community Advisor

Hi @marie_p_h ,

 

I missed to add the method, please see it below-

public ResourceResolver getResourceResolverForPage(String name) {
ResourceResolver resourceResolver = null;
try {
Map<String, Object> param = new HashMap<>();
param.put(ResourceResolverFactory.SUBSERVICE, name);
resourceResolver = resolverFactory.getServiceResourceResolver(param);
} catch (Exception e) {
}
return resourceResolver;
}

kishorekumar14
Correct answer by
Level 7
Level 7

Hi @marie_p_h ,

 

Could you please check if this helps. 

 

I found some of the test samples from here https://github.com/adobe/aem-test-samples 

 

It has some integration testing samples for content fragments creation. Please refer below link

https://github.com/adobe/aem-test-samples/blob/aem-cloud/cf-smoke/src/main/java/com/adobe/cq/cloud/t... 

View solution in original post