ibm_db 5.6.1 → 5.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Makefile +13 -9
  3. data/ext/extconf.rb +176 -110
  4. data/ext/ibm_db.c +60 -0
  5. data/ext/ibm_db.o +0 -0
  6. data/ext/ibm_db.so +0 -0
  7. data/ext/mkmf.log +6 -6
  8. data/ext/ruby_ibm_db_cli.c +14 -10
  9. data/ext/ruby_ibm_db_cli.h +4 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/IBM_DB.rb +2 -2
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
  13. data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
  14. data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
  15. data/test/activejob/destroy_association_async_job_test.rb +62 -0
  16. data/test/activejob/destroy_association_async_test.rb +147 -11
  17. data/test/activejob/job_runtime_test.rb +41 -0
  18. data/test/activejob/unloadable_base_job.rb +3 -0
  19. data/test/cases/active_record_schema_test.rb +196 -0
  20. data/test/cases/active_record_test.rb +21 -0
  21. data/test/cases/adapter_prevent_writes_test.rb +26 -202
  22. data/test/cases/adapter_test.rb +592 -82
  23. data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
  24. data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
  25. data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
  26. data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
  27. data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
  28. data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
  29. data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
  30. data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
  31. data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
  32. data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
  33. data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
  34. data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
  35. data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
  36. data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
  38. data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
  39. data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
  40. data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
  41. data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
  42. data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
  43. data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
  44. data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
  45. data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
  46. data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
  47. data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
  48. data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
  49. data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
  51. data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
  52. data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
  53. data/test/cases/adapters/postgresql/array_test.rb +6 -6
  54. data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
  55. data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
  56. data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
  57. data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
  58. data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
  59. data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
  60. data/test/cases/adapters/postgresql/citext_test.rb +7 -1
  61. data/test/cases/adapters/postgresql/collation_test.rb +1 -1
  62. data/test/cases/adapters/postgresql/composite_test.rb +1 -1
  63. data/test/cases/adapters/postgresql/connection_test.rb +43 -36
  64. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
  65. data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
  66. data/test/cases/adapters/postgresql/date_test.rb +2 -2
  67. data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
  69. data/test/cases/adapters/postgresql/domain_test.rb +1 -1
  70. data/test/cases/adapters/postgresql/enum_test.rb +208 -8
  71. data/test/cases/adapters/postgresql/explain_test.rb +25 -6
  72. data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
  73. data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
  74. data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
  75. data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
  76. data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
  77. data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
  78. data/test/cases/adapters/postgresql/integer_test.rb +1 -1
  79. data/test/cases/adapters/postgresql/interval_test.rb +9 -17
  80. data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
  81. data/test/cases/adapters/postgresql/json_test.rb +5 -0
  82. data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
  83. data/test/cases/adapters/postgresql/money_test.rb +17 -9
  84. data/test/cases/adapters/postgresql/network_test.rb +13 -1
  85. data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
  86. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
  87. data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
  88. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
  89. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
  90. data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
  91. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
  92. data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
  93. data/test/cases/adapters/postgresql/range_test.rb +185 -21
  94. data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
  95. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
  96. data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
  97. data/test/cases/adapters/postgresql/schema_test.rb +270 -20
  98. data/test/cases/adapters/postgresql/serial_test.rb +5 -5
  99. data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
  100. data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
  101. data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
  102. data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
  103. data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
  104. data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
  105. data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
  106. data/test/cases/adapters/postgresql/xml_test.rb +1 -1
  107. data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
  108. data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
  109. data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
  110. data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
  111. data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
  112. data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
  113. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
  114. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
  115. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
  116. data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
  117. data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
  118. data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
  119. data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
  120. data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
  121. data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
  122. data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
  123. data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
  124. data/test/cases/aggregations_test.rb +16 -0
  125. data/test/cases/annotate_test.rb +14 -12
  126. data/test/cases/arel/attributes/attribute_test.rb +86 -47
  127. data/test/cases/arel/collectors/bind_test.rb +1 -1
  128. data/test/cases/arel/collectors/composite_test.rb +11 -1
  129. data/test/cases/arel/collectors/sql_string_test.rb +1 -1
  130. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
  131. data/test/cases/arel/delete_manager_test.rb +0 -6
  132. data/test/cases/arel/factory_methods_test.rb +45 -0
  133. data/test/cases/arel/insert_manager_test.rb +1 -7
  134. data/test/cases/arel/nodes/as_test.rb +12 -0
  135. data/test/cases/arel/nodes/ascending_test.rb +1 -1
  136. data/test/cases/arel/nodes/bin_test.rb +1 -1
  137. data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
  138. data/test/cases/arel/nodes/cte_test.rb +46 -0
  139. data/test/cases/arel/nodes/descending_test.rb +1 -1
  140. data/test/cases/arel/nodes/equality_test.rb +3 -3
  141. data/test/cases/arel/nodes/filter_test.rb +37 -0
  142. data/test/cases/arel/nodes/fragments_test.rb +38 -0
  143. data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
  144. data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
  145. data/test/cases/arel/nodes/node_test.rb +1 -1
  146. data/test/cases/arel/nodes/or_test.rb +2 -2
  147. data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
  148. data/test/cases/arel/nodes/table_alias_test.rb +12 -0
  149. data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
  150. data/test/cases/arel/nodes/update_statement_test.rb +4 -0
  151. data/test/cases/arel/nodes_test.rb +3 -2
  152. data/test/cases/arel/select_manager_test.rb +12 -12
  153. data/test/cases/arel/support/fake_record.rb +22 -17
  154. data/test/cases/arel/table_test.rb +15 -25
  155. data/test/cases/arel/update_manager_test.rb +51 -6
  156. data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
  157. data/test/cases/arel/visitors/dot_test.rb +177 -2
  158. data/test/cases/arel/visitors/mysql_test.rb +49 -1
  159. data/test/cases/arel/visitors/postgres_test.rb +1 -31
  160. data/test/cases/arel/visitors/sqlite_test.rb +1 -1
  161. data/test/cases/arel/visitors/to_sql_test.rb +330 -20
  162. data/test/cases/assertions/query_assertions_test.rb +136 -0
  163. data/test/cases/associations/belongs_to_associations_test.rb +502 -41
  164. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
  165. data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
  166. data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
  167. data/test/cases/associations/eager_singularization_test.rb +1 -1
  168. data/test/cases/associations/eager_test.rb +255 -93
  169. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
  170. data/test/cases/associations/has_many_associations_test.rb +282 -72
  171. data/test/cases/associations/has_many_through_associations_test.rb +172 -45
  172. data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
  173. data/test/cases/associations/has_one_associations_test.rb +160 -29
  174. data/test/cases/associations/has_one_through_associations_test.rb +64 -15
  175. data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
  176. data/test/cases/associations/inner_join_association_test.rb +36 -6
  177. data/test/cases/associations/inverse_associations_test.rb +177 -40
  178. data/test/cases/associations/join_model_test.rb +17 -12
  179. data/test/cases/associations/left_outer_join_association_test.rb +14 -3
  180. data/test/cases/associations/nested_error_test.rb +116 -0
  181. data/test/cases/associations/nested_through_associations_test.rb +54 -19
  182. data/test/cases/associations/required_test.rb +1 -1
  183. data/test/cases/associations_test.rb +1278 -21
  184. data/test/cases/asynchronous_queries_test.rb +310 -0
  185. data/test/cases/attribute_methods/read_test.rb +6 -0
  186. data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
  187. data/test/cases/attribute_methods_test.rb +565 -46
  188. data/test/cases/attributes_test.rb +42 -1
  189. data/test/cases/autosave_association_test.rb +645 -92
  190. data/test/cases/base_prevent_writes_test.rb +28 -159
  191. data/test/cases/base_test.rb +434 -209
  192. data/test/cases/batches_test.rb +441 -57
  193. data/test/cases/binary_test.rb +31 -0
  194. data/test/cases/bind_parameter_test.rb +107 -16
  195. data/test/cases/cache_key_test.rb +7 -7
  196. data/test/cases/calculations_test.rb +541 -110
  197. data/test/cases/callbacks_test.rb +0 -1
  198. data/test/cases/clone_test.rb +5 -4
  199. data/test/cases/coders/yaml_column_test.rb +97 -2
  200. data/test/cases/collection_cache_key_test.rb +24 -16
  201. data/test/cases/column_alias_test.rb +2 -8
  202. data/test/cases/column_definition_test.rb +12 -3
  203. data/test/cases/comment_test.rb +23 -26
  204. data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
  205. data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
  206. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
  207. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
  208. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
  209. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
  210. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
  211. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
  212. data/test/cases/connection_adapters/registration_test.rb +98 -0
  213. data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
  214. data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
  215. data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
  216. data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
  217. data/test/cases/connection_handling_test.rb +210 -0
  218. data/test/cases/connection_management_test.rb +44 -7
  219. data/test/cases/connection_pool_test.rb +466 -99
  220. data/test/cases/core_test.rb +167 -9
  221. data/test/cases/counter_cache_test.rb +129 -2
  222. data/test/cases/custom_locking_test.rb +3 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +149 -13
  224. data/test/cases/database_configurations/resolver_test.rb +14 -10
  225. data/test/cases/database_configurations/url_config_test.rb +53 -0
  226. data/test/cases/database_configurations_test.rb +86 -43
  227. data/test/cases/database_selector_test.rb +30 -8
  228. data/test/cases/database_statements_test.rb +10 -14
  229. data/test/cases/date_time_precision_test.rb +141 -11
  230. data/test/cases/date_time_test.rb +19 -1
  231. data/test/cases/defaults_test.rb +107 -41
  232. data/test/cases/delegated_type_test.rb +69 -9
  233. data/test/cases/dirty_test.rb +82 -25
  234. data/test/cases/disconnected_test.rb +10 -9
  235. data/test/cases/dup_test.rb +26 -6
  236. data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
  237. data/test/cases/encryption/cipher_test.rb +65 -0
  238. data/test/cases/encryption/concurrency_test.rb +27 -0
  239. data/test/cases/encryption/config_test.rb +21 -0
  240. data/test/cases/encryption/configurable_test.rb +93 -0
  241. data/test/cases/encryption/contexts_test.rb +105 -0
  242. data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
  243. data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
  244. data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
  245. data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
  246. data/test/cases/encryption/encryptable_record_test.rb +470 -0
  247. data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
  248. data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
  249. data/test/cases/encryption/encryption_schemes_test.rb +240 -0
  250. data/test/cases/encryption/encryptor_test.rb +113 -0
  251. data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
  252. data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
  253. data/test/cases/encryption/helper.rb +152 -0
  254. data/test/cases/encryption/key_generator_test.rb +55 -0
  255. data/test/cases/encryption/key_provider_test.rb +57 -0
  256. data/test/cases/encryption/key_test.rb +17 -0
  257. data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
  258. data/test/cases/encryption/message_serializer_test.rb +82 -0
  259. data/test/cases/encryption/message_test.rb +43 -0
  260. data/test/cases/encryption/null_encryptor_test.rb +21 -0
  261. data/test/cases/encryption/properties_test.rb +69 -0
  262. data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
  263. data/test/cases/encryption/scheme_test.rb +58 -0
  264. data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
  265. data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
  266. data/test/cases/enum_test.rb +374 -72
  267. data/test/cases/errors_test.rb +7 -4
  268. data/test/cases/excluding_test.rb +116 -0
  269. data/test/cases/explain_subscriber_test.rb +6 -1
  270. data/test/cases/explain_test.rb +119 -10
  271. data/test/cases/filter_attributes_test.rb +7 -14
  272. data/test/cases/finder_respond_to_test.rb +3 -3
  273. data/test/cases/finder_test.rb +357 -72
  274. data/test/cases/fixture_set/file_test.rb +9 -0
  275. data/test/cases/fixtures_test.rb +426 -190
  276. data/test/cases/helper.rb +66 -192
  277. data/test/cases/hot_compatibility_test.rb +10 -10
  278. data/test/cases/inheritance_test.rb +51 -61
  279. data/test/cases/inherited_test.rb +40 -0
  280. data/test/cases/insert_all_test.rb +419 -9
  281. data/test/cases/instrumentation_test.rb +202 -30
  282. data/test/cases/integration_test.rb +25 -7
  283. data/test/cases/invalid_connection_test.rb +5 -5
  284. data/test/cases/invertible_migration_test.rb +108 -24
  285. data/test/cases/json_attribute_test.rb +1 -0
  286. data/test/cases/json_serialization_test.rb +5 -5
  287. data/test/cases/json_shared_test_cases.rb +5 -9
  288. data/test/cases/locking_test.rb +67 -31
  289. data/test/cases/log_subscriber_test.rb +17 -15
  290. data/test/cases/marshal_serialization_test.rb +78 -5
  291. data/test/cases/message_pack_test.rb +91 -0
  292. data/test/cases/migration/change_schema_test.rb +77 -46
  293. data/test/cases/migration/change_table_test.rb +129 -114
  294. data/test/cases/migration/check_constraint_test.rb +192 -10
  295. data/test/cases/migration/column_attributes_test.rb +4 -9
  296. data/test/cases/migration/column_positioning_test.rb +2 -2
  297. data/test/cases/migration/columns_test.rb +118 -4
  298. data/test/cases/migration/command_recorder_test.rb +181 -14
  299. data/test/cases/migration/compatibility_test.rb +883 -196
  300. data/test/cases/migration/create_join_table_test.rb +8 -1
  301. data/test/cases/migration/exclusion_constraint_test.rb +192 -0
  302. data/test/cases/migration/foreign_key_test.rb +356 -14
  303. data/test/cases/migration/helper.rb +4 -1
  304. data/test/cases/migration/index_test.rb +67 -2
  305. data/test/cases/migration/invalid_options_test.rb +129 -0
  306. data/test/cases/migration/logger_test.rb +7 -4
  307. data/test/cases/migration/pending_migrations_test.rb +103 -60
  308. data/test/cases/migration/references_foreign_key_test.rb +73 -4
  309. data/test/cases/migration/references_index_test.rb +25 -27
  310. data/test/cases/migration/references_statements_test.rb +27 -3
  311. data/test/cases/migration/rename_table_test.rb +39 -54
  312. data/test/cases/migration/schema_definitions_test.rb +109 -0
  313. data/test/cases/migration/unique_constraint_test.rb +248 -0
  314. data/test/cases/migration_test.rb +677 -220
  315. data/test/cases/migrator_test.rb +102 -75
  316. data/test/cases/multi_db_migrator_test.rb +55 -34
  317. data/test/cases/multiparameter_attributes_test.rb +26 -29
  318. data/test/cases/multiple_db_test.rb +42 -19
  319. data/test/cases/nested_attributes_test.rb +124 -6
  320. data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
  321. data/test/cases/normalized_attribute_test.rb +117 -0
  322. data/test/cases/null_relation_test.rb +35 -2
  323. data/test/cases/persistence/reload_association_cache_test.rb +20 -0
  324. data/test/cases/persistence_test.rb +629 -22
  325. data/test/cases/pooled_connections_test.rb +57 -56
  326. data/test/cases/prepared_statement_status_test.rb +8 -3
  327. data/test/cases/primary_class_test.rb +134 -0
  328. data/test/cases/primary_keys_test.rb +171 -55
  329. data/test/cases/query_cache_test.rb +558 -263
  330. data/test/cases/query_logs_test.rb +293 -0
  331. data/test/cases/quoting_test.rb +39 -72
  332. data/test/cases/readonly_test.rb +50 -12
  333. data/test/cases/reaper_test.rb +22 -6
  334. data/test/cases/reflection_test.rb +207 -9
  335. data/test/cases/relation/and_test.rb +43 -0
  336. data/test/cases/relation/delegation_test.rb +32 -5
  337. data/test/cases/relation/delete_all_test.rb +27 -6
  338. data/test/cases/relation/field_ordered_values_test.rb +128 -0
  339. data/test/cases/relation/load_async_test.rb +650 -0
  340. data/test/cases/relation/merging_test.rb +80 -109
  341. data/test/cases/relation/mutation_test.rb +12 -7
  342. data/test/cases/relation/or_test.rb +11 -8
  343. data/test/cases/relation/order_test.rb +90 -0
  344. data/test/cases/relation/predicate_builder_test.rb +21 -6
  345. data/test/cases/relation/select_test.rb +162 -3
  346. data/test/cases/relation/structural_compatibility_test.rb +38 -0
  347. data/test/cases/relation/update_all_test.rb +81 -27
  348. data/test/cases/relation/where_chain_test.rb +190 -3
  349. data/test/cases/relation/where_clause_test.rb +43 -1
  350. data/test/cases/relation/where_test.rb +95 -7
  351. data/test/cases/relation/with_test.rb +165 -0
  352. data/test/cases/relation_test.rb +42 -37
  353. data/test/cases/relations_test.rb +436 -138
  354. data/test/cases/reload_models_test.rb +18 -14
  355. data/test/cases/reserved_word_test.rb +2 -1
  356. data/test/cases/result_test.rb +14 -22
  357. data/test/cases/sanitize_test.rb +89 -27
  358. data/test/cases/schema_dumper_test.rb +535 -62
  359. data/test/cases/scoping/default_scoping_test.rb +219 -35
  360. data/test/cases/scoping/named_scoping_test.rb +25 -46
  361. data/test/cases/scoping/relation_scoping_test.rb +112 -4
  362. data/test/cases/secure_password_test.rb +108 -0
  363. data/test/cases/secure_token_test.rb +72 -0
  364. data/test/cases/serialization_test.rb +1 -1
  365. data/test/cases/serialized_attribute_test.rb +305 -60
  366. data/test/cases/shard_keys_test.rb +125 -0
  367. data/test/cases/shard_selector_test.rb +45 -0
  368. data/test/cases/signed_id_test.rb +57 -5
  369. data/test/cases/statement_cache_test.rb +31 -30
  370. data/test/cases/statement_invalid_test.rb +8 -4
  371. data/test/cases/store_test.rb +73 -9
  372. data/test/cases/strict_loading_test.rb +327 -13
  373. data/test/cases/table_metadata_test.rb +16 -0
  374. data/test/cases/tasks/database_tasks_test.rb +517 -244
  375. data/test/cases/test_case.rb +254 -60
  376. data/test/cases/test_case_test.rb +69 -0
  377. data/test/cases/test_databases_test.rb +7 -3
  378. data/test/cases/test_fixtures_test.rb +19 -40
  379. data/test/cases/time_precision_test.rb +17 -5
  380. data/test/cases/timestamp_test.rb +124 -16
  381. data/test/cases/token_for_test.rb +165 -0
  382. data/test/cases/touch_later_test.rb +43 -1
  383. data/test/cases/transaction_callbacks_test.rb +325 -8
  384. data/test/cases/transaction_instrumentation_test.rb +453 -0
  385. data/test/cases/transaction_isolation_test.rb +12 -8
  386. data/test/cases/transactions_test.rb +629 -112
  387. data/test/cases/type/date_time_test.rb +7 -1
  388. data/test/cases/type/time_test.rb +9 -0
  389. data/test/cases/type/type_map_test.rb +108 -73
  390. data/test/cases/type/unsigned_integer_test.rb +12 -0
  391. data/test/cases/type_caster/connection_test.rb +19 -0
  392. data/test/cases/type_test.rb +1 -1
  393. data/test/cases/unconnected_test.rb +7 -7
  394. data/test/cases/unsafe_raw_sql_test.rb +39 -8
  395. data/test/cases/validations/absence_validation_test.rb +1 -1
  396. data/test/cases/validations/association_validation_test.rb +25 -3
  397. data/test/cases/validations/numericality_validation_test.rb +3 -9
  398. data/test/cases/validations/presence_validation_test.rb +1 -1
  399. data/test/cases/validations/uniqueness_validation_test.rb +280 -40
  400. data/test/cases/validations_test.rb +2 -2
  401. data/test/cases/view_test.rb +33 -22
  402. data/test/cases/yaml_serialization_test.rb +23 -17
  403. data/test/config.example.yml +58 -56
  404. data/test/config.rb +1 -0
  405. data/test/fixtures/1_need_quoting.yml +2 -0
  406. data/test/fixtures/accounts.yml +5 -0
  407. data/test/fixtures/aircrafts.yml +7 -0
  408. data/test/fixtures/book_identifiers.yml +11 -0
  409. data/test/fixtures/books.yml +5 -4
  410. data/test/fixtures/cake_designers.yml +5 -0
  411. data/test/fixtures/cars.yml +6 -0
  412. data/test/fixtures/chefs.yml +5 -0
  413. data/test/fixtures/clothing_items.yml +23 -0
  414. data/test/fixtures/clubs.yml +1 -1
  415. data/test/fixtures/comments.yml +2 -1
  416. data/test/fixtures/cpk_authors.yml +8 -0
  417. data/test/fixtures/cpk_books.yml +21 -0
  418. data/test/fixtures/cpk_order_agreements.yml +13 -0
  419. data/test/fixtures/cpk_order_tags.yml +15 -0
  420. data/test/fixtures/cpk_orders.yml +11 -0
  421. data/test/fixtures/cpk_posts.yml +12 -0
  422. data/test/fixtures/cpk_reviews.yml +13 -0
  423. data/test/fixtures/cpk_tags.yml +11 -0
  424. data/test/fixtures/drink_designers.yml +5 -0
  425. data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
  426. data/test/fixtures/encrypted_books.yml +4 -0
  427. data/test/fixtures/fk_object_to_point_to.yml +2 -0
  428. data/test/fixtures/memberships.yml +15 -15
  429. data/test/fixtures/paragraphs.yml +5 -0
  430. data/test/fixtures/parrots.yml +4 -0
  431. data/test/fixtures/people.yml +2 -0
  432. data/test/fixtures/pirates.yml +2 -2
  433. data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
  434. data/test/fixtures/references.yml +3 -3
  435. data/test/fixtures/sharded_blog_posts.yml +14 -0
  436. data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
  437. data/test/fixtures/sharded_blogs.yml +8 -0
  438. data/test/fixtures/sharded_comments.yml +22 -0
  439. data/test/fixtures/sharded_tags.yml +34 -0
  440. data/test/fixtures/sponsors.yml +2 -2
  441. data/test/fixtures/topics.yml +1 -0
  442. data/test/fixtures/treasures.yml +4 -0
  443. data/test/fixtures/virtual_columns.yml +5 -0
  444. data/test/fixtures/warehouse_things.yml +1 -1
  445. data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
  446. data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
  447. data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
  448. data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
  449. data/test/migrations/scope/1_unscoped.rb +7 -0
  450. data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
  451. data/test/models/admin/user.rb +2 -0
  452. data/test/models/admin/user_json.rb +48 -0
  453. data/test/models/attachment.rb +7 -0
  454. data/test/models/author.rb +70 -3
  455. data/test/models/author_encrypted.rb +16 -0
  456. data/test/models/bird.rb +1 -1
  457. data/test/models/book.rb +18 -11
  458. data/test/models/book_destroy_async.rb +1 -1
  459. data/test/models/book_encrypted.rb +106 -0
  460. data/test/models/book_identifier.rb +5 -0
  461. data/test/models/branch.rb +11 -0
  462. data/test/models/bulb.rb +1 -1
  463. data/test/models/car.rb +8 -1
  464. data/test/models/cat.rb +1 -1
  465. data/test/models/category.rb +3 -1
  466. data/test/models/chat_message.rb +8 -0
  467. data/test/models/chef.rb +52 -0
  468. data/test/models/clothing_item.rb +12 -0
  469. data/test/models/club.rb +4 -1
  470. data/test/models/comment.rb +7 -4
  471. data/test/models/comment_overlapping_counter_cache.rb +15 -0
  472. data/test/models/company.rb +16 -2
  473. data/test/models/computer.rb +1 -0
  474. data/test/models/contact.rb +3 -3
  475. data/test/models/contract.rb +5 -1
  476. data/test/models/cpk/author.rb +9 -0
  477. data/test/models/cpk/book.rb +55 -0
  478. data/test/models/cpk/book_destroy_async.rb +9 -0
  479. data/test/models/cpk/car.rb +9 -0
  480. data/test/models/cpk/car_review.rb +9 -0
  481. data/test/models/cpk/chapter.rb +16 -0
  482. data/test/models/cpk/chapter_destroy_async.rb +10 -0
  483. data/test/models/cpk/comment.rb +9 -0
  484. data/test/models/cpk/order.rb +55 -0
  485. data/test/models/cpk/order_agreement.rb +10 -0
  486. data/test/models/cpk/order_tag.rb +10 -0
  487. data/test/models/cpk/post.rb +10 -0
  488. data/test/models/cpk/posts_tag.rb +10 -0
  489. data/test/models/cpk/review.rb +9 -0
  490. data/test/models/cpk/tag.rb +10 -0
  491. data/test/models/cpk.rb +15 -0
  492. data/test/models/customer.rb +3 -1
  493. data/test/models/destroy_async_parent.rb +1 -1
  494. data/test/models/developer.rb +44 -3
  495. data/test/models/discount.rb +4 -0
  496. data/test/models/drink_designer.rb +1 -0
  497. data/test/models/editor.rb +8 -0
  498. data/test/models/editorship.rb +6 -0
  499. data/test/models/entry.rb +5 -0
  500. data/test/models/essay.rb +6 -1
  501. data/test/models/essay_destroy_async.rb +1 -0
  502. data/test/models/eye.rb +87 -21
  503. data/test/models/face.rb +1 -1
  504. data/test/models/friendship.rb +3 -0
  505. data/test/models/hardback.rb +7 -0
  506. data/test/models/hotel.rb +2 -0
  507. data/test/models/human.rb +2 -2
  508. data/test/models/invoice.rb +2 -1
  509. data/test/models/invokes_an_undefined_method.rb +5 -0
  510. data/test/models/line_item.rb +6 -0
  511. data/test/models/member.rb +9 -4
  512. data/test/models/membership.rb +2 -2
  513. data/test/models/message.rb +2 -1
  514. data/test/models/need_quoting.rb +5 -0
  515. data/test/models/paragraph.rb +5 -0
  516. data/test/models/parrot.rb +6 -3
  517. data/test/models/person.rb +7 -4
  518. data/test/models/pirate.rb +4 -1
  519. data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
  520. data/test/models/post.rb +65 -2
  521. data/test/models/post_encrypted.rb +15 -0
  522. data/test/models/post_with_prefetched_pk.rb +15 -0
  523. data/test/models/project.rb +1 -0
  524. data/test/models/publication.rb +16 -0
  525. data/test/models/raises_argument_error.rb +5 -0
  526. data/test/models/raises_no_method_error.rb +5 -0
  527. data/test/models/recipient.rb +5 -0
  528. data/test/models/reference.rb +1 -1
  529. data/test/models/reply.rb +1 -1
  530. data/test/models/room.rb +3 -0
  531. data/test/models/sharded/blog.rb +12 -0
  532. data/test/models/sharded/blog_post.rb +17 -0
  533. data/test/models/sharded/blog_post_destroy_async.rb +14 -0
  534. data/test/models/sharded/blog_post_tag.rb +11 -0
  535. data/test/models/sharded/blog_post_with_revision.rb +11 -0
  536. data/test/models/sharded/comment.rb +12 -0
  537. data/test/models/sharded/comment_destroy_async.rb +12 -0
  538. data/test/models/sharded/tag.rb +11 -0
  539. data/test/models/sharded.rb +8 -0
  540. data/test/models/ship.rb +1 -1
  541. data/test/models/shipping_line.rb +11 -0
  542. data/test/models/subscriber.rb +1 -0
  543. data/test/models/subscription.rb +3 -1
  544. data/test/models/too_long_table_name.rb +5 -0
  545. data/test/models/topic.rb +3 -1
  546. data/test/models/traffic_light.rb +2 -2
  547. data/test/models/traffic_light_encrypted.rb +21 -0
  548. data/test/models/translation.rb +9 -0
  549. data/test/models/treasure.rb +1 -1
  550. data/test/models/tyre.rb +1 -1
  551. data/test/models/user.rb +16 -0
  552. data/test/models/user_with_invalid_relation.rb +28 -0
  553. data/test/models/uuid_comment.rb +5 -0
  554. data/test/models/uuid_entry.rb +5 -0
  555. data/test/models/uuid_message.rb +5 -0
  556. data/test/models/zine.rb +2 -1
  557. data/test/schema/mysql2_specific_schema.rb +26 -12
  558. data/test/schema/postgresql_specific_schema.rb +121 -13
  559. data/test/schema/schema.rb +361 -103
  560. data/test/schema/sqlite_specific_schema.rb +17 -6
  561. data/test/schema/trilogy_specific_schema.rb +96 -0
  562. data/test/support/adapter_helper.rb +104 -0
  563. data/test/support/async_helper.rb +15 -0
  564. data/test/support/config.rb +1 -1
  565. data/test/support/connection.rb +14 -2
  566. data/test/support/ddl_helper.rb +1 -1
  567. data/test/support/fake_adapter.rb +42 -0
  568. data/test/support/load_schema_helper.rb +22 -0
  569. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
  570. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
  571. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
  572. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
  573. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
  574. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
  575. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
  576. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
  577. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
  578. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
  579. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
  580. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
  581. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
  582. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
  583. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
  584. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
  585. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
  586. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
  587. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
  588. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
  589. data/test/support/schema_dumping_helper.rb +15 -9
  590. data/test/support/tools.rb +37 -0
  591. data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
  592. metadata +247 -15
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "ostruct"
3
+ require "models/computer"
4
4
 
5
5
  class Developer < ActiveRecord::Base
6
6
  module TimestampAliases
@@ -30,6 +30,10 @@ class Developer < ActiveRecord::Base
30
30
  end
31
31
  end
32
32
 
33
+ def self.target
34
+ :__target__ # Used by delegation_test.rb
35
+ end
36
+
33
37
  belongs_to :mentor
34
38
  belongs_to :strict_loading_mentor, strict_loading: true, foreign_key: :mentor_id, class_name: "Mentor"
35
39
  belongs_to :strict_loading_off_mentor, strict_loading: false, foreign_key: :mentor_id, class_name: "Mentor"
@@ -37,6 +41,7 @@ class Developer < ActiveRecord::Base
37
41
  accepts_nested_attributes_for :projects
38
42
 
39
43
  has_and_belongs_to_many :shared_computers, class_name: "Computer"
44
+ has_many :computers, foreign_key: :developer
40
45
 
41
46
  has_and_belongs_to_many :projects_extended_by_name,
42
47
  -> { extending(ProjectsAssociationExtension) },
@@ -130,6 +135,8 @@ end
130
135
  class AuditLog < ActiveRecord::Base
131
136
  belongs_to :developer, validate: true
132
137
  belongs_to :unvalidated_developer, class_name: "Developer"
138
+
139
+ self.attributes_for_inspect = [:id, :message]
133
140
  end
134
141
 
135
142
  class AuditLogRequired < ActiveRecord::Base
@@ -152,6 +159,35 @@ class DeveloperWithSelect < ActiveRecord::Base
152
159
  default_scope { select("name") }
153
160
  end
154
161
 
162
+ class DeveloperwithDefaultMentorScopeNot < ActiveRecord::Base
163
+ self.table_name = "developers"
164
+ default_scope -> { where(mentor_id: 1) }
165
+ end
166
+
167
+ class DeveloperWithDefaultMentorScopeAllQueries < ActiveRecord::Base
168
+ self.table_name = "developers"
169
+ default_scope -> { where(mentor_id: 1) }, all_queries: true
170
+ end
171
+
172
+ class DeveloperWithDefaultNilableFirmScopeAllQueries < ActiveRecord::Base
173
+ self.table_name = "developers"
174
+ firm_id = nil # Could be something like Current.firm_id
175
+ default_scope -> { where(firm_id: firm_id) if firm_id }, all_queries: true
176
+ end
177
+
178
+ module MentorDefaultScopeNotAllQueries
179
+ extend ActiveSupport::Concern
180
+
181
+ included { default_scope { where(mentor_id: 1) } }
182
+ end
183
+
184
+ class DeveloperWithIncludedMentorDefaultScopeNotAllQueriesAndDefaultScopeFirmWithAllQueries < ActiveRecord::Base
185
+ include MentorDefaultScopeNotAllQueries
186
+ self.table_name = "developers"
187
+ firm_id = 10 # Could be something like Current.firm_id
188
+ default_scope -> { where(firm_id: firm_id) if firm_id }, all_queries: true
189
+ end
190
+
155
191
  class DeveloperWithIncludes < ActiveRecord::Base
156
192
  self.table_name = "developers"
157
193
  has_many :audit_logs, foreign_key: :developer_id
@@ -193,7 +229,7 @@ end
193
229
 
194
230
  class CallableDeveloperCalledDavid < ActiveRecord::Base
195
231
  self.table_name = "developers"
196
- default_scope OpenStruct.new(call: where(name: "David"))
232
+ default_scope Struct.new(:call).new(where(name: "David"))
197
233
  end
198
234
 
199
235
  class ClassMethodDeveloperCalledDavid < ActiveRecord::Base
@@ -296,7 +332,7 @@ class EagerDeveloperWithCallableDefaultScope < ActiveRecord::Base
296
332
  self.table_name = "developers"
297
333
  has_and_belongs_to_many :projects, -> { order("projects.id") }, foreign_key: "developer_id", join_table: "developers_projects"
298
334
 
299
- default_scope OpenStruct.new(call: includes(:projects))
335
+ default_scope Struct.new(:call).new(includes(:projects))
300
336
  end
301
337
 
302
338
  class ThreadsafeDeveloper < ActiveRecord::Base
@@ -339,3 +375,8 @@ class ColumnNamesCachedDeveloper < ActiveRecord::Base
339
375
  self.table_name = "developers"
340
376
  self.ignored_columns += ["name"] if column_names.include?("name")
341
377
  end
378
+
379
+ class AuditRequiredDeveloper < ActiveRecord::Base
380
+ self.table_name = "developers"
381
+ has_many :required_audit_logs, class_name: "AuditLogRequired"
382
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Discount < ActiveRecord::Base
4
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  class DrinkDesigner < ActiveRecord::Base
4
4
  has_one :chef, as: :employable
5
+ accepts_nested_attributes_for :chef
5
6
  end
6
7
 
7
8
  class DrinkDesignerWithPolymorphicDependentNullifyChef < ActiveRecord::Base
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Editor < ActiveRecord::Base
4
+ self.primary_key = "name"
5
+
6
+ has_one :publication, foreign_key: :editor_in_chief_id, inverse_of: :editor_in_chief
7
+ has_many :editorships
8
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Editorship < ActiveRecord::Base
4
+ belongs_to :publication
5
+ belongs_to :editor
6
+ end
data/test/models/entry.rb CHANGED
@@ -2,4 +2,9 @@
2
2
 
3
3
  class Entry < ActiveRecord::Base
4
4
  delegated_type :entryable, types: %w[ Message Comment ]
5
+ belongs_to :account, touch: true
6
+
7
+ # alternate delegation for custom foreign_key/foreign_type
8
+ delegated_type :thing, types: %w[ Post ],
9
+ foreign_key: :entryable_id, foreign_type: :entryable_type
5
10
  end
data/test/models/essay.rb CHANGED
@@ -1,8 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Essay < ActiveRecord::Base
4
- belongs_to :author
4
+ belongs_to :author, primary_key: :name
5
5
  belongs_to :writer, primary_key: :name, polymorphic: true
6
6
  belongs_to :category, primary_key: :name
7
7
  has_one :owner, primary_key: :name
8
8
  end
9
+
10
+ class EssaySpecial < Essay
11
+ end
12
+ class TypedEssay < Essay
13
+ end
@@ -3,6 +3,7 @@
3
3
  class EssayDestroyAsync < ActiveRecord::Base
4
4
  self.table_name = "essays"
5
5
  belongs_to :book, dependent: :destroy_async, class_name: "BookDestroyAsync"
6
+ belongs_to :writer, polymorphic: true, dependent: :destroy_async
6
7
  end
7
8
 
8
9
  class LongEssayDestroyAsync < EssayDestroyAsync
data/test/models/eye.rb CHANGED
@@ -4,36 +4,102 @@ class Eye < ActiveRecord::Base
4
4
  attr_reader :after_create_callbacks_stack
5
5
  attr_reader :after_update_callbacks_stack
6
6
  attr_reader :after_save_callbacks_stack
7
+ attr_writer :override_iris_with_read_only_foreign_key_color
7
8
 
8
9
  # Callbacks configured before the ones has_one sets up.
9
- after_create :trace_after_create
10
- after_update :trace_after_update
11
- after_save :trace_after_save
10
+ after_create :trace_after_create, if: :iris
11
+ after_update :trace_after_update, if: :iris
12
+ after_save :trace_after_save, if: :iris
12
13
 
13
14
  has_one :iris
14
15
  accepts_nested_attributes_for :iris
15
16
 
16
17
  # Callbacks configured after the ones has_one sets up.
17
- after_create :trace_after_create2
18
- after_update :trace_after_update2
19
- after_save :trace_after_save2
20
-
21
- def trace_after_create
22
- (@after_create_callbacks_stack ||= []) << !iris.persisted?
23
- end
24
- alias trace_after_create2 trace_after_create
25
-
26
- def trace_after_update
27
- (@after_update_callbacks_stack ||= []) << iris.has_changes_to_save?
28
- end
29
- alias trace_after_update2 trace_after_update
30
-
31
- def trace_after_save
32
- (@after_save_callbacks_stack ||= []) << iris.has_changes_to_save?
33
- end
34
- alias trace_after_save2 trace_after_save
18
+ after_create :trace_after_create2, if: :iris
19
+ after_update :trace_after_update2, if: :iris
20
+ after_save :trace_after_save2, if: :iris
21
+
22
+ private
23
+ def trace_after_create
24
+ (@after_create_callbacks_stack ||= []) << !iris.persisted?
25
+ end
26
+ alias trace_after_create2 trace_after_create
27
+
28
+ def trace_after_update
29
+ (@after_update_callbacks_stack ||= []) << iris.has_changes_to_save?
30
+ end
31
+ alias trace_after_update2 trace_after_update
32
+
33
+ def trace_after_save
34
+ (@after_save_callbacks_stack ||= []) << iris.has_changes_to_save?
35
+ end
36
+ alias trace_after_save2 trace_after_save
37
+
38
+ public
39
+ has_one :iris_with_read_only_foreign_key, class_name: "IrisWithReadOnlyForeignKey", foreign_key: :eye_id
40
+ accepts_nested_attributes_for :iris_with_read_only_foreign_key
41
+
42
+ before_save :set_iris_with_read_only_foreign_key_color_to_blue, if: -> {
43
+ iris_with_read_only_foreign_key && @override_iris_with_read_only_foreign_key_color
44
+ }
45
+
46
+ private
47
+ def set_iris_with_read_only_foreign_key_color_to_blue
48
+ iris_with_read_only_foreign_key.color = "blue"
49
+ end
35
50
  end
36
51
 
37
52
  class Iris < ActiveRecord::Base
53
+ attr_reader :before_validation_callbacks_counter
54
+ attr_reader :before_create_callbacks_counter
55
+ attr_reader :before_save_callbacks_counter
56
+
57
+ attr_reader :after_validation_callbacks_counter
58
+ attr_reader :after_create_callbacks_counter
59
+ attr_reader :after_save_callbacks_counter
60
+
38
61
  belongs_to :eye
62
+
63
+ before_validation :update_before_validation_counter
64
+ before_create :update_before_create_counter
65
+ before_save :update_before_save_counter
66
+
67
+ after_validation :update_after_validation_counter
68
+ after_create :update_after_create_counter
69
+ after_save :update_after_save_counter
70
+
71
+ private
72
+ def update_before_validation_counter
73
+ @before_validation_callbacks_counter ||= 0
74
+ @before_validation_callbacks_counter += 1
75
+ end
76
+
77
+ def update_before_create_counter
78
+ @before_create_callbacks_counter ||= 0
79
+ @before_create_callbacks_counter += 1
80
+ end
81
+
82
+ def update_before_save_counter
83
+ @before_save_callbacks_counter ||= 0
84
+ @before_save_callbacks_counter += 1
85
+ end
86
+
87
+ def update_after_validation_counter
88
+ @after_validation_callbacks_counter ||= 0
89
+ @after_validation_callbacks_counter += 1
90
+ end
91
+
92
+ def update_after_create_counter
93
+ @after_create_callbacks_counter ||= 0
94
+ @after_create_callbacks_counter += 1
95
+ end
96
+
97
+ def update_after_save_counter
98
+ @after_save_callbacks_counter ||= 0
99
+ @after_save_callbacks_counter += 1
100
+ end
101
+ end
102
+
103
+ class IrisWithReadOnlyForeignKey < Iris
104
+ attr_readonly :eye_id
39
105
  end
data/test/models/face.rb CHANGED
@@ -8,7 +8,7 @@ class Face < ActiveRecord::Base
8
8
  # Oracle identifier length is limited to 30 bytes or less, `polymorphic` renamed `poly`
9
9
  belongs_to :poly_human_without_inverse, polymorphic: true
10
10
  # These are "broken" inverse_of associations for the purposes of testing
11
- belongs_to :puzzled_human, class_name: "Human", inverse_of: :puzzled_face
11
+ belongs_to :confused_human, class_name: "Human", inverse_of: :cnffused_face
12
12
  belongs_to :puzzled_polymorphic_human, polymorphic: true, inverse_of: :puzzled_polymorphic_face
13
13
 
14
14
  validate do
@@ -5,4 +5,7 @@ class Friendship < ActiveRecord::Base
5
5
  # friend_too exists to test a bug, and probably shouldn't be used elsewhere
6
6
  belongs_to :friend_too, foreign_key: "friend_id", class_name: "Person", counter_cache: :friends_too_count
7
7
  belongs_to :follower, class_name: "Person"
8
+
9
+ has_one :friend_favorite_reference_job, through: :friend, source: :favorite_reference_job
10
+ has_one :follower_favorite_reference_job, through: :follower, source: :favorite_reference_job
8
11
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Hardback < ActiveRecord::Base
4
+ end
5
+
6
+ class BestHardback < Hardback
7
+ end
data/test/models/hotel.rb CHANGED
@@ -10,4 +10,6 @@ class Hotel < ActiveRecord::Base
10
10
  has_many :mocktail_designers, through: :chef_lists, source: :employable, source_type: "MocktailDesigner"
11
11
 
12
12
  has_many :recipes, through: :chefs
13
+
14
+ has_many :lost_items, through: :departments
13
15
  end
data/test/models/human.rb CHANGED
@@ -4,7 +4,7 @@ class Human < ActiveRecord::Base
4
4
  self.table_name = "humans"
5
5
 
6
6
  has_one :face, inverse_of: :human
7
- has_one :autosave_face, class_name: "Face", autosave: true, foreign_key: :human_id, inverse_of: :autosave_human
7
+ has_one :autosave_face, class_name: "Face", autosave: true, inverse_of: :autosave_human
8
8
  has_one :polymorphic_face, class_name: "Face", as: :polymorphic_human, inverse_of: :polymorphic_human
9
9
  has_one :polymorphic_face_without_inverse, class_name: "Face", as: :poly_human_without_inverse
10
10
  has_many :interests, inverse_of: :human
@@ -24,7 +24,7 @@ class Human < ActiveRecord::Base
24
24
  after_add: :add_called,
25
25
  inverse_of: :polymorphic_human
26
26
  # These are "broken" inverse_of associations for the purposes of testing
27
- has_one :confused_face, class_name: "Face", inverse_of: :confused_human
27
+ has_one :confused_face, class_name: "Face", inverse_of: :cnffused_human
28
28
  has_many :secret_interests, class_name: "Interest", inverse_of: :secret_human
29
29
  has_one :mixed_case_monkey
30
30
 
@@ -2,5 +2,6 @@
2
2
 
3
3
  class Invoice < ActiveRecord::Base
4
4
  has_many :line_items, autosave: true
5
- before_save { |record| record.balance = record.line_items.map(&:amount).sum }
5
+ has_many :shipping_lines, -> { from("shipping_lines") }, autosave: true
6
+ before_save { |record| record.balance = record.line_items.map(&:amount).compact.sum }
6
7
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class InvokesAnUndefinedMethod
4
+ this_method_is_undefined
5
+ end
@@ -2,4 +2,10 @@
2
2
 
3
3
  class LineItem < ActiveRecord::Base
4
4
  belongs_to :invoice, touch: true
5
+ has_many :discount_applications, class_name: "LineItemDiscountApplication"
6
+ end
7
+
8
+ class LineItemDiscountApplication < ActiveRecord::Base
9
+ belongs_to :line_item
10
+ belongs_to :discount
5
11
  end
@@ -5,13 +5,15 @@ class Member < ActiveRecord::Base
5
5
  has_one :selected_membership
6
6
  has_one :membership
7
7
  has_one :club, through: :current_membership
8
+ has_one :club_without_joins, through: :current_membership, source: :club, disable_joins: true
8
9
  has_one :selected_club, through: :selected_membership, source: :club
9
- has_one :favourite_club, -> { where "memberships.favourite = ?", true }, through: :membership, source: :club
10
+ has_one :favorite_club, -> { where "memberships.favorite = ?", true }, through: :membership, source: :club
10
11
  has_one :hairy_club, -> { where clubs: { name: "Moustache and Eyebrow Fancier Club" } }, through: :membership, source: :club
11
12
  has_one :sponsor, as: :sponsorable
12
13
  has_one :sponsor_club, through: :sponsor
13
14
  has_one :member_detail, inverse_of: false
14
15
  has_one :organization, through: :member_detail
16
+ has_one :organization_without_joins, through: :member_detail, disable_joins: true, source: :organization
15
17
  belongs_to :member_type
16
18
 
17
19
  has_many :nested_member_types, through: :member_detail, source: :member_type
@@ -27,16 +29,19 @@ class Member < ActiveRecord::Base
27
29
  has_one :general_club, -> { general }, through: :current_membership, source: :club
28
30
 
29
31
  has_many :super_memberships
30
- has_many :favourite_memberships, -> { where(favourite: true) }, class_name: "Membership"
31
- has_many :clubs, through: :favourite_memberships
32
+ has_many :favorite_memberships, -> { where(favorite: true) }, class_name: "Membership"
33
+ has_many :clubs, through: :favorite_memberships
32
34
 
33
35
  has_many :tenant_memberships
34
36
  has_many :tenant_clubs, through: :tenant_memberships, class_name: "Club", source: :club
35
37
 
36
- has_one :club_through_many, through: :favourite_memberships, source: :club
38
+ has_one :club_through_many, through: :favorite_memberships, source: :club
37
39
 
38
40
  belongs_to :admittable, polymorphic: true
39
41
  has_one :premium_club, through: :admittable
42
+
43
+ scope :unnamed, -> { where(name: nil) }
44
+ scope :with_member_type_id, -> (id) { where(member_type_id: id) }
40
45
  end
41
46
 
42
47
  class SelfMember < ActiveRecord::Base
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Membership < ActiveRecord::Base
4
- enum type: %i(Membership CurrentMembership SuperMembership SelectedMembership TenantMembership)
4
+ enum :type, %i(Membership CurrentMembership SuperMembership SelectedMembership TenantMembership)
5
5
  belongs_to :member
6
6
  belongs_to :club
7
7
  end
8
8
 
9
9
  class CurrentMembership < Membership
10
10
  belongs_to :member
11
- belongs_to :club
11
+ belongs_to :club, inverse_of: :membership
12
12
  end
13
13
 
14
14
  class SuperMembership < Membership
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Message < ActiveRecord::Base
4
- has_one :entry, as: :entryable
4
+ has_one :entry, as: :entryable, touch: true
5
+ has_many :recipients
5
6
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class NeedQuoting < ActiveRecord::Base
4
+ self.table_name = "\"1_need_quoting\""
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Paragraph < ActiveRecord::Base
4
+ belongs_to :book
5
+ end
@@ -5,7 +5,7 @@ class Parrot < ActiveRecord::Base
5
5
 
6
6
  has_and_belongs_to_many :pirates
7
7
  has_and_belongs_to_many :treasures
8
- has_many :loots, as: :looter
8
+ has_many :loots, as: :looter, class_name: "Treasure"
9
9
  alias_attribute :title, :name
10
10
 
11
11
  validates_presence_of :name
@@ -22,13 +22,16 @@ class Parrot < ActiveRecord::Base
22
22
  end
23
23
 
24
24
  def self.delete_all(*)
25
- connection.delete("DELETE FROM parrots_pirates")
26
- connection.delete("DELETE FROM parrots_treasures")
25
+ with_connection do |c|
26
+ c.delete("DELETE FROM parrots_pirates")
27
+ c.delete("DELETE FROM parrots_treasures")
28
+ end
27
29
  super
28
30
  end
29
31
  end
30
32
 
31
33
  class LiveParrot < Parrot
34
+ enum :breed, { african: 0, australian: 1 }
32
35
  end
33
36
 
34
37
  class DeadParrot < Parrot
@@ -17,8 +17,9 @@ class Person < ActiveRecord::Base
17
17
 
18
18
  has_many :references
19
19
  has_many :bad_references
20
- has_many :fixed_bad_references, -> { where favourite: true }, class_name: "BadReference"
21
- has_one :favourite_reference, -> { where "favourite=?", true }, class_name: "Reference"
20
+ has_many :fixed_bad_references, -> { where favorite: true }, class_name: "BadReference"
21
+ has_one :favorite_reference, -> { where favorite: true }, class_name: "Reference"
22
+ has_one :favorite_reference_job, through: :favorite_reference, source: :job
22
23
  has_many :posts_with_comments_sorted_by_comment_id, -> { includes(:comments).order("comments.id") }, through: :readers, source: :post
23
24
  has_many :first_posts, -> { where(id: [1, 2]) }, through: :readers
24
25
 
@@ -39,6 +40,8 @@ class Person < ActiveRecord::Base
39
40
  has_many :essays, primary_key: "first_name", foreign_key: "writer_id"
40
41
 
41
42
  scope :males, -> { where(gender: "M") }
43
+
44
+ attr_readonly :born_at
42
45
  end
43
46
 
44
47
  class PersonWithDependentDestroyJobs < ActiveRecord::Base
@@ -125,7 +128,7 @@ class NestedPerson < ActiveRecord::Base
125
128
  end
126
129
  end
127
130
 
128
- class Insure
131
+ module Insure
129
132
  INSURES = %W{life annuality}
130
133
 
131
134
  def self.load(mask)
@@ -143,5 +146,5 @@ end
143
146
  class SerializedPerson < ActiveRecord::Base
144
147
  self.table_name = "people"
145
148
 
146
- serialize :insures, Insure
149
+ serialize :insures, coder: Insure
147
150
  end
@@ -44,6 +44,9 @@ class Pirate < ActiveRecord::Base
44
44
 
45
45
  has_one :foo_bulb, -> { where name: "foo" }, foreign_key: :car_id, class_name: "Bulb"
46
46
 
47
+ has_many :mateys, foreign_key: :pirate_id
48
+ has_one :attacker_matey, foreign_key: :target_id, class_name: "Matey"
49
+
47
50
  accepts_nested_attributes_for :parrots, :birds, allow_destroy: true, reject_if: proc(&:empty?)
48
51
  accepts_nested_attributes_for :ship, allow_destroy: true, reject_if: proc(&:empty?)
49
52
  accepts_nested_attributes_for :update_only_ship, update_only: true
@@ -95,7 +98,7 @@ end
95
98
 
96
99
  class FamousPirate < ActiveRecord::Base
97
100
  self.table_name = "pirates"
98
- has_many :famous_ships, inverse_of: :famous_pirate, foreign_key: :pirate_id
101
+ has_many :famous_ships, inverse_of: :famous_pirate
99
102
  validates_presence_of :catchphrase, on: :conference
100
103
  end
101
104
 
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PkAutopopulatedByATriggerRecord < ActiveRecord::Base
4
+ self.primary_key = :id
5
+ end