Created
September 6, 2017 15:48
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Author
senid231
commented
Sep 6, 2017
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment