mirror of
https://github.com/boostorg/mysql.git
synced 2026-02-14 00:42:53 +00:00
New integ test system to avoid code duplication
This commit is contained in:
@@ -10,64 +10,124 @@
|
||||
|
||||
using namespace mysql::test;
|
||||
using mysql::value;
|
||||
using mysql::error_code;
|
||||
using mysql::error_info;
|
||||
using mysql::Error;
|
||||
using mysql::tcp_resultset;
|
||||
using mysql::tcp_prepared_statement;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
struct ExecuteStatementTest : public IntegTestAfterHandshake
|
||||
// Iterator version
|
||||
using listit = std::forward_list<value>::const_iterator;
|
||||
struct ExecuteStatementIteratorTraits
|
||||
{
|
||||
static tcp_resultset sync_errc(const tcp_prepared_statement& stmt, listit first, listit last,
|
||||
error_code& errc, error_info& info)
|
||||
{
|
||||
return stmt.execute(first, last, errc, info);
|
||||
}
|
||||
|
||||
static tcp_resultset sync_exc(const tcp_prepared_statement& stmt, listit first, listit last)
|
||||
{
|
||||
return stmt.execute(first, last);
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(ExecuteStatementTest, IteratorsSyncErrc_OkNoParams)
|
||||
struct ExecuteStatementIteratorTest : public NetworkTest<ExecuteStatementIteratorTraits> {};
|
||||
|
||||
TEST_P(ExecuteStatementIteratorTest, OkNoParams)
|
||||
{
|
||||
std::forward_list<value> params;
|
||||
auto stmt = conn.prepare_statement("SELECT * FROM empty_table");
|
||||
auto result = stmt.execute(params.begin(), params.end(), errc, info);
|
||||
validate_no_error();
|
||||
EXPECT_TRUE(result.valid());
|
||||
auto result = GetParam().fun(stmt, params.begin(), params.end()); // execute
|
||||
result.validate_no_error();
|
||||
EXPECT_TRUE(result.value.valid());
|
||||
}
|
||||
|
||||
TEST_F(ExecuteStatementTest, IteratorsSyncErrc_OkWithParams)
|
||||
TEST_P(ExecuteStatementIteratorTest, OkWithParams)
|
||||
{
|
||||
std::forward_list<value> params { value("item"), value(42) };
|
||||
auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)");
|
||||
auto result = stmt.execute(params.begin(), params.end(), errc, info);
|
||||
validate_no_error();
|
||||
EXPECT_TRUE(result.valid());
|
||||
auto result = GetParam().fun(stmt, params.begin(), params.end());
|
||||
result.validate_no_error();
|
||||
EXPECT_TRUE(result.value.valid());
|
||||
}
|
||||
|
||||
TEST_F(ExecuteStatementTest, IteratorsSyncErrc_Error)
|
||||
TEST_P(ExecuteStatementIteratorTest, MismatchedNumParams)
|
||||
{
|
||||
std::forward_list<value> params { value("item") };
|
||||
auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)");
|
||||
auto result = stmt.execute(params.begin(), params.end(), errc, info);
|
||||
validate_sync_fail(Error::wrong_num_params, {"param", "2", "1", "statement", "execute"});
|
||||
EXPECT_FALSE(result.valid());
|
||||
auto result = GetParam().fun(stmt, params.begin(), params.end());
|
||||
result.validate_error(Error::wrong_num_params, {"param", "2", "1", "statement", "execute"});
|
||||
EXPECT_FALSE(result.value.valid());
|
||||
}
|
||||
|
||||
TEST_F(ExecuteStatementTest, CollectionSyncErrc_OkNoParams)
|
||||
// TODO: is there any way of making server return an error here?
|
||||
|
||||
MYSQL_NETWORK_TEST_SUITE(ExecuteStatementIteratorTest);
|
||||
|
||||
// Container version
|
||||
struct ExecuteStatementContainerTraits
|
||||
{
|
||||
static tcp_resultset sync_errc(const tcp_prepared_statement& stmt, const std::vector<value>& v,
|
||||
error_code& errc, error_info& info)
|
||||
{
|
||||
return stmt.execute(v, errc, info);
|
||||
}
|
||||
|
||||
static tcp_resultset sync_exc(const tcp_prepared_statement& stmt, const std::vector<value>& v)
|
||||
{
|
||||
return stmt.execute(v);
|
||||
}
|
||||
};
|
||||
|
||||
struct ExecuteStatementContainerTest : public NetworkTest<ExecuteStatementContainerTraits> {};
|
||||
|
||||
TEST_P(ExecuteStatementContainerTest, OkNoParams)
|
||||
{
|
||||
auto stmt = conn.prepare_statement("SELECT * FROM empty_table");
|
||||
auto result = stmt.execute(mysql::no_statement_params, errc, info);
|
||||
validate_no_error();
|
||||
auto result = GetParam().fun(stmt, std::vector<value>()); // execute
|
||||
result.validate_no_error();
|
||||
EXPECT_TRUE(result.value.valid());
|
||||
}
|
||||
|
||||
TEST_P(ExecuteStatementContainerTest, OkWithParams)
|
||||
{
|
||||
std::vector<value> params { value("item"), value(42) };
|
||||
auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)");
|
||||
auto result = GetParam().fun(stmt, params);
|
||||
result.validate_no_error();
|
||||
EXPECT_TRUE(result.value.valid());
|
||||
}
|
||||
|
||||
TEST_P(ExecuteStatementContainerTest, MismatchedNumParams)
|
||||
{
|
||||
std::vector<value> params { value("item") };
|
||||
auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)");
|
||||
auto result = GetParam().fun(stmt, params);
|
||||
result.validate_error(Error::wrong_num_params, {"param", "2", "1", "statement", "execute"});
|
||||
EXPECT_FALSE(result.value.valid());
|
||||
}
|
||||
|
||||
MYSQL_NETWORK_TEST_SUITE(ExecuteStatementContainerTest);
|
||||
|
||||
struct ExecuteStatementOtherContainersTest : IntegTestAfterHandshake {};
|
||||
|
||||
TEST_F(ExecuteStatementOtherContainersTest, NoParams_CanUseNoStatementParamsVariable)
|
||||
{
|
||||
auto stmt = conn.prepare_statement("SELECT * FROM empty_table");
|
||||
auto result = stmt.execute(mysql::no_statement_params);
|
||||
EXPECT_TRUE(result.valid());
|
||||
}
|
||||
|
||||
TEST_F(ExecuteStatementTest, CollectionSyncErrc_OkWithParams)
|
||||
TEST_F(ExecuteStatementOtherContainersTest, CArray)
|
||||
{
|
||||
value arr [] = { value("hola"), value(10) };
|
||||
auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)");
|
||||
auto result = stmt.execute(makevalues("item", 42), errc, info);
|
||||
validate_no_error();
|
||||
auto result = stmt.execute(arr);
|
||||
EXPECT_TRUE(result.valid());
|
||||
}
|
||||
|
||||
TEST_F(ExecuteStatementTest, CollectionSyncErrc_Error)
|
||||
{
|
||||
auto stmt = conn.prepare_statement("SELECT * FROM empty_table WHERE id IN (?, ?)");
|
||||
auto result = stmt.execute(makevalues("item"), errc, info);
|
||||
validate_sync_fail(Error::wrong_num_params, {"param", "2", "1", "statement", "execute"});
|
||||
EXPECT_FALSE(result.valid());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user