PageRenderTime 25ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/db-support/src/test/java/com/carbonfive/db/jdbc/ScriptRunnerTest.java

https://github.com/carbonfive/db-migration
Java | 134 lines | 106 code | 28 blank | 0 comment | 0 complexity | 64efc6a715e7c94186b017dc196113a7 MD5 | raw file
  1. package com.carbonfive.db.jdbc;
  2. import com.mockrunner.mock.jdbc.MockConnection;
  3. import org.junit.Test;
  4. import java.io.InputStreamReader;
  5. import java.io.Reader;
  6. import java.util.List;
  7. import static org.hamcrest.MatcherAssert.assertThat;
  8. import static org.hamcrest.core.Is.is;
  9. import static org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace;
  10. public class ScriptRunnerTest
  11. {
  12. @Test
  13. public void scriptRunnerShouldBatchSimpleCommands() throws Exception
  14. {
  15. ScriptRunner runner = new ScriptRunner(DatabaseType.UNKNOWN);
  16. Reader reader = new InputStreamReader(getClass().getResourceAsStream("simple.sql"));
  17. MockConnection connection = new MockConnection();
  18. runner.execute(connection, reader);
  19. List statements = connection.getStatementResultSetHandler().getExecutedStatements();
  20. assertThat(statements.size(), is(2));
  21. assertThat(statements.get(0).toString(),
  22. is(equalToIgnoringWhiteSpace("create table users ( username varchar not null, password varchar not null )")));
  23. assertThat(statements.get(1).toString(),
  24. is(equalToIgnoringWhiteSpace("alter table users add index (username), add unique (username)")));
  25. }
  26. @Test
  27. public void scriptRunnerShouldHandleComplexCommands() throws Exception
  28. {
  29. ScriptRunner runner = new ScriptRunner(DatabaseType.MYSQL);
  30. Reader reader = new InputStreamReader(getClass().getResourceAsStream("complex.sql"));
  31. MockConnection connection = new MockConnection();
  32. runner.execute(connection, reader);
  33. List statements = connection.getStatementResultSetHandler().getExecutedStatements();
  34. String expectedSql = "update dav_file set parent = ( select id from ( select id from dav_file where name = '__SITE_PROTECTED__' ) as x )" +
  35. " where ( name = 'templates' and parent is null )" +
  36. " or ( name = 'velocity' and parent is null )" +
  37. " or ( name = 'tags' and parent is null )" +
  38. " or ( name = 'ctd' and parent is null )";
  39. assertThat(statements.size(), is(1));
  40. assertThat(statements.get(0).toString(), is(equalToIgnoringWhiteSpace(expectedSql)));
  41. }
  42. @Test
  43. public void scriptRunnerShouldBatchMySQLFunctionsAndProcedures() throws Exception
  44. {
  45. ScriptRunner runner = new ScriptRunner(DatabaseType.MYSQL);
  46. Reader reader = new InputStreamReader(getClass().getResourceAsStream("stored-procedure-mysql.sql"));
  47. MockConnection connection = new MockConnection();
  48. runner.execute(connection, reader);
  49. List statements = connection.getStatementResultSetHandler().getExecutedStatements();
  50. assertThat(statements.size(), is(3));
  51. assertThat(statements.get(0).toString(),
  52. is(equalToIgnoringWhiteSpace("CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('Hello, ',s,'!')")));
  53. assertThat(statements.get(1).toString(),
  54. is(equalToIgnoringWhiteSpace("CREATE FUNCTION weighted_average (n1 INT, n2 INT, n3 INT, n4 INT) RETURNS INT DETERMINISTIC BEGIN DECLARE avg INT; SET avg = (n1+n2+n3*2+n4*4)/8; RETURN avg; END")));
  55. assertThat(statements.get(2).toString(),
  56. is(equalToIgnoringWhiteSpace("CREATE PROCEDURE payment(payment_amount DECIMAL(6,2), payment_seller_id INT) BEGIN DECLARE n DECIMAL(6,2); SET n = payment_amount - 1.00; INSERT INTO Moneys VALUES (n, CURRENT_DATE); IF payment_amount > 1.00 THEN UPDATE Sellers SET commission = commission + 1.00 WHERE seller_id = payment_seller_id; END IF; END")));
  57. }
  58. @Test
  59. public void scriptRunnerShouldBatchPostgresFunctionsAndProcedures() throws Exception
  60. {
  61. ScriptRunner runner = new ScriptRunner(DatabaseType.POSTGRESQL);
  62. Reader reader = new InputStreamReader(getClass().getResourceAsStream("stored-procedure-postgresql.sql"));
  63. MockConnection connection = new MockConnection();
  64. runner.execute(connection, reader);
  65. List statements = connection.getStatementResultSetHandler().getExecutedStatements();
  66. assertThat(statements.size(), is(4));
  67. assertThat(statements.get(0).toString(),
  68. is(equalToIgnoringWhiteSpace("CREATE FUNCTION getQtyOrders(customerID int) RETURNS int AS $$ DECLARE qty int; BEGIN SELECT COUNT(*) INTO qty FROM Orders WHERE accnum = customerID; RETURN qty; END; $$ LANGUAGE plpgsql")));
  69. assertThat(statements.get(1).toString(),
  70. is(equalToIgnoringWhiteSpace("CREATE FUNCTION one() RETURNS integer AS ' SELECT 1 AS result; ' LANGUAGE SQL")));
  71. assertThat(statements.get(2).toString(),
  72. is(equalToIgnoringWhiteSpace("CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$ BEGIN IF NEW.empname IS NULL THEN RAISE EXCEPTION 'empname cannot be null'; END IF; IF NEW.salary IS NULL THEN RAISE EXCEPTION '% cannot have null salary', NEW.empname; END IF; IF NEW.salary < 0 THEN RAISE EXCEPTION '% cannot have a negative salary', NEW.empname; END IF; NEW.last_date := current_timestamp; NEW.last_user := current_user; RETURN NEW; END; $emp_stamp$ LANGUAGE plpgsql")));
  73. assertThat(statements.get(3).toString(),
  74. is(equalToIgnoringWhiteSpace("SELECT one()")));
  75. }
  76. @Test
  77. public void scriptRunnerShouldUseTheSameDelimiterUntilExplicitlyChanged() throws Exception
  78. {
  79. ScriptRunner runner = new ScriptRunner(DatabaseType.UNKNOWN);
  80. Reader reader = new InputStreamReader(getClass().getResourceAsStream("function-mysql.sql"));
  81. MockConnection connection = new MockConnection();
  82. runner.execute(connection, reader);
  83. List statements = connection.getStatementResultSetHandler().getExecutedStatements();
  84. assertThat(statements.size(), is(3));
  85. assertThat(statements.get(0).toString(),
  86. is(equalToIgnoringWhiteSpace("DROP FUNCTION IF EXISTS simpleFunction")));
  87. assertThat(statements.get(1).toString(),
  88. is(equalToIgnoringWhiteSpace("CREATE FUNCTION simpleFunction() RETURNS varchar(100) READS SQL DATA begin declare message varchar(100) default 'Hello Word'; return message; end")));
  89. assertThat(statements.get(2).toString(),
  90. is(equalToIgnoringWhiteSpace("select simpleFunction()")));
  91. }
  92. @Test
  93. public void scriptRunnerShouldExecuteLastStatementWhenDelimiterIsMissing() throws Exception
  94. {
  95. ScriptRunner runner = new ScriptRunner(DatabaseType.UNKNOWN);
  96. Reader reader = new InputStreamReader(getClass().getResourceAsStream("missing-last-deliminator.sql"));
  97. MockConnection connection = new MockConnection();
  98. runner.execute(connection, reader);
  99. List statements = connection.getStatementResultSetHandler().getExecutedStatements();
  100. assertThat(statements.size(), is(2));
  101. assertThat(statements.get(0).toString(),
  102. is(equalToIgnoringWhiteSpace("create table users ( username varchar not null, password varchar not null )")));
  103. assertThat(statements.get(1).toString(),
  104. is(equalToIgnoringWhiteSpace("create table roles ( name varchar not null unique, description text not null )")));
  105. }
  106. }