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,276 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "base64"
4
+ require "abstract_unit"
5
+
6
+ class AuthorizationTest < ActiveSupport::TestCase
7
+ Response = Struct.new(:code)
8
+
9
+ def setup
10
+ @conn = ActiveResource::Connection.new("http://localhost")
11
+ @matz = { person: { id: 1, name: "Matz" } }.to_json
12
+ @david = { person: { id: 2, name: "David" } }.to_json
13
+ @authenticated_conn = ActiveResource::Connection.new("http://david:test123@localhost")
14
+ @basic_authorization_request_header = { "Authorization" => "Basic ZGF2aWQ6dGVzdDEyMw==" }
15
+ @jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
16
+ @bearer_token_authorization_request_header = { "Authorization" => "Bearer #{@jwt}" }
17
+ end
18
+
19
+ private
20
+ def decode(response)
21
+ @authenticated_conn.format.decode(response.body)
22
+ end
23
+ end
24
+
25
+ class BasicAuthorizationTest < AuthorizationTest
26
+ def setup
27
+ super
28
+ @authenticated_conn.auth_type = :basic
29
+
30
+ ActiveResource::HttpMock.respond_to do |mock|
31
+ mock.get "/people/2.json", @basic_authorization_request_header, @david
32
+ mock.get "/people/1.json", @basic_authorization_request_header, nil, 401, "WWW-Authenticate" => "i_should_be_ignored"
33
+ mock.get "/people/3.json", @bearer_token_authorization_request_header, @david
34
+ mock.put "/people/2.json", @basic_authorization_request_header, nil, 204
35
+ mock.delete "/people/2.json", @basic_authorization_request_header, nil, 200
36
+ mock.post "/people/2/addresses.json", @basic_authorization_request_header, nil, 201, "Location" => "/people/1/addresses/5"
37
+ mock.head "/people/2.json", @basic_authorization_request_header, nil, 200
38
+ end
39
+ end
40
+
41
+ def test_get
42
+ david = decode(@authenticated_conn.get("/people/2.json"))
43
+ assert_equal "David", david["name"]
44
+ end
45
+
46
+ def test_post
47
+ response = @authenticated_conn.post("/people/2/addresses.json")
48
+ assert_equal "/people/1/addresses/5", response["Location"]
49
+ end
50
+
51
+ def test_put
52
+ response = @authenticated_conn.put("/people/2.json")
53
+ assert_equal 204, response.code
54
+ end
55
+
56
+ def test_delete
57
+ response = @authenticated_conn.delete("/people/2.json")
58
+ assert_equal 200, response.code
59
+ end
60
+
61
+ def test_head
62
+ response = @authenticated_conn.head("/people/2.json")
63
+ assert_equal 200, response.code
64
+ end
65
+
66
+ def test_retry_on_401_doesnt_happen_with_basic_auth
67
+ assert_raise(ActiveResource::UnauthorizedAccess) { @authenticated_conn.get("/people/1.json") }
68
+ assert_equal "", @authenticated_conn.send(:response_auth_header)
69
+ end
70
+
71
+ def test_raises_invalid_request_on_unauthorized_requests
72
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.get("/people/2.json") }
73
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.post("/people/2/addresses.json") }
74
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.put("/people/2.json") }
75
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.delete("/people/2.json") }
76
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.head("/people/2.json") }
77
+ end
78
+
79
+
80
+ def test_authorization_header
81
+ authorization_header = @authenticated_conn.__send__(:authorization_header, :get, URI.parse("/people/2.json"))
82
+ assert_equal @basic_authorization_request_header["Authorization"], authorization_header["Authorization"]
83
+ authorization = authorization_header["Authorization"].to_s.split
84
+
85
+ assert_equal "Basic", authorization[0]
86
+ assert_equal ["david", "test123"], ::Base64.decode64(authorization[1]).split(":")[0..1]
87
+ end
88
+
89
+ def test_authorization_header_with_username_but_no_password
90
+ @conn = ActiveResource::Connection.new("http://david:@localhost")
91
+ authorization_header = @conn.__send__(:authorization_header, :get, URI.parse("/people/2.json"))
92
+ authorization = authorization_header["Authorization"].to_s.split
93
+
94
+ assert_equal "Basic", authorization[0]
95
+ assert_equal ["david"], ::Base64.decode64(authorization[1]).split(":")[0..1]
96
+ end
97
+
98
+ def test_authorization_header_with_password_but_no_username
99
+ @conn = ActiveResource::Connection.new("http://:test123@localhost")
100
+ authorization_header = @conn.__send__(:authorization_header, :get, URI.parse("/people/2.json"))
101
+ authorization = authorization_header["Authorization"].to_s.split
102
+
103
+ assert_equal "Basic", authorization[0]
104
+ assert_equal ["", "test123"], ::Base64.decode64(authorization[1]).split(":")[0..1]
105
+ end
106
+
107
+ def test_authorization_header_with_decoded_credentials_from_url
108
+ @conn = ActiveResource::Connection.new("http://my%40email.com:%31%32%33@localhost")
109
+ authorization_header = @conn.__send__(:authorization_header, :get, URI.parse("/people/2.json"))
110
+ authorization = authorization_header["Authorization"].to_s.split
111
+
112
+ assert_equal "Basic", authorization[0]
113
+ assert_equal ["my@email.com", "123"], ::Base64.decode64(authorization[1]).split(":")[0..1]
114
+ end
115
+
116
+ def test_authorization_header_explicitly_setting_username_and_password
117
+ @authenticated_conn = ActiveResource::Connection.new("http://@localhost")
118
+ @authenticated_conn.user = "david"
119
+ @authenticated_conn.password = "test123"
120
+ authorization_header = @authenticated_conn.__send__(:authorization_header, :get, URI.parse("/people/2.json"))
121
+ assert_equal @basic_authorization_request_header["Authorization"], authorization_header["Authorization"]
122
+ authorization = authorization_header["Authorization"].to_s.split
123
+
124
+ assert_equal "Basic", authorization[0]
125
+ assert_equal ["david", "test123"], ::Base64.decode64(authorization[1]).split(":")[0..1]
126
+ end
127
+
128
+ def test_authorization_header_explicitly_setting_username_but_no_password
129
+ @conn = ActiveResource::Connection.new("http://@localhost")
130
+ @conn.user = "david"
131
+ authorization_header = @conn.__send__(:authorization_header, :get, URI.parse("/people/2.json"))
132
+ authorization = authorization_header["Authorization"].to_s.split
133
+
134
+ assert_equal "Basic", authorization[0]
135
+ assert_equal ["david"], ::Base64.decode64(authorization[1]).split(":")[0..1]
136
+ end
137
+
138
+ def test_authorization_header_explicitly_setting_password_but_no_username
139
+ @conn = ActiveResource::Connection.new("http://@localhost")
140
+ @conn.password = "test123"
141
+ authorization_header = @conn.__send__(:authorization_header, :get, URI.parse("/people/2.json"))
142
+ authorization = authorization_header["Authorization"].to_s.split
143
+
144
+ assert_equal "Basic", authorization[0]
145
+ assert_equal ["", "test123"], ::Base64.decode64(authorization[1]).split(":")[0..1]
146
+ end
147
+
148
+ def test_authorization_header_if_credentials_supplied_and_auth_type_is_basic
149
+ authorization_header = @authenticated_conn.__send__(:authorization_header, :get, URI.parse("/people/2.json"))
150
+ assert_equal @basic_authorization_request_header["Authorization"], authorization_header["Authorization"]
151
+ authorization = authorization_header["Authorization"].to_s.split
152
+
153
+ assert_equal "Basic", authorization[0]
154
+ assert_equal ["david", "test123"], ::Base64.decode64(authorization[1]).split(":")[0..1]
155
+ end
156
+
157
+ def test_authorization_header_explicitly_setting_jwt_and_auth_type_is_bearer
158
+ @conn = ActiveResource::Connection.new("http://localhost")
159
+ @conn.auth_type = :bearer
160
+ @conn.bearer_token = @jwt
161
+ authorization_header = @conn.__send__(:authorization_header, :get, URI.parse("/people/3.json"))
162
+ assert_equal @bearer_token_authorization_request_header["Authorization"], authorization_header["Authorization"]
163
+ authorization = authorization_header["Authorization"].to_s.split
164
+
165
+ assert_equal "Bearer", authorization[0]
166
+ assert_equal @jwt, authorization[1]
167
+ end
168
+
169
+ def test_authorization_header_if_no_jwt_and_auth_type_is_bearer
170
+ @conn = ActiveResource::Connection.new("http://localhost")
171
+ @conn.auth_type = :bearer
172
+ authorization_header = @conn.__send__(:authorization_header, :get, URI.parse("/people/3.json"))
173
+ assert_nil authorization_header["Authorization"]
174
+ end
175
+
176
+ def test_client_nonce_is_not_nil
177
+ assert_not_nil ActiveResource::Connection.new("http://david:test123@localhost").send(:client_nonce)
178
+ end
179
+ end
180
+
181
+ class DigestAuthorizationTest < AuthorizationTest
182
+ def setup
183
+ super
184
+ @authenticated_conn.auth_type = :digest
185
+
186
+ # Make client nonce deterministic
187
+ def @authenticated_conn.client_nonce; "i-am-a-client-nonce" end
188
+
189
+ @nonce = "MTI0OTUxMzc4NzpjYWI3NDM3NDNmY2JmODU4ZjQ2ZjcwNGZkMTJiMjE0NA=="
190
+
191
+ ActiveResource::HttpMock.respond_to do |mock|
192
+ mock.get "/people/2.json", { "Authorization" => blank_digest_auth_header("/people/2.json", "fad396f6a34aeba28e28b9b96ddbb671") }, nil, 401, "WWW-Authenticate" => response_digest_auth_header
193
+ mock.get "/people/2.json", { "Authorization" => request_digest_auth_header("/people/2.json", "c064d5ba8891a25290c76c8c7d31fb7b") }, @david, 200
194
+ mock.get "/people/1.json", { "Authorization" => request_digest_auth_header("/people/1.json", "f9c0b594257bb8422af4abd429c5bb70") }, @matz, 200
195
+
196
+ mock.put "/people/2.json", { "Authorization" => blank_digest_auth_header("/people/2.json", "50a685d814f94665b9d160fbbaa3958a") }, nil, 401, "WWW-Authenticate" => response_digest_auth_header
197
+ mock.put "/people/2.json", { "Authorization" => request_digest_auth_header("/people/2.json", "5a75cde841122d8e0f20f8fd1f98a743") }, nil, 204
198
+
199
+ mock.delete "/people/2.json", { "Authorization" => blank_digest_auth_header("/people/2.json", "846f799107eab5ca4285b909ee299a33") }, nil, 401, "WWW-Authenticate" => response_digest_auth_header
200
+ mock.delete "/people/2.json", { "Authorization" => request_digest_auth_header("/people/2.json", "9f5b155224edbbb69fd99d8ce094681e") }, nil, 200
201
+
202
+ mock.post "/people/2/addresses.json", { "Authorization" => blank_digest_auth_header("/people/2/addresses.json", "6984d405ff3d9ed07bbf747dcf16afb0") }, nil, 401, "WWW-Authenticate" => response_digest_auth_header
203
+ mock.post "/people/2/addresses.json", { "Authorization" => request_digest_auth_header("/people/2/addresses.json", "4bda6a28dbf930b5af9244073623bd04") }, nil, 201, "Location" => "/people/1/addresses/5"
204
+
205
+ mock.head "/people/2.json", { "Authorization" => blank_digest_auth_header("/people/2.json", "15e5ed84ba5c4cfcd5c98a36c2e4f421") }, nil, 401, "WWW-Authenticate" => response_digest_auth_header
206
+ mock.head "/people/2.json", { "Authorization" => request_digest_auth_header("/people/2.json", "d4c6d2bcc8717abb2e2ccb8c49ee6a91") }, nil, 200
207
+ end
208
+ end
209
+
210
+ def test_authorization_header_if_credentials_supplied_and_auth_type_is_digest
211
+ authorization_header = @authenticated_conn.__send__(:authorization_header, :get, URI.parse("/people/2.json"))
212
+ assert_equal blank_digest_auth_header("/people/2.json", "fad396f6a34aeba28e28b9b96ddbb671"), authorization_header["Authorization"]
213
+ end
214
+
215
+ def test_authorization_header_with_query_string_if_auth_type_is_digest
216
+ authorization_header = @authenticated_conn.__send__(:authorization_header, :get, URI.parse("/people/2.json?only=name"))
217
+ assert_equal blank_digest_auth_header("/people/2.json?only=name", "f8457b0b5d21b6b80737a386217afb24"), authorization_header["Authorization"]
218
+ end
219
+
220
+ def test_get_with_digest_auth_handles_initial_401_response_and_retries
221
+ response = @authenticated_conn.get("/people/2.json")
222
+ assert_equal "David", decode(response)["name"]
223
+ end
224
+
225
+ def test_post_with_digest_auth_handles_initial_401_response_and_retries
226
+ response = @authenticated_conn.post("/people/2/addresses.json")
227
+ assert_equal "/people/1/addresses/5", response["Location"]
228
+ assert_equal 201, response.code
229
+ end
230
+
231
+ def test_put_with_digest_auth_handles_initial_401_response_and_retries
232
+ response = @authenticated_conn.put("/people/2.json")
233
+ assert_equal 204, response.code
234
+ end
235
+
236
+ def test_delete_with_digest_auth_handles_initial_401_response_and_retries
237
+ response = @authenticated_conn.delete("/people/2.json")
238
+ assert_equal 200, response.code
239
+ end
240
+
241
+ def test_head_with_digest_auth_handles_initial_401_response_and_retries
242
+ response = @authenticated_conn.head("/people/2.json")
243
+ assert_equal 200, response.code
244
+ end
245
+
246
+ def test_get_with_digest_auth_caches_nonce
247
+ response = @authenticated_conn.get("/people/2.json")
248
+ assert_equal "David", decode(response)["name"]
249
+
250
+ # There is no mock for this request with a non-cached nonce.
251
+ response = @authenticated_conn.get("/people/1.json")
252
+ assert_equal "Matz", decode(response)["name"]
253
+ end
254
+
255
+ def test_raises_invalid_request_on_unauthorized_requests_with_digest_auth
256
+ @conn.auth_type = :digest
257
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.get("/people/2.json") }
258
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.post("/people/2/addresses.json") }
259
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.put("/people/2.json") }
260
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.delete("/people/2.json") }
261
+ assert_raise(ActiveResource::InvalidRequestError) { @conn.head("/people/2.json") }
262
+ end
263
+
264
+ private
265
+ def blank_digest_auth_header(uri, response)
266
+ %Q(Digest username="david", realm="", qop="", uri="#{uri}", nonce="", nc="0", cnonce="i-am-a-client-nonce", response="#{response}")
267
+ end
268
+
269
+ def request_digest_auth_header(uri, response)
270
+ %Q(Digest username="david", realm="RailsTestApp", qop="auth", uri="#{uri}", nonce="#{@nonce}", nc="0", cnonce="i-am-a-client-nonce", response="#{response}", opaque="ef6dfb078ba22298d366f99567814ffb")
271
+ end
272
+
273
+ def response_digest_auth_header
274
+ %Q(Digest realm="RailsTestApp", qop="auth", algorithm=MD5, nonce="#{@nonce}", opaque="ef6dfb078ba22298d366f99567814ffb")
275
+ end
276
+ end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "abstract_unit"
4
+ require "fixtures/person"
5
+ require "fixtures/street_address"
6
+ require "active_support/core_ext/hash/conversions"
7
+
8
+ class CustomMethodsTest < ActiveSupport::TestCase
9
+ def setup
10
+ @matz = { person: { id: 1, name: "Matz" } }.to_json
11
+ @matz_deep = { person: { id: 1, name: "Matz", other: "other" } }.to_json
12
+ @matz_array = { people: [{ person: { id: 1, name: "Matz" } }] }.to_json
13
+ @ryan = { person: { name: "Ryan" } }.to_json
14
+ @addy = { address: { id: 1, street: "12345 Street" } }.to_json
15
+ @addy_deep = { address: { id: 1, street: "12345 Street", zip: "27519" } }.to_json
16
+
17
+ ActiveResource::HttpMock.respond_to do |mock|
18
+ mock.get "/people/1.json", {}, @matz
19
+ mock.get "/people/1/shallow.json", {}, @matz
20
+ mock.get "/people/1/deep.json", {}, @matz_deep
21
+ mock.get "/people/retrieve.json?name=Matz", {}, @matz_array
22
+ mock.get "/people/managers.json", {}, @matz_array
23
+ mock.post "/people/hire.json?name=Matz", {}, nil, 201
24
+ mock.put "/people/1/promote.json?position=Manager", {}, nil, 204
25
+ mock.put "/people/promote.json?name=Matz", {}, nil, 204, {}
26
+ mock.put "/people/sort.json?by=name", {}, nil, 204
27
+ mock.delete "/people/deactivate.json?name=Matz", {}, nil, 200
28
+ mock.delete "/people/1/deactivate.json", {}, nil, 200
29
+ mock.post "/people/new/register.json", {}, @ryan, 201, "Location" => "/people/5.json"
30
+ mock.post "/people/1/register.json", {}, @matz, 201
31
+ mock.get "/people/1/addresses/1.json", {}, @addy
32
+ mock.get "/people/1/addresses/1/deep.json", {}, @addy_deep
33
+ mock.put "/people/1/addresses/1/normalize_phone.json?locale=US", {}, nil, 204
34
+ mock.put "/people/1/addresses/sort.json?by=name", {}, nil, 204
35
+ mock.post "/people/1/addresses/new/link.json", {}, { address: { street: "12345 Street" } }.to_json, 201, "Location" => "/people/1/addresses/2.json"
36
+ end
37
+
38
+ Person.user = nil
39
+ Person.password = nil
40
+ end
41
+
42
+ def teardown
43
+ ActiveResource::HttpMock.reset!
44
+ end
45
+
46
+ def test_custom_collection_method
47
+ # GET
48
+ assert_equal([{ "id" => 1, "name" => "Matz" }], Person.get(:retrieve, name: "Matz"))
49
+
50
+ # POST
51
+ assert_equal(ActiveResource::Response.new("", 201, {}), Person.post(:hire, name: "Matz"))
52
+
53
+ # PUT
54
+ assert_equal ActiveResource::Response.new("", 204, {}),
55
+ Person.put(:promote, { name: "Matz" }, "atestbody")
56
+ assert_equal ActiveResource::Response.new("", 204, {}), Person.put(:sort, by: "name")
57
+
58
+ # DELETE
59
+ Person.delete :deactivate, name: "Matz"
60
+
61
+ # Nested resource
62
+ assert_equal ActiveResource::Response.new("", 204, {}), StreetAddress.put(:sort, person_id: 1, by: "name")
63
+ end
64
+
65
+ def test_custom_element_method
66
+ # Test GET against an element URL
67
+ assert_equal Person.find(1).get(:shallow), "id" => 1, "name" => "Matz"
68
+ assert_equal Person.find(1).get(:deep), "id" => 1, "name" => "Matz", "other" => "other"
69
+
70
+ # Test PUT against an element URL
71
+ assert_equal ActiveResource::Response.new("", 204, {}), Person.find(1).put(:promote, { position: "Manager" }, "body")
72
+
73
+ # Test DELETE against an element URL
74
+ assert_equal ActiveResource::Response.new("", 200, {}), Person.find(1).delete(:deactivate)
75
+
76
+ # With nested resources
77
+ assert_equal StreetAddress.find(1, params: { person_id: 1 }).get(:deep),
78
+ "id" => 1, "street" => "12345 Street", "zip" => "27519"
79
+ assert_equal ActiveResource::Response.new("", 204, {}),
80
+ StreetAddress.find(1, params: { person_id: 1 }).put(:normalize_phone, locale: "US")
81
+ end
82
+
83
+ def test_custom_new_element_method
84
+ # Test POST against a new element URL
85
+ ryan = Person.new(name: "Ryan")
86
+ assert_equal ActiveResource::Response.new(@ryan, 201, "Location" => "/people/5.json"), ryan.post(:register)
87
+ expected_request = ActiveResource::Request.new(:post, "/people/new/register.json", @ryan)
88
+ assert_equal expected_request.body, ActiveResource::HttpMock.requests.first.body
89
+
90
+ # Test POST against a nested collection URL
91
+ addy = StreetAddress.new(street: "123 Test Dr.", person_id: 1)
92
+ assert_equal ActiveResource::Response.new({ address: { street: "12345 Street" } }.to_json,
93
+ 201, "Location" => "/people/1/addresses/2.json"),
94
+ addy.post(:link)
95
+
96
+ matz = Person.find(1)
97
+ assert_equal ActiveResource::Response.new(@matz, 201), matz.post(:register)
98
+ end
99
+
100
+ def test_find_custom_resources
101
+ assert_equal "Matz", Person.find(:all, from: :managers).first.name
102
+ end
103
+
104
+ def test_paths_with_format
105
+ path_with_format = "/people/active.json"
106
+
107
+ ActiveResource::HttpMock.respond_to do |mock|
108
+ mock.get path_with_format, {}, @matz
109
+ mock.post path_with_format, {}, nil
110
+ mock.patch path_with_format, {}, nil
111
+ mock.delete path_with_format, {}, nil
112
+ mock.put path_with_format, {}, nil
113
+ end
114
+
115
+ [:get, :post, :delete, :patch, :put].each_with_index do |method, index|
116
+ Person.send(method, :active)
117
+ expected_request = ActiveResource::Request.new(method, path_with_format)
118
+ assert_equal expected_request.path, ActiveResource::HttpMock.requests[index].path
119
+ assert_equal expected_request.method, ActiveResource::HttpMock.requests[index].method
120
+ end
121
+ end
122
+
123
+ def test_paths_without_format
124
+ ActiveResource::Base.include_format_in_path = false
125
+ path_without_format = "/people/active"
126
+
127
+ ActiveResource::HttpMock.respond_to do |mock|
128
+ mock.get path_without_format, {}, @matz
129
+ mock.post path_without_format, {}, nil
130
+ mock.patch path_without_format, {}, nil
131
+ mock.delete path_without_format, {}, nil
132
+ mock.put path_without_format, {}, nil
133
+ end
134
+
135
+ [:get, :post, :delete, :patch, :put].each_with_index do |method, index|
136
+ Person.send(method, :active)
137
+ expected_request = ActiveResource::Request.new(method, path_without_format)
138
+ assert_equal expected_request.path, ActiveResource::HttpMock.requests[index].path
139
+ assert_equal expected_request.method, ActiveResource::HttpMock.requests[index].method
140
+ end
141
+ ensure
142
+ ActiveResource::Base.include_format_in_path = true
143
+ end
144
+
145
+ def test_custom_element_method_identifier_encoding
146
+ luis = { person: { id: "luís", name: "Luís" } }.to_json
147
+
148
+ ActiveResource::HttpMock.respond_to do |mock|
149
+ mock.get "/people/lu%C3%ADs.json", {}, luis
150
+ mock.put "/people/lu%C3%ADs/deactivate.json", {}, luis, 204
151
+ end
152
+
153
+ assert_equal ActiveResource::Response.new(luis, 204), Person.find("luís").put(:deactivate)
154
+ end
155
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "abstract_unit"
4
+ require "fixtures/person"
5
+ require "fixtures/street_address"
6
+
7
+ class BaseEqualityTest < ActiveSupport::TestCase
8
+ def setup
9
+ @new = Person.new
10
+ @one = Person.new(id: 1)
11
+ @two = Person.new(id: 2)
12
+ @street = StreetAddress.new(id: 2)
13
+ end
14
+
15
+ def test_should_equal_self
16
+ assert @new == @new, "@new == @new"
17
+ assert @one == @one, "@one == @one"
18
+ end
19
+
20
+ def test_shouldnt_equal_new_resource
21
+ assert @new != @one, "@new != @one"
22
+ assert @one != @new, "@one != @new"
23
+ end
24
+
25
+ def test_shouldnt_equal_different_class
26
+ assert @two != @street, "person != street_address with same id"
27
+ assert @street != @two, "street_address != person with same id"
28
+ end
29
+
30
+ def test_eql_should_alias_equals_operator
31
+ assert_equal @new == @new, @new.eql?(@new)
32
+ assert_equal @new == @one, @new.eql?(@one)
33
+
34
+ assert_equal @one == @one, @one.eql?(@one)
35
+ assert_equal @one == @new, @one.eql?(@new)
36
+
37
+ assert_equal @one == @street, @one.eql?(@street)
38
+ end
39
+
40
+ def test_hash_should_be_id_hash
41
+ [@new, @one, @two, @street].each do |resource|
42
+ assert_equal resource.id.hash, resource.hash
43
+ end
44
+ end
45
+
46
+ def test_with_prefix_options
47
+ assert_equal @one == @one, @one.eql?(@one)
48
+ assert_equal @one == @one.dup, @one.eql?(@one.dup)
49
+ new_one = @one.dup
50
+ new_one.prefix_options = { foo: "bar" }
51
+ assert_not_equal @one, new_one
52
+ end
53
+ end