Expand my Community achievements bar.

Radically easy to access on brand approved content for distribution and omnichannel performant delivery. AEM Assets Content Hub and Dynamic Media with OpenAPI capabilities is now GA.
SOLVED

Junit for uploading asset through code is not working

Avatar

Level 4

Hi All,

 

I am doing upload asset through below service and written below code.

 

 

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.json.JSONObject;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.dam.api.Asset;
import com.day.cq.dam.api.AssetManager;

@Component(service = AssetUploadAPIService.class)
public class AssetUploadAPIServiceImpl implements AssetUploadAPIService {

    @reference
    transient ResourceResolverFactory resolverFactory;

    private transient Map<String, Object> param = new HashMap<>();

    private static final Logger LOGGER = LoggerFactory.getLogger(AssetUploadAPIServiceImpl.class);
    
    public AssetUploadAPIServiceImpl() {
         param.put(ResourceResolverFactory.SUBSERVICE, "datawrite");
    }

    private ResourceResolver getResourceResolver() throws LoginException {
        return resolverFactory.getServiceResourceResolver(param);
    }

    @Override
    public ServletResponse<String> getAssetUploadResponse(SlingHttpServletRequest request) {
        try (ResourceResolver resourceResolver = getResourceResolver()) {
            StringBuilder sb = new StringBuilder();
            BufferedReader reader = request.getReader();
            try {
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
            } finally {
                reader.close();
            }

            LOGGER.info("POST JSON data: {}", sb);
            JSONObject jsonObject = new JSONObject(sb.toString());
            String assetPath = jsonObject.getString("assetPath");
            String mimeType = jsonObject.getString("mimeType");
            String encoding = jsonObject.getString("encoding");
            String asset = jsonObject.getString("asset");
            String imageType = mimeType.split("/")[1];

            LOGGER.info("assetPath: {}, mimeType: {}, encoding: {}, asset: {}, imageType: {}", assetPath, mimeType,encoding, asset, imageType);

            InputStream targetStream = new ByteArrayInputStream(Base64.getDecoder().decode(asset.getBytes(StandardCharsets.UTF_8)));

            AssetManager assetManager = resourceResolver.adaptTo(AssetManager.class);
            Asset imageAsset = assetManager.createAsset((assetPath + "." + imageType), targetStream, mimeType, true);
            return new ServletResponse<>(ServletResponse.ServletResponseType.RES_200, imageAsset.getPath());
        } 
        catch (Exception e) {
            LOGGER.error(String.format("There was an Error  === " + e));
            return new ServletResponse<>(ServletResponse.ServletResponseType.RES_400, e.getMessage());
        }
    }

}

 

 

 

 

 

Here I am passing as assetpath = "/content/dam/public/assets/test1" , mimetype = "image/png" and encoding = "base64" as part of json object and then test1.png is uploading in the path /content/dam/public/assets

 

Here I have written below JUNIT test case for this upload asset, but my asset path are not covering. Can anybody please help me here which one I am missing here.

 

 

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.HashMap;

import javax.jcr.Session;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
import org.apache.sling.testing.mock.sling.ResourceResolverType;
import org.json.JSONException;
import org.junit.Rule;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import com.day.cq.wcm.foundation.forms.FormsHandlingRequest;

import io.wcm.testing.mock.aem.junit5.AemContext;

class AssetUploadAPIServiceImplTest {

    @Mock
    private ResourceResolverFactory resolverFactory;

    @Mock
    private Session session;

    @Mock
    private ResourceResolver resourceResolver;

    @Rule
    private final AemContext context = new AemContext(ResourceResolverType.JCR_MOCK);

    @InjectMocks
    private AssetUploadAPIServiceImpl assetUploadAPIService = new AssetUploadAPIServiceImpl();

    @BeforeEach
    public void setup() {
        MockitoAnnotations.initMocks(this);
        HashMap<String, Object> parameterMap = new HashMap<>();
        parameterMap.put("assetPath", "/content/dam/public/assets");
        parameterMap.put("mimeType", "image/png");
        parameterMap.put("encoding", "base64");
        context.request().setParameterMap(parameterMap);
    }

    @test
    void getAssetUploadResponse() throws LoginException, JSONException {
        when(resolverFactory.getServiceResourceResolver(any())).thenReturn(resourceResolver);
        when(resourceResolver.adaptTo(Session.class)).thenReturn(session);
        ServletResponse<String> actualAssetUploadResponse = assetUploadAPIService.getAssetUploadResponse(new FormsHandlingRequest(new SlingHttpServletRequestWrapper(mock(SlingHttpServletRequest.class))));
        assertNull(actualAssetUploadResponse.getPayload());
        assertEquals(ServletResponse.ServletResponseType.RES_400, actualAssetUploadResponse.getStatus());
    }

}

 

 

Can anybody please let me know that what I am missing here for the code coverage for below jsonobject part ?

 

 

JSONObject jsonObject = new JSONObject(sb.toString());
            String assetPath = jsonObject.getString("assetPath");
            String mimeType = jsonObject.getString("mimeType");
            String encoding = jsonObject.getString("encoding");
            String asset = jsonObject.getString("asset");
            String imageType = mimeType.split("/")[1];

            LOGGER.info("assetPath: {}, mimeType: {}, encoding: {}, asset: {}, imageType: {}", assetPath, mimeType,encoding, asset, imageType);

            InputStream targetStream = new ByteArrayInputStream(Base64.getDecoder().decode(asset.getBytes(StandardCharsets.UTF_8)));

            AssetManager assetManager = resourceResolver.adaptTo(AssetManager.class);
            Asset imageAsset = assetManager.createAsset((assetPath + "." + imageType), targetStream, mimeType, true);
            return new ServletResponse<>(ServletResponse.ServletResponseType.RES_200, imageAsset.getPath());

 

Thanks in advance.

snaik

 

 

 

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

@subnaik  can you try below code

lenient().when(resolver.adaptTo(AssetManager.class)).thenReturn(assetManager);
lenient().when(fileResource.adaptTo(Asset.class)).thenReturn(asset);
JSONObject js = new JSONObject();
js.put("assetPath","/content/dam");
js.put("mimeType", "test");
InputStream in = IOUtils.toInputStream(json.toString(), CharEncoding.UTF_8);
when(conn.getInputStream()).thenReturn(in);

View solution in original post

2 Replies

Avatar

Administrator

@Jagadeesh_Prakash @TarunKumar @Heidi05 @Mohit_KBansal @Avdhesh-Pandey @VictorToledo @sherinregi @Hafizur-Rahman @Hemant_arora Can you please review this unanswered question? Appreciate your thoughts on this.



Kautuk Sahni

Avatar

Correct answer by
Community Advisor

@subnaik  can you try below code

lenient().when(resolver.adaptTo(AssetManager.class)).thenReturn(assetManager);
lenient().when(fileResource.adaptTo(Asset.class)).thenReturn(asset);
JSONObject js = new JSONObject();
js.put("assetPath","/content/dam");
js.put("mimeType", "test");
InputStream in = IOUtils.toInputStream(json.toString(), CharEncoding.UTF_8);
when(conn.getInputStream()).thenReturn(in);