/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch licenses this file to you 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 org.elasticsearch.script.mustache; import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.script.ScriptType; import org.elasticsearch.test.ESTestCase; import java.io.IOException; import java.util.List; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.Matchers.nullValue; public class SearchTemplateRequestTests extends ESTestCase { public void testParseInlineTemplate() throws Exception { String source = "{" + " 'inline' : {\n" + " 'query': {\n" + " 'terms': {\n" + " 'status': [\n" + " '{{#status}}',\n" + " '{{.}}',\n" + " '{{/status}}'\n" + " ]\n" + " }\n" + " }\n" + " }" + "}"; SearchTemplateRequest request = RestSearchTemplateAction.parse(newParser(source)); assertThat(request.getScript(), equalTo("{\"query\":{\"terms\":{\"status\":[\"{{#status}}\",\"{{.}}\",\"{{/status}}\"]}}}")); assertThat(request.getScriptType(), equalTo(ScriptType.INLINE)); assertThat(request.getScriptParams(), nullValue()); } public void testParseInlineTemplateWithParams() throws Exception { String source = "{" + " 'inline' : {" + " 'query': { 'match' : { '{{my_field}}' : '{{my_value}}' } }," + " 'size' : '{{my_size}}'" + " }," + " 'params' : {" + " 'my_field' : 'foo'," + " 'my_value' : 'bar'," + " 'my_size' : 5" + " }" + "}"; SearchTemplateRequest request = RestSearchTemplateAction.parse(newParser(source)); assertThat(request.getScript(), equalTo("{\"query\":{\"match\":{\"{{my_field}}\":\"{{my_value}}\"}},\"size\":\"{{my_size}}\"}")); assertThat(request.getScriptType(), equalTo(ScriptType.INLINE)); assertThat(request.getScriptParams().size(), equalTo(3)); assertThat(request.getScriptParams(), hasEntry("my_field", "foo")); assertThat(request.getScriptParams(), hasEntry("my_value", "bar")); assertThat(request.getScriptParams(), hasEntry("my_size", 5)); } public void testParseInlineTemplateAsString() throws Exception { String source = "{'inline' : '{\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":{\\\"match\\\":{\\\"foo\\\":\\\"{{text}}\\\"}}}}}'}"; SearchTemplateRequest request = RestSearchTemplateAction.parse(newParser(source)); assertThat(request.getScript(), equalTo("{\"query\":{\"bool\":{\"must\":{\"match\":{\"foo\":\"{{text}}\"}}}}}")); assertThat(request.getScriptType(), equalTo(ScriptType.INLINE)); assertThat(request.getScriptParams(), nullValue()); } @SuppressWarnings("unchecked") public void testParseInlineTemplateAsStringWithParams() throws Exception { String source = "{'inline' : '{\\\"query\\\":{\\\"match\\\":{\\\"{{field}}\\\":\\\"{{value}}\\\"}}}', " + "'params': {'status': ['pending', 'published']}}"; SearchTemplateRequest request = RestSearchTemplateAction.parse(newParser(source)); assertThat(request.getScript(), equalTo("{\"query\":{\"match\":{\"{{field}}\":\"{{value}}\"}}}")); assertThat(request.getScriptType(), equalTo(ScriptType.INLINE)); assertThat(request.getScriptParams().size(), equalTo(1)); assertThat(request.getScriptParams(), hasKey("status")); assertThat((List<String>) request.getScriptParams().get("status"), hasItems("pending", "published")); } public void testParseFileTemplate() throws Exception { String source = "{'file' : 'fileTemplate'}"; SearchTemplateRequest request = RestSearchTemplateAction.parse(newParser(source)); assertThat(request.getScript(), equalTo("fileTemplate")); assertThat(request.getScriptType(), equalTo(ScriptType.FILE)); assertThat(request.getScriptParams(), nullValue()); } public void testParseFileTemplateWithParams() throws Exception { String source = "{'file' : 'template_foo', 'params' : {'foo': 'bar', 'size': 500}}"; SearchTemplateRequest request = RestSearchTemplateAction.parse(newParser(source)); assertThat(request.getScript(), equalTo("template_foo")); assertThat(request.getScriptType(), equalTo(ScriptType.FILE)); assertThat(request.getScriptParams().size(), equalTo(2)); assertThat(request.getScriptParams(), hasEntry("foo", "bar")); assertThat(request.getScriptParams(), hasEntry("size", 500)); } public void testParseStoredTemplate() throws Exception { String source = "{'id' : 'storedTemplate'}"; SearchTemplateRequest request = RestSearchTemplateAction.parse(newParser(source)); assertThat(request.getScript(), equalTo("storedTemplate")); assertThat(request.getScriptType(), equalTo(ScriptType.STORED)); assertThat(request.getScriptParams(), nullValue()); } public void testParseStoredTemplateWithParams() throws Exception { String source = "{'id' : 'another_template', 'params' : {'bar': 'foo'}}"; SearchTemplateRequest request = RestSearchTemplateAction.parse(newParser(source)); assertThat(request.getScript(), equalTo("another_template")); assertThat(request.getScriptType(), equalTo(ScriptType.STORED)); assertThat(request.getScriptParams().size(), equalTo(1)); assertThat(request.getScriptParams(), hasEntry("bar", "foo")); } public void testParseWrongTemplate() { // Unclosed template id expectThrows(ParsingException.class, () -> RestSearchTemplateAction.parse(newParser("{'id' : 'another_temp }"))); } /** * Creates a {@link XContentParser} with the given String while replacing single quote to double quotes. */ private XContentParser newParser(String s) throws IOException { assertNotNull(s); return createParser(JsonXContent.jsonXContent, s.replace("'", "\"")); } }