/*
* Copyright 2013 undera.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.atlantbh.jmeter.plugins.jsonutils.jsonpathextractor;
import kg.apc.emulators.TestJMeterUtils;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.threads.JMeterContext;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.*;
public class JSONPathExtractorTest {
private static final String json = "{ \"store\": {\n" +
" \"book\": [ \n" +
" { \"category\": \"reference\",\n" +
" \"author\": \"Nigel Rees\",\n" +
" \"title\": \"Sayings of the Century\",\n" +
" \"price\": 8.95\n" +
" },\n" +
" { \"category\": \"fiction\",\n" +
" \"author\": \"Evelyn Waugh\",\n" +
" \"title\": \"Sword of Honour\",\n" +
" \"price\": 12.99\n" +
" },\n" +
" { \"category\": \"fiction\",\n" +
" \"author\": \"Herman Melville\",\n" +
" \"title\": \"Moby Dick\",\n" +
" \"isbn\": \"0-553-21311-3\",\n" +
" \"price\": 8.99\n" +
" },\n" +
" { \"category\": \"fiction\",\n" +
" \"author\": \"J. R. R. Tolkien\",\n" +
" \"title\": \"The Lord of the Rings\",\n" +
" \"isbn\": \"0-395-19395-8\",\n" +
" \"price\": 22.99\n" +
" }\n" +
" ],\n" +
" \"bicycle\": {\n" +
" \"color\": \"red\",\n" +
" \"price\": 19.95\n" +
" }\n" +
" }\n" +
"}";
private static final String json2 = "{\n" +
" \"status\": \"success\",\n" +
" \"data\": {\n" +
" \"groups\": [\n" +
" {\n" +
" \"id\": \"e02991f4-a95d-43dd-8eb0-fbc44349e238\",\n" +
" \"name\": \"Uber\"\n" +
" },\n" +
" {\n" +
" \"id\": \"71bc2d86-b023-44ca-b358-52531bd57ab3\",\n" +
" \"name\": \"Hooey\"\n" +
" },\n" +
" {\n" +
" \"id\": \"378e9b20-99bb-4d1f-bf2c-6a4a6c69a8ed\",\n" +
" \"name\": \"Zaz\"\n" +
" },\n" +
" {\n" +
" \"id\": \"296453c7-379b-4694-8cc2-5ca44afcb0a4\",\n" +
" \"name\": \"Zompek\"\n" +
" },\n" +
" {\n" +
" \"id\": \"46834f01-6b5f-4b35-bd34-e96aa9cbe315\",\n" +
" \"name\": \"Asguard\"\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
private static final String json3 = "{\n" +
" \"data\":[\n" +
" {\"attr\":{\"value\":0}},\n" +
" {\"attr\":{\"value\":1}},\n" +
" {\"attr\":{\"value\":2}},\n" +
" {\"attr\":{\"value\":0}},\n" +
" ]\n" +
"}";
@Before
public void setUpClass() throws Exception {
TestJMeterUtils.createJmeterEnv();
}
@Test
public void testGetJsonPath() {
System.out.println("getJsonPath");
JSONPathExtractor instance = new JSONPathExtractor();
String expResult = "";
String result = instance.getJsonPath();
assertEquals(expResult, result);
}
@Test
public void testSetJsonPath() {
System.out.println("setJsonPath");
String jsonPath = "";
JSONPathExtractor instance = new JSONPathExtractor();
instance.setJsonPath(jsonPath);
}
@Test
public void testGetVar() {
System.out.println("getVar");
JSONPathExtractor instance = new JSONPathExtractor();
String expResult = "";
String result = instance.getVar();
assertEquals(expResult, result);
}
@Test
public void testProcess_default() {
System.out.println("process def");
JMeterContext context = JMeterContextService.getContext();
SampleResult res = new SampleResult();
context.setPreviousResult(res);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setDefaultValue("DEFAULT");
instance.setVar("test");
instance.process();
JMeterVariables vars = context.getVariables();
assertEquals("DEFAULT", vars.get("test"));
}
@Test
public void testProcess() {
System.out.println("process");
JMeterContext context = JMeterContextService.getContext();
SampleResult res = new SampleResult();
res.setResponseData(json.getBytes());
context.setPreviousResult(res);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setDefaultValue("DEFAULT");
instance.setVar("test");
instance.setJsonPath("$.store.book[*].author");
instance.process();
JMeterVariables vars = context.getVariables();
assertEquals("[\"Nigel Rees\",\"Evelyn Waugh\",\"Herman Melville\",\"J. R. R. Tolkien\"]", vars.get("test"));
}
@Test
public void testProcess_chinese() {
JMeterContext context = JMeterContextService.getContext();
SampleResult res = new SampleResult();
String chinese = "{\"carBrandName\":\"大众\"}";
res.setResponseData(chinese.getBytes());
context.setPreviousResult(res);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setDefaultValue("DEFAULT");
instance.setVar("test");
instance.setJsonPath("$.carBrandName");
instance.process();
JMeterVariables vars = context.getVariables();
// freaking "static final" DEFAULT_ENCODING field in SampleResult does not allow us to assert this
// assertEquals("大众", vars.get("test"));
}
@Test
public void testProcess_from_var() {
System.out.println("process fromvar");
JMeterContext context = JMeterContextService.getContext();
JMeterVariables vars = context.getVariables();
SampleResult res = new SampleResult();
res.setResponseData("".getBytes());
context.setPreviousResult(res);
vars.put("SVAR", json);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setDefaultValue("DEFAULT");
instance.setVar("test");
instance.setJsonPath("$.store.book[*].author");
instance.setSubject(JSONPathExtractor.SUBJECT_VARIABLE);
instance.setSrcVariableName("SVAR");
instance.process();
assertEquals("[\"Nigel Rees\",\"Evelyn Waugh\",\"Herman Melville\",\"J. R. R. Tolkien\"]", vars.get("test"));
}
@Test
public void testProcess_list() {
System.out.println("process list");
JMeterContext context = JMeterContextService.getContext();
SampleResult res = new SampleResult();
res.setResponseData("{\"myval\": [{\"test\":1},{\"test\":{\"dict\":1}},{\"test\":null}]}".getBytes());
context.setPreviousResult(res);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setDefaultValue("DEFAULT");
instance.setVar("test");
instance.setJsonPath("$.myval[*].test");
instance.process();
JMeterVariables vars = context.getVariables();
assertEquals("[1,{\"dict\":1},null]", vars.get("test"));
assertEquals("1", vars.get("test_1"));
assertEquals("{\"dict\":1}", vars.get("test_2"));
assertEquals("null", vars.get("test_3"));
// test for cleaning prev vars
res.setResponseData("{\"myval\": [{\"test\":1},{\"test\":2}]}".getBytes());
instance.process();
assertEquals("[1,2]", vars.get("test"));
assertEquals("1", vars.get("test_1"));
assertEquals("2", vars.get("test_2"));
assertEquals(null, vars.get("test_3"));
}
@Test
public void testReported1() {
System.out.println("process reported");
JMeterContext context = JMeterContextService.getContext();
SampleResult res = new SampleResult();
res.setResponseData(json2.getBytes());
context.setPreviousResult(res);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setVar("GroupID");
instance.setJsonPath("$.data.groups[?(@.name=='Zaz')].id");
instance.setDefaultValue("NOTFOUND");
instance.process();
JMeterVariables vars = context.getVariables();
assertNotEquals("NOTFOUND", vars.get("GroupID"));
assertEquals("378e9b20-99bb-4d1f-bf2c-6a4a6c69a8ed", vars.get("GroupID_1"));
}
@Test
public void testReported1_1() {
System.out.println("process reported");
JMeterContext context = JMeterContextService.getContext();
SampleResult res = new SampleResult();
res.setResponseData(json2.getBytes());
context.setPreviousResult(res);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setVar("GroupID");
instance.setJsonPath("$.data.groups[*].id");
instance.setDefaultValue("NOTFOUND");
instance.process();
JMeterVariables vars = context.getVariables();
assertNotEquals("NOTFOUND", vars.get("GroupID"));
assertEquals("e02991f4-a95d-43dd-8eb0-fbc44349e238", vars.get("GroupID_1"));
}
@Test
public void testReported1_3() {
System.out.println("process reported");
JMeterContext context = JMeterContextService.getContext();
SampleResult res = new SampleResult();
res.setResponseData(json2.getBytes());
context.setPreviousResult(res);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setVar("GroupID");
instance.setJsonPath("$.data.groups[?(@.name==Avtovaz)].id");
instance.setDefaultValue("NOTFOUND");
instance.process();
JMeterVariables vars = context.getVariables();
assertEquals("NOTFOUND", vars.get("GroupID"));
}
@Ignore
@Test // FIXME: we need to solve this one day
public void testReported2() {
System.out.println("process reported");
JMeterContext context = JMeterContextService.getContext();
SampleResult res = new SampleResult();
res.setResponseData(json3.getBytes());
context.setPreviousResult(res);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setVar("var");
instance.setJsonPath("$.data[?(@.attr.value>0)][0].attr");
instance.setDefaultValue("NOTFOUND");
instance.process();
JMeterVariables vars = context.getVariables();
assertNotEquals("NOTFOUND", vars.get("var"));
assertEquals("{value=1}", vars.get("var"));
}
@Test
public void testProcess_from_var_2() {
System.out.println("process fromvar");
JMeterContext context = JMeterContextService.getContext();
JMeterVariables vars = context.getVariables();
SampleResult res = new SampleResult();
res.setResponseData("".getBytes());
context.setPreviousResult(res);
vars.put("SVAR", json);
JSONPathExtractor instance = new JSONPathExtractor();
instance.setDefaultValue("DEFAULT");
instance.setVar("test");
instance.setJsonPath("$.store.bicycle");
instance.setSubject(JSONPathExtractor.SUBJECT_VARIABLE);
instance.setSrcVariableName("SVAR");
instance.process();
String test = vars.get("test");
boolean thiis = "{\"color\":\"red\",\"price\":19.95}".equals(test);
boolean thaat = "{\"price\":19.95,\"color\":\"red\"}".equals(test);
assertTrue(thiis || thaat);
}
}