Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save senid231/b91bb2e51e7dd45be3d6c16c018dcbb5 to your computer and use it in GitHub Desktop.
Save senid231/b91bb2e51e7dd45be3d6c16c018dcbb5 to your computer and use it in GitHub Desktop.
bug in jsonapi_resources master (tested after commit 38757c631e4d0e420830a8cfba52cfae48cc8a86). when fetch with including polymorphic association it fails with 500
begin
require 'bundler/inline'
require 'bundler'
rescue LoadError => e
STDERR.puts 'Bundler version 1.10 or later is required. Please update your Bundler'
raise e
end
gemfile(true, ui: ENV['SILENT'] ? Bundler::UI::Silent.new : Bundler::UI::Shell.new) do
source 'https://rubygems.org'
gem 'rails', require: false
gem 'sqlite3', platform: :mri
gem 'activerecord-jdbcsqlite3-adapter',
git: 'https://github.com/jruby/activerecord-jdbc-adapter',
branch: 'rails-5',
platform: :jruby
if ENV['JSONAPI_RESOURCES_PATH']
gem 'jsonapi-resources', path: ENV['JSONAPI_RESOURCES_PATH'], require: false
else
gem 'jsonapi-resources', git: 'https://github.com/cerebris/jsonapi-resources', require: false
end
end
# prepare active_record database
require 'active_record'
class NullLogger < Logger
def initialize(*_args)
end
def add(*_args, &_block)
end
end
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
ActiveRecord::Base.logger = ENV['SILENT'] ? NullLogger.new : Logger.new(STDOUT)
ActiveRecord::Migration.verbose = !ENV['SILENT']
ActiveRecord::Schema.define do
# Add your schema here
create_table :options, force: true do |t|
t.integer :optionable_id
t.string :optionable_type
t.boolean :enabled, default: false, null: false
end
create_table :androids, force: true do |t|
t.string :version_name
end
end
# create models
class Option < ActiveRecord::Base
belongs_to :optionable, polymorphic: true, required: false
end
class Android < ActiveRecord::Base
has_one :option, as: :optionable
end
# prepare rails app
require 'action_controller/railtie'
# require 'action_view/railtie'
require 'jsonapi-resources'
class ApplicationController < ActionController::Base
end
# prepare jsonapi resources and controllers
class OptionsController < ApplicationController
include JSONAPI::ActsAsResourceController
end
class OptionResource < JSONAPI::Resource
attribute :enabled
has_one :optionable, polymorphic: true, class_name: 'Android'
end
class AndroidResource < JSONAPI::Resource
attribute :version_name
end
class TestApp < Rails::Application
config.root = File.dirname(__FILE__)
config.logger = ENV['SILENT'] ? NullLogger.new : Logger.new(STDOUT)
Rails.logger = config.logger
secrets.secret_token = 'secret_token'
secrets.secret_key_base = 'secret_key_base'
config.eager_load = false
end
# initialize app
Rails.application.initialize!
JSONAPI.configure do |config|
config.json_key_format = :underscored_key
config.route_format = :underscored_key
end
# draw routes
Rails.application.routes.draw do
jsonapi_resources :options, only: [:show, :update]
end
# prepare tests
require 'minitest/autorun'
require 'rack/test'
# Replace this with the code necessary to make your test fail.
class BugTest < Minitest::Test
include Rack::Test::Methods
def json_api_headers
{'Accept' => JSONAPI::MEDIA_TYPE, 'CONTENT_TYPE' => JSONAPI::MEDIA_TYPE}
end
def test_patch_linkage_options_with_android
android = Android.create! version_name: '1.0'
option = Option.create!
json_request = {
data: {
id: option.id.to_s,
type: 'options',
relationships: {
optionable: {
data: {
id: android.id.to_s,
type: 'androids'
}
}
}
}
}
patch "/options/#{option.id}?include=optionable", json_request.to_json, json_api_headers
assert last_response.ok?
assert android, option.reload.optionable
end
def test_fetch_option_linked_with_android
android = Android.create! version_name: '1.0'
option = Option.create! optionable: android
get "/options/#{option.id}?include=optionable", nil, json_api_headers
assert last_response.ok?
end
private
def app
Rails.application
end
end
@senid231
Copy link
Author

senid231 commented Sep 6, 2017

I, [2017-09-06T18:51:12.610866 #27020]  INFO -- : Started GET "/options/1?include=optionable" for 127.0.0.1 at 2017-09-06 18:51:12 +0300
I, [2017-09-06T18:51:12.615273 #27020]  INFO -- : Processing by OptionsController#show as HTML
I, [2017-09-06T18:51:12.615541 #27020]  INFO -- :   Parameters: {"include"=>"optionable", "id"=>"1"}
D, [2017-09-06T18:51:12.621236 #27020] DEBUG -- :    (0.1ms)  SELECT options.id FROM "options" WHERE "options"."id" = ?  [["id", 1]]
No relations found for polymorphic relationship.
D, [2017-09-06T18:51:12.826236 #27020] DEBUG -- :    (8.8ms)  SELECT options.id, options.optionable_id, options.optionable_type FROM "options" WHERE "options"."id" = 1
E, [2017-09-06T18:51:12.828804 #27020] ERROR -- : Internal Server Error: undefined method `[]' for nil:NilClass /home/senid/projects/forked/jsonapi-resources/lib/jsonapi/active_relation_resource_finder.rb:338:in `block in find_related_polymorphic_fragments'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/active_relation_resource_finder.rb:329:in `each'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/active_relation_resource_finder.rb:329:in `find_related_polymorphic_fragments'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/active_relation_resource_finder.rb:117:in `find_related_fragments'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/processor.rb:476:in `block in get_related'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/core_ext/object/try.rb:17:in `each'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/core_ext/object/try.rb:17:in `public_send'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/core_ext/object/try.rb:17:in `try!'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/core_ext/object/try.rb:6:in `try'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/processor.rb:462:in `get_related'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/processor.rb:425:in `find_resource_id_tree'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/processor.rb:363:in `find_resource_set'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/processor.rb:97:in `show'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/processor.rb:34:in `block (2 levels) in process'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/callbacks.rb:97:in `run_callbacks'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/processor.rb:33:in `block in process'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/callbacks.rb:97:in `run_callbacks'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/processor.rb:32:in `process'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/operation.rb:12:in `process'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/acts_as_resource_controller.rb:123:in `process_operation'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/acts_as_resource_controller.rb:93:in `block (3 levels) in process_request'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/request_parser.rb:32:in `each'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/acts_as_resource_controller.rb:81:in `block (2 levels) in process_request'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/callbacks.rb:97:in `run_callbacks'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/acts_as_resource_controller.rb:80:in `block in process_request'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/acts_as_resource_controller.rb:115:in `process_operations'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/acts_as_resource_controller.rb:79:in `process_request'
/home/senid/projects/forked/jsonapi-resources/lib/jsonapi/acts_as_resource_controller.rb:23:in `show'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_controller/metal/basic_implicit_render.rb:4:in `send_action'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/abstract_controller/base.rb:186:in `process_action'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_controller/metal/rendering.rb:30:in `process_action'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/abstract_controller/callbacks.rb:20:in `block in process_action'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/callbacks.rb:97:in `run_callbacks'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/abstract_controller/callbacks.rb:19:in `process_action'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_controller/metal/rescue.rb:20:in `process_action'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/notifications.rb:166:in `block in instrument'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/notifications.rb:166:in `instrument'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_controller/metal/params_wrapper.rb:252:in `process_action'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/abstract_controller/base.rb:124:in `process'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionview-5.1.3/lib/action_view/rendering.rb:30:in `process'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_controller/metal.rb:189:in `dispatch'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_controller/metal.rb:253:in `dispatch'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/routing/route_set.rb:31:in `serve'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/journey/router.rb:46:in `block in serve'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/journey/router.rb:33:in `each'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/journey/router.rb:33:in `serve'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/routing/route_set.rb:834:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-2.0.3/lib/rack/etag.rb:25:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-2.0.3/lib/rack/conditional_get.rb:25:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-2.0.3/lib/rack/head.rb:12:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-2.0.3/lib/rack/session/abstract/id.rb:232:in `context'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-2.0.3/lib/rack/session/abstract/id.rb:226:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/cookies.rb:613:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/callbacks.rb:26:in `block in call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/callbacks.rb:97:in `run_callbacks'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/callbacks.rb:24:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/executor.rb:12:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/debug_exceptions.rb:59:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/railties-5.1.3/lib/rails/rack/logger.rb:36:in `call_app'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/railties-5.1.3/lib/rails/rack/logger.rb:26:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/remote_ip.rb:79:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/request_id.rb:25:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-2.0.3/lib/rack/method_override.rb:22:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-2.0.3/lib/rack/runtime.rb:22:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/activesupport-5.1.3/lib/active_support/cache/strategy/local_cache_middleware.rb:27:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/executor.rb:12:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/actionpack-5.1.3/lib/action_dispatch/middleware/static.rb:125:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-2.0.3/lib/rack/sendfile.rb:111:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/railties-5.1.3/lib/rails/engine.rb:522:in `call'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-test-0.6.3/lib/rack/mock_session.rb:30:in `request'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-test-0.6.3/lib/rack/test.rb:244:in `process_request'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/rack-test-0.6.3/lib/rack/test.rb:58:in `get'
/home/senid/.rvm/rubies/ruby-2.2.4/lib/ruby/2.2.0/forwardable.rb:183:in `get'
/home/senid/projects/forked/jsonapi-resources/lib/bug_report_templates/rails_5_master_polymorphic_linkage_bug.rb:148:in `test_fetch_option_linked_with_android'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest/test.rb:107:in `block (3 levels) in run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest/test.rb:204:in `capture_exceptions'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest/test.rb:104:in `block (2 levels) in run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest/test.rb:255:in `time_it'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest/test.rb:103:in `block in run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:350:in `on_signal'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest/test.rb:275:in `with_info_handler'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest/test.rb:102:in `run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:839:in `run_one_method'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:324:in `run_one_method'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:311:in `block (2 levels) in run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:310:in `each'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:310:in `block in run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:350:in `on_signal'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:337:in `with_info_handler'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:309:in `run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:159:in `block in __run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:159:in `map'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:159:in `__run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:136:in `run'
/home/senid/.rvm/gems/ruby-2.2.4@jsonapi-resources_bug-report-template/gems/minitest-5.10.3/lib/minitest.rb:63:in `block in autorun'
I, [2017-09-06T18:51:12.839355 #27020]  INFO -- : Completed 500 Internal Server Error in 224ms (Views: 1.1ms)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment