/* * Copyright (C) 2012-2015 DataStax Inc. * * 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.datastax.driver.core; import com.datastax.driver.core.exceptions.InvalidQueryException; import com.datastax.driver.core.exceptions.UnsupportedFeatureException; import com.datastax.driver.core.utils.CassandraVersion; import com.google.common.collect.ImmutableMap; import org.testng.SkipException; import org.testng.annotations.Test; import static org.assertj.core.api.Assertions.assertThat; public class SimpleStatementIntegrationTest extends CCMTestsSupport { @Override public void onTestContextInitialized() { execute( "CREATE TABLE users(id int, id2 int, name text, primary key (id, id2))", "INSERT INTO users(id, id2, name) VALUES (1, 2, 'test')" ); } @Test(groups = "short") @CassandraVersion("2.1.0") public void should_execute_query_with_named_values() { // Given SimpleStatement statement = new SimpleStatement("SELECT * FROM users WHERE id = :id and id2 = :id2", ImmutableMap.<String, Object>of("id", 1, "id2", 2)); // When Row row = session().execute(statement).one(); // Then assertThat(row).isNotNull(); assertThat(row.getString("name")).isEqualTo("test"); } @Test(groups = "short", expectedExceptions = InvalidQueryException.class) @CassandraVersion("2.1.0") public void should_fail_if_query_with_named_values_but_missing_parameter() { // Given a Statement missing named parameters. SimpleStatement statement = new SimpleStatement("SELECT * FROM users WHERE id = :id and id2 = :id2", ImmutableMap.<String, Object>of("id2", 2)); // When session().execute(statement).one(); // Then - The driver does allow this because it doesn't know what parameters are required, but C* should // throw an InvalidQueryException. } @Test(groups = "short", expectedExceptions = InvalidQueryException.class) @CassandraVersion("2.1.0") public void should_fail_if_query_with_named_values_but_using_wrong_type() { // Given a Statement using a named parameter with the wrong value for the type (id is of type int, using double) SimpleStatement statement = new SimpleStatement("SELECT * FROM users WHERE id = :id and id2 = :id2", ImmutableMap.<String, Object>of("id", 2.7, "id2", 2)); // When session().execute(statement).one(); // Then - The driver does allow this because it doesn't know the type information, but C* should throw an // InvalidQueryException. } public void useNamedValuesWithProtocol(ProtocolVersion version) { Cluster vCluster = createClusterBuilder() .addContactPoints(getContactPoints()) .withPort(ccm().getBinaryPort()) .withProtocolVersion(version).build(); try { Session vSession = vCluster.connect(this.keyspace); // Given - A simple statement with named parameters. SimpleStatement statement = new SimpleStatement("SELECT * FROM users WHERE id = :id", ImmutableMap.<String, Object>of("id", 1)); // When - Executing that statement against a Cluster instance using Protocol Version V2. vSession.execute(statement).one(); // Then - Should throw an UnsupportedFeatureException } finally { vCluster.close(); } } @Test(groups = "short", expectedExceptions = UnsupportedFeatureException.class) @CassandraVersion("2.0.0") public void should_fail_if_query_with_named_values_if_protocol_is_V2() { if (ccm().getCassandraVersion().getMajor() >= 3) { throw new SkipException("Skipping since Cassandra 3.0+ does not support protocol v2"); } useNamedValuesWithProtocol(ProtocolVersion.V2); } @Test(groups = "short", expectedExceptions = UnsupportedFeatureException.class) @CassandraVersion("2.0.0") public void should_fail_if_query_with_named_values_if_protocol_is_V1() { if (ccm().getCassandraVersion().getMajor() >= 3) { throw new SkipException("Skipping since Cassandra 3.0+ does not support protocol v1"); } useNamedValuesWithProtocol(ProtocolVersion.V1); } }