Expand my Community achievements bar.

SOLVED

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

Avatar

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? 

Topics

Topics help categorize Community content and increase your ability to discover relevant content.

1 Accepted Solution

Avatar

Correct answer by
Level 10

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

Avatar

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());

}

 

Avatar

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...

Avatar

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;
}

Avatar

Correct answer by
Level 10

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...