mirror of
https://github.com/boostorg/mysql.git
synced 2025-05-12 14:11:41 +00:00
108 lines
3.7 KiB
C++
108 lines
3.7 KiB
C++
//
|
|
// Copyright (c) 2019-2020 Ruben Perez Hidalgo (rubenperez038 at gmail dot com)
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
|
|
#include "boost/mysql/connection.hpp"
|
|
#include <gmock/gmock.h> // for EXPECT_THAT()
|
|
#include <boost/asio/use_future.hpp>
|
|
#include "metadata_validator.hpp"
|
|
#include "integration_test_common.hpp"
|
|
#include "test_common.hpp"
|
|
|
|
namespace net = boost::asio;
|
|
using namespace testing;
|
|
using namespace boost::mysql::test;
|
|
using boost::mysql::detail::make_error_code;
|
|
using boost::mysql::field_metadata;
|
|
using boost::mysql::field_type;
|
|
using boost::mysql::errc;
|
|
|
|
namespace
|
|
{
|
|
|
|
template <typename Stream>
|
|
struct QueryTest : public NetworkTest<Stream>
|
|
{
|
|
auto do_query(std::string_view sql)
|
|
{
|
|
return this->GetParam().net->query(this->conn, sql);
|
|
}
|
|
|
|
void InsertQueryOk()
|
|
{
|
|
const char* sql = "INSERT INTO inserts_table (field_varchar, field_date) VALUES ('v0', '2010-10-11')";
|
|
auto result = do_query(sql);
|
|
result.validate_no_error();
|
|
EXPECT_TRUE(result.value.fields().empty());
|
|
EXPECT_TRUE(result.value.valid());
|
|
EXPECT_TRUE(result.value.complete());
|
|
EXPECT_EQ(result.value.affected_rows(), 1);
|
|
EXPECT_EQ(result.value.warning_count(), 0);
|
|
EXPECT_GT(result.value.last_insert_id(), 0);
|
|
EXPECT_EQ(result.value.info(), "");
|
|
}
|
|
|
|
void InsertQueryFailed()
|
|
{
|
|
const char* sql = "INSERT INTO bad_table (field_varchar, field_date) VALUES ('v0', '2010-10-11')";
|
|
auto result = do_query(sql);
|
|
result.validate_error(errc::no_such_table, {"table", "doesn't exist", "bad_table"});
|
|
EXPECT_FALSE(result.value.valid());
|
|
}
|
|
|
|
void UpdateQueryOk()
|
|
{
|
|
const char* sql = "UPDATE updates_table SET field_int = field_int+1";
|
|
auto result = do_query(sql);
|
|
result.validate_no_error();
|
|
EXPECT_TRUE(result.value.fields().empty());
|
|
EXPECT_TRUE(result.value.valid());
|
|
EXPECT_TRUE(result.value.complete());
|
|
EXPECT_EQ(result.value.affected_rows(), 2);
|
|
EXPECT_EQ(result.value.warning_count(), 0);
|
|
EXPECT_EQ(result.value.last_insert_id(), 0);
|
|
EXPECT_THAT(std::string(result.value.info()), HasSubstr("Rows matched"));
|
|
}
|
|
|
|
void SelectOk()
|
|
{
|
|
auto result = do_query("SELECT * FROM empty_table");
|
|
result.validate_no_error();
|
|
EXPECT_TRUE(result.value.valid());
|
|
EXPECT_FALSE(result.value.complete());
|
|
this->validate_2fields_meta(result.value, "empty_table");
|
|
}
|
|
|
|
void SelectQueryFailed()
|
|
{
|
|
auto result = do_query("SELECT field_varchar, field_bad FROM one_row_table");
|
|
result.validate_error(errc::bad_field_error, {"unknown column", "field_bad"});
|
|
EXPECT_FALSE(result.value.valid());
|
|
}
|
|
|
|
// Some system-level query tests (TODO: this does not feel right here)
|
|
void QueryAndFetch_AliasedTableAndField_MetadataCorrect()
|
|
{
|
|
auto result = do_query("SELECT field_varchar AS field_alias FROM empty_table table_alias");
|
|
meta_validator validator ("table_alias", "empty_table", "field_alias",
|
|
"field_varchar", field_type::varchar);
|
|
result.validate_no_error();
|
|
validate_meta(result.value.fields(), {validator});
|
|
}
|
|
};
|
|
|
|
BOOST_MYSQL_NETWORK_TEST_SUITE(QueryTest)
|
|
|
|
BOOST_MYSQL_NETWORK_TEST(QueryTest, InsertQueryOk)
|
|
BOOST_MYSQL_NETWORK_TEST(QueryTest, InsertQueryFailed)
|
|
BOOST_MYSQL_NETWORK_TEST(QueryTest, UpdateQueryOk)
|
|
BOOST_MYSQL_NETWORK_TEST(QueryTest, SelectOk)
|
|
BOOST_MYSQL_NETWORK_TEST(QueryTest, SelectQueryFailed)
|
|
BOOST_MYSQL_NETWORK_TEST(QueryTest, QueryAndFetch_AliasedTableAndField_MetadataCorrect)
|
|
|
|
|
|
} // anon namespace
|