From fd69e4b980b4d0f79ec678110967c43f01ed0046 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Mon, 1 Oct 2018 15:52:08 +0100 Subject: [PATCH] Serialization tests for expression commands --- .../expr/GetExpressionHistoryCommand.java | 3 - .../expr/ExpressionCommandTestBase.java | 70 +++++++++++++++++ .../GetExpressionHistoryCommandTests.java | 55 ++++++++++++++ ...GetExpressionLanguageInfoCommandTests.java | 37 +++++++++ .../GetStarredExpressionsCommandTests.java | 44 +++++++++++ .../expr/PreviewExpressionCommandTests.java | 76 +++++++++++++++++++ .../ToggleStarredExpressionCommandTests.java | 49 ++++++++++++ 7 files changed, 331 insertions(+), 3 deletions(-) create mode 100644 main/tests/server/src/com/google/refine/tests/commands/expr/ExpressionCommandTestBase.java create mode 100644 main/tests/server/src/com/google/refine/tests/commands/expr/GetExpressionHistoryCommandTests.java create mode 100644 main/tests/server/src/com/google/refine/tests/commands/expr/GetExpressionLanguageInfoCommandTests.java create mode 100644 main/tests/server/src/com/google/refine/tests/commands/expr/GetStarredExpressionsCommandTests.java create mode 100644 main/tests/server/src/com/google/refine/tests/commands/expr/PreviewExpressionCommandTests.java create mode 100644 main/tests/server/src/com/google/refine/tests/commands/expr/ToggleStarredExpressionCommandTests.java diff --git a/main/src/com/google/refine/commands/expr/GetExpressionHistoryCommand.java b/main/src/com/google/refine/commands/expr/GetExpressionHistoryCommand.java index 950e7eab9..1c1ef7bc4 100644 --- a/main/src/com/google/refine/commands/expr/GetExpressionHistoryCommand.java +++ b/main/src/com/google/refine/commands/expr/GetExpressionHistoryCommand.java @@ -47,7 +47,6 @@ import org.json.JSONWriter; import com.google.refine.ProjectManager; import com.google.refine.commands.Command; -import com.google.refine.model.Project; import com.google.refine.preference.TopList; public class GetExpressionHistoryCommand extends Command { @@ -61,8 +60,6 @@ public class GetExpressionHistoryCommand extends Command { throws ServletException, IOException { try { - Project project = getProject(request); - List localExpressions = toExpressionList(ProjectManager.singleton.getPreferenceStore().get("scripting.expressions")); localExpressions = localExpressions.size() > 20 ? localExpressions.subList(0, 20) : localExpressions; diff --git a/main/tests/server/src/com/google/refine/tests/commands/expr/ExpressionCommandTestBase.java b/main/tests/server/src/com/google/refine/tests/commands/expr/ExpressionCommandTestBase.java new file mode 100644 index 000000000..f2ffb2244 --- /dev/null +++ b/main/tests/server/src/com/google/refine/tests/commands/expr/ExpressionCommandTestBase.java @@ -0,0 +1,70 @@ +package com.google.refine.tests.commands.expr; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.testng.annotations.BeforeMethod; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import com.google.refine.commands.Command; +import com.google.refine.io.FileProjectManager; +import com.google.refine.tests.util.TestUtils; + +public class ExpressionCommandTestBase { + protected HttpServletRequest request = null; + protected HttpServletResponse response = null; + protected Command command = null; + protected StringWriter writer = null; + + @BeforeMethod + public void setUpRequestResponse() { + request = mock(HttpServletRequest.class); + response = mock(HttpServletResponse.class); + writer = new StringWriter(); + try { + when(response.getWriter()).thenReturn(new PrintWriter(writer)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void initWorkspace(String expressionsJson, String starredExpressionsJson) { + String starred = starredExpressionsJson == null ? "{\"class\":\"com.google.refine.preference.TopList\",\"top\":2147483647," + + "\"list\":[]}" : starredExpressionsJson; + String expressions = expressionsJson == null ? "{\"class\":\"com.google.refine.preference.TopList\",\"top\":100,\"list\":[]}" : expressionsJson; + try { + File workspaceDir = TestUtils.createTempDirectory("openrefine-test-workspace-dir"); + File jsonPath = new File(workspaceDir, "workspace.json"); + FileUtils.writeStringToFile(jsonPath, "{\"projectIDs\":[]\n" + + ",\"preferences\":{\"entries\":{\"scripting.starred-expressions\":" + starred + + ",\"scripting.expressions\":"+expressions+"}}}"); + FileProjectManager.initialize(workspaceDir); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void assertResponseJsonIs(String expectedJson) { + String actualJson = writer.toString(); + if(!TestUtils.equalAsJson(expectedJson, actualJson)) { + try { + TestUtils.jsonDiff(expectedJson, actualJson); + } catch (JsonParseException | JsonMappingException e) { + e.printStackTrace(); + } + } + TestUtils.assertEqualAsJson(expectedJson, actualJson); + } + +} diff --git a/main/tests/server/src/com/google/refine/tests/commands/expr/GetExpressionHistoryCommandTests.java b/main/tests/server/src/com/google/refine/tests/commands/expr/GetExpressionHistoryCommandTests.java new file mode 100644 index 000000000..a563d3dd8 --- /dev/null +++ b/main/tests/server/src/com/google/refine/tests/commands/expr/GetExpressionHistoryCommandTests.java @@ -0,0 +1,55 @@ +package com.google.refine.tests.commands.expr; + +import java.io.IOException; + +import javax.servlet.ServletException; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.google.refine.commands.expr.GetExpressionHistoryCommand; + +public class GetExpressionHistoryCommandTests extends ExpressionCommandTestBase { + + @BeforeMethod + public void setUp() { + command = new GetExpressionHistoryCommand(); + } + + @Test + public void testJsonResponse() throws ServletException, IOException { + + initWorkspace("{\n" + + " \"class\": \"com.google.refine.preference.TopList\",\n" + + " \"top\": 100,\n" + + " \"list\": [\n" + + " \"grel:facetCount(value, 'value', 'Column 1')\",\n" + + " \"grel:facetCount(value, 'value', 'Column 3')\",\n" + + " \"grel:cell.recon.match.id\"" + + "]}", "{\n" + + " \"class\": \"com.google.refine.preference.TopList\",\n" + + " \"top\": 100,\n" + + " \"list\": [\n" + + " \"grel:cell.recon.match.id\"\n" + + "]}"); + + String json = "{\n" + + " \"expressions\" : [ {\n" + + " \"code\" : \"grel:facetCount(value, 'value', 'Column 1')\",\n" + + " \"global\" : false,\n" + + " \"starred\" : false\n" + + " }, {\n" + + " \"code\" : \"grel:facetCount(value, 'value', 'Column 3')\",\n" + + " \"global\" : false,\n" + + " \"starred\" : false\n" + + " }, {\n" + + " \"code\" : \"grel:cell.recon.match.id\",\n" + + " \"global\" : false,\n" + + " \"starred\" : true\n" + + " } ]\n" + + " }"; + command.doGet(request, response); + assertResponseJsonIs(json); + } + +} diff --git a/main/tests/server/src/com/google/refine/tests/commands/expr/GetExpressionLanguageInfoCommandTests.java b/main/tests/server/src/com/google/refine/tests/commands/expr/GetExpressionLanguageInfoCommandTests.java new file mode 100644 index 000000000..b80159be2 --- /dev/null +++ b/main/tests/server/src/com/google/refine/tests/commands/expr/GetExpressionLanguageInfoCommandTests.java @@ -0,0 +1,37 @@ +package com.google.refine.tests.commands.expr; + +import java.io.IOException; + +import javax.servlet.ServletException; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.fasterxml.jackson.databind.JsonNode; + +import com.google.refine.commands.expr.GetExpressionLanguageInfoCommand; +import com.google.refine.tests.util.TestUtils; +import com.google.refine.util.ParsingUtilities; + +public class GetExpressionLanguageInfoCommandTests extends ExpressionCommandTestBase { + + @BeforeMethod + public void setUp() { + command = new GetExpressionLanguageInfoCommand(); + } + + @Test + public void testJsonResponse() throws ServletException, IOException { + + initWorkspace(null, null); + + command.doGet(request, response); + String jsonResponse = writer.toString(); + JsonNode result = ParsingUtilities.mapper.readValue(jsonResponse, JsonNode.class); + TestUtils.assertEqualAsJson("{\n" + + " \"description\" : \"Evaluates expression a to an array. Then for each array element, binds its value to variable name v, evaluates expression test which should return a boolean. If the boolean is true, pushes v onto the result array.\",\n" + + " \"params\" : \"expression a, variable v, expression test\",\n" + + " \"returns\" : \"array\"\n" + + " }", result.get("controls").get("filter").toString()); + } +} diff --git a/main/tests/server/src/com/google/refine/tests/commands/expr/GetStarredExpressionsCommandTests.java b/main/tests/server/src/com/google/refine/tests/commands/expr/GetStarredExpressionsCommandTests.java new file mode 100644 index 000000000..f341bdaf8 --- /dev/null +++ b/main/tests/server/src/com/google/refine/tests/commands/expr/GetStarredExpressionsCommandTests.java @@ -0,0 +1,44 @@ +package com.google.refine.tests.commands.expr; + +import java.io.IOException; + +import javax.servlet.ServletException; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.google.refine.commands.expr.GetStarredExpressionsCommand; + +public class GetStarredExpressionsCommandTests extends ExpressionCommandTestBase { + + @BeforeMethod + public void setUp() { + command = new GetStarredExpressionsCommand(); + } + + @Test + public void testJsonResponse() throws ServletException, IOException { + + initWorkspace("{\n" + + " \"class\": \"com.google.refine.preference.TopList\",\n" + + " \"top\": 100,\n" + + " \"list\": [\n" + + " \"grel:facetCount(value, 'value', 'Column 1')\",\n" + + " \"grel:facetCount(value, 'value', 'Column 3')\",\n" + + " \"grel:cell.recon.match.id\"" + + "]}", "{\n" + + " \"class\": \"com.google.refine.preference.TopList\",\n" + + " \"top\": 100,\n" + + " \"list\": [\n" + + " \"grel:cell.recon.match.id\"\n" + + "]}"); + + String json = "{\n" + + " \"expressions\" : [ {\n" + + " \"code\" : \"grel:cell.recon.match.id\"\n" + + " } ]\n" + + " }"; + command.doGet(request, response); + assertResponseJsonIs(json); + } +} diff --git a/main/tests/server/src/com/google/refine/tests/commands/expr/PreviewExpressionCommandTests.java b/main/tests/server/src/com/google/refine/tests/commands/expr/PreviewExpressionCommandTests.java new file mode 100644 index 000000000..268107b51 --- /dev/null +++ b/main/tests/server/src/com/google/refine/tests/commands/expr/PreviewExpressionCommandTests.java @@ -0,0 +1,76 @@ +package com.google.refine.tests.commands.expr; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.google.refine.commands.Command; +import com.google.refine.commands.expr.PreviewExpressionCommand; +import com.google.refine.model.Project; +import com.google.refine.tests.RefineTest; +import com.google.refine.tests.util.TestUtils; + +public class PreviewExpressionCommandTests extends RefineTest { + protected Project project = null; + protected HttpServletRequest request = null; + protected HttpServletResponse response = null; + protected Command command = null; + protected StringWriter writer = null; + + @BeforeMethod + public void setUpRequestResponse() { + request = mock(HttpServletRequest.class); + response = mock(HttpServletResponse.class); + writer = new StringWriter(); + try { + when(response.getWriter()).thenReturn(new PrintWriter(writer)); + } catch (IOException e) { + e.printStackTrace(); + } + command = new PreviewExpressionCommand(); + project = createCSVProject("a,b\nc,d\ne,f\ng,h"); + } + + @Test + public void testJsonResponse() throws ServletException, IOException { + + when(request.getParameter("project")).thenReturn(Long.toString(project.id)); + when(request.getParameter("cellIndex")).thenReturn("1"); + when(request.getParameter("expression")).thenReturn("grel:value + \"_u\""); + when(request.getParameter("rowIndices")).thenReturn("[0,2]"); + + String json = "{\n" + + " \"code\" : \"ok\",\n" + + " \"results\" : [ \"d_u\", \"h_u\" ]\n" + + " }"; + command.doPost(request, response); + TestUtils.assertEqualAsJson(json, writer.toString()); + } + + @Test + public void testParseError() throws ServletException, IOException { + + when(request.getParameter("project")).thenReturn(Long.toString(project.id)); + when(request.getParameter("cellIndex")).thenReturn("1"); + when(request.getParameter("expression")).thenReturn("grel:value +"); + when(request.getParameter("rowIndices")).thenReturn("[0,2]"); + + String json = "{\n" + + " \"code\" : \"error\",\n" + + " \"message\" : \"Parsing error at offset 7: Expecting something more at end of expression\",\n" + + " \"type\" : \"parser\"\n" + + " }"; + command.doPost(request, response); + TestUtils.assertEqualAsJson(json, writer.toString()); + } +} diff --git a/main/tests/server/src/com/google/refine/tests/commands/expr/ToggleStarredExpressionCommandTests.java b/main/tests/server/src/com/google/refine/tests/commands/expr/ToggleStarredExpressionCommandTests.java new file mode 100644 index 000000000..019fa43ba --- /dev/null +++ b/main/tests/server/src/com/google/refine/tests/commands/expr/ToggleStarredExpressionCommandTests.java @@ -0,0 +1,49 @@ +package com.google.refine.tests.commands.expr; + +import java.io.IOException; +import static org.mockito.Mockito.when; + +import javax.servlet.ServletException; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.google.refine.commands.expr.ToggleStarredExpressionCommand; + +public class ToggleStarredExpressionCommandTests extends ExpressionCommandTestBase { + + @BeforeMethod + public void setUp() { + command = new ToggleStarredExpressionCommand(); + } + + @Test + public void testJsonResponse() throws ServletException, IOException { + + initWorkspace("{\n" + + " \"class\": \"com.google.refine.preference.TopList\",\n" + + " \"top\": 100,\n" + + " \"list\": [\n" + + " \"grel:facetCount(value, 'value', 'Column 1')\",\n" + + " \"grel:facetCount(value, 'value', 'Column 3')\",\n" + + " \"grel:cell.recon.match.id\"" + + "]}", "{\n" + + " \"class\": \"com.google.refine.preference.TopList\",\n" + + " \"top\": 100,\n" + + " \"list\": [\n" + + " \"grel:cell.recon.match.id\"\n" + + "]}"); + + String json = "{\n" + + " \"expressions\" : [ {\n" + + " \"code\" : \"grel:facetCount(value, 'value', 'Column 1')\"\n" + + " }, {\n" + + " \"code\" : \"grel:cell.recon.match.id\"\n" + + " } ]\n" + + " }"; + when(request.getParameter("expression")).thenReturn("grel:facetCount(value, 'value', 'Column 1')"); + when(request.getParameter("returnList")).thenReturn("yes"); + command.doPost(request, response); + assertResponseJsonIs(json); + } +}