You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

304 lines
17 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. namespace hana = ::boost::hana;
  8. TEST(CppHibernateTests, init)
  9. {
  10. StrictMock<mariadb_mock> mock;
  11. expect_query(mock, "START TRANSACTION");
  12. expect_query(mock, "DROP DATABASE IF EXISTS `test`");
  13. expect_query(mock, "CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8");
  14. expect_query(mock, "USE `test`");
  15. expect_query(mock, "CREATE FUNCTION IF NOT EXISTS UuidToBin(_uuid CHAR(36))\n"
  16. " RETURNS BINARY(16)\n"
  17. " LANGUAGE SQL\n"
  18. " DETERMINISTIC\n"
  19. " CONTAINS SQL\n"
  20. " SQL SECURITY INVOKER\n"
  21. "RETURN\n"
  22. " UNHEX(CONCAT(\n"
  23. " SUBSTR(_uuid, 25, 12),\n"
  24. " SUBSTR(_uuid, 20, 4),\n"
  25. " SUBSTR(_uuid, 15, 4),\n"
  26. " SUBSTR(_uuid, 10, 4),\n"
  27. " SUBSTR(_uuid, 1, 8)\n"
  28. " )\n"
  29. ")");
  30. expect_query(mock, "CREATE FUNCTION IF NOT EXISTS BinToUuid(_bin BINARY(16))\n"
  31. " RETURNS CHAR(36)\n"
  32. " LANGUAGE SQL\n"
  33. " DETERMINISTIC\n"
  34. " CONTAINS SQL\n"
  35. " SQL SECURITY INVOKER\n"
  36. "RETURN\n"
  37. " IF(\n"
  38. " _bin IS NULL,\n"
  39. " NULL,\n"
  40. " LCASE(CONCAT_WS('-',\n"
  41. " HEX(SUBSTR(_bin, 13, 4)),\n"
  42. " HEX(SUBSTR(_bin, 11, 2)),\n"
  43. " HEX(SUBSTR(_bin, 9, 2)),\n"
  44. " HEX(SUBSTR(_bin, 7, 2)),\n"
  45. " HEX(SUBSTR(_bin, 1, 6))\n"
  46. " )\n"
  47. " )\n"
  48. ")");
  49. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_test1`\n"
  50. "(\n"
  51. " `tbl_test1_id` BINARY(16) NOT NULL,\n"
  52. " `str_data` VARCHAR(100) NOT NULL,\n"
  53. " `str64_data` VARCHAR(64) NOT NULL,\n"
  54. " `u32_nullable` INT UNSIGNED NULL DEFAULT NULL,\n"
  55. " `u32_ptr_u` INT UNSIGNED NULL DEFAULT NULL,\n"
  56. " `u32_ptr_s` INT UNSIGNED NULL DEFAULT NULL,\n"
  57. " PRIMARY KEY ( `tbl_test1_id` ),\n"
  58. " UNIQUE INDEX `index_tbl_test1_id` ( `tbl_test1_id` ASC )\n"
  59. ")\n"
  60. "ENGINE = InnoDB\n"
  61. "DEFAULT CHARACTER SET = utf8");
  62. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_test2`\n"
  63. "(\n"
  64. " `tbl_test2_id` BINARY(16) NOT NULL,\n"
  65. " `u8_data` TINYINT UNSIGNED NOT NULL,\n"
  66. " `i8_data` TINYINT NOT NULL,\n"
  67. " `u16_data` SMALLINT UNSIGNED NOT NULL,\n"
  68. " `i16_data` SMALLINT NOT NULL,\n"
  69. " PRIMARY KEY ( `tbl_test2_id` ),\n"
  70. " UNIQUE INDEX `index_tbl_test2_id` ( `tbl_test2_id` ASC )\n"
  71. ")\n"
  72. "ENGINE = InnoDB\n"
  73. "DEFAULT CHARACTER SET = utf8");
  74. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_test3`\n"
  75. "(\n"
  76. " `tbl_test3_id` BINARY(16) NOT NULL,\n"
  77. " `tbl_derived3_id_test3_list` BINARY(16) NULL DEFAULT NULL,\n"
  78. " `tbl_derived3_index_test3_list` INT UNSIGNED NOT NULL,\n"
  79. " `tbl_derived3_id_test3_vector` BINARY(16) NULL DEFAULT NULL,\n"
  80. " `tbl_derived3_index_test3_vector` INT UNSIGNED NOT NULL,\n"
  81. " `u32_data` INT UNSIGNED NOT NULL,\n"
  82. " `i32_data` INT NOT NULL,\n"
  83. " `u64_data` BIGINT UNSIGNED NOT NULL,\n"
  84. " `i64_data` BIGINT NOT NULL,\n"
  85. " PRIMARY KEY ( `tbl_test3_id` ),\n"
  86. " UNIQUE INDEX `index_tbl_test3_id` ( `tbl_test3_id` ASC ),\n"
  87. " INDEX `index_tbl_derived3_id_test3_list` ( `tbl_derived3_id_test3_list` ASC ),\n"
  88. " INDEX `index_tbl_derived3_id_test3_vector` ( `tbl_derived3_id_test3_vector` ASC )\n"
  89. ")\n"
  90. "ENGINE = InnoDB\n"
  91. "DEFAULT CHARACTER SET = utf8");
  92. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_base`\n"
  93. "(\n"
  94. " `tbl_base_id` BINARY(16) NOT NULL,\n"
  95. " `name` VARCHAR(100) NOT NULL,\n"
  96. " `__type` INT UNSIGNED NOT NULL,\n"
  97. " PRIMARY KEY ( `tbl_base_id` ),\n"
  98. " UNIQUE INDEX `index_tbl_base_id` ( `tbl_base_id` ASC )\n"
  99. ")\n"
  100. "ENGINE = InnoDB\n"
  101. "DEFAULT CHARACTER SET = utf8");
  102. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_derived1`\n"
  103. "(\n"
  104. " `tbl_derived1_id` BINARY(16) NOT NULL,\n"
  105. " `tbl_base_id` BINARY(16) NOT NULL,\n"
  106. " `tbl_test1_id_test1_data` BINARY(16) NOT NULL,\n"
  107. " `enum_data` ENUM ( 'test0', 'test1', 'test2', 'test3' ) NOT NULL,\n"
  108. " PRIMARY KEY ( `tbl_derived1_id` ),\n"
  109. " UNIQUE INDEX `index_tbl_derived1_id` ( `tbl_derived1_id` ASC ),\n"
  110. " UNIQUE INDEX `index_tbl_base_id` ( `tbl_base_id` ASC ),\n"
  111. " INDEX `index_tbl_test1_id_test1_data` ( `tbl_test1_id_test1_data` ASC )\n"
  112. ")\n"
  113. "ENGINE = InnoDB\n"
  114. "DEFAULT CHARACTER SET = utf8");
  115. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_derived2`\n"
  116. "(\n"
  117. " `tbl_derived2_id` BINARY(16) NOT NULL,\n"
  118. " `tbl_base_id` BINARY(16) NOT NULL,\n"
  119. " `tbl_test2_id_test2_nullable` BINARY(16) NULL DEFAULT NULL,\n"
  120. " `tbl_test2_id_test2_ptr_u` BINARY(16) NULL DEFAULT NULL,\n"
  121. " `tbl_test2_id_test2_ptr_s` BINARY(16) NULL DEFAULT NULL,\n"
  122. " PRIMARY KEY ( `tbl_derived2_id` ),\n"
  123. " UNIQUE INDEX `index_tbl_derived2_id` ( `tbl_derived2_id` ASC ),\n"
  124. " UNIQUE INDEX `index_tbl_base_id` ( `tbl_base_id` ASC ),\n"
  125. " INDEX `index_tbl_test2_id_test2_nullable` ( `tbl_test2_id_test2_nullable` ASC ),\n"
  126. " INDEX `index_tbl_test2_id_test2_ptr_u` ( `tbl_test2_id_test2_ptr_u` ASC ),\n"
  127. " INDEX `index_tbl_test2_id_test2_ptr_s` ( `tbl_test2_id_test2_ptr_s` ASC )\n"
  128. ")\n"
  129. "ENGINE = InnoDB\n"
  130. "DEFAULT CHARACTER SET = utf8");
  131. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_derived3`\n"
  132. "(\n"
  133. " `tbl_derived3_id` BINARY(16) NOT NULL,\n"
  134. " `tbl_derived2_id` BINARY(16) NOT NULL,\n"
  135. " PRIMARY KEY ( `tbl_derived3_id` ),\n"
  136. " UNIQUE INDEX `index_tbl_derived3_id` ( `tbl_derived3_id` ASC ),\n"
  137. " UNIQUE INDEX `index_tbl_derived2_id` ( `tbl_derived2_id` ASC )\n"
  138. ")\n"
  139. "ENGINE = InnoDB\n"
  140. "DEFAULT CHARACTER SET = utf8");
  141. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_dummy_id`\n"
  142. "(\n"
  143. " `tbl_dummy_id_id` BINARY(16) NOT NULL,\n"
  144. " `tbl_dummy_owner_id_dummies` BINARY(16) NULL DEFAULT NULL,\n"
  145. " `tbl_dummy_owner_index_dummies` INT UNSIGNED NOT NULL,\n"
  146. " `data` INT NOT NULL,\n"
  147. " PRIMARY KEY ( `tbl_dummy_id_id` ),\n"
  148. " UNIQUE INDEX `index_tbl_dummy_id_id` ( `tbl_dummy_id_id` ASC ),\n"
  149. " INDEX `index_tbl_dummy_owner_id_dummies` ( `tbl_dummy_owner_id_dummies` ASC )\n"
  150. ")\n"
  151. "ENGINE = InnoDB\n"
  152. "DEFAULT CHARACTER SET = utf8");
  153. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_dummy_owner`\n"
  154. "(\n"
  155. " `tbl_dummy_owner_id` BINARY(16) NOT NULL,\n"
  156. " PRIMARY KEY ( `tbl_dummy_owner_id` ),\n"
  157. " UNIQUE INDEX `index_tbl_dummy_owner_id` ( `tbl_dummy_owner_id` ASC )\n"
  158. ")\n"
  159. "ENGINE = InnoDB\n"
  160. "DEFAULT CHARACTER SET = utf8");
  161. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_double_usage_item`\n"
  162. "(\n"
  163. " `tbl_double_usage_item_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n"
  164. " `tbl_double_usage_id_single_item` INT NULL DEFAULT NULL,\n"
  165. " `tbl_double_usage_id_multiple_items` INT NULL DEFAULT NULL,\n"
  166. " `tbl_double_usage_index_multiple_items` INT UNSIGNED NOT NULL,\n"
  167. " `data` INT NOT NULL,\n"
  168. " PRIMARY KEY ( `tbl_double_usage_item_id` ),\n"
  169. " UNIQUE INDEX `index_tbl_double_usage_item_id` ( `tbl_double_usage_item_id` ASC ),\n"
  170. " INDEX `index_tbl_double_usage_id_single_item` ( `tbl_double_usage_id_single_item` ASC ),\n"
  171. " INDEX `index_tbl_double_usage_id_multiple_items` ( `tbl_double_usage_id_multiple_items` ASC )\n"
  172. ")\n"
  173. "ENGINE = InnoDB\n"
  174. "DEFAULT CHARACTER SET = utf8");
  175. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_double_usage`\n"
  176. "(\n"
  177. " `tbl_double_usage_id` INT NOT NULL AUTO_INCREMENT,\n"
  178. " PRIMARY KEY ( `tbl_double_usage_id` ),\n"
  179. " UNIQUE INDEX `index_tbl_double_usage_id` ( `tbl_double_usage_id` ASC )\n"
  180. ")\n"
  181. "ENGINE = InnoDB\n"
  182. "DEFAULT CHARACTER SET = utf8");
  183. expect_query(mock, "CREATE TABLE IF NOT EXISTS `tbl_double_usage_wrapper`\n"
  184. "(\n"
  185. " `tbl_double_usage_wrapper_id` INT NOT NULL AUTO_INCREMENT,\n"
  186. " `tbl_double_usage_id_double_usage` INT NULL DEFAULT NULL,\n"
  187. " PRIMARY KEY ( `tbl_double_usage_wrapper_id` ),\n"
  188. " UNIQUE INDEX `index_tbl_double_usage_wrapper_id` ( `tbl_double_usage_wrapper_id` ASC ),\n"
  189. " INDEX `index_tbl_double_usage_id_double_usage` ( `tbl_double_usage_id_double_usage` ASC )\n"
  190. ")\n"
  191. "ENGINE = InnoDB\n"
  192. "DEFAULT CHARACTER SET = utf8");
  193. expect_query(mock, "ALTER TABLE `tbl_test3`\n"
  194. " ADD CONSTRAINT `fk_tbl_test3_tbl_derived3_test3_list`\n"
  195. " FOREIGN KEY IF NOT EXISTS (`tbl_derived3_id_test3_list`)\n"
  196. " REFERENCES `test`.`tbl_derived3` (`tbl_derived3_id`)\n"
  197. " ON DELETE SET NULL\n"
  198. " ON UPDATE NO ACTION,\n"
  199. " ADD CONSTRAINT `fk_tbl_test3_tbl_derived3_test3_vector`\n"
  200. " FOREIGN KEY IF NOT EXISTS (`tbl_derived3_id_test3_vector`)\n"
  201. " REFERENCES `test`.`tbl_derived3` (`tbl_derived3_id`)\n"
  202. " ON DELETE SET NULL\n"
  203. " ON UPDATE NO ACTION");
  204. expect_query(mock, "ALTER TABLE `tbl_derived1`\n"
  205. " ADD CONSTRAINT `fk_tbl_derived1_tbl_base_id`\n"
  206. " FOREIGN KEY IF NOT EXISTS (`tbl_base_id`)\n"
  207. " REFERENCES `test`.`tbl_base` (`tbl_base_id`)\n"
  208. " ON DELETE CASCADE\n"
  209. " ON UPDATE CASCADE,\n"
  210. " ADD CONSTRAINT `fk_tbl_derived1_tbl_test1_test1_data`\n"
  211. " FOREIGN KEY IF NOT EXISTS (`tbl_test1_id_test1_data`)\n"
  212. " REFERENCES `test`.`tbl_test1` (`tbl_test1_id`)\n"
  213. " ON DELETE CASCADE\n"
  214. " ON UPDATE NO ACTION");
  215. expect_query(mock, "ALTER TABLE `tbl_derived2`\n"
  216. " ADD CONSTRAINT `fk_tbl_derived2_tbl_base_id`\n"
  217. " FOREIGN KEY IF NOT EXISTS (`tbl_base_id`)\n"
  218. " REFERENCES `test`.`tbl_base` (`tbl_base_id`)\n"
  219. " ON DELETE CASCADE\n"
  220. " ON UPDATE CASCADE,\n"
  221. " ADD CONSTRAINT `fk_tbl_derived2_tbl_test2_test2_nullable`\n"
  222. " FOREIGN KEY IF NOT EXISTS (`tbl_test2_id_test2_nullable`)\n"
  223. " REFERENCES `test`.`tbl_test2` (`tbl_test2_id`)\n"
  224. " ON DELETE SET NULL\n"
  225. " ON UPDATE NO ACTION,\n"
  226. " ADD CONSTRAINT `fk_tbl_derived2_tbl_test2_test2_ptr_u`\n"
  227. " FOREIGN KEY IF NOT EXISTS (`tbl_test2_id_test2_ptr_u`)\n"
  228. " REFERENCES `test`.`tbl_test2` (`tbl_test2_id`)\n"
  229. " ON DELETE SET NULL\n"
  230. " ON UPDATE NO ACTION,\n"
  231. " ADD CONSTRAINT `fk_tbl_derived2_tbl_test2_test2_ptr_s`\n"
  232. " FOREIGN KEY IF NOT EXISTS (`tbl_test2_id_test2_ptr_s`)\n"
  233. " REFERENCES `test`.`tbl_test2` (`tbl_test2_id`)\n"
  234. " ON DELETE SET NULL\n"
  235. " ON UPDATE NO ACTION");
  236. expect_query(mock, "ALTER TABLE `tbl_derived3`\n"
  237. " ADD CONSTRAINT `fk_tbl_derived3_tbl_derived2_id`\n"
  238. " FOREIGN KEY IF NOT EXISTS (`tbl_derived2_id`)\n"
  239. " REFERENCES `test`.`tbl_derived2` (`tbl_derived2_id`)\n"
  240. " ON DELETE CASCADE\n"
  241. " ON UPDATE CASCADE");
  242. expect_query(mock, "ALTER TABLE `tbl_dummy_id`\n"
  243. " ADD CONSTRAINT `fk_tbl_dummy_id_tbl_dummy_owner_dummies`\n"
  244. " FOREIGN KEY IF NOT EXISTS (`tbl_dummy_owner_id_dummies`)\n"
  245. " REFERENCES `test`.`tbl_dummy_owner` (`tbl_dummy_owner_id`)\n"
  246. " ON DELETE SET NULL\n"
  247. " ON UPDATE NO ACTION");
  248. expect_query(mock, "ALTER TABLE `tbl_double_usage_item`\n"
  249. " ADD CONSTRAINT `fk_tbl_double_usage_item_tbl_double_usage_single_item`\n"
  250. " FOREIGN KEY IF NOT EXISTS (`tbl_double_usage_id_single_item`)\n"
  251. " REFERENCES `test`.`tbl_double_usage` (`tbl_double_usage_id`)\n"
  252. " ON DELETE SET NULL\n"
  253. " ON UPDATE NO ACTION,\n"
  254. " ADD CONSTRAINT `fk_tbl_double_usage_item_tbl_double_usage_multiple_items`\n"
  255. " FOREIGN KEY IF NOT EXISTS (`tbl_double_usage_id_multiple_items`)\n"
  256. " REFERENCES `test`.`tbl_double_usage` (`tbl_double_usage_id`)\n"
  257. " ON DELETE SET NULL\n"
  258. " ON UPDATE NO ACTION");
  259. expect_query(mock, "ALTER TABLE `tbl_double_usage_wrapper`\n"
  260. " ADD CONSTRAINT `fk_tbl_double_usage_wrapper_tbl_double_usage_double_usage`\n"
  261. " FOREIGN KEY IF NOT EXISTS (`tbl_double_usage_id_double_usage`)\n"
  262. " REFERENCES `test`.`tbl_double_usage` (`tbl_double_usage_id`)\n"
  263. " ON DELETE SET NULL\n"
  264. " ON UPDATE NO ACTION");
  265. expect_query(mock, "COMMIT");
  266. EXPECT_CALL(
  267. mock,
  268. mysql_close(
  269. reinterpret_cast<MYSQL*>(0x1111)));
  270. ::cppmariadb::connection connection(reinterpret_cast<MYSQL*>(0x1111));
  271. auto context = make_context<mariadb_driver>(test_schema);
  272. context.connection(&connection);
  273. context.init(true);
  274. }