package info.archinnov.achilles.script; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import com.datastax.driver.core.Session; import com.datastax.driver.core.SimpleStatement; import com.google.common.base.Joiner; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.ArrayList; import java.util.List; @RunWith(MockitoJUnitRunner.class) public class ScriptExecutorTest { @InjectMocks private ScriptExecutor scriptExecutor; @Mock private Session session; @Captor private ArgumentCaptor<SimpleStatement> statementCaptor; @Test public void should_load_script_as_lines() throws Exception { //When final List<String> lines = scriptExecutor.loadScriptAsLines("testScript.cql"); //Then assertThat(lines).contains("CREATE TABLE IF NOT EXISTS test(", atIndex(0)); assertThat(lines).contains("id int PRIMARY KEY,", atIndex(1)); assertThat(lines).contains("value text", atIndex(2)); assertThat(lines).contains(");", atIndex(3)); assertThat(lines).contains("INSERT INTO test(id,value) VALUES(1,'test');", atIndex(4)); assertThat(lines).contains("DELETE FROM test WHERE id=1;", atIndex(5)); } @Test public void should_build_statements_from_lines() throws Exception { //Given List<String> lines = new ArrayList<>(); lines.add("CREATE TABLE IF NOT EXISTS test("); lines.add("id int PRIMARY KEY,"); lines.add("value text"); lines.add(");"); lines.add("INSERT INTO test(id,value) VALUES(1,';^');"); lines.add("DELETE FROM test WHERE id=1;"); //When final List<SimpleStatement> statements = scriptExecutor.buildStatements(lines); //Then assertThat(statements.get(0).getQueryString()).isEqualTo("CREATE TABLE IF NOT EXISTS test( id int PRIMARY KEY, value text );"); assertThat(statements.get(1).getQueryString()).isEqualTo("INSERT INTO test(id,value) VALUES(1,';^');"); assertThat(statements.get(2).getQueryString()).isEqualTo("DELETE FROM test WHERE id=1;"); } @Test public void should_build_batch_statements_from_lines() throws Exception { //Given List<String> lines = new ArrayList<>(); lines.add("BEGIN UNLOGGED BATCH USING TIMESTAMP 123456789"); lines.add(" INSERT INTO test(id,value) VALUES(1,'test');"); lines.add(" DELETE FROM test WHERE id=1;"); lines.add("APPLY BATCH;"); lines.add("INSERT INTO test(id,value) VALUES(2,'test2');"); //When final List<SimpleStatement> statements = scriptExecutor.buildStatements(lines); //Then assertThat(statements).hasSize(2); assertThat(statements.get(0).getQueryString()).isEqualTo("BEGIN UNLOGGED BATCH USING TIMESTAMP 123456789 INSERT INTO test(id,value) VALUES(1,'test'); DELETE FROM test WHERE id=1;APPLY BATCH;"); assertThat(statements.get(1).getQueryString()).isEqualTo("INSERT INTO test(id,value) VALUES(2,'test2');"); } @Test public void should_build_create_function_statements_from_lines_syntax_1() throws Exception { //Given List<String> lines = new ArrayList<>(); lines.add("CREATE FUNCTION udf.maxof(val1 int, val2 int)"); lines.add(" RETURNS NULL ON NULL INPUT"); lines.add(" RETURNS int"); lines.add("LANGUAGE java"); lines.add("AS $$"); lines.add("return Math.max(val1, val2);"); lines.add("$$;"); //When final List<SimpleStatement> statements = scriptExecutor.buildStatements(lines); //Then assertThat(statements).hasSize(1); assertThat(statements.get(0).getQueryString()).isEqualTo("CREATE FUNCTION udf.maxof(val1 int, val2 int) RETURNS NULL ON NULL INPUT RETURNS int LANGUAGE java AS $$return Math.max(val1, val2);$$;"); } @Test public void should_build_create_function_statements_from_lines_syntax_2() throws Exception { //Given List<String> lines = new ArrayList<>(); lines.add("CREATE FUNCTION udf.maxof(val1 int, val2 int)"); lines.add(" RETURNS NULL ON NULL INPUT"); lines.add(" RETURNS int"); lines.add("LANGUAGE java"); lines.add("AS"); lines.add("$$"); lines.add("return Math.max(val1, val2);"); lines.add("$$;"); //When final List<SimpleStatement> statements = scriptExecutor.buildStatements(lines); //Then assertThat(statements).hasSize(1); assertThat(statements.get(0).getQueryString()).isEqualTo("CREATE FUNCTION udf.maxof(val1 int, val2 int) RETURNS NULL ON NULL INPUT RETURNS int LANGUAGE java AS $$return Math.max(val1, val2);$$;"); } @Test public void should_build_create_function_statements_from_lines_syntax_3() throws Exception { //Given List<String> lines = new ArrayList<>(); lines.add("CREATE FUNCTION udf.maxof(val1 int, val2 int)"); lines.add(" RETURNS NULL ON NULL INPUT"); lines.add(" RETURNS int"); lines.add("LANGUAGE java"); lines.add("AS $$"); lines.add("return Math.max(val1, val2);"); lines.add("$$"); lines.add(";"); lines.add("SELECT * FROM zeppelin.table;"); //When final List<SimpleStatement> statements = scriptExecutor.buildStatements(lines); //Then assertThat(statements).hasSize(2); assertThat(statements.get(0).getQueryString()).isEqualTo("CREATE FUNCTION udf.maxof(val1 int, val2 int) RETURNS NULL ON NULL INPUT RETURNS int LANGUAGE java AS $$return Math.max(val1, val2);$$ ;"); assertThat(statements.get(1).getQueryString()).isEqualTo("SELECT * FROM zeppelin.table;"); } @Test public void should_build_create_function_statements_from_lines_syntax_4() throws Exception { //Given List<String> lines = new ArrayList<>(); lines.add("CREATE FUNCTION udf.maxof(val1 int, val2 int)"); lines.add(" RETURNS NULL ON NULL INPUT"); lines.add(" RETURNS int"); lines.add("LANGUAGE java"); lines.add("AS"); lines.add("$$"); lines.add("return Math.max(val1, val2);"); lines.add("$$"); lines.add(";"); lines.add("SELECT * FROM zeppelin.table;"); //When final List<SimpleStatement> statements = scriptExecutor.buildStatements(lines); //Then assertThat(statements).hasSize(2); assertThat(statements.get(0).getQueryString()).isEqualTo("CREATE FUNCTION udf.maxof(val1 int, val2 int) RETURNS NULL ON NULL INPUT RETURNS int LANGUAGE java AS $$return Math.max(val1, val2);$$ ;"); assertThat(statements.get(1).getQueryString()).isEqualTo("SELECT * FROM zeppelin.table;"); } @Test public void should_execute_script() throws Exception { //When scriptExecutor.executeScript("testScript.cql"); //Then verify(session,times(3)).execute(statementCaptor.capture()); final List<SimpleStatement> statements = statementCaptor.getAllValues(); assertThat(statements.get(0).getQueryString()).isEqualTo("CREATE TABLE IF NOT EXISTS test( id int PRIMARY KEY, value text );"); assertThat(statements.get(1).getQueryString()).isEqualTo("INSERT INTO test(id,value) VALUES(1,'test');"); assertThat(statements.get(2).getQueryString()).isEqualTo("DELETE FROM test WHERE id=1;"); } }