active_cached_resource 0.0.1.pre

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 (340) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +22 -0
  4. data/.standard.yml +2 -0
  5. data/CHANGELOG.md +5 -0
  6. data/README.md +45 -0
  7. data/Rakefile +21 -0
  8. data/example/consumer/.dockerignore +41 -0
  9. data/example/consumer/.gitattributes +9 -0
  10. data/example/consumer/.gitignore +36 -0
  11. data/example/consumer/.kamal/hooks/docker-setup.sample +3 -0
  12. data/example/consumer/.kamal/hooks/post-deploy.sample +14 -0
  13. data/example/consumer/.kamal/hooks/post-proxy-reboot.sample +3 -0
  14. data/example/consumer/.kamal/hooks/pre-build.sample +51 -0
  15. data/example/consumer/.kamal/hooks/pre-connect.sample +47 -0
  16. data/example/consumer/.kamal/hooks/pre-deploy.sample +109 -0
  17. data/example/consumer/.kamal/hooks/pre-proxy-reboot.sample +3 -0
  18. data/example/consumer/.kamal/secrets +17 -0
  19. data/example/consumer/Dockerfile +65 -0
  20. data/example/consumer/Gemfile +17 -0
  21. data/example/consumer/Rakefile +6 -0
  22. data/example/consumer/app/controllers/application_controller.rb +2 -0
  23. data/example/consumer/app/controllers/concerns/.keep +0 -0
  24. data/example/consumer/app/jobs/application_job.rb +7 -0
  25. data/example/consumer/app/mailers/application_mailer.rb +4 -0
  26. data/example/consumer/app/models/application_record.rb +3 -0
  27. data/example/consumer/app/models/concerns/.keep +0 -0
  28. data/example/consumer/app/models/person.rb +9 -0
  29. data/example/consumer/app/views/layouts/mailer.html.erb +13 -0
  30. data/example/consumer/app/views/layouts/mailer.text.erb +1 -0
  31. data/example/consumer/bin/brakeman +7 -0
  32. data/example/consumer/bin/bundle +109 -0
  33. data/example/consumer/bin/dev +2 -0
  34. data/example/consumer/bin/docker-entrypoint +14 -0
  35. data/example/consumer/bin/jobs +6 -0
  36. data/example/consumer/bin/kamal +27 -0
  37. data/example/consumer/bin/rails +4 -0
  38. data/example/consumer/bin/rake +4 -0
  39. data/example/consumer/bin/rubocop +8 -0
  40. data/example/consumer/bin/setup +34 -0
  41. data/example/consumer/bin/thrust +5 -0
  42. data/example/consumer/config/application.rb +20 -0
  43. data/example/consumer/config/boot.rb +3 -0
  44. data/example/consumer/config/cache.yml +16 -0
  45. data/example/consumer/config/credentials.yml.enc +1 -0
  46. data/example/consumer/config/database.yml +14 -0
  47. data/example/consumer/config/deploy.yml +116 -0
  48. data/example/consumer/config/environment.rb +5 -0
  49. data/example/consumer/config/environments/development.rb +64 -0
  50. data/example/consumer/config/environments/production.rb +85 -0
  51. data/example/consumer/config/environments/test.rb +50 -0
  52. data/example/consumer/config/initializers/cors.rb +16 -0
  53. data/example/consumer/config/initializers/filter_parameter_logging.rb +8 -0
  54. data/example/consumer/config/initializers/inflections.rb +16 -0
  55. data/example/consumer/config/locales/en.yml +31 -0
  56. data/example/consumer/config/puma.rb +41 -0
  57. data/example/consumer/config/queue.yml +18 -0
  58. data/example/consumer/config/recurring.yml +10 -0
  59. data/example/consumer/config/routes.rb +10 -0
  60. data/example/consumer/config.ru +6 -0
  61. data/example/consumer/db/cache_schema.rb +14 -0
  62. data/example/consumer/db/queue_schema.rb +129 -0
  63. data/example/consumer/db/seeds.rb +0 -0
  64. data/example/consumer/lib/tasks/.keep +0 -0
  65. data/example/consumer/log/.keep +0 -0
  66. data/example/consumer/public/robots.txt +1 -0
  67. data/example/consumer/script/.keep +0 -0
  68. data/example/consumer/storage/.keep +0 -0
  69. data/example/consumer/tmp/.keep +0 -0
  70. data/example/consumer/tmp/cache/.keep +0 -0
  71. data/example/consumer/tmp/pids/.keep +0 -0
  72. data/example/consumer/tmp/storage/.keep +0 -0
  73. data/example/consumer/vendor/.keep +0 -0
  74. data/example/provider/.dockerignore +41 -0
  75. data/example/provider/.gitattributes +9 -0
  76. data/example/provider/.gitignore +32 -0
  77. data/example/provider/.kamal/hooks/docker-setup.sample +3 -0
  78. data/example/provider/.kamal/hooks/post-deploy.sample +14 -0
  79. data/example/provider/.kamal/hooks/post-proxy-reboot.sample +3 -0
  80. data/example/provider/.kamal/hooks/pre-build.sample +51 -0
  81. data/example/provider/.kamal/hooks/pre-connect.sample +47 -0
  82. data/example/provider/.kamal/hooks/pre-deploy.sample +109 -0
  83. data/example/provider/.kamal/hooks/pre-proxy-reboot.sample +3 -0
  84. data/example/provider/.kamal/secrets +17 -0
  85. data/example/provider/Dockerfile +65 -0
  86. data/example/provider/Gemfile +14 -0
  87. data/example/provider/Rakefile +6 -0
  88. data/example/provider/app/controllers/application_controller.rb +2 -0
  89. data/example/provider/app/controllers/concerns/.keep +0 -0
  90. data/example/provider/app/controllers/people_controller.rb +68 -0
  91. data/example/provider/app/jobs/application_job.rb +7 -0
  92. data/example/provider/app/mailers/application_mailer.rb +4 -0
  93. data/example/provider/app/models/address.rb +3 -0
  94. data/example/provider/app/models/application_record.rb +3 -0
  95. data/example/provider/app/models/company.rb +3 -0
  96. data/example/provider/app/models/concerns/.keep +0 -0
  97. data/example/provider/app/models/person.rb +6 -0
  98. data/example/provider/app/views/layouts/mailer.html.erb +13 -0
  99. data/example/provider/app/views/layouts/mailer.text.erb +1 -0
  100. data/example/provider/bin/brakeman +7 -0
  101. data/example/provider/bin/bundle +109 -0
  102. data/example/provider/bin/dev +2 -0
  103. data/example/provider/bin/docker-entrypoint +14 -0
  104. data/example/provider/bin/jobs +6 -0
  105. data/example/provider/bin/kamal +27 -0
  106. data/example/provider/bin/rails +4 -0
  107. data/example/provider/bin/rake +4 -0
  108. data/example/provider/bin/rubocop +8 -0
  109. data/example/provider/bin/setup +34 -0
  110. data/example/provider/bin/thrust +5 -0
  111. data/example/provider/config/application.rb +44 -0
  112. data/example/provider/config/boot.rb +3 -0
  113. data/example/provider/config/cache.yml +16 -0
  114. data/example/provider/config/credentials.yml.enc +1 -0
  115. data/example/provider/config/database.yml +20 -0
  116. data/example/provider/config/deploy.yml +116 -0
  117. data/example/provider/config/environment.rb +5 -0
  118. data/example/provider/config/environments/development.rb +64 -0
  119. data/example/provider/config/environments/production.rb +85 -0
  120. data/example/provider/config/environments/test.rb +50 -0
  121. data/example/provider/config/initializers/cors.rb +16 -0
  122. data/example/provider/config/initializers/filter_parameter_logging.rb +8 -0
  123. data/example/provider/config/initializers/inflections.rb +16 -0
  124. data/example/provider/config/locales/en.yml +31 -0
  125. data/example/provider/config/puma.rb +41 -0
  126. data/example/provider/config/queue.yml +18 -0
  127. data/example/provider/config/recurring.yml +10 -0
  128. data/example/provider/config/routes.rb +4 -0
  129. data/example/provider/config.ru +6 -0
  130. data/example/provider/db/cache_schema.rb +14 -0
  131. data/example/provider/db/migrate/20241202183937_create_people.rb +11 -0
  132. data/example/provider/db/migrate/20241202183955_create_addresses.rb +13 -0
  133. data/example/provider/db/migrate/20241202184017_create_companies.rb +14 -0
  134. data/example/provider/db/queue_schema.rb +129 -0
  135. data/example/provider/db/schema.rb +47 -0
  136. data/example/provider/db/seeds.rb +18 -0
  137. data/example/provider/lib/tasks/.keep +0 -0
  138. data/example/provider/log/.keep +0 -0
  139. data/example/provider/public/robots.txt +1 -0
  140. data/example/provider/script/.keep +0 -0
  141. data/example/provider/storage/.keep +0 -0
  142. data/example/provider/tmp/.keep +0 -0
  143. data/example/provider/tmp/pids/.keep +0 -0
  144. data/example/provider/tmp/storage/.keep +0 -0
  145. data/example/provider/vendor/.keep +0 -0
  146. data/lib/active_cached_resource/caching.rb +176 -0
  147. data/lib/active_cached_resource/caching_strategies/active_support_cache.rb +31 -0
  148. data/lib/active_cached_resource/caching_strategies/base.rb +114 -0
  149. data/lib/active_cached_resource/caching_strategies/sql_cache.rb +32 -0
  150. data/lib/active_cached_resource/configuration.rb +50 -0
  151. data/lib/active_cached_resource/logger.rb +22 -0
  152. data/lib/active_cached_resource/model.rb +33 -0
  153. data/lib/active_cached_resource/version.rb +12 -0
  154. data/lib/active_cached_resource.rb +64 -0
  155. data/lib/activeresource/.gitignore +15 -0
  156. data/lib/activeresource/README.md +283 -0
  157. data/lib/activeresource/examples/performance.rb +72 -0
  158. data/lib/activeresource/lib/active_resource/active_job_serializer.rb +26 -0
  159. data/lib/activeresource/lib/active_resource/associations/builder/association.rb +32 -0
  160. data/lib/activeresource/lib/active_resource/associations/builder/belongs_to.rb +16 -0
  161. data/lib/activeresource/lib/active_resource/associations/builder/has_many.rb +14 -0
  162. data/lib/activeresource/lib/active_resource/associations/builder/has_one.rb +14 -0
  163. data/lib/activeresource/lib/active_resource/associations.rb +175 -0
  164. data/lib/activeresource/lib/active_resource/base.rb +1741 -0
  165. data/lib/activeresource/lib/active_resource/callbacks.rb +22 -0
  166. data/lib/activeresource/lib/active_resource/collection.rb +214 -0
  167. data/lib/activeresource/lib/active_resource/connection.rb +298 -0
  168. data/lib/activeresource/lib/active_resource/custom_methods.rb +129 -0
  169. data/lib/activeresource/lib/active_resource/exceptions.rb +98 -0
  170. data/lib/activeresource/lib/active_resource/formats/json_format.rb +28 -0
  171. data/lib/activeresource/lib/active_resource/formats/xml_format.rb +27 -0
  172. data/lib/activeresource/lib/active_resource/formats.rb +24 -0
  173. data/lib/activeresource/lib/active_resource/http_mock.rb +386 -0
  174. data/lib/activeresource/lib/active_resource/inheriting_hash.rb +34 -0
  175. data/lib/activeresource/lib/active_resource/log_subscriber.rb +26 -0
  176. data/lib/activeresource/lib/active_resource/railtie.rb +31 -0
  177. data/lib/activeresource/lib/active_resource/reflection.rb +78 -0
  178. data/lib/activeresource/lib/active_resource/schema.rb +60 -0
  179. data/lib/activeresource/lib/active_resource/singleton.rb +111 -0
  180. data/lib/activeresource/lib/active_resource/threadsafe_attributes.rb +65 -0
  181. data/lib/activeresource/lib/active_resource/validations.rb +176 -0
  182. data/lib/activeresource/lib/active_resource.rb +49 -0
  183. data/lib/activeresource/lib/activeresource.rb +3 -0
  184. data/lib/activeresource/test/abstract_unit.rb +153 -0
  185. data/lib/activeresource/test/cases/active_job_serializer_test.rb +53 -0
  186. data/lib/activeresource/test/cases/association_test.rb +104 -0
  187. data/lib/activeresource/test/cases/associations/builder/belongs_to_test.rb +42 -0
  188. data/lib/activeresource/test/cases/associations/builder/has_many_test.rb +28 -0
  189. data/lib/activeresource/test/cases/associations/builder/has_one_test.rb +28 -0
  190. data/lib/activeresource/test/cases/authorization_test.rb +276 -0
  191. data/lib/activeresource/test/cases/base/custom_methods_test.rb +155 -0
  192. data/lib/activeresource/test/cases/base/equality_test.rb +53 -0
  193. data/lib/activeresource/test/cases/base/load_test.rb +249 -0
  194. data/lib/activeresource/test/cases/base/schema_test.rb +428 -0
  195. data/lib/activeresource/test/cases/base_errors_test.rb +129 -0
  196. data/lib/activeresource/test/cases/base_test.rb +1622 -0
  197. data/lib/activeresource/test/cases/callbacks_test.rb +155 -0
  198. data/lib/activeresource/test/cases/collection_test.rb +172 -0
  199. data/lib/activeresource/test/cases/connection_test.rb +357 -0
  200. data/lib/activeresource/test/cases/finder_test.rb +217 -0
  201. data/lib/activeresource/test/cases/format_test.rb +137 -0
  202. data/lib/activeresource/test/cases/http_mock_test.rb +213 -0
  203. data/lib/activeresource/test/cases/inheritence_test.rb +19 -0
  204. data/lib/activeresource/test/cases/inheriting_hash_test.rb +25 -0
  205. data/lib/activeresource/test/cases/log_subscriber_test.rb +63 -0
  206. data/lib/activeresource/test/cases/reflection_test.rb +65 -0
  207. data/lib/activeresource/test/cases/validations_test.rb +78 -0
  208. data/lib/activeresource/test/fixtures/address.rb +20 -0
  209. data/lib/activeresource/test/fixtures/beast.rb +16 -0
  210. data/lib/activeresource/test/fixtures/comment.rb +5 -0
  211. data/lib/activeresource/test/fixtures/customer.rb +5 -0
  212. data/lib/activeresource/test/fixtures/inventory.rb +14 -0
  213. data/lib/activeresource/test/fixtures/person.rb +15 -0
  214. data/lib/activeresource/test/fixtures/pet.rb +6 -0
  215. data/lib/activeresource/test/fixtures/post.rb +5 -0
  216. data/lib/activeresource/test/fixtures/product.rb +11 -0
  217. data/lib/activeresource/test/fixtures/project.rb +19 -0
  218. data/lib/activeresource/test/fixtures/proxy.rb +6 -0
  219. data/lib/activeresource/test/fixtures/sound.rb +11 -0
  220. data/lib/activeresource/test/fixtures/street_address.rb +6 -0
  221. data/lib/activeresource/test/fixtures/subscription_plan.rb +7 -0
  222. data/lib/activeresource/test/fixtures/weather.rb +21 -0
  223. data/lib/activeresource/test/setter_trap.rb +28 -0
  224. data/lib/activeresource/test/singleton_test.rb +138 -0
  225. data/lib/activeresource/test/threadsafe_attributes_test.rb +91 -0
  226. data/lib/generators/active_cached_resource/install_generator.rb +31 -0
  227. data/lib/generators/active_cached_resource/templates/migration.erb +16 -0
  228. data/sorbet/config +4 -0
  229. data/sorbet/rbi/annotations/.gitattributes +1 -0
  230. data/sorbet/rbi/annotations/activemodel.rbi +89 -0
  231. data/sorbet/rbi/annotations/activesupport.rbi +457 -0
  232. data/sorbet/rbi/annotations/minitest.rbi +119 -0
  233. data/sorbet/rbi/annotations/rainbow.rbi +269 -0
  234. data/sorbet/rbi/dsl/.gitattributes +1 -0
  235. data/sorbet/rbi/dsl/active_support/callbacks.rbi +21 -0
  236. data/sorbet/rbi/gems/.gitattributes +1 -0
  237. data/sorbet/rbi/gems/actioncable@8.0.0.rbi +252 -0
  238. data/sorbet/rbi/gems/actionmailbox@8.0.0.rbi +9 -0
  239. data/sorbet/rbi/gems/actionmailer@8.0.0.rbi +9 -0
  240. data/sorbet/rbi/gems/actionpack@8.0.0.rbi +20909 -0
  241. data/sorbet/rbi/gems/actiontext@8.0.0.rbi +9 -0
  242. data/sorbet/rbi/gems/actionview@8.0.0.rbi +16207 -0
  243. data/sorbet/rbi/gems/activejob@8.0.0.rbi +9 -0
  244. data/sorbet/rbi/gems/activemodel-serializers-xml@1.0.3.rbi +166 -0
  245. data/sorbet/rbi/gems/activemodel@8.0.0.rbi +6857 -0
  246. data/sorbet/rbi/gems/activerecord@8.0.0.rbi +42896 -0
  247. data/sorbet/rbi/gems/activeresource@6.1.4.rbi +3944 -0
  248. data/sorbet/rbi/gems/activestorage@8.0.0.rbi +9 -0
  249. data/sorbet/rbi/gems/activesupport@8.0.0.rbi +21251 -0
  250. data/sorbet/rbi/gems/ast@2.4.2.rbi +585 -0
  251. data/sorbet/rbi/gems/base64@0.2.0.rbi +509 -0
  252. data/sorbet/rbi/gems/benchmark@0.4.0.rbi +618 -0
  253. data/sorbet/rbi/gems/bigdecimal@3.1.8.rbi +78 -0
  254. data/sorbet/rbi/gems/builder@3.3.0.rbi +9 -0
  255. data/sorbet/rbi/gems/bump@0.10.0.rbi +169 -0
  256. data/sorbet/rbi/gems/byebug@11.1.3.rbi +3607 -0
  257. data/sorbet/rbi/gems/coderay@1.1.3.rbi +3427 -0
  258. data/sorbet/rbi/gems/concurrent-ruby@1.3.4.rbi +11645 -0
  259. data/sorbet/rbi/gems/connection_pool@2.4.1.rbi +9 -0
  260. data/sorbet/rbi/gems/crass@1.0.6.rbi +623 -0
  261. data/sorbet/rbi/gems/date@3.4.0.rbi +75 -0
  262. data/sorbet/rbi/gems/diff-lcs@1.5.1.rbi +1131 -0
  263. data/sorbet/rbi/gems/docile@1.4.1.rbi +377 -0
  264. data/sorbet/rbi/gems/drb@2.2.1.rbi +1347 -0
  265. data/sorbet/rbi/gems/erubi@1.13.0.rbi +150 -0
  266. data/sorbet/rbi/gems/globalid@1.2.1.rbi +9 -0
  267. data/sorbet/rbi/gems/i18n@1.14.6.rbi +2359 -0
  268. data/sorbet/rbi/gems/io-console@0.7.2.rbi +9 -0
  269. data/sorbet/rbi/gems/json@2.8.2.rbi +1901 -0
  270. data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14238 -0
  271. data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +240 -0
  272. data/sorbet/rbi/gems/logger@1.6.1.rbi +920 -0
  273. data/sorbet/rbi/gems/loofah@2.23.1.rbi +1081 -0
  274. data/sorbet/rbi/gems/mail@2.8.1.rbi +9 -0
  275. data/sorbet/rbi/gems/marcel@1.0.4.rbi +9 -0
  276. data/sorbet/rbi/gems/method_source@1.1.0.rbi +304 -0
  277. data/sorbet/rbi/gems/mini_mime@1.1.5.rbi +9 -0
  278. data/sorbet/rbi/gems/minitest@5.25.2.rbi +1547 -0
  279. data/sorbet/rbi/gems/net-imap@0.5.1.rbi +9 -0
  280. data/sorbet/rbi/gems/net-pop@0.1.2.rbi +9 -0
  281. data/sorbet/rbi/gems/net-protocol@0.2.2.rbi +292 -0
  282. data/sorbet/rbi/gems/net-smtp@0.5.0.rbi +9 -0
  283. data/sorbet/rbi/gems/netrc@0.11.0.rbi +159 -0
  284. data/sorbet/rbi/gems/nio4r@2.7.4.rbi +9 -0
  285. data/sorbet/rbi/gems/nokogiri@1.16.7.rbi +7311 -0
  286. data/sorbet/rbi/gems/parallel@1.26.3.rbi +291 -0
  287. data/sorbet/rbi/gems/parser@3.3.6.0.rbi +5519 -0
  288. data/sorbet/rbi/gems/prism@1.2.0.rbi +39085 -0
  289. data/sorbet/rbi/gems/pry-byebug@3.10.1.rbi +1151 -0
  290. data/sorbet/rbi/gems/pry@0.14.2.rbi +10076 -0
  291. data/sorbet/rbi/gems/psych@5.2.0.rbi +1785 -0
  292. data/sorbet/rbi/gems/racc@1.8.1.rbi +162 -0
  293. data/sorbet/rbi/gems/rack-session@2.0.0.rbi +727 -0
  294. data/sorbet/rbi/gems/rack-test@2.1.0.rbi +747 -0
  295. data/sorbet/rbi/gems/rack@3.1.8.rbi +4905 -0
  296. data/sorbet/rbi/gems/rackup@2.2.1.rbi +230 -0
  297. data/sorbet/rbi/gems/rails-dom-testing@2.2.0.rbi +758 -0
  298. data/sorbet/rbi/gems/rails-html-sanitizer@1.6.0.rbi +785 -0
  299. data/sorbet/rbi/gems/rails@8.0.0.rbi +9 -0
  300. data/sorbet/rbi/gems/railties@8.0.0.rbi +6287 -0
  301. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +403 -0
  302. data/sorbet/rbi/gems/rake@13.2.1.rbi +3091 -0
  303. data/sorbet/rbi/gems/rbi@0.2.1.rbi +4535 -0
  304. data/sorbet/rbi/gems/rdoc@6.8.1.rbi +12572 -0
  305. data/sorbet/rbi/gems/regexp_parser@2.9.2.rbi +3772 -0
  306. data/sorbet/rbi/gems/reline@0.5.12.rbi +2416 -0
  307. data/sorbet/rbi/gems/rexml@3.3.9.rbi +4858 -0
  308. data/sorbet/rbi/gems/rspec-core@3.13.2.rbi +11287 -0
  309. data/sorbet/rbi/gems/rspec-expectations@3.13.3.rbi +8183 -0
  310. data/sorbet/rbi/gems/rspec-mocks@3.13.2.rbi +5341 -0
  311. data/sorbet/rbi/gems/rspec-support@3.13.1.rbi +1630 -0
  312. data/sorbet/rbi/gems/rspec@3.13.0.rbi +83 -0
  313. data/sorbet/rbi/gems/rubocop-ast@1.36.1.rbi +7303 -0
  314. data/sorbet/rbi/gems/rubocop-performance@1.21.1.rbi +9 -0
  315. data/sorbet/rbi/gems/rubocop@1.65.1.rbi +58170 -0
  316. data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1318 -0
  317. data/sorbet/rbi/gems/securerandom@0.3.2.rbi +395 -0
  318. data/sorbet/rbi/gems/simplecov-html@0.13.1.rbi +225 -0
  319. data/sorbet/rbi/gems/simplecov@0.22.0.rbi +2149 -0
  320. data/sorbet/rbi/gems/simplecov_json_formatter@0.1.4.rbi +9 -0
  321. data/sorbet/rbi/gems/spoom@1.5.0.rbi +4932 -0
  322. data/sorbet/rbi/gems/standard-custom@1.0.2.rbi +9 -0
  323. data/sorbet/rbi/gems/standard-performance@1.4.0.rbi +9 -0
  324. data/sorbet/rbi/gems/standard@1.40.0.rbi +929 -0
  325. data/sorbet/rbi/gems/stringio@3.1.2.rbi +9 -0
  326. data/sorbet/rbi/gems/tapioca@0.16.4.rbi +3597 -0
  327. data/sorbet/rbi/gems/thor@1.3.2.rbi +4378 -0
  328. data/sorbet/rbi/gems/timeout@0.4.2.rbi +151 -0
  329. data/sorbet/rbi/gems/tzinfo@2.0.6.rbi +5918 -0
  330. data/sorbet/rbi/gems/unicode-display_width@2.6.0.rbi +66 -0
  331. data/sorbet/rbi/gems/uri@1.0.2.rbi +2377 -0
  332. data/sorbet/rbi/gems/useragent@0.16.10.rbi +9 -0
  333. data/sorbet/rbi/gems/websocket-driver@0.7.6.rbi +9 -0
  334. data/sorbet/rbi/gems/websocket-extensions@0.1.5.rbi +9 -0
  335. data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +435 -0
  336. data/sorbet/rbi/gems/yard@0.9.37.rbi +18504 -0
  337. data/sorbet/rbi/gems/zeitwerk@2.7.1.rbi +9 -0
  338. data/sorbet/tapioca/config.yml +13 -0
  339. data/sorbet/tapioca/require.rb +12 -0
  340. metadata +543 -0
@@ -0,0 +1,217 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "abstract_unit"
4
+ require "fixtures/person"
5
+ require "fixtures/customer"
6
+ require "fixtures/street_address"
7
+ require "fixtures/beast"
8
+ require "fixtures/proxy"
9
+ require "fixtures/pet"
10
+ require "active_support/core_ext/hash/conversions"
11
+
12
+ class FinderTest < ActiveSupport::TestCase
13
+ def setup
14
+ setup_response # find me in abstract_unit
15
+ end
16
+
17
+ def test_find_by_id
18
+ matz = Person.find(1)
19
+ assert_kind_of Person, matz
20
+ assert_equal "Matz", matz.name
21
+ assert matz.name?
22
+ end
23
+
24
+ def test_find_by_id_with_custom_prefix
25
+ addy = StreetAddress.find(1, params: { person_id: 1 })
26
+ assert_kind_of StreetAddress, addy
27
+ assert_equal "12345 Street", addy.street
28
+ end
29
+
30
+ def test_find_all
31
+ all = Person.find(:all)
32
+ assert_equal 2, all.size
33
+ assert_kind_of Person, all.first
34
+ assert_equal "Matz", all.first.name
35
+ assert_equal "David", all.last.name
36
+ end
37
+
38
+ def test_all
39
+ all = Person.all
40
+ assert_equal 2, all.size
41
+ assert_kind_of Person, all.first
42
+ assert_equal "Matz", all.first.name
43
+ assert_equal "David", all.last.name
44
+ end
45
+
46
+ def test_all_with_params
47
+ all = StreetAddress.all(params: { person_id: 1 })
48
+ assert_equal 1, all.size
49
+ assert_kind_of StreetAddress, all.first
50
+ end
51
+
52
+ def test_where
53
+ people = Person.where
54
+ assert_equal 2, people.size
55
+ assert_kind_of Person, people.first
56
+ assert_equal "Matz", people.first.name
57
+ assert_equal "David", people.last.name
58
+ end
59
+
60
+ def test_where_with_clauses
61
+ addresses = StreetAddress.where(person_id: 1)
62
+ assert_equal 1, addresses.size
63
+ assert_kind_of StreetAddress, addresses.first
64
+ end
65
+
66
+ def test_where_with_clause_in
67
+ ActiveResource::HttpMock.respond_to { |m| m.get "/people.json?id%5B%5D=2", {}, @people_david }
68
+ people = Person.where(id: [2])
69
+ assert_equal 1, people.size
70
+ assert_kind_of Person, people.first
71
+ assert_equal "David", people.first.name
72
+ end
73
+
74
+ def test_where_with_invalid_clauses
75
+ error = assert_raise(ArgumentError) { Person.where(nil) }
76
+ assert_equal "expected a clauses Hash, got nil", error.message
77
+ end
78
+
79
+ def test_find_first
80
+ matz = Person.find(:first)
81
+ assert_kind_of Person, matz
82
+ assert_equal "Matz", matz.name
83
+ end
84
+
85
+ def test_first
86
+ matz = Person.first
87
+ assert_kind_of Person, matz
88
+ assert_equal "Matz", matz.name
89
+ end
90
+
91
+ def test_first_with_params
92
+ addy = StreetAddress.first(params: { person_id: 1 })
93
+ assert_kind_of StreetAddress, addy
94
+ assert_equal "12345 Street", addy.street
95
+ end
96
+
97
+ def test_find_last
98
+ david = Person.find(:last)
99
+ assert_kind_of Person, david
100
+ assert_equal "David", david.name
101
+ end
102
+
103
+ def test_last
104
+ david = Person.last
105
+ assert_kind_of Person, david
106
+ assert_equal "David", david.name
107
+ end
108
+
109
+ def test_last_with_params
110
+ addy = StreetAddress.last(params: { person_id: 1 })
111
+ assert_kind_of StreetAddress, addy
112
+ assert_equal "12345 Street", addy.street
113
+ end
114
+
115
+ def test_find_by_id_not_found
116
+ assert_raise(ActiveResource::ResourceNotFound) { Person.find(99) }
117
+ assert_raise(ActiveResource::ResourceNotFound) { StreetAddress.find(99, params: { person_id: 1 }) }
118
+ end
119
+
120
+ def test_find_all_sub_objects
121
+ all = StreetAddress.find(:all, params: { person_id: 1 })
122
+ assert_equal 1, all.size
123
+ assert_kind_of StreetAddress, all.first
124
+ assert_equal ({ person_id: 1 }), all.first.prefix_options
125
+ end
126
+
127
+ def test_find_all_sub_objects_not_found
128
+ assert_nothing_raised do
129
+ StreetAddress.find(:all, params: { person_id: 2 })
130
+ end
131
+ end
132
+
133
+ def test_find_all_by_from
134
+ ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/people.json", {}, @people_david }
135
+
136
+ people = Person.find(:all, from: "/companies/1/people.json")
137
+ assert_equal 1, people.size
138
+ assert_equal "David", people.first.name
139
+ end
140
+
141
+ def test_find_all_by_from_with_options
142
+ ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/people.json", {}, @people_david }
143
+
144
+ people = Person.find(:all, from: "/companies/1/people.json")
145
+ assert_equal 1, people.size
146
+ assert_equal "David", people.first.name
147
+ end
148
+
149
+ def test_find_all_by_from_with_prefix
150
+ ActiveResource::HttpMock.respond_to { |m| m.get "/dogs.json", {}, @pets }
151
+
152
+ pets = Pet.find(:all, from: "/dogs.json", params: { person_id: 1 })
153
+ assert_equal 2, pets.size
154
+ assert_equal "Max", pets.first.name
155
+ assert_equal ({ person_id: 1 }), pets.first.prefix_options
156
+
157
+ assert_equal "Daisy", pets.second.name
158
+ assert_equal ({ person_id: 1 }), pets.second.prefix_options
159
+ end
160
+
161
+ def test_find_all_by_symbol_from
162
+ ActiveResource::HttpMock.respond_to { |m| m.get "/people/managers.json", {}, @people_david }
163
+
164
+ people = Person.find(:all, from: :managers)
165
+ assert_equal 1, people.size
166
+ assert_equal "David", people.first.name
167
+ end
168
+
169
+ def test_find_all_by_symbol_from_with_prefix
170
+ ActiveResource::HttpMock.respond_to { |m| m.get "/people/1/pets/dogs.json", {}, @pets }
171
+
172
+ pets = Pet.find(:all, from: :dogs, params: { person_id: 1 })
173
+ assert_equal 2, pets.size
174
+ assert_equal "Max", pets.first.name
175
+ assert_equal ({ person_id: 1 }), pets.first.prefix_options
176
+
177
+ assert_equal "Daisy", pets.second.name
178
+ assert_equal ({ person_id: 1 }), pets.second.prefix_options
179
+ end
180
+
181
+ def test_find_first_or_last_not_found
182
+ ActiveResource::HttpMock.respond_to { |m| m.get "/people.json", {}, "", 404 }
183
+
184
+ assert_nothing_raised { Person.find(:first) }
185
+ assert_nothing_raised { Person.find(:last) }
186
+ end
187
+
188
+ def test_find_single_by_from
189
+ ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/manager.json", {}, @david }
190
+
191
+ david = Person.find(:one, from: "/companies/1/manager.json")
192
+ assert_equal "David", david.name
193
+ end
194
+
195
+ def test_find_single_by_symbol_from
196
+ ActiveResource::HttpMock.respond_to { |m| m.get "/people/leader.json", {}, @david }
197
+
198
+ david = Person.find(:one, from: :leader)
199
+ assert_equal "David", david.name
200
+ end
201
+
202
+ def test_find_identifier_encoding
203
+ ActiveResource::HttpMock.respond_to { |m| m.get "/people/%3F.json", {}, @david }
204
+
205
+ david = Person.find("?")
206
+
207
+ assert_equal "David", david.name
208
+ end
209
+
210
+ def test_find_identifier_encoding_for_path_traversal
211
+ ActiveResource::HttpMock.respond_to { |m| m.get "/people/..%2F.json", {}, @david }
212
+
213
+ david = Person.find("../")
214
+
215
+ assert_equal "David", david.name
216
+ end
217
+ end
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "abstract_unit"
4
+ require "fixtures/person"
5
+ require "fixtures/street_address"
6
+
7
+ class FormatTest < ActiveSupport::TestCase
8
+ def setup
9
+ @matz = { id: 1, name: "Matz" }
10
+ @david = { id: 2, name: "David" }
11
+
12
+ @programmers = [ @matz, @david ]
13
+ end
14
+
15
+ def test_http_format_header_name
16
+ [:get, :head].each do |verb|
17
+ header_name = ActiveResource::Connection::HTTP_FORMAT_HEADER_NAMES[verb]
18
+ assert_equal "Accept", header_name
19
+ end
20
+
21
+ [:patch, :put, :post].each do |verb|
22
+ header_name = ActiveResource::Connection::HTTP_FORMAT_HEADER_NAMES[verb]
23
+ assert_equal "Content-Type", header_name
24
+ end
25
+ end
26
+
27
+ def test_formats_on_single_element
28
+ [ :json, :xml ].each do |format|
29
+ using_format(Person, format) do
30
+ ActiveResource::HttpMock.respond_to.get "/people/1.#{format}", { "Accept" => ActiveResource::Formats[format].mime_type }, ActiveResource::Formats[format].encode(@david)
31
+ assert_equal @david[:name], Person.find(1).name
32
+ end
33
+ end
34
+ end
35
+
36
+ def test_formats_on_collection
37
+ [ :json, :xml ].each do |format|
38
+ using_format(Person, format) do
39
+ ActiveResource::HttpMock.respond_to.get "/people.#{format}", { "Accept" => ActiveResource::Formats[format].mime_type }, ActiveResource::Formats[format].encode(@programmers)
40
+ remote_programmers = Person.find(:all)
41
+ assert_equal 2, remote_programmers.size
42
+ assert remote_programmers.find { |p| p.name == "David" }
43
+ end
44
+ end
45
+ end
46
+
47
+ def test_formats_on_custom_collection_method
48
+ [ :json, :xml ].each do |format|
49
+ using_format(Person, format) do
50
+ ActiveResource::HttpMock.respond_to.get "/people/retrieve.#{format}?name=David", { "Accept" => ActiveResource::Formats[format].mime_type }, ActiveResource::Formats[format].encode([@david])
51
+ remote_programmers = Person.get(:retrieve, name: "David")
52
+ assert_equal 1, remote_programmers.size
53
+ assert_equal @david[:id], remote_programmers[0]["id"]
54
+ assert_equal @david[:name], remote_programmers[0]["name"]
55
+ end
56
+ end
57
+ end
58
+
59
+ def test_formats_on_custom_element_method
60
+ [:json, :xml].each do |format|
61
+ using_format(Person, format) do
62
+ david = (format == :json ? { person: @david } : @david)
63
+ ActiveResource::HttpMock.respond_to do |mock|
64
+ mock.get "/people/2.#{format}", { "Accept" => ActiveResource::Formats[format].mime_type }, ActiveResource::Formats[format].encode(david)
65
+ mock.get "/people/2/shallow.#{format}", { "Accept" => ActiveResource::Formats[format].mime_type }, ActiveResource::Formats[format].encode(david)
66
+ end
67
+
68
+ remote_programmer = Person.find(2).get(:shallow)
69
+ assert_equal @david[:id], remote_programmer["id"]
70
+ assert_equal @david[:name], remote_programmer["name"]
71
+ end
72
+
73
+ ryan_hash = { name: "Ryan" }
74
+ ryan_hash = (format == :json ? { person: ryan_hash } : ryan_hash)
75
+ ryan = ActiveResource::Formats[format].encode(ryan_hash)
76
+ using_format(Person, format) do
77
+ remote_ryan = Person.new(name: "Ryan")
78
+ ActiveResource::HttpMock.respond_to.post "/people.#{format}", { "Content-Type" => ActiveResource::Formats[format].mime_type }, ryan, 201, "Location" => "/people/5.#{format}"
79
+ remote_ryan.save
80
+
81
+ remote_ryan = Person.new(name: "Ryan")
82
+ ActiveResource::HttpMock.respond_to.post "/people/new/register.#{format}", { "Content-Type" => ActiveResource::Formats[format].mime_type }, ryan, 201, "Location" => "/people/5.#{format}"
83
+ assert_equal ActiveResource::Response.new(ryan, 201, "Location" => "/people/5.#{format}"), remote_ryan.post(:register)
84
+ end
85
+ end
86
+ end
87
+
88
+ def test_setting_format_before_site
89
+ resource = Class.new(ActiveResource::Base)
90
+ resource.format = :json
91
+ resource.site = "http://37s.sunrise.i:3000"
92
+ assert_equal ActiveResource::Formats[:json], resource.connection.format
93
+ end
94
+
95
+ def test_serialization_of_nested_resource
96
+ address = { street: "12345 Street" }
97
+ person = { name: "Rus", address: address }
98
+
99
+ [:json, :xml].each do |format|
100
+ encoded_person = ActiveResource::Formats[format].encode(person)
101
+ assert_match(/12345 Street/, encoded_person)
102
+ remote_person = Person.new(person.update(address: StreetAddress.new(address)))
103
+ assert_kind_of StreetAddress, remote_person.address
104
+ using_format(Person, format) do
105
+ ActiveResource::HttpMock.respond_to.post "/people.#{format}", { "Content-Type" => ActiveResource::Formats[format].mime_type }, encoded_person, 201, "Location" => "/people/5.#{format}"
106
+ remote_person.save
107
+ end
108
+ end
109
+ end
110
+
111
+ def test_removing_root
112
+ matz = { name: "Matz" }
113
+ matz_with_root = { person: matz }
114
+
115
+ # On Array
116
+ people = [ matz ]
117
+ assert_equal ActiveResource::Formats.remove_root(people), [ matz ]
118
+
119
+ # On Hash with no root
120
+ person = matz
121
+ assert_equal ActiveResource::Formats.remove_root(person), matz
122
+
123
+ # On Hash with root
124
+ person = matz_with_root
125
+ assert_equal ActiveResource::Formats.remove_root(person), matz
126
+ end
127
+
128
+ private
129
+ def using_format(klass, mime_type_reference)
130
+ previous_format = klass.format
131
+ klass.format = mime_type_reference
132
+
133
+ yield
134
+ ensure
135
+ klass.format = previous_format
136
+ end
137
+ end
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "abstract_unit"
4
+ require "active_support/core_ext/object/inclusion"
5
+
6
+ class HttpMockTest < ActiveSupport::TestCase
7
+ setup do
8
+ @http = ActiveResource::HttpMock.new("http://example.com")
9
+ end
10
+
11
+ FORMAT_HEADER = ActiveResource::Connection::HTTP_FORMAT_HEADER_NAMES
12
+
13
+ [:post, :patch, :put, :get, :delete, :head].each do |method|
14
+ test "responds to simple #{method} request" do
15
+ ActiveResource::HttpMock.respond_to do |mock|
16
+ mock.send(method, "/people/1", { FORMAT_HEADER[method] => "application/json" }, "Response")
17
+ end
18
+
19
+ assert_equal "Response", request(method, "/people/1", FORMAT_HEADER[method] => "application/json").body
20
+ end
21
+
22
+ test "adds format header by default to #{method} request" do
23
+ ActiveResource::HttpMock.respond_to do |mock|
24
+ mock.send(method, "/people/1", {}, "Response")
25
+ end
26
+
27
+ assert_equal "Response", request(method, "/people/1", FORMAT_HEADER[method] => "application/json").body
28
+ end
29
+
30
+ test "respond only when headers match header by default to #{method} request" do
31
+ ActiveResource::HttpMock.respond_to do |mock|
32
+ mock.send(method, "/people/1", { "X-Header" => "X" }, "Response")
33
+ end
34
+
35
+ assert_equal "Response", request(method, "/people/1", "X-Header" => "X").body
36
+ assert_raise(ActiveResource::InvalidRequestError) { request(method, "/people/1") }
37
+ end
38
+
39
+ test "does not overwrite format header to #{method} request" do
40
+ ActiveResource::HttpMock.respond_to do |mock|
41
+ mock.send(method, "/people/1", { FORMAT_HEADER[method] => "application/json" }, "Response")
42
+ end
43
+
44
+ assert_equal "Response", request(method, "/people/1", FORMAT_HEADER[method] => "application/json").body
45
+ end
46
+
47
+ test "ignores format header when there is only one response to same url in a #{method} request" do
48
+ ActiveResource::HttpMock.respond_to do |mock|
49
+ mock.send(method, "/people/1", {}, "Response")
50
+ end
51
+
52
+ assert_equal "Response", request(method, "/people/1", FORMAT_HEADER[method] => "application/json").body
53
+ assert_equal "Response", request(method, "/people/1", FORMAT_HEADER[method] => "application/xml").body
54
+ end
55
+
56
+ test "responds correctly when format header is given to #{method} request" do
57
+ ActiveResource::HttpMock.respond_to do |mock|
58
+ mock.send(method, "/people/1", { FORMAT_HEADER[method] => "application/xml" }, "XML")
59
+ mock.send(method, "/people/1", { FORMAT_HEADER[method] => "application/json" }, "Json")
60
+ end
61
+
62
+ assert_equal "XML", request(method, "/people/1", FORMAT_HEADER[method] => "application/xml").body
63
+ assert_equal "Json", request(method, "/people/1", FORMAT_HEADER[method] => "application/json").body
64
+ end
65
+
66
+ test "raises InvalidRequestError if no response found for the #{method} request" do
67
+ ActiveResource::HttpMock.respond_to do |mock|
68
+ mock.send(method, "/people/1", { FORMAT_HEADER[method] => "application/json" }, "json")
69
+ end
70
+
71
+ assert_raise(::ActiveResource::InvalidRequestError) do
72
+ request(method, "/people/1", FORMAT_HEADER[method] => "application/xml")
73
+ end
74
+ end
75
+ end
76
+
77
+ test "allows you to send in pairs directly to the respond_to method" do
78
+ matz = { person: { id: 1, name: "Matz" } }.to_json
79
+
80
+ create_matz = ActiveResource::Request.new(:post, "/people.json", matz, {})
81
+ created_response = ActiveResource::Response.new("", 201, "Location" => "/people/1.json")
82
+ get_matz = ActiveResource::Request.new(:get, "/people/1.json", nil)
83
+ ok_response = ActiveResource::Response.new(matz, 200, {})
84
+
85
+ pairs = { create_matz => created_response, get_matz => ok_response }
86
+
87
+ ActiveResource::HttpMock.respond_to(pairs)
88
+ assert_equal 2, ActiveResource::HttpMock.responses.length
89
+ assert_equal "", ActiveResource::HttpMock.responses.assoc(create_matz)[1].body
90
+ assert_equal matz, ActiveResource::HttpMock.responses.assoc(get_matz)[1].body
91
+ end
92
+
93
+ test "resets all mocked responses on each call to respond_to with a block by default" do
94
+ ActiveResource::HttpMock.respond_to do |mock|
95
+ mock.send(:get, "/people/1", {}, "JSON1")
96
+ end
97
+ assert_equal 1, ActiveResource::HttpMock.responses.length
98
+
99
+ ActiveResource::HttpMock.respond_to do |mock|
100
+ mock.send(:get, "/people/2", {}, "JSON2")
101
+ end
102
+ assert_equal 1, ActiveResource::HttpMock.responses.length
103
+ end
104
+
105
+ test "resets all mocked responses on each call to respond_to by passing pairs by default" do
106
+ ActiveResource::HttpMock.respond_to do |mock|
107
+ mock.send(:get, "/people/1", {}, "JSON1")
108
+ end
109
+ assert_equal 1, ActiveResource::HttpMock.responses.length
110
+
111
+ matz = { person: { id: 1, name: "Matz" } }.to_json
112
+ get_matz = ActiveResource::Request.new(:get, "/people/1.json", nil)
113
+ ok_response = ActiveResource::Response.new(matz, 200, {})
114
+ ActiveResource::HttpMock.respond_to(get_matz => ok_response)
115
+
116
+ assert_equal 1, ActiveResource::HttpMock.responses.length
117
+ end
118
+
119
+ test "allows you to add new responses to the existing responses by calling a block" do
120
+ ActiveResource::HttpMock.respond_to do |mock|
121
+ mock.send(:get, "/people/1", {}, "JSON1")
122
+ end
123
+ assert_equal 1, ActiveResource::HttpMock.responses.length
124
+
125
+ ActiveResource::HttpMock.respond_to(false) do |mock|
126
+ mock.send(:get, "/people/2", {}, "JSON2")
127
+ end
128
+ assert_equal 2, ActiveResource::HttpMock.responses.length
129
+ end
130
+
131
+ test "allows you to add new responses to the existing responses by passing pairs" do
132
+ ActiveResource::HttpMock.respond_to do |mock|
133
+ mock.send(:get, "/people/1", {}, "JSON1")
134
+ end
135
+ assert_equal 1, ActiveResource::HttpMock.responses.length
136
+
137
+ matz = { person: { id: 1, name: "Matz" } }.to_json
138
+ get_matz = ActiveResource::Request.new(:get, "/people/1.json", nil)
139
+ ok_response = ActiveResource::Response.new(matz, 200, {})
140
+ ActiveResource::HttpMock.respond_to({ get_matz => ok_response }, false)
141
+
142
+ assert_equal 2, ActiveResource::HttpMock.responses.length
143
+ end
144
+
145
+ test "allows you to replace the existing response with the same request by calling a block" do
146
+ ActiveResource::HttpMock.respond_to do |mock|
147
+ mock.send(:get, "/people/1", {}, "JSON1")
148
+ end
149
+ assert_equal 1, ActiveResource::HttpMock.responses.length
150
+
151
+ ActiveResource::HttpMock.respond_to(false) do |mock|
152
+ mock.send(:get, "/people/1", {}, "JSON2")
153
+ end
154
+ assert_equal 1, ActiveResource::HttpMock.responses.length
155
+ end
156
+
157
+ test "allows you to replace the existing response with the same request by passing pairs" do
158
+ ActiveResource::HttpMock.respond_to do |mock|
159
+ mock.send(:get, "/people/1", {}, "JSON1")
160
+ end
161
+ assert_equal 1, ActiveResource::HttpMock.responses.length
162
+
163
+ matz = { person: { id: 1, name: "Matz" } }.to_json
164
+ get_matz = ActiveResource::Request.new(:get, "/people/1", nil)
165
+ ok_response = ActiveResource::Response.new(matz, 200, {})
166
+
167
+ ActiveResource::HttpMock.respond_to({ get_matz => ok_response }, false)
168
+ assert_equal 1, ActiveResource::HttpMock.responses.length
169
+ end
170
+
171
+ test "do not replace the response with the same path but different method by calling a block" do
172
+ ActiveResource::HttpMock.respond_to do |mock|
173
+ mock.send(:get, "/people/1", {}, "JSON1")
174
+ end
175
+ assert_equal 1, ActiveResource::HttpMock.responses.length
176
+
177
+ ActiveResource::HttpMock.respond_to(false) do |mock|
178
+ mock.send(:put, "/people/1", {}, "JSON2")
179
+ end
180
+ assert_equal 2, ActiveResource::HttpMock.responses.length
181
+ end
182
+
183
+ test "do not replace the response with the same path but different method by passing pairs" do
184
+ ActiveResource::HttpMock.respond_to do |mock|
185
+ mock.send(:get, "/people/1", {}, "JSON1")
186
+ end
187
+ assert_equal 1, ActiveResource::HttpMock.responses.length
188
+
189
+ put_matz = ActiveResource::Request.new(:put, "/people/1", nil)
190
+ ok_response = ActiveResource::Response.new("", 200, {})
191
+
192
+ ActiveResource::HttpMock.respond_to({ put_matz => ok_response }, false)
193
+ assert_equal 2, ActiveResource::HttpMock.responses.length
194
+ end
195
+
196
+ test "omits query parameters from the URL when options[:omit_query_params] is true" do
197
+ ActiveResource::HttpMock.respond_to do |mock|
198
+ mock.get("/endpoint", {}, "Response", 200, {}, { omit_query_in_path: true })
199
+ end
200
+
201
+ response = request(:get, "/endpoint?param1=value1&param2=value2")
202
+
203
+ assert_equal "Response", response.body
204
+ end
205
+
206
+ def request(method, path, headers = {}, body = nil)
207
+ if method.in?([:patch, :put, :post])
208
+ @http.send(method, path, body, headers)
209
+ else
210
+ @http.send(method, path, headers)
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "abstract_unit"
4
+
5
+ require "fixtures/product"
6
+
7
+ class InheritenceTest < ActiveSupport::TestCase
8
+ def test_sub_class_retains_ancestor_headers
9
+ ActiveResource::HttpMock.respond_to do |mock|
10
+ mock.get "/sub_products/1.json",
11
+ { "Accept" => "application/json", "X-Inherited-Header" => "present" },
12
+ { id: 1, name: "Sub Product" }.to_json,
13
+ 200
14
+ end
15
+
16
+ sub_product = SubProduct.find(1)
17
+ assert_equal "SubProduct", sub_product.class.to_s
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ class InheritingHashTest < ActiveSupport::TestCase
4
+ def setup
5
+ @parent = ActiveResource::InheritingHash.new({ override_me: "foo", parent_key: "parent_value" })
6
+ @child = ActiveResource::InheritingHash.new(@parent)
7
+ @child[:override_me] = "bar"
8
+ @child[:child_only] = "baz"
9
+ end
10
+
11
+ def test_child_key_overrides_parent_key
12
+ assert_equal "bar", @child[:override_me]
13
+ end
14
+
15
+ def test_parent_key_available_on_lookup
16
+ assert_equal "parent_value", @child[:parent_key]
17
+ end
18
+
19
+ def test_conversion_to_regular_hash_includes_parent_keys
20
+ hash = @child.to_hash
21
+
22
+ assert_equal 3, hash.keys.length
23
+ assert_equal "parent_value", hash[:parent_key]
24
+ end
25
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "abstract_unit"
4
+ require "fixtures/person"
5
+ require "active_support/log_subscriber/test_helper"
6
+ require "active_resource/log_subscriber"
7
+ require "active_support/core_ext/hash/conversions"
8
+
9
+ class LogSubscriberTest < ActiveSupport::TestCase
10
+ include ActiveSupport::LogSubscriber::TestHelper
11
+
12
+ def setup
13
+ super
14
+
15
+ @matz = { person: { id: 1, name: "Matz" } }.to_json
16
+ ActiveResource::HttpMock.respond_to do |mock|
17
+ mock.get "/people/1.json", {}, @matz
18
+ mock.get "/people/2.json", {}, nil, 404
19
+ mock.get "/people/3.json", {}, nil, 502
20
+ end
21
+
22
+ ActiveResource::LogSubscriber.attach_to :active_resource
23
+ end
24
+
25
+ def set_logger(logger)
26
+ ActiveResource::Base.logger = logger
27
+ end
28
+
29
+ def test_request_notification
30
+ Person.find(1)
31
+ wait
32
+ assert_equal 2, @logger.logged(:info).size
33
+ assert_equal "GET http://37s.sunrise.i:3000/people/1.json", @logger.logged(:info)[0]
34
+ assert_match(/--> 200 200 33/, @logger.logged(:info)[1])
35
+ end
36
+
37
+ def test_failure_error_log
38
+ Person.find(2)
39
+ rescue
40
+ wait
41
+ assert_equal 2, @logger.logged(:error).size
42
+ assert_equal "GET http://37s.sunrise.i:3000/people/2.json", @logger.logged(:error)[0]
43
+ assert_match(/--> 404 404 0/, @logger.logged(:error)[1])
44
+ end
45
+
46
+ def test_server_error_log
47
+ Person.find(3)
48
+ rescue
49
+ wait
50
+ assert_equal 2, @logger.logged(:error).size
51
+ assert_equal "GET http://37s.sunrise.i:3000/people/3.json", @logger.logged(:error)[0]
52
+ assert_match(/--> 502 502 0/, @logger.logged(:error)[1])
53
+ end
54
+
55
+ def test_connection_failure
56
+ Person.find(99)
57
+ rescue
58
+ wait
59
+ assert_equal 2, @logger.logged(:error).size
60
+ assert_equal "GET http://37s.sunrise.i:3000/people/99.json", @logger.logged(:error)[0]
61
+ assert_match(/--> 523 ActiveResource connection error 0/, @logger.logged(:error)[1])
62
+ end
63
+ end