Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

281 righe
11 KiB

  1. #include <cpphibernate/driver/mariadb.h>
  2. #include "test_helper.h"
  3. #include "test_schema.h"
  4. #include "mariadb_mock.h"
  5. using namespace ::testing;
  6. using namespace ::cpphibernate;
  7. using namespace ::cpphibernate::modifier;
  8. using namespace ::boost::hana::literals;
  9. TEST(CppHibernateTests, read_test1)
  10. {
  11. StrictMock<mariadb_mock> mock;
  12. expect_query(mock, "START TRANSACTION");
  13. expect_query(mock, "SELECT "
  14. "BinToUuid(`T0`.`tbl_test1_id`), "
  15. "`T0`.`str_data`, "
  16. "`T0`.`str64_data`, "
  17. "`T0`.`u32_nullable`, "
  18. "`T0`.`u32_ptr_u`, "
  19. "`T0`.`u32_ptr_s` "
  20. "FROM "
  21. "`tbl_test1` AS `T0` ",
  22. result_used({
  23. { "3d12697a-abb9-11e8-98d0-529269fb1459", "str_data of class `test1` object `t1`", "str64_data of class `test1` object `t1`", nullptr, "123", "456" }
  24. }));
  25. expect_query(mock, "COMMIT");
  26. EXPECT_CALL(
  27. mock,
  28. mysql_close(
  29. reinterpret_cast<MYSQL*>(0x1111)));
  30. EXPECT_CALL(
  31. mock,
  32. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  33. .Times(AnyNumber())
  34. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  35. test1 t1;
  36. t1.id = uuid("3d12697a-abb9-11e8-98d0-529269fb1459");
  37. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  38. auto context = make_context<driver::mariadb>(test_schema, connection);
  39. using namespace modifier;
  40. context.read(t1);
  41. EXPECT_EQ (t1.id, uuid("3d12697a-abb9-11e8-98d0-529269fb1459"));
  42. EXPECT_EQ (t1.str_data, "str_data of class `test1` object `t1`");
  43. EXPECT_EQ (t1.str64_data, "str64_data of class `test1` object `t1`");
  44. EXPECT_FALSE(static_cast<bool>(t1.u32_nullable));
  45. ASSERT_TRUE (static_cast<bool>(t1.u32_ptr_u));
  46. EXPECT_EQ (*t1.u32_ptr_u, 123);
  47. ASSERT_TRUE (static_cast<bool>(t1.u32_ptr_s));
  48. EXPECT_EQ (*t1.u32_ptr_s, 456);
  49. }
  50. TEST(CppHibernateTests, read_test2)
  51. {
  52. StrictMock<mariadb_mock> mock;
  53. expect_query(mock, "START TRANSACTION");
  54. expect_query(mock, "SELECT "
  55. "BinToUuid(`T0`.`tbl_test2_id`), "
  56. "`T0`.`u8_data`, "
  57. "`T0`.`i8_data`, "
  58. "`T0`.`u16_data`, "
  59. "`T0`.`i16_data` "
  60. "FROM "
  61. "`tbl_test2` AS `T0` ",
  62. result_used({
  63. { "3d1270dc-abb9-11e8-98d0-529269fb1459", "1", "2", "3", "4" }
  64. }));
  65. expect_query(mock, "COMMIT");
  66. EXPECT_CALL(
  67. mock,
  68. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  69. .Times(AnyNumber())
  70. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  71. EXPECT_CALL(
  72. mock,
  73. mysql_close(
  74. reinterpret_cast<MYSQL*>(0x1111)));
  75. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  76. auto context = make_context<driver::mariadb>(test_schema, connection);
  77. constexpr decltype(auto) test2_key_field = test_schema.tables[1_c].fields[0_c];
  78. test2 t2;
  79. context.read(t2, where(equal(test2_key_field, "3d1270dc-abb9-11e8-98d0-529269fb1459")));
  80. EXPECT_EQ(t2.id, uuid("3d1270dc-abb9-11e8-98d0-529269fb1459"));
  81. EXPECT_EQ(t2.u8_data, 1);
  82. EXPECT_EQ(t2.i8_data, 2);
  83. EXPECT_EQ(t2.u16_data, 3);
  84. EXPECT_EQ(t2.i16_data, 4);
  85. }
  86. TEST(CppHibernateTests, read_test3)
  87. {
  88. StrictMock<mariadb_mock> mock;
  89. expect_query(mock, "START TRANSACTION");
  90. expect_query(mock, "SELECT "
  91. "BinToUuid(`T0`.`tbl_test3_id`), "
  92. "`T0`.`u32_data`, "
  93. "`T0`.`i32_data`, "
  94. "`T0`.`u64_data`, "
  95. "`T0`.`i64_data` "
  96. "FROM "
  97. "`tbl_test3` AS `T0` ",
  98. result_used({
  99. { "3d12737a-abb9-11e8-98d0-529269fb1459", "5", "6", "7", "8" }
  100. }));
  101. expect_query(mock, "COMMIT");
  102. EXPECT_CALL(
  103. mock,
  104. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  105. .Times(AnyNumber())
  106. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  107. EXPECT_CALL(
  108. mock,
  109. mysql_close(
  110. reinterpret_cast<MYSQL*>(0x1111)));
  111. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  112. auto context = make_context<driver::mariadb>(test_schema, connection);
  113. test3 t3;
  114. t3.id = uuid("3d12737a-abb9-11e8-98d0-529269fb1459");
  115. context.read(t3);
  116. EXPECT_EQ(t3.id, uuid("3d12737a-abb9-11e8-98d0-529269fb1459"));
  117. EXPECT_EQ(t3.u32_data, 5);
  118. EXPECT_EQ(t3.i32_data, 6);
  119. EXPECT_EQ(t3.u64_data, 7);
  120. EXPECT_EQ(t3.i64_data, 8);
  121. }
  122. TEST(CppHibernateTests, read_derived1_static)
  123. {
  124. StrictMock<mariadb_mock> mock;
  125. expect_query(mock, "START TRANSACTION");
  126. expect_query(mock, "SELECT "
  127. "BinToUuid(`T1`.`tbl_base_id`), "
  128. "`T1`.`name`, "
  129. "BinToUuid(`T0`.`tbl_derived1_id`), "
  130. "`T0`.`enum_data`, "
  131. "BinToUuid(`T2`.`tbl_test1_id`), "
  132. "`T2`.`str_data`, "
  133. "`T2`.`str64_data`, "
  134. "`T2`.`u32_nullable`, "
  135. "`T2`.`u32_ptr_u`, "
  136. "`T2`.`u32_ptr_s` "
  137. "FROM "
  138. "`tbl_derived1` AS `T0` "
  139. "LEFT JOIN "
  140. "`tbl_base` AS `T1` ON `T0`.`tbl_base_id`=`T1`.`tbl_base_id` "
  141. "LEFT JOIN "
  142. "`tbl_test1` AS `T2` ON `T0`.`tbl_test1_id_test1_data`=`T2`.`tbl_test1_id` ",
  143. result_used({
  144. { "3d12778a-abb9-11e8-98d0-529269fb1459", "derived1", "3d12758c-abb9-11e8-98d0-529269fb1459", "test2", "3d127988-abb9-11e8-98d0-529269fb1459", "str_data of class `test1` object `d1.test1_data`", "str64_data of class `test1` object `d1.test1_data`", "32", nullptr, "789" }
  145. }));
  146. expect_query(mock, "COMMIT");
  147. EXPECT_CALL(
  148. mock,
  149. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  150. .Times(AnyNumber())
  151. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  152. EXPECT_CALL(
  153. mock,
  154. mysql_close(
  155. reinterpret_cast<MYSQL*>(0x1111)));
  156. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  157. auto context = make_context<driver::mariadb>(test_schema, connection);
  158. derived1 d1;
  159. d1.derived1_id = uuid("3d12758c-abb9-11e8-98d0-529269fb1459");
  160. context.read(d1);
  161. EXPECT_EQ (d1.id, uuid("3d12778a-abb9-11e8-98d0-529269fb1459"));
  162. EXPECT_EQ (d1.derived1_id, uuid("3d12758c-abb9-11e8-98d0-529269fb1459"));
  163. EXPECT_EQ (d1.name, "derived1");
  164. EXPECT_EQ (d1.enum_data, test_enum::test2);
  165. EXPECT_EQ (d1.test1_data.str_data, "str_data of class `test1` object `d1.test1_data`");
  166. EXPECT_EQ (d1.test1_data.str64_data, "str64_data of class `test1` object `d1.test1_data`");
  167. ASSERT_TRUE (static_cast<bool>(d1.test1_data.u32_nullable));
  168. EXPECT_EQ (*d1.test1_data.u32_nullable, 32);
  169. ASSERT_TRUE (static_cast<bool>(d1.test1_data.u32_ptr_s));
  170. EXPECT_EQ (*d1.test1_data.u32_ptr_s, 789);
  171. EXPECT_FALSE(static_cast<bool>(d1.test1_data.u32_ptr_u));
  172. }
  173. TEST(CppHibernateTests, read_derived2_static)
  174. {
  175. StrictMock<mariadb_mock> mock;
  176. expect_query(mock, "START TRANSACTION");
  177. expect_query(mock, "SELECT "
  178. "BinToUuid(`T1`.`tbl_base_id`), "
  179. "`T1`.`name`, "
  180. "BinToUuid(`T0`.`tbl_derived2_id`), "
  181. "BinToUuid(`T2`.`tbl_test2_id`), "
  182. "`T2`.`u8_data`, "
  183. "`T2`.`i8_data`, "
  184. "`T2`.`u16_data`, "
  185. "`T2`.`i16_data`, "
  186. "BinToUuid(`T3`.`tbl_test2_id`), "
  187. "`T3`.`u8_data`, "
  188. "`T3`.`i8_data`, "
  189. "`T3`.`u16_data`, "
  190. "`T3`.`i16_data`, "
  191. "BinToUuid(`T4`.`tbl_test2_id`), "
  192. "`T4`.`u8_data`, "
  193. "`T4`.`i8_data`, "
  194. "`T4`.`u16_data`, "
  195. "`T4`.`i16_data` "
  196. "FROM "
  197. "`tbl_derived2` AS `T0` "
  198. "LEFT JOIN "
  199. "`tbl_base` AS `T1` ON `T0`.`tbl_base_id`=`T1`.`tbl_base_id` "
  200. "LEFT JOIN "
  201. "`tbl_test2` AS `T2` ON `T0`.`tbl_test2_id_test2_nullable`=`T2`.`tbl_test2_id` "
  202. "LEFT JOIN "
  203. "`tbl_test2` AS `T3` ON `T0`.`tbl_test2_id_test2_ptr_u`=`T3`.`tbl_test2_id` "
  204. "LEFT JOIN "
  205. "`tbl_test2` AS `T4` ON `T0`.`tbl_test2_id_test2_ptr_s`=`T4`.`tbl_test2_id` ",
  206. result_used({
  207. { "3d127db6-abb9-11e8-98d0-529269fb1459", "derived2", "3d127bcc-abb9-11e8-98d0-529269fb1459", "3d1283a6-abb9-11e8-98d0-529269fb1459", "10", "11", "12", "13", "3d128522-abb9-11e8-98d0-529269fb1459", "20", "21", "22", "23", nullptr, nullptr, nullptr, nullptr, nullptr }
  208. }));
  209. expect_query(mock, "COMMIT");
  210. EXPECT_CALL(
  211. mock,
  212. mysql_real_escape_string(reinterpret_cast<MYSQL*>(0x1111), _, _, _))
  213. .Times(AnyNumber())
  214. .WillRepeatedly(WithArgs<1, 2, 3>(EscapeString()));
  215. EXPECT_CALL(
  216. mock,
  217. mysql_close(
  218. reinterpret_cast<MYSQL*>(0x1111)));
  219. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  220. auto context = make_context<driver::mariadb>(test_schema, connection);
  221. derived2 d2;
  222. d2.derived2_id = uuid("3d127bcc-abb9-11e8-98d0-529269fb1459");
  223. context.read(d2);
  224. EXPECT_EQ (d2.id, uuid("3d127db6-abb9-11e8-98d0-529269fb1459"));
  225. EXPECT_EQ (d2.derived2_id, uuid("3d127bcc-abb9-11e8-98d0-529269fb1459"));
  226. EXPECT_EQ (d2.name, "derived2");
  227. ASSERT_TRUE (static_cast<bool>(d2.test2_nullable));
  228. EXPECT_EQ (d2.test2_nullable->u8_data, 10);
  229. EXPECT_EQ (d2.test2_nullable->i8_data, 11);
  230. EXPECT_EQ (d2.test2_nullable->u16_data, 12);
  231. EXPECT_EQ (d2.test2_nullable->i16_data, 13);
  232. ASSERT_TRUE (static_cast<bool>(d2.test2_ptr_u));
  233. EXPECT_EQ (d2.test2_ptr_u->u8_data, 20);
  234. EXPECT_EQ (d2.test2_ptr_u->i8_data, 21);
  235. EXPECT_EQ (d2.test2_ptr_u->u16_data, 22);
  236. EXPECT_EQ (d2.test2_ptr_u->i16_data, 23);
  237. EXPECT_FALSE(static_cast<bool>(d2.test2_ptr_s));
  238. }