package com.github.davidmoten.rx.jdbc;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import org.junit.Test;
import com.github.davidmoten.junit.Asserts;
import com.github.davidmoten.rx.jdbc.NamedParameters.JdbcQuery;
public class NamedParametersTest {
@Test
public void testSelect() {
JdbcQuery r = NamedParameters.parse(
"select a, b from tbl where a.name=:name and b.name=:name and c.description = :description");
assertEquals("select a, b from tbl where a.name=? and b.name=? and c.description = ?",
r.sql());
assertEquals(Arrays.asList("name", "name", "description"), r.names());
}
@Test
public void testSelectWithOneNamedParameterAndColonNameInQuotes() {
JdbcQuery r = NamedParameters
.parse("select a, b from tbl where a.name=:name and b.name=':name'");
assertEquals("select a, b from tbl where a.name=? and b.name=':name'", r.sql());
assertEquals(Arrays.asList("name"), r.names());
}
@Test
public void testSelectWithNoNamedParameters() {
assertParseUnchanged("select a, b from tbl");
}
@Test
public void testNamedParametersAllMissingParametersShouldDoNothing() {
DatabaseCreator.db().select("select name from person where name = :name").count()
.subscribe();
}
@Test
public void testDoubleColonNotModified() {
JdbcQuery r = NamedParameters.parse("select a::varchar, b from tbl where a.name=:name");
assertEquals("select a::varchar, b from tbl where a.name=?", r.sql());
assertEquals(Arrays.asList("name"), r.names());
}
@Test
public void testTripleColonNotModified() {
JdbcQuery r = NamedParameters.parse("select a:::varchar, b from tbl where a.name=:name");
assertEquals("select a:::varchar, b from tbl where a.name=?", r.sql());
assertEquals(Arrays.asList("name"), r.names());
}
@Test
public void testTerminatingColonNotModified() {
assertParseUnchanged("select a:");
}
@Test
public void testParseColonFollowedByNonIdentifierCharacter() {
assertParseUnchanged("select a:||c from blah");
}
@Test
public void testIsFollowedOrPrefixedByColon() {
assertTrue(NamedParameters.isFollowedOrPrefixedByColon("a:bc", 0));
assertFalse(NamedParameters.isFollowedOrPrefixedByColon("a:bc", 1));
assertTrue(NamedParameters.isFollowedOrPrefixedByColon("a:bc", 2));
assertFalse(NamedParameters.isFollowedOrPrefixedByColon(":bc", 0));
assertTrue(NamedParameters.isFollowedOrPrefixedByColon(":bc", 1));
}
@Test(expected = StringIndexOutOfBoundsException.class)
public void testIsFollowedOrPrefixedByColonAtEndThrowsException() {
NamedParameters.isFollowedOrPrefixedByColon("a:b", 2);
}
@Test
public void testDoubleQuote() {
assertParseUnchanged("select \":b\" from blah");
}
@Test
public void testIsUtilityClass() {
Asserts.assertIsUtilityClass(NamedParameters.class);
}
private static void assertParseUnchanged(String sql) {
JdbcQuery r = NamedParameters.parse(sql);
assertEquals(sql, r.sql());
assertTrue(r.names().isEmpty());
}
}