Skip to content

Commit

Permalink
#29866 doing unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
jdotcms committed Sep 25, 2024
1 parent 7cc4d9e commit be7920b
Show file tree
Hide file tree
Showing 2 changed files with 171 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.dotcms.cdi.CDIUtils;
import com.dotcms.cube.CubeJSQuery;
import com.dotcms.rest.api.v1.DotObjectMapperProvider;
import com.dotmarketing.business.web.UserWebAPI;
import com.dotmarketing.business.web.WebAPILocator;
import com.dotmarketing.exception.DotRuntimeException;
import com.dotmarketing.util.Logger;
Expand All @@ -17,6 +18,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.Objects;

/**
* This class is a ViewTool that can be used to access the analytics data.
Expand All @@ -26,20 +28,23 @@ public class AnalyticsTool implements ViewTool {

private final ContentAnalyticsAPI contentAnalyticsAPI;
private final AnalyticsQueryParser analyticsQueryParser;
private final UserWebAPI userWebAPI;

private User user = null;

public AnalyticsTool() {
this(CDIUtils.getBean(ContentAnalyticsAPI.class).get(),
CDIUtils.getBean(AnalyticsQueryParser.class).get());
CDIUtils.getBean(AnalyticsQueryParser.class).get(),
WebAPILocator.getUserWebAPI());
}


public AnalyticsTool(final ContentAnalyticsAPI contentAnalyticsAPI,
final AnalyticsQueryParser analyticsQueryParser) {
final AnalyticsQueryParser analyticsQueryParser,
final UserWebAPI userWebAPI) {

this.contentAnalyticsAPI = contentAnalyticsAPI;
this.analyticsQueryParser = analyticsQueryParser;
this.userWebAPI = userWebAPI;
}

@Override
Expand All @@ -52,7 +57,7 @@ public void init(final Object initData) {

if (session != null) {
try {
user = WebAPILocator.getUserWebAPI().getLoggedInUser(request);
user = userWebAPI.getLoggedInUser(request);
} catch (DotRuntimeException e) {
Logger.error(this.getClass(), e.getMessage());
}
Expand Down Expand Up @@ -105,6 +110,10 @@ public ReportResponse runReportFromJson(final String query) {
*/
public ReportResponse runReportFromMap(final Map<String, Object> query) {

if (Objects.isNull(query)) {
throw new IllegalArgumentException("Query can not be null");
}

Logger.debug(this, () -> "Running report from map: " + query);
final AnalyticsQuery analyticsQuery = DotObjectMapperProvider.getInstance()
.getDefaultObjectMapper().convertValue(query, AnalyticsQuery.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
package com.dotcms.analytics.viewtool;

import com.dotcms.analytics.content.ContentAnalyticsAPI;
import com.dotcms.analytics.content.ReportResponse;
import com.dotcms.analytics.query.AnalyticsQueryParser;
import com.dotmarketing.business.web.UserWebAPI;
import com.dotmarketing.exception.DotRuntimeException;
import com.fasterxml.jackson.core.JsonParseException;
import com.liferay.portal.model.User;
import org.apache.velocity.tools.view.context.ViewContext;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
* Test class for AnalyticsTool
* @author jsanca
*/
public class AnalyticsToolTest {

/**
* Method to test: {@link AnalyticsTool#runReportFromJson(String)}
* Given Scenario: Sending a null as json
* ExpectedResult: Should throw IllegalArgumentException
*/
@Test(expected = IllegalArgumentException.class)
public void test_run_report_from_json_npe() {

final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
final HttpSession session = Mockito.mock(HttpSession.class);
final ContentAnalyticsAPI contentAnalyticsAPI = Mockito.mock(ContentAnalyticsAPI.class);
final AnalyticsQueryParser analyticsQueryParser = new AnalyticsQueryParser();
final UserWebAPI userWebAPI = Mockito.mock(UserWebAPI.class);
final ViewContext viewContext = Mockito.mock(ViewContext.class);
final AnalyticsTool analyticsTool = new AnalyticsTool(contentAnalyticsAPI,
analyticsQueryParser, userWebAPI);
final User user = new User();

Mockito.when(viewContext.getRequest()).thenReturn(request);
Mockito.when(request.getSession(false)).thenReturn(session);
Mockito.when(userWebAPI.getLoggedInUser(request)).thenReturn(user);

analyticsTool.init(viewContext);
analyticsTool.runReportFromJson(null);
}

/**
* Method to test: {@link AnalyticsTool#runReportFromJson(String)}
* Given Scenario: Sending wrong as json
* ExpectedResult: Should throw IllegalArgumentException wrapped on DotRuntimeException
*/
@Test(expected = DotRuntimeException.class)
public void test_run_report_from_json_bad_json() {

final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
final HttpSession session = Mockito.mock(HttpSession.class);
final ContentAnalyticsAPI contentAnalyticsAPI = Mockito.mock(ContentAnalyticsAPI.class);
final AnalyticsQueryParser analyticsQueryParser = new AnalyticsQueryParser();
final UserWebAPI userWebAPI = Mockito.mock(UserWebAPI.class);
final ViewContext viewContext = Mockito.mock(ViewContext.class);
final AnalyticsTool analyticsTool = new AnalyticsTool(contentAnalyticsAPI,
analyticsQueryParser, userWebAPI);
final User user = new User();

Mockito.when(viewContext.getRequest()).thenReturn(request);
Mockito.when(request.getSession(false)).thenReturn(session);
Mockito.when(userWebAPI.getLoggedInUser(request)).thenReturn(user);

analyticsTool.init(viewContext);
analyticsTool.runReportFromJson("{\n" +
"\t\"dimensions\": [\"Events.referer\", \"Events.experiment\", \"Events.variant\", \"Events.utcTime\", \"Events.url\", \"Events.lookBackWindow\", \"Events.eventType\"],\n" +
"\t\"measures\": [\"Events.count\", \"Events.uniqueCount\"],\n" +
"\t\"filters\": \"Events.variant = ['B'] or Events.experiments = ['B']\",\n" +
"\t\"limit\":100,\n" +
"\t\"offset\":1,\n" +
"\t\"timeDimensions\":Events.day day\",\n" + // here is a sintax error
"\t\"orders\":\"Events.day ASC\"\n" +
"}");
}

/**
* Method to test: {@link AnalyticsTool#runReportFromJson(String)}
* Given Scenario: Sending a good as json
* ExpectedResult: Should a non null ReportResponse
*/
@Test()
public void test_run_report_from_json_good_json() {

final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
final HttpSession session = Mockito.mock(HttpSession.class);
final ContentAnalyticsAPI contentAnalyticsAPI = Mockito.mock(ContentAnalyticsAPI.class);
final AnalyticsQueryParser analyticsQueryParser = new AnalyticsQueryParser();
final UserWebAPI userWebAPI = Mockito.mock(UserWebAPI.class);
final ViewContext viewContext = Mockito.mock(ViewContext.class);
final AnalyticsTool analyticsTool = new AnalyticsTool(contentAnalyticsAPI,
analyticsQueryParser, userWebAPI);
final User user = new User();

Mockito.when(viewContext.getRequest()).thenReturn(request);
Mockito.when(request.getSession(false)).thenReturn(session);
Mockito.when(userWebAPI.getLoggedInUser(request)).thenReturn(user);
Mockito.when(contentAnalyticsAPI.runReport(Mockito.any(), Mockito.eq(user))).thenReturn(new ReportResponse(List.of()));

analyticsTool.init(viewContext);
final ReportResponse reportResponse = analyticsTool.runReportFromJson("{\n" +
"\t\"dimensions\": [\"Events.referer\", \"Events.experiment\", \"Events.variant\", \"Events.utcTime\", \"Events.url\", \"Events.lookBackWindow\", \"Events.eventType\"],\n" +
"\t\"measures\": [\"Events.count\", \"Events.uniqueCount\"],\n" +
"\t\"filters\": \"Events.variant = ['B'] or Events.experiments = ['B']\",\n" +
"\t\"limit\":100,\n" +
"\t\"offset\":1,\n" +
"\t\"timeDimensions\":\"Events.day day\",\n" +
"\t\"orders\":\"Events.day ASC\"\n" +
"}");

Assert.assertNotNull(reportResponse);
}

/**
* Method to test: {@link AnalyticsTool#runReportFromJson(String)}
* Given Scenario: Sending a good as json
* ExpectedResult: Should a non null ReportResponse
*/
@Test()
public void test_run_report_from_json_good_json() {

final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
final HttpSession session = Mockito.mock(HttpSession.class);
final ContentAnalyticsAPI contentAnalyticsAPI = Mockito.mock(ContentAnalyticsAPI.class);
final AnalyticsQueryParser analyticsQueryParser = new AnalyticsQueryParser();
final UserWebAPI userWebAPI = Mockito.mock(UserWebAPI.class);
final ViewContext viewContext = Mockito.mock(ViewContext.class);
final AnalyticsTool analyticsTool = new AnalyticsTool(contentAnalyticsAPI,
analyticsQueryParser, userWebAPI);
final User user = new User();

Mockito.when(viewContext.getRequest()).thenReturn(request);
Mockito.when(request.getSession(false)).thenReturn(session);
Mockito.when(userWebAPI.getLoggedInUser(request)).thenReturn(user);
Mockito.when(contentAnalyticsAPI.runReport(Mockito.any(), Mockito.eq(user))).thenReturn(new ReportResponse(List.of()));

analyticsTool.init(viewContext);
final ReportResponse reportResponse = analyticsTool.runReportFromJson("{\n" +
"\t\"dimensions\": [\"Events.referer\", \"Events.experiment\", \"Events.variant\", \"Events.utcTime\", \"Events.url\", \"Events.lookBackWindow\", \"Events.eventType\"],\n" +
"\t\"measures\": [\"Events.count\", \"Events.uniqueCount\"],\n" +
"\t\"filters\": \"Events.variant = ['B'] or Events.experiments = ['B']\",\n" +
"\t\"limit\":100,\n" +
"\t\"offset\":1,\n" +
"\t\"timeDimensions\":\"Events.day day\",\n" +
"\t\"orders\":\"Events.day ASC\"\n" +
"}");

Assert.assertNotNull(reportResponse);
}
}

0 comments on commit be7920b

Please sign in to comment.