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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +22 -0
- data/.standard.yml +2 -0
- data/CHANGELOG.md +5 -0
- data/README.md +45 -0
- data/Rakefile +21 -0
- data/example/consumer/.dockerignore +41 -0
- data/example/consumer/.gitattributes +9 -0
- data/example/consumer/.gitignore +36 -0
- data/example/consumer/.kamal/hooks/docker-setup.sample +3 -0
- data/example/consumer/.kamal/hooks/post-deploy.sample +14 -0
- data/example/consumer/.kamal/hooks/post-proxy-reboot.sample +3 -0
- data/example/consumer/.kamal/hooks/pre-build.sample +51 -0
- data/example/consumer/.kamal/hooks/pre-connect.sample +47 -0
- data/example/consumer/.kamal/hooks/pre-deploy.sample +109 -0
- data/example/consumer/.kamal/hooks/pre-proxy-reboot.sample +3 -0
- data/example/consumer/.kamal/secrets +17 -0
- data/example/consumer/Dockerfile +65 -0
- data/example/consumer/Gemfile +17 -0
- data/example/consumer/Rakefile +6 -0
- data/example/consumer/app/controllers/application_controller.rb +2 -0
- data/example/consumer/app/controllers/concerns/.keep +0 -0
- data/example/consumer/app/jobs/application_job.rb +7 -0
- data/example/consumer/app/mailers/application_mailer.rb +4 -0
- data/example/consumer/app/models/application_record.rb +3 -0
- data/example/consumer/app/models/concerns/.keep +0 -0
- data/example/consumer/app/models/person.rb +9 -0
- data/example/consumer/app/views/layouts/mailer.html.erb +13 -0
- data/example/consumer/app/views/layouts/mailer.text.erb +1 -0
- data/example/consumer/bin/brakeman +7 -0
- data/example/consumer/bin/bundle +109 -0
- data/example/consumer/bin/dev +2 -0
- data/example/consumer/bin/docker-entrypoint +14 -0
- data/example/consumer/bin/jobs +6 -0
- data/example/consumer/bin/kamal +27 -0
- data/example/consumer/bin/rails +4 -0
- data/example/consumer/bin/rake +4 -0
- data/example/consumer/bin/rubocop +8 -0
- data/example/consumer/bin/setup +34 -0
- data/example/consumer/bin/thrust +5 -0
- data/example/consumer/config/application.rb +20 -0
- data/example/consumer/config/boot.rb +3 -0
- data/example/consumer/config/cache.yml +16 -0
- data/example/consumer/config/credentials.yml.enc +1 -0
- data/example/consumer/config/database.yml +14 -0
- data/example/consumer/config/deploy.yml +116 -0
- data/example/consumer/config/environment.rb +5 -0
- data/example/consumer/config/environments/development.rb +64 -0
- data/example/consumer/config/environments/production.rb +85 -0
- data/example/consumer/config/environments/test.rb +50 -0
- data/example/consumer/config/initializers/cors.rb +16 -0
- data/example/consumer/config/initializers/filter_parameter_logging.rb +8 -0
- data/example/consumer/config/initializers/inflections.rb +16 -0
- data/example/consumer/config/locales/en.yml +31 -0
- data/example/consumer/config/puma.rb +41 -0
- data/example/consumer/config/queue.yml +18 -0
- data/example/consumer/config/recurring.yml +10 -0
- data/example/consumer/config/routes.rb +10 -0
- data/example/consumer/config.ru +6 -0
- data/example/consumer/db/cache_schema.rb +14 -0
- data/example/consumer/db/queue_schema.rb +129 -0
- data/example/consumer/db/seeds.rb +0 -0
- data/example/consumer/lib/tasks/.keep +0 -0
- data/example/consumer/log/.keep +0 -0
- data/example/consumer/public/robots.txt +1 -0
- data/example/consumer/script/.keep +0 -0
- data/example/consumer/storage/.keep +0 -0
- data/example/consumer/tmp/.keep +0 -0
- data/example/consumer/tmp/cache/.keep +0 -0
- data/example/consumer/tmp/pids/.keep +0 -0
- data/example/consumer/tmp/storage/.keep +0 -0
- data/example/consumer/vendor/.keep +0 -0
- data/example/provider/.dockerignore +41 -0
- data/example/provider/.gitattributes +9 -0
- data/example/provider/.gitignore +32 -0
- data/example/provider/.kamal/hooks/docker-setup.sample +3 -0
- data/example/provider/.kamal/hooks/post-deploy.sample +14 -0
- data/example/provider/.kamal/hooks/post-proxy-reboot.sample +3 -0
- data/example/provider/.kamal/hooks/pre-build.sample +51 -0
- data/example/provider/.kamal/hooks/pre-connect.sample +47 -0
- data/example/provider/.kamal/hooks/pre-deploy.sample +109 -0
- data/example/provider/.kamal/hooks/pre-proxy-reboot.sample +3 -0
- data/example/provider/.kamal/secrets +17 -0
- data/example/provider/Dockerfile +65 -0
- data/example/provider/Gemfile +14 -0
- data/example/provider/Rakefile +6 -0
- data/example/provider/app/controllers/application_controller.rb +2 -0
- data/example/provider/app/controllers/concerns/.keep +0 -0
- data/example/provider/app/controllers/people_controller.rb +68 -0
- data/example/provider/app/jobs/application_job.rb +7 -0
- data/example/provider/app/mailers/application_mailer.rb +4 -0
- data/example/provider/app/models/address.rb +3 -0
- data/example/provider/app/models/application_record.rb +3 -0
- data/example/provider/app/models/company.rb +3 -0
- data/example/provider/app/models/concerns/.keep +0 -0
- data/example/provider/app/models/person.rb +6 -0
- data/example/provider/app/views/layouts/mailer.html.erb +13 -0
- data/example/provider/app/views/layouts/mailer.text.erb +1 -0
- data/example/provider/bin/brakeman +7 -0
- data/example/provider/bin/bundle +109 -0
- data/example/provider/bin/dev +2 -0
- data/example/provider/bin/docker-entrypoint +14 -0
- data/example/provider/bin/jobs +6 -0
- data/example/provider/bin/kamal +27 -0
- data/example/provider/bin/rails +4 -0
- data/example/provider/bin/rake +4 -0
- data/example/provider/bin/rubocop +8 -0
- data/example/provider/bin/setup +34 -0
- data/example/provider/bin/thrust +5 -0
- data/example/provider/config/application.rb +44 -0
- data/example/provider/config/boot.rb +3 -0
- data/example/provider/config/cache.yml +16 -0
- data/example/provider/config/credentials.yml.enc +1 -0
- data/example/provider/config/database.yml +20 -0
- data/example/provider/config/deploy.yml +116 -0
- data/example/provider/config/environment.rb +5 -0
- data/example/provider/config/environments/development.rb +64 -0
- data/example/provider/config/environments/production.rb +85 -0
- data/example/provider/config/environments/test.rb +50 -0
- data/example/provider/config/initializers/cors.rb +16 -0
- data/example/provider/config/initializers/filter_parameter_logging.rb +8 -0
- data/example/provider/config/initializers/inflections.rb +16 -0
- data/example/provider/config/locales/en.yml +31 -0
- data/example/provider/config/puma.rb +41 -0
- data/example/provider/config/queue.yml +18 -0
- data/example/provider/config/recurring.yml +10 -0
- data/example/provider/config/routes.rb +4 -0
- data/example/provider/config.ru +6 -0
- data/example/provider/db/cache_schema.rb +14 -0
- data/example/provider/db/migrate/20241202183937_create_people.rb +11 -0
- data/example/provider/db/migrate/20241202183955_create_addresses.rb +13 -0
- data/example/provider/db/migrate/20241202184017_create_companies.rb +14 -0
- data/example/provider/db/queue_schema.rb +129 -0
- data/example/provider/db/schema.rb +47 -0
- data/example/provider/db/seeds.rb +18 -0
- data/example/provider/lib/tasks/.keep +0 -0
- data/example/provider/log/.keep +0 -0
- data/example/provider/public/robots.txt +1 -0
- data/example/provider/script/.keep +0 -0
- data/example/provider/storage/.keep +0 -0
- data/example/provider/tmp/.keep +0 -0
- data/example/provider/tmp/pids/.keep +0 -0
- data/example/provider/tmp/storage/.keep +0 -0
- data/example/provider/vendor/.keep +0 -0
- data/lib/active_cached_resource/caching.rb +176 -0
- data/lib/active_cached_resource/caching_strategies/active_support_cache.rb +31 -0
- data/lib/active_cached_resource/caching_strategies/base.rb +114 -0
- data/lib/active_cached_resource/caching_strategies/sql_cache.rb +32 -0
- data/lib/active_cached_resource/configuration.rb +50 -0
- data/lib/active_cached_resource/logger.rb +22 -0
- data/lib/active_cached_resource/model.rb +33 -0
- data/lib/active_cached_resource/version.rb +12 -0
- data/lib/active_cached_resource.rb +64 -0
- data/lib/activeresource/.gitignore +15 -0
- data/lib/activeresource/README.md +283 -0
- data/lib/activeresource/examples/performance.rb +72 -0
- data/lib/activeresource/lib/active_resource/active_job_serializer.rb +26 -0
- data/lib/activeresource/lib/active_resource/associations/builder/association.rb +32 -0
- data/lib/activeresource/lib/active_resource/associations/builder/belongs_to.rb +16 -0
- data/lib/activeresource/lib/active_resource/associations/builder/has_many.rb +14 -0
- data/lib/activeresource/lib/active_resource/associations/builder/has_one.rb +14 -0
- data/lib/activeresource/lib/active_resource/associations.rb +175 -0
- data/lib/activeresource/lib/active_resource/base.rb +1741 -0
- data/lib/activeresource/lib/active_resource/callbacks.rb +22 -0
- data/lib/activeresource/lib/active_resource/collection.rb +214 -0
- data/lib/activeresource/lib/active_resource/connection.rb +298 -0
- data/lib/activeresource/lib/active_resource/custom_methods.rb +129 -0
- data/lib/activeresource/lib/active_resource/exceptions.rb +98 -0
- data/lib/activeresource/lib/active_resource/formats/json_format.rb +28 -0
- data/lib/activeresource/lib/active_resource/formats/xml_format.rb +27 -0
- data/lib/activeresource/lib/active_resource/formats.rb +24 -0
- data/lib/activeresource/lib/active_resource/http_mock.rb +386 -0
- data/lib/activeresource/lib/active_resource/inheriting_hash.rb +34 -0
- data/lib/activeresource/lib/active_resource/log_subscriber.rb +26 -0
- data/lib/activeresource/lib/active_resource/railtie.rb +31 -0
- data/lib/activeresource/lib/active_resource/reflection.rb +78 -0
- data/lib/activeresource/lib/active_resource/schema.rb +60 -0
- data/lib/activeresource/lib/active_resource/singleton.rb +111 -0
- data/lib/activeresource/lib/active_resource/threadsafe_attributes.rb +65 -0
- data/lib/activeresource/lib/active_resource/validations.rb +176 -0
- data/lib/activeresource/lib/active_resource.rb +49 -0
- data/lib/activeresource/lib/activeresource.rb +3 -0
- data/lib/activeresource/test/abstract_unit.rb +153 -0
- data/lib/activeresource/test/cases/active_job_serializer_test.rb +53 -0
- data/lib/activeresource/test/cases/association_test.rb +104 -0
- data/lib/activeresource/test/cases/associations/builder/belongs_to_test.rb +42 -0
- data/lib/activeresource/test/cases/associations/builder/has_many_test.rb +28 -0
- data/lib/activeresource/test/cases/associations/builder/has_one_test.rb +28 -0
- data/lib/activeresource/test/cases/authorization_test.rb +276 -0
- data/lib/activeresource/test/cases/base/custom_methods_test.rb +155 -0
- data/lib/activeresource/test/cases/base/equality_test.rb +53 -0
- data/lib/activeresource/test/cases/base/load_test.rb +249 -0
- data/lib/activeresource/test/cases/base/schema_test.rb +428 -0
- data/lib/activeresource/test/cases/base_errors_test.rb +129 -0
- data/lib/activeresource/test/cases/base_test.rb +1622 -0
- data/lib/activeresource/test/cases/callbacks_test.rb +155 -0
- data/lib/activeresource/test/cases/collection_test.rb +172 -0
- data/lib/activeresource/test/cases/connection_test.rb +357 -0
- data/lib/activeresource/test/cases/finder_test.rb +217 -0
- data/lib/activeresource/test/cases/format_test.rb +137 -0
- data/lib/activeresource/test/cases/http_mock_test.rb +213 -0
- data/lib/activeresource/test/cases/inheritence_test.rb +19 -0
- data/lib/activeresource/test/cases/inheriting_hash_test.rb +25 -0
- data/lib/activeresource/test/cases/log_subscriber_test.rb +63 -0
- data/lib/activeresource/test/cases/reflection_test.rb +65 -0
- data/lib/activeresource/test/cases/validations_test.rb +78 -0
- data/lib/activeresource/test/fixtures/address.rb +20 -0
- data/lib/activeresource/test/fixtures/beast.rb +16 -0
- data/lib/activeresource/test/fixtures/comment.rb +5 -0
- data/lib/activeresource/test/fixtures/customer.rb +5 -0
- data/lib/activeresource/test/fixtures/inventory.rb +14 -0
- data/lib/activeresource/test/fixtures/person.rb +15 -0
- data/lib/activeresource/test/fixtures/pet.rb +6 -0
- data/lib/activeresource/test/fixtures/post.rb +5 -0
- data/lib/activeresource/test/fixtures/product.rb +11 -0
- data/lib/activeresource/test/fixtures/project.rb +19 -0
- data/lib/activeresource/test/fixtures/proxy.rb +6 -0
- data/lib/activeresource/test/fixtures/sound.rb +11 -0
- data/lib/activeresource/test/fixtures/street_address.rb +6 -0
- data/lib/activeresource/test/fixtures/subscription_plan.rb +7 -0
- data/lib/activeresource/test/fixtures/weather.rb +21 -0
- data/lib/activeresource/test/setter_trap.rb +28 -0
- data/lib/activeresource/test/singleton_test.rb +138 -0
- data/lib/activeresource/test/threadsafe_attributes_test.rb +91 -0
- data/lib/generators/active_cached_resource/install_generator.rb +31 -0
- data/lib/generators/active_cached_resource/templates/migration.erb +16 -0
- data/sorbet/config +4 -0
- data/sorbet/rbi/annotations/.gitattributes +1 -0
- data/sorbet/rbi/annotations/activemodel.rbi +89 -0
- data/sorbet/rbi/annotations/activesupport.rbi +457 -0
- data/sorbet/rbi/annotations/minitest.rbi +119 -0
- data/sorbet/rbi/annotations/rainbow.rbi +269 -0
- data/sorbet/rbi/dsl/.gitattributes +1 -0
- data/sorbet/rbi/dsl/active_support/callbacks.rbi +21 -0
- data/sorbet/rbi/gems/.gitattributes +1 -0
- data/sorbet/rbi/gems/actioncable@8.0.0.rbi +252 -0
- data/sorbet/rbi/gems/actionmailbox@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/actionmailer@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/actionpack@8.0.0.rbi +20909 -0
- data/sorbet/rbi/gems/actiontext@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/actionview@8.0.0.rbi +16207 -0
- data/sorbet/rbi/gems/activejob@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/activemodel-serializers-xml@1.0.3.rbi +166 -0
- data/sorbet/rbi/gems/activemodel@8.0.0.rbi +6857 -0
- data/sorbet/rbi/gems/activerecord@8.0.0.rbi +42896 -0
- data/sorbet/rbi/gems/activeresource@6.1.4.rbi +3944 -0
- data/sorbet/rbi/gems/activestorage@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/activesupport@8.0.0.rbi +21251 -0
- data/sorbet/rbi/gems/ast@2.4.2.rbi +585 -0
- data/sorbet/rbi/gems/base64@0.2.0.rbi +509 -0
- data/sorbet/rbi/gems/benchmark@0.4.0.rbi +618 -0
- data/sorbet/rbi/gems/bigdecimal@3.1.8.rbi +78 -0
- data/sorbet/rbi/gems/builder@3.3.0.rbi +9 -0
- data/sorbet/rbi/gems/bump@0.10.0.rbi +169 -0
- data/sorbet/rbi/gems/byebug@11.1.3.rbi +3607 -0
- data/sorbet/rbi/gems/coderay@1.1.3.rbi +3427 -0
- data/sorbet/rbi/gems/concurrent-ruby@1.3.4.rbi +11645 -0
- data/sorbet/rbi/gems/connection_pool@2.4.1.rbi +9 -0
- data/sorbet/rbi/gems/crass@1.0.6.rbi +623 -0
- data/sorbet/rbi/gems/date@3.4.0.rbi +75 -0
- data/sorbet/rbi/gems/diff-lcs@1.5.1.rbi +1131 -0
- data/sorbet/rbi/gems/docile@1.4.1.rbi +377 -0
- data/sorbet/rbi/gems/drb@2.2.1.rbi +1347 -0
- data/sorbet/rbi/gems/erubi@1.13.0.rbi +150 -0
- data/sorbet/rbi/gems/globalid@1.2.1.rbi +9 -0
- data/sorbet/rbi/gems/i18n@1.14.6.rbi +2359 -0
- data/sorbet/rbi/gems/io-console@0.7.2.rbi +9 -0
- data/sorbet/rbi/gems/json@2.8.2.rbi +1901 -0
- data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14238 -0
- data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +240 -0
- data/sorbet/rbi/gems/logger@1.6.1.rbi +920 -0
- data/sorbet/rbi/gems/loofah@2.23.1.rbi +1081 -0
- data/sorbet/rbi/gems/mail@2.8.1.rbi +9 -0
- data/sorbet/rbi/gems/marcel@1.0.4.rbi +9 -0
- data/sorbet/rbi/gems/method_source@1.1.0.rbi +304 -0
- data/sorbet/rbi/gems/mini_mime@1.1.5.rbi +9 -0
- data/sorbet/rbi/gems/minitest@5.25.2.rbi +1547 -0
- data/sorbet/rbi/gems/net-imap@0.5.1.rbi +9 -0
- data/sorbet/rbi/gems/net-pop@0.1.2.rbi +9 -0
- data/sorbet/rbi/gems/net-protocol@0.2.2.rbi +292 -0
- data/sorbet/rbi/gems/net-smtp@0.5.0.rbi +9 -0
- data/sorbet/rbi/gems/netrc@0.11.0.rbi +159 -0
- data/sorbet/rbi/gems/nio4r@2.7.4.rbi +9 -0
- data/sorbet/rbi/gems/nokogiri@1.16.7.rbi +7311 -0
- data/sorbet/rbi/gems/parallel@1.26.3.rbi +291 -0
- data/sorbet/rbi/gems/parser@3.3.6.0.rbi +5519 -0
- data/sorbet/rbi/gems/prism@1.2.0.rbi +39085 -0
- data/sorbet/rbi/gems/pry-byebug@3.10.1.rbi +1151 -0
- data/sorbet/rbi/gems/pry@0.14.2.rbi +10076 -0
- data/sorbet/rbi/gems/psych@5.2.0.rbi +1785 -0
- data/sorbet/rbi/gems/racc@1.8.1.rbi +162 -0
- data/sorbet/rbi/gems/rack-session@2.0.0.rbi +727 -0
- data/sorbet/rbi/gems/rack-test@2.1.0.rbi +747 -0
- data/sorbet/rbi/gems/rack@3.1.8.rbi +4905 -0
- data/sorbet/rbi/gems/rackup@2.2.1.rbi +230 -0
- data/sorbet/rbi/gems/rails-dom-testing@2.2.0.rbi +758 -0
- data/sorbet/rbi/gems/rails-html-sanitizer@1.6.0.rbi +785 -0
- data/sorbet/rbi/gems/rails@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/railties@8.0.0.rbi +6287 -0
- data/sorbet/rbi/gems/rainbow@3.1.1.rbi +403 -0
- data/sorbet/rbi/gems/rake@13.2.1.rbi +3091 -0
- data/sorbet/rbi/gems/rbi@0.2.1.rbi +4535 -0
- data/sorbet/rbi/gems/rdoc@6.8.1.rbi +12572 -0
- data/sorbet/rbi/gems/regexp_parser@2.9.2.rbi +3772 -0
- data/sorbet/rbi/gems/reline@0.5.12.rbi +2416 -0
- data/sorbet/rbi/gems/rexml@3.3.9.rbi +4858 -0
- data/sorbet/rbi/gems/rspec-core@3.13.2.rbi +11287 -0
- data/sorbet/rbi/gems/rspec-expectations@3.13.3.rbi +8183 -0
- data/sorbet/rbi/gems/rspec-mocks@3.13.2.rbi +5341 -0
- data/sorbet/rbi/gems/rspec-support@3.13.1.rbi +1630 -0
- data/sorbet/rbi/gems/rspec@3.13.0.rbi +83 -0
- data/sorbet/rbi/gems/rubocop-ast@1.36.1.rbi +7303 -0
- data/sorbet/rbi/gems/rubocop-performance@1.21.1.rbi +9 -0
- data/sorbet/rbi/gems/rubocop@1.65.1.rbi +58170 -0
- data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1318 -0
- data/sorbet/rbi/gems/securerandom@0.3.2.rbi +395 -0
- data/sorbet/rbi/gems/simplecov-html@0.13.1.rbi +225 -0
- data/sorbet/rbi/gems/simplecov@0.22.0.rbi +2149 -0
- data/sorbet/rbi/gems/simplecov_json_formatter@0.1.4.rbi +9 -0
- data/sorbet/rbi/gems/spoom@1.5.0.rbi +4932 -0
- data/sorbet/rbi/gems/standard-custom@1.0.2.rbi +9 -0
- data/sorbet/rbi/gems/standard-performance@1.4.0.rbi +9 -0
- data/sorbet/rbi/gems/standard@1.40.0.rbi +929 -0
- data/sorbet/rbi/gems/stringio@3.1.2.rbi +9 -0
- data/sorbet/rbi/gems/tapioca@0.16.4.rbi +3597 -0
- data/sorbet/rbi/gems/thor@1.3.2.rbi +4378 -0
- data/sorbet/rbi/gems/timeout@0.4.2.rbi +151 -0
- data/sorbet/rbi/gems/tzinfo@2.0.6.rbi +5918 -0
- data/sorbet/rbi/gems/unicode-display_width@2.6.0.rbi +66 -0
- data/sorbet/rbi/gems/uri@1.0.2.rbi +2377 -0
- data/sorbet/rbi/gems/useragent@0.16.10.rbi +9 -0
- data/sorbet/rbi/gems/websocket-driver@0.7.6.rbi +9 -0
- data/sorbet/rbi/gems/websocket-extensions@0.1.5.rbi +9 -0
- data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +435 -0
- data/sorbet/rbi/gems/yard@0.9.37.rbi +18504 -0
- data/sorbet/rbi/gems/zeitwerk@2.7.1.rbi +9 -0
- data/sorbet/tapioca/config.yml +13 -0
- data/sorbet/tapioca/require.rb +12 -0
- metadata +543 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "abstract_unit"
|
|
4
|
+
require "active_support/core_ext/hash/conversions"
|
|
5
|
+
|
|
6
|
+
class Developer < ActiveResource::Base
|
|
7
|
+
self.site = "http://37s.sunrise.i:3000"
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
def callback_string(callback_method)
|
|
11
|
+
"history << [#{callback_method.to_sym.inspect}, :string]"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def callback_proc(callback_method)
|
|
15
|
+
Proc.new { |model| model.history << [callback_method, :proc] }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def define_callback_method(callback_method)
|
|
19
|
+
define_method(callback_method) do
|
|
20
|
+
self.history << [callback_method, :method]
|
|
21
|
+
end
|
|
22
|
+
send(callback_method, :"#{callback_method}")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def callback_object(callback_method)
|
|
26
|
+
klass = Class.new
|
|
27
|
+
klass.send(:define_method, callback_method) do |model|
|
|
28
|
+
model.history << [callback_method, :object]
|
|
29
|
+
end
|
|
30
|
+
klass.new
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
ActiveResource::Callbacks::CALLBACKS.each do |callback_method|
|
|
35
|
+
next if callback_method.to_s =~ /^around_/
|
|
36
|
+
define_callback_method(callback_method)
|
|
37
|
+
send(callback_method, callback_proc(callback_method))
|
|
38
|
+
send(callback_method, callback_object(callback_method))
|
|
39
|
+
send(callback_method) { |model| model.history << [callback_method, :block] }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def history
|
|
43
|
+
@history ||= []
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class CallbacksTest < ActiveSupport::TestCase
|
|
48
|
+
def setup
|
|
49
|
+
@developer_attrs = { id: 1, name: "Guillermo", salary: 100_000 }
|
|
50
|
+
@developer = { "developer" => @developer_attrs }.to_json
|
|
51
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
|
52
|
+
mock.post "/developers.json", {}, @developer, 201, "Location" => "/developers/1.json"
|
|
53
|
+
mock.get "/developers/1.json", {}, @developer
|
|
54
|
+
mock.put "/developers/1.json", {}, nil, 204
|
|
55
|
+
mock.delete "/developers/1.json", {}, nil, 200
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_valid?
|
|
60
|
+
developer = Developer.new
|
|
61
|
+
developer.valid?
|
|
62
|
+
assert_equal [
|
|
63
|
+
[ :before_validation, :method ],
|
|
64
|
+
[ :before_validation, :proc ],
|
|
65
|
+
[ :before_validation, :object ],
|
|
66
|
+
[ :before_validation, :block ],
|
|
67
|
+
[ :after_validation, :method ],
|
|
68
|
+
[ :after_validation, :proc ],
|
|
69
|
+
[ :after_validation, :object ],
|
|
70
|
+
[ :after_validation, :block ],
|
|
71
|
+
], developer.history
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_create
|
|
75
|
+
developer = Developer.create(@developer_attrs)
|
|
76
|
+
assert_equal [
|
|
77
|
+
[ :before_validation, :method ],
|
|
78
|
+
[ :before_validation, :proc ],
|
|
79
|
+
[ :before_validation, :object ],
|
|
80
|
+
[ :before_validation, :block ],
|
|
81
|
+
[ :after_validation, :method ],
|
|
82
|
+
[ :after_validation, :proc ],
|
|
83
|
+
[ :after_validation, :object ],
|
|
84
|
+
[ :after_validation, :block ],
|
|
85
|
+
[ :before_save, :method ],
|
|
86
|
+
[ :before_save, :proc ],
|
|
87
|
+
[ :before_save, :object ],
|
|
88
|
+
[ :before_save, :block ],
|
|
89
|
+
[ :before_create, :method ],
|
|
90
|
+
[ :before_create, :proc ],
|
|
91
|
+
[ :before_create, :object ],
|
|
92
|
+
[ :before_create, :block ],
|
|
93
|
+
[ :after_create, :method ],
|
|
94
|
+
[ :after_create, :proc ],
|
|
95
|
+
[ :after_create, :object ],
|
|
96
|
+
[ :after_create, :block ],
|
|
97
|
+
[ :after_save, :method ],
|
|
98
|
+
[ :after_save, :proc ],
|
|
99
|
+
[ :after_save, :object ],
|
|
100
|
+
[ :after_save, :block ]
|
|
101
|
+
], developer.history
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_update
|
|
105
|
+
developer = Developer.find(1)
|
|
106
|
+
developer.save
|
|
107
|
+
assert_equal [
|
|
108
|
+
[ :before_validation, :method ],
|
|
109
|
+
[ :before_validation, :proc ],
|
|
110
|
+
[ :before_validation, :object ],
|
|
111
|
+
[ :before_validation, :block ],
|
|
112
|
+
[ :after_validation, :method ],
|
|
113
|
+
[ :after_validation, :proc ],
|
|
114
|
+
[ :after_validation, :object ],
|
|
115
|
+
[ :after_validation, :block ],
|
|
116
|
+
[ :before_save, :method ],
|
|
117
|
+
[ :before_save, :proc ],
|
|
118
|
+
[ :before_save, :object ],
|
|
119
|
+
[ :before_save, :block ],
|
|
120
|
+
[ :before_update, :method ],
|
|
121
|
+
[ :before_update, :proc ],
|
|
122
|
+
[ :before_update, :object ],
|
|
123
|
+
[ :before_update, :block ],
|
|
124
|
+
[ :after_update, :method ],
|
|
125
|
+
[ :after_update, :proc ],
|
|
126
|
+
[ :after_update, :object ],
|
|
127
|
+
[ :after_update, :block ],
|
|
128
|
+
[ :after_save, :method ],
|
|
129
|
+
[ :after_save, :proc ],
|
|
130
|
+
[ :after_save, :object ],
|
|
131
|
+
[ :after_save, :block ]
|
|
132
|
+
], developer.history
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def test_destroy
|
|
136
|
+
developer = Developer.find(1)
|
|
137
|
+
developer.destroy
|
|
138
|
+
assert_equal [
|
|
139
|
+
[ :before_destroy, :method ],
|
|
140
|
+
[ :before_destroy, :proc ],
|
|
141
|
+
[ :before_destroy, :object ],
|
|
142
|
+
[ :before_destroy, :block ],
|
|
143
|
+
[ :after_destroy, :method ],
|
|
144
|
+
[ :after_destroy, :proc ],
|
|
145
|
+
[ :after_destroy, :object ],
|
|
146
|
+
[ :after_destroy, :block ]
|
|
147
|
+
], developer.history
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def test_delete
|
|
151
|
+
developer = Developer.find(1)
|
|
152
|
+
Developer.delete(developer.id)
|
|
153
|
+
assert_equal [], developer.history
|
|
154
|
+
end
|
|
155
|
+
end
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "abstract_unit"
|
|
4
|
+
|
|
5
|
+
class CollectionTest < ActiveSupport::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
@collection = ActiveResource::Collection.new
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class BasicCollectionTest < CollectionTest
|
|
12
|
+
def test_collection_respond_to_first_or_create
|
|
13
|
+
assert @collection.respond_to?(:first_or_create)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_collection_respond_to_first_or_initialize
|
|
17
|
+
assert @collection.respond_to?(:first_or_initialize)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_first_or_create_without_resource_class_raises_error
|
|
21
|
+
assert_raise(RuntimeError) { @collection.first_or_create }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_first_or_initialize_without_resource_class_raises_error
|
|
25
|
+
assert_raise(RuntimeError) { @collection.first_or_initialize }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def respond_to_where
|
|
29
|
+
assert @collection.respond_to?(:where)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class PaginatedCollection < ActiveResource::Collection
|
|
34
|
+
attr_accessor :next_page
|
|
35
|
+
def parse_response(parsed)
|
|
36
|
+
@elements = parsed["results"]
|
|
37
|
+
@next_page = parsed["next_page"]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class PaginatedPost < ActiveResource::Base
|
|
42
|
+
self.site = "http://37s.sunrise.i:3000"
|
|
43
|
+
self.collection_parser = "PaginatedCollection"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class ReduxCollection < ActiveResource::Base
|
|
47
|
+
self.site = "http://37s.sunrise.i:3000"
|
|
48
|
+
self.collection_parser = PaginatedCollection
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class CollectionInheritanceTest < ActiveSupport::TestCase
|
|
53
|
+
def setup
|
|
54
|
+
@post = { id: 1, title: "Awesome" }
|
|
55
|
+
@post_even_more = { id: 1, title: "Awesome", subtitle: "EvenMore" }
|
|
56
|
+
@posts_hash = { "results" => [@post], :next_page => "/paginated_posts.json?page=2" }
|
|
57
|
+
@posts = @posts_hash.to_json
|
|
58
|
+
@posts2 = { "results" => [@post.merge(id: 2)], :next_page => nil }.to_json
|
|
59
|
+
|
|
60
|
+
@empty_posts = { "results" => [], :next_page => nil }.to_json
|
|
61
|
+
@new_post = { id: nil, title: nil }.to_json
|
|
62
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
|
63
|
+
mock.get "/paginated_posts.json", {}, @posts
|
|
64
|
+
mock.get "/paginated_posts/new.json", {}, @new_post
|
|
65
|
+
mock.get "/paginated_posts.json?page=2", {}, @posts
|
|
66
|
+
mock.get "/paginated_posts.json?title=test", {}, @empty_posts
|
|
67
|
+
mock.get "/paginated_posts.json?page=2&title=Awesome", {}, @posts
|
|
68
|
+
mock.get "/paginated_posts.json?subtitle=EvenMore&title=Awesome", {}, @posts
|
|
69
|
+
mock.get "/paginated_posts.json?title=notfound", {}, nil, 404
|
|
70
|
+
mock.get "/paginated_posts.json?title=internalservererror", {}, nil, 500
|
|
71
|
+
mock.post "/paginated_posts.json", {}, nil
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_setting_collection_parser
|
|
76
|
+
assert_kind_of PaginatedCollection, PaginatedPost.find(:all)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_setting_collection_parser_resource_class
|
|
80
|
+
assert_equal PaginatedPost, PaginatedPost.where(page: 2).resource_class
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_setting_collection_parser_query_params
|
|
84
|
+
assert_equal({ page: 2 }, PaginatedPost.where(page: 2).query_params)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def test_custom_accessor
|
|
88
|
+
assert_equal PaginatedPost.find(:all).call.next_page, @posts_hash[:next_page]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test_first_or_create
|
|
92
|
+
post = PaginatedPost.where(title: "test").first_or_create
|
|
93
|
+
assert post.valid?
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_first_or_initialize
|
|
97
|
+
post = PaginatedPost.where(title: "test").first_or_initialize
|
|
98
|
+
assert post.valid?
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_where
|
|
102
|
+
posts = PaginatedPost.where(page: 2)
|
|
103
|
+
next_posts = posts.where(title: "Awesome")
|
|
104
|
+
assert_kind_of PaginatedCollection, next_posts
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def test_where_lazy_chain
|
|
108
|
+
expected_request = ActiveResource::Request.new(
|
|
109
|
+
:get,
|
|
110
|
+
"/paginated_posts.json?subtitle=EvenMore&title=Awesome",
|
|
111
|
+
nil,
|
|
112
|
+
{ "Accept" => "application/json" }
|
|
113
|
+
)
|
|
114
|
+
posts = PaginatedPost.where(title: "Awesome").where(subtitle: "EvenMore")
|
|
115
|
+
assert_not posts.requested?
|
|
116
|
+
assert_equal 0, ActiveResource::HttpMock.requests.count { |r| r == expected_request }
|
|
117
|
+
# Call twice to ensure the request is only made once
|
|
118
|
+
posts.to_a
|
|
119
|
+
posts.to_a
|
|
120
|
+
assert_equal 1, ActiveResource::HttpMock.requests.count { |r| r == expected_request }
|
|
121
|
+
assert posts.requested?
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test_where_lazy_chain_with_no_results
|
|
125
|
+
posts = PaginatedPost.where(title: "notfound")
|
|
126
|
+
assert_not posts.requested?
|
|
127
|
+
assert_equal [], posts.to_a
|
|
128
|
+
assert posts.requested?
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def test_where_lazy_chain_internal_server_error
|
|
132
|
+
posts = PaginatedPost.where(title: "internalservererror")
|
|
133
|
+
assert_not posts.requested?
|
|
134
|
+
assert_raise ActiveResource::ServerError do
|
|
135
|
+
posts.to_a
|
|
136
|
+
end
|
|
137
|
+
assert posts.requested?
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def test_refresh
|
|
141
|
+
expected_request = ActiveResource::Request.new(
|
|
142
|
+
:get,
|
|
143
|
+
"/paginated_posts.json?page=2",
|
|
144
|
+
@posts,
|
|
145
|
+
{ "Accept" => "application/json" }
|
|
146
|
+
)
|
|
147
|
+
posts = PaginatedPost.where(page: 2)
|
|
148
|
+
|
|
149
|
+
assert_not posts.requested?
|
|
150
|
+
posts.to_a
|
|
151
|
+
assert posts.requested?
|
|
152
|
+
assert_equal 1, ActiveResource::HttpMock.requests.count { |r| r == expected_request }
|
|
153
|
+
posts.refresh
|
|
154
|
+
assert_equal 2, ActiveResource::HttpMock.requests.count { |r| r == expected_request }
|
|
155
|
+
assert posts.requested?
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def test_call
|
|
159
|
+
expected_request = ActiveResource::Request.new(
|
|
160
|
+
:get,
|
|
161
|
+
"/paginated_posts.json?page=2",
|
|
162
|
+
@posts,
|
|
163
|
+
{ "Accept" => "application/json" }
|
|
164
|
+
)
|
|
165
|
+
posts = PaginatedPost.where(page: 2)
|
|
166
|
+
|
|
167
|
+
assert_not posts.requested?
|
|
168
|
+
assert_kind_of PaginatedCollection, posts.call
|
|
169
|
+
assert posts.requested?
|
|
170
|
+
assert_equal 1, ActiveResource::HttpMock.requests.count { |r| r == expected_request }
|
|
171
|
+
end
|
|
172
|
+
end
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "abstract_unit"
|
|
4
|
+
|
|
5
|
+
class ConnectionTest < ActiveSupport::TestCase
|
|
6
|
+
ResponseCodeStub = Struct.new(:code)
|
|
7
|
+
RedirectResponseStub = Struct.new(:code, :Location)
|
|
8
|
+
|
|
9
|
+
def setup
|
|
10
|
+
@conn = ActiveResource::Connection.new("http://localhost")
|
|
11
|
+
matz = { person: { id: 1, name: "Matz" } }
|
|
12
|
+
david = { person: { id: 2, name: "David" } }
|
|
13
|
+
@people = { people: [ matz, david ] }.to_json
|
|
14
|
+
@people_single = { "people-single-elements" => [ matz ] }.to_json
|
|
15
|
+
@people_empty = { "people-empty-elements" => [ ] }.to_json
|
|
16
|
+
@matz = matz.to_json
|
|
17
|
+
@david = david.to_json
|
|
18
|
+
@header = { "key" => "value" }.freeze
|
|
19
|
+
|
|
20
|
+
@default_request_headers = { "Content-Type" => "application/json" }
|
|
21
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
|
22
|
+
mock.get "/people/2.json", @header, @david
|
|
23
|
+
mock.get "/people.json", {}, @people
|
|
24
|
+
mock.get "/people_single_elements.json", {}, @people_single
|
|
25
|
+
mock.get "/people_empty_elements.json", {}, @people_empty
|
|
26
|
+
mock.get "/people/1.json", {}, @matz
|
|
27
|
+
mock.put "/people/1.json", {}, nil, 204
|
|
28
|
+
mock.put "/people/2.json", {}, @header, 204
|
|
29
|
+
mock.delete "/people/1.json", {}, nil, 200
|
|
30
|
+
mock.delete "/people/2.json", @header, nil, 200
|
|
31
|
+
mock.post "/people.json", {}, nil, 201, "Location" => "/people/5.json"
|
|
32
|
+
mock.post "/members.json", {}, @header, 201, "Location" => "/people/6.json"
|
|
33
|
+
mock.head "/people/1.json", {}, nil, 200
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_same_logger_as_base
|
|
38
|
+
old_logger = ActiveResource::Base.logger
|
|
39
|
+
ActiveResource::Base.logger = original_logger = Object.new
|
|
40
|
+
old_site = ActiveResource::Base.site
|
|
41
|
+
|
|
42
|
+
ActiveResource::Base.site = "http://localhost"
|
|
43
|
+
assert_equal original_logger, ActiveResource::Base.connection.logger
|
|
44
|
+
|
|
45
|
+
ActiveResource::Base.logger = Logger.new(STDOUT)
|
|
46
|
+
assert_equal ActiveResource::Base.logger, ActiveResource::Base.connection.logger
|
|
47
|
+
ensure
|
|
48
|
+
ActiveResource::Base.logger = old_logger
|
|
49
|
+
ActiveResource::Base.site = old_site
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def test_handle_response
|
|
53
|
+
# 2xx and 3xx are valid responses.
|
|
54
|
+
[200, 299, 300, 399].each do |code|
|
|
55
|
+
expected = ResponseCodeStub.new(code)
|
|
56
|
+
assert_equal expected, handle_response(expected)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# 301 is moved permanently (redirect)
|
|
60
|
+
assert_redirect_raises 301
|
|
61
|
+
|
|
62
|
+
# 302 is found (redirect)
|
|
63
|
+
assert_redirect_raises 302
|
|
64
|
+
|
|
65
|
+
# 303 is see other (redirect)
|
|
66
|
+
assert_redirect_raises 303
|
|
67
|
+
|
|
68
|
+
# 307 is temporary redirect
|
|
69
|
+
assert_redirect_raises 307
|
|
70
|
+
|
|
71
|
+
# 400 is a bad request (e.g. malformed URI or missing request parameter)
|
|
72
|
+
assert_response_raises ActiveResource::BadRequest, 400
|
|
73
|
+
|
|
74
|
+
# 401 is an unauthorized request
|
|
75
|
+
assert_response_raises ActiveResource::UnauthorizedAccess, 401
|
|
76
|
+
|
|
77
|
+
# 402 is a payment required error.
|
|
78
|
+
assert_response_raises ActiveResource::PaymentRequired, 402
|
|
79
|
+
|
|
80
|
+
# 403 is a forbidden request (and authorizing will not help)
|
|
81
|
+
assert_response_raises ActiveResource::ForbiddenAccess, 403
|
|
82
|
+
|
|
83
|
+
# 404 is a missing resource.
|
|
84
|
+
assert_response_raises ActiveResource::ResourceNotFound, 404
|
|
85
|
+
|
|
86
|
+
# 405 is a method not allowed error
|
|
87
|
+
assert_response_raises ActiveResource::MethodNotAllowed, 405
|
|
88
|
+
|
|
89
|
+
# 409 is an optimistic locking error
|
|
90
|
+
assert_response_raises ActiveResource::ResourceConflict, 409
|
|
91
|
+
|
|
92
|
+
# 410 is a removed resource
|
|
93
|
+
assert_response_raises ActiveResource::ResourceGone, 410
|
|
94
|
+
|
|
95
|
+
# 412 is a precondition failed
|
|
96
|
+
assert_response_raises ActiveResource::PreconditionFailed, 412
|
|
97
|
+
|
|
98
|
+
# 422 is a validation error
|
|
99
|
+
assert_response_raises ActiveResource::ResourceInvalid, 422
|
|
100
|
+
|
|
101
|
+
# 429 is too many requests
|
|
102
|
+
assert_response_raises ActiveResource::TooManyRequests, 429
|
|
103
|
+
|
|
104
|
+
# 4xx are client errors.
|
|
105
|
+
[402, 499].each do |code|
|
|
106
|
+
assert_response_raises ActiveResource::ClientError, code
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# 5xx are server errors.
|
|
110
|
+
[500, 599].each do |code|
|
|
111
|
+
assert_response_raises ActiveResource::ServerError, code
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Others are unknown.
|
|
115
|
+
[199, 600].each do |code|
|
|
116
|
+
assert_response_raises ActiveResource::ConnectionError, code
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
ResponseHeaderStub = Struct.new(:code, :message, "Allow")
|
|
121
|
+
def test_should_return_allowed_methods_for_method_no_allowed_exception
|
|
122
|
+
handle_response ResponseHeaderStub.new(405, "HTTP Failed...", "GET, POST")
|
|
123
|
+
rescue ActiveResource::MethodNotAllowed => e
|
|
124
|
+
assert_equal "Failed. Response code = 405. Response message = HTTP Failed....", e.message
|
|
125
|
+
assert_equal [:get, :post], e.allowed_methods
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_initialize_raises_argument_error_on_missing_site
|
|
129
|
+
assert_raise(ArgumentError) { ActiveResource::Connection.new(nil) }
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def test_site_accessor_accepts_uri_or_string_argument
|
|
133
|
+
site = URI.parse("http://localhost")
|
|
134
|
+
|
|
135
|
+
assert_raise(URI::InvalidURIError) { @conn.site = nil }
|
|
136
|
+
|
|
137
|
+
assert_nothing_raised { @conn.site = "http://localhost" }
|
|
138
|
+
assert_equal site, @conn.site
|
|
139
|
+
|
|
140
|
+
assert_nothing_raised { @conn.site = site }
|
|
141
|
+
assert_equal site, @conn.site
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def test_proxy_accessor_accepts_uri_or_string_argument
|
|
145
|
+
proxy = URI.parse("http://proxy_user:proxy_password@proxy.local:4242")
|
|
146
|
+
|
|
147
|
+
assert_nothing_raised { @conn.proxy = "http://proxy_user:proxy_password@proxy.local:4242" }
|
|
148
|
+
assert_equal proxy, @conn.proxy
|
|
149
|
+
|
|
150
|
+
assert_nothing_raised { @conn.proxy = proxy }
|
|
151
|
+
assert_equal proxy, @conn.proxy
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def test_proxy_accessor_accepts_uri_or_string_argument_with_special_characters
|
|
155
|
+
user = "proxy_;{(,!$%_user"
|
|
156
|
+
password = "proxy_;:{(,!$%_password"
|
|
157
|
+
|
|
158
|
+
encoded_user = URI.encode_www_form_component(user) # "proxy_;%7B(,!$%25_user"
|
|
159
|
+
encoded_password = URI.encode_www_form_component(password) # "proxy_;:%7B(,!$%25_password"
|
|
160
|
+
|
|
161
|
+
proxy = URI.parse("http://#{encoded_user}:#{encoded_password}@proxy.local:4242")
|
|
162
|
+
|
|
163
|
+
assert_nothing_raised { @conn.proxy = "http://#{encoded_user}:#{encoded_password}@proxy.local:4242" }
|
|
164
|
+
assert_equal user, @conn.send(:new_http).proxy_user
|
|
165
|
+
assert_equal password, @conn.send(:new_http).proxy_pass
|
|
166
|
+
|
|
167
|
+
assert_nothing_raised { @conn.proxy = proxy }
|
|
168
|
+
assert_equal user, @conn.send(:new_http).proxy_user
|
|
169
|
+
assert_equal password, @conn.send(:new_http).proxy_pass
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def test_timeout_accessor
|
|
173
|
+
@conn.timeout = 5
|
|
174
|
+
assert_equal 5, @conn.timeout
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def test_get
|
|
178
|
+
matz = decode(@conn.get("/people/1.json"))
|
|
179
|
+
assert_equal "Matz", matz["name"]
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def test_head
|
|
183
|
+
response = @conn.head("/people/1.json")
|
|
184
|
+
assert response.body.blank?
|
|
185
|
+
assert_equal 200, response.code
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def test_get_with_header
|
|
189
|
+
david = decode(@conn.get("/people/2.json", @header))
|
|
190
|
+
assert_equal "David", david["name"]
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def test_get_collection
|
|
194
|
+
people = decode(@conn.get("/people.json"))
|
|
195
|
+
assert_equal "Matz", people[0]["person"]["name"]
|
|
196
|
+
assert_equal "David", people[1]["person"]["name"]
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def test_get_collection_single
|
|
200
|
+
people = decode(@conn.get("/people_single_elements.json"))
|
|
201
|
+
assert_equal "Matz", people[0]["person"]["name"]
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def test_get_collection_empty
|
|
205
|
+
people = decode(@conn.get("/people_empty_elements.json"))
|
|
206
|
+
assert_equal [], people
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def test_post
|
|
210
|
+
response = @conn.post("/people.json")
|
|
211
|
+
assert_equal "/people/5.json", response["Location"]
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def test_post_with_header
|
|
215
|
+
response = @conn.post("/members.json", @header)
|
|
216
|
+
assert_equal "/people/6.json", response["Location"]
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def test_put
|
|
220
|
+
response = @conn.put("/people/1.json")
|
|
221
|
+
assert_equal 204, response.code
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def test_put_with_header
|
|
225
|
+
response = @conn.put("/people/2.json", @header)
|
|
226
|
+
assert_equal 204, response.code
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def test_delete
|
|
230
|
+
response = @conn.delete("/people/1.json")
|
|
231
|
+
assert_equal 200, response.code
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def test_delete_with_header
|
|
235
|
+
response = @conn.delete("/people/2.json", @header)
|
|
236
|
+
assert_equal 200, response.code
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def test_timeout
|
|
240
|
+
@http = mock("new Net::HTTP")
|
|
241
|
+
@conn.expects(:http).returns(@http)
|
|
242
|
+
@http.expects(:get).raises(Timeout::Error, "execution expired")
|
|
243
|
+
assert_raise(ActiveResource::TimeoutError) { @conn.get("/people_timeout.json") }
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def test_setting_timeout
|
|
247
|
+
http = Net::HTTP.new("")
|
|
248
|
+
|
|
249
|
+
[10, 20].each do |timeout|
|
|
250
|
+
@conn.timeout = timeout
|
|
251
|
+
@conn.send(:configure_http, http)
|
|
252
|
+
assert_equal timeout, http.open_timeout
|
|
253
|
+
assert_equal timeout, http.read_timeout
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def test_accept_http_header
|
|
258
|
+
@http = mock("new Net::HTTP")
|
|
259
|
+
@conn.expects(:http).returns(@http)
|
|
260
|
+
path = "/people/1.xml"
|
|
261
|
+
@http.expects(:get).with(path, { "Accept" => "application/xhtml+xml" }).returns(ActiveResource::Response.new(@matz, 200, { "Content-Type" => "text/xhtml" }))
|
|
262
|
+
assert_nothing_raised { @conn.get(path, "Accept" => "application/xhtml+xml") }
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def test_ssl_options_get_applied_to_http
|
|
266
|
+
http = Net::HTTP.new("")
|
|
267
|
+
@conn.site = "https://secure"
|
|
268
|
+
@conn.ssl_options = { verify_mode: OpenSSL::SSL::VERIFY_PEER }
|
|
269
|
+
@conn.send(:configure_http, http)
|
|
270
|
+
|
|
271
|
+
assert http.use_ssl?
|
|
272
|
+
assert_equal http.verify_mode, OpenSSL::SSL::VERIFY_PEER
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def test_ssl_options_get_applied_to_https_urls_without_explicitly_setting_ssl_options
|
|
276
|
+
http = Net::HTTP.new("")
|
|
277
|
+
@conn.site = "https://secure"
|
|
278
|
+
assert @conn.send(:configure_http, http).use_ssl?
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def test_ssl_error
|
|
282
|
+
http = Net::HTTP.new("")
|
|
283
|
+
@conn.expects(:http).returns(http)
|
|
284
|
+
http.expects(:get).raises(OpenSSL::SSL::SSLError, "Expired certificate")
|
|
285
|
+
assert_raise(ActiveResource::SSLError) { @conn.get("/people/1.json") }
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def test_auth_type_can_be_string
|
|
289
|
+
@conn.auth_type = "digest"
|
|
290
|
+
assert_equal(:digest, @conn.auth_type)
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
def test_auth_type_defaults_to_basic
|
|
294
|
+
@conn.auth_type = nil
|
|
295
|
+
assert_equal(:basic, @conn.auth_type)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def test_auth_type_ignores_nonsensical_values
|
|
299
|
+
@conn.auth_type = :wibble
|
|
300
|
+
assert_equal(:basic, @conn.auth_type)
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def test_disable_net_connection_by_default_when_http_mock_is_available
|
|
304
|
+
assert_equal(ActiveResource::HttpMock, @conn.send(:http).class)
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def test_enable_net_connection
|
|
308
|
+
@conn.send(:http)
|
|
309
|
+
keep_net_connection_status do
|
|
310
|
+
ActiveResource::HttpMock.enable_net_connection!
|
|
311
|
+
assert @conn.send(:http).kind_of?(Net::HTTP)
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def test_disable_net_connection
|
|
316
|
+
keep_net_connection_status do
|
|
317
|
+
ActiveResource::HttpMock.enable_net_connection!
|
|
318
|
+
@conn.send(:http)
|
|
319
|
+
ActiveResource::HttpMock.disable_net_connection!
|
|
320
|
+
assert @conn.send(:http).kind_of?(ActiveResource::HttpMock)
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def keep_net_connection_status
|
|
325
|
+
old = ActiveResource::HttpMock.net_connection_enabled?
|
|
326
|
+
begin
|
|
327
|
+
yield
|
|
328
|
+
ensure
|
|
329
|
+
if old
|
|
330
|
+
ActiveResource::HttpMock.enable_net_connection!
|
|
331
|
+
else
|
|
332
|
+
ActiveResource::HttpMock.disable_net_connection!
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
protected
|
|
338
|
+
def assert_response_raises(klass, code)
|
|
339
|
+
assert_raise(klass, "Expected response code #{code} to raise #{klass}") do
|
|
340
|
+
handle_response ResponseCodeStub.new(code)
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def assert_redirect_raises(code)
|
|
345
|
+
assert_raise(ActiveResource::Redirection, "Expected response code #{code} to raise ActiveResource::Redirection") do
|
|
346
|
+
handle_response RedirectResponseStub.new(code, "http://example.com/")
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def handle_response(response)
|
|
351
|
+
@conn.__send__(:handle_response, response)
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
def decode(response)
|
|
355
|
+
@conn.format.decode(response.body)
|
|
356
|
+
end
|
|
357
|
+
end
|