Created
February 21, 2017 15:09
-
-
Save senid231/433a1576b0a3a5f43090fe0d5c375f0c to your computer and use it in GitHub Desktop.
template example for https://github.com/cerebris/jsonapi-resources/issues/985
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' | |
rescue LoadError => e | |
STDERR.puts 'Bundler version 1.10 or later is required. Please update your Bundler' | |
raise e | |
end | |
gemfile(true) do | |
source 'https://rubygems.org' | |
gem 'rails', '4.2.7', require: false | |
gem 'pg', '~> 0.19' | |
gem 'jsonapi-resources', '0.9.0', require: false | |
# gem 'jsonapi-resources', require: false | |
# gem 'jsonapi-resources', git: 'https://github.com/cerebris/jsonapi-resources', require: false | |
end | |
# prepare active_record database | |
require 'active_record' | |
system('psql -c "drop database if exists tmp_bug_report;"') | |
system('psql -c "create database tmp_bug_report;"') | |
ActiveRecord::Base.establish_connection(adapter: 'postgresql', database: 'tmp_bug_report') | |
ActiveRecord::Base.logger = Logger.new(STDOUT) | |
ActiveRecord::Schema.define do | |
enable_extension('uuid-ossp') | |
# Add your schema here | |
create_table :users, force: true, id: :uuid do |t| | |
t.string :name | |
end | |
create_table :addresses, force: true, id: :uuid do |t| | |
t.uuid :user_id | |
t.string :street | |
end | |
end | |
# create models | |
class User < ActiveRecord::Base | |
has_many :addresses | |
end | |
class Address < ActiveRecord::Base | |
belongs_to :user | |
end | |
# prepare rails app | |
require 'action_controller/railtie' | |
require 'jsonapi-resources' | |
class ApplicationController < ActionController::Base | |
end | |
# prepare jsonapi resources and controllers | |
class JsonApiController < ApplicationController | |
include JSONAPI::ActsAsResourceController | |
end | |
module Api | |
module V1 | |
class UsersController < ::JsonApiController | |
end | |
class AddressesController < ::JsonApiController | |
end | |
class UserResource < JSONAPI::Resource | |
model_name 'User' | |
has_many :addresses, class_name: 'Address' | |
attributes :name | |
end | |
class AddressResource < JSONAPI::Resource | |
model_name 'Address' | |
has_one :user, class_name: 'User' | |
attributes :street | |
end | |
end | |
end | |
class TestApp < Rails::Application | |
config.root = File.dirname(__FILE__) | |
config.logger = 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.resource_key_type = :uuid | |
end | |
# draw routes | |
Rails.application.routes.draw do | |
namespace :api do | |
namespace :v1 do | |
jsonapi_resources :addresses, only: [:index] | |
end | |
end | |
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 response_json | |
JSON.parse(last_response.body) rescue nil | |
end | |
def pretty_response_json | |
JSON.pretty_generate(response_json) rescue nil | |
end | |
def json_api_headers | |
{'Accept' => JSONAPI::MEDIA_TYPE, 'CONTENT_TYPE' => JSONAPI::MEDIA_TYPE} | |
end | |
def test_index_addresses | |
user = User.create! name: 'John Doe' | |
address = Address.create! user: user, street: 'main st' | |
get '/api/v1/addresses', {include: 'user'}, json_api_headers | |
puts pretty_response_json | |
assert last_response.ok? | |
data = response_json['data'].first | |
refute_nil data | |
assert_equal address.id.to_s, data['id'] | |
refute_nil data['relationships'] | |
refute_nil data['relationships']['user'] | |
refute_nil data['relationships']['user']['data'] | |
assert_equal 'users', data['relationships']['user']['data']['type'] | |
assert_equal user.id, data['relationships']['user']['data']['id'] | |
included = response_json['included'] | |
refute_nil included | |
assert_equal 'users', included.first['type'] | |
assert_equal user.id, included.first['id'] | |
end | |
private | |
def app | |
Rails.application | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment