active_cached_resource 0.0.1.pre

Sign up to get free protection for your applications and to get access to all the features.
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