JSONAPI-Resources / JSONAPI-Resources/jsonapi-resources
bug with inclusion of polymorphic association
Open
Nobody has claimed this yet.
Priority: High
Target: 0.10
Type: Bug
- Dominant language
- Ruby
- Stars
- 2.3k
- Forks
- 546
- PR merge metrics
- No merged PRs in 30d
Description
reproduced with gist
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
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Run the embedded Minitest reproduction and compare test_patch_linkage_options_with_android with test_fetch_option_linked_with_android. Trace OptionResource's polymorphic optionable relationship through the JSONAPI controller and route. Done means both requests return successfully and the optionable association can be linked and included as the tests intend.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rails, ruby, sqlite
- Domain
- api, backend, database
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100