Set up GitHub actions CI (#2403)

* Set up GitHub actions CI
* Remove simplecov entirely for now
* Fix deprecations
* Relax dev deps
* Address Rails 6.0 blocking hosts
* Rails 6.1 content type changed to application/json; charset=utf-8
* Test a few more rubies and rails
* Stop testing grape. We should drop grape support

```
/home/runner/work/active_model_serializers/active_model_serializers/vendor/bundle/ruby/2.6.0/gems/grape-0.19.0/lib/grape/error_formatter.rb:16: warning: in `formatters': the last argument was passed as a single Hash
/home/runner/work/active_model_serializers/active_model_serializers/vendor/bundle/ruby/2.6.0/gems/grape-0.19.0/lib/grape/error_formatter.rb:21: warning: although a splat keyword arguments here
Run options: --seed 23470

..........................................................................................................................................................................................................................................................................................................................................................................................................................................E

ActiveModelSerializers::GrapeTest#test_render_helper_passes_through_options_correctly:
NoMethodError: undefined method `[]' for nil:NilClass

bin/rails test /home/runner/work/active_model_serializers/active_model_serializers/test/grape_test.rb:126

W, [2020-12-29T02:27:48.991413 #2790]  WARN -- : You are setting a key that conflicts with a built-in method Hashie::Mash#size defined in Hash. This can cause unexpected behavior when accessing the key as a property. You can still access the key via the #[] method.
W, [2020-12-29T02:27:48.991505 #2790]  WARN -- : You are setting a key that conflicts with a built-in method Hashie::Mash#size defined in Hash. This can cause unexpected behavior when accessing the key as a property. You can still access the key via the #[] method.
W, [2020-12-29T02:27:48.991581 #2790]  WARN -- : You are setting a key that conflicts with a built-in method Hashie::Mash#size defined in Hash. This can cause unexpected behavior when accessing the key as a property. You can still access the key via the #[] method.
W, [2020-12-29T02:27:48.991625 #2790]  WARN -- : You are setting a key that conflicts with a built-in method Hashie::Mash#size defined in Hash. This can cause unexpected behavior when accessing the key as a property. You can still access the key via the #[] method.
E

Error:
ActiveModelSerializers::GrapeTest#test_implicit_formatter_handles_collections:
NoMethodError: undefined method `[]' for nil:NilClass

bin/rails test /home/runner/work/active_model_serializers/active_model_serializers/test/grape_test.rb:185

...............................................................................................................................................

Finished in 2.052241s, 280.6688 runs/s, 473.6285 assertions/s.
576 runs, 972 assertions, 0 failures, 7 errors, 0 skips
rake aborted!
Command failed with status (1): [ruby -w -I"lib:lib:test" -r./test/test_helper.rb  -w -I"/home/runner/work/active_model_serializers/active_model_serializers/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib" "/home/runner/work/active_model_serializers/active_model_serializers/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/rake_test_loader.rb" "test/action_controller/adapter_selector_test.rb" "test/action_controller/explicit_serializer_test.rb" "test/action_controller/json/include_test.rb" "test/action_controller/json_api/deserialization_test.rb" "test/action_controller/json_api/errors_test.rb" "test/action_controller/json_api/fields_test.rb" "test/action_controller/json_api/linked_test.rb" "test/action_controller/json_api/pagination_test.rb" "test/action_controller/json_api/transform_test.rb" "test/action_controller/lookup_proc_test.rb" "test/action_controller/namespace_lookup_test.rb" "test/action_controller/serialization_scope_name_test.rb" "test/action_controller/serialization_test.rb" "test/active_model_serializers/adapter_for_test.rb" "test/active_model_serializers/json_pointer_test.rb" "test/active_model_serializers/logging_test.rb" "test/active_model_serializers/model_test.rb" "test/active_model_serializers/test/schema_test.rb" "test/active_model_serializers/test/serializer_test.rb" "test/active_record_test.rb" "test/adapter/attributes_test.rb" "test/adapter/deprecation_test.rb" "test/adapter/json/belongs_to_test.rb" "test/adapter/json/collection_test.rb" "test/adapter/json/fields_test.rb" "test/adapter/json/has_many_test.rb" "test/adapter/json/transform_test.rb" "test/adapter/json_api/belongs_to_test.rb" "test/adapter/json_api/collection_test.rb" "test/adapter/json_api/errors_test.rb" "test/adapter/json_api/fields_test.rb" "test/adapter/json_api/has_many_explicit_serializer_test.rb" "test/adapter/json_api/has_many_test.rb" "test/adapter/json_api/has_one_test.rb" "test/adapter/json_api/include_data_if_sideloaded_test.rb" "test/adapter/json_api/json_api_test.rb" "test/adapter/json_api/linked_test.rb" "test/adapter/json_api/links_test.rb" "test/adapter/json_api/pagination_links_test.rb" "test/adapter/json_api/parse_test.rb" "test/adapter/json_api/relationship_test.rb" "test/adapter/json_api/resource_meta_test.rb" "test/adapter/json_api/toplevel_jsonapi_test.rb" "test/adapter/json_api/transform_test.rb" "test/adapter/json_api/type_test.rb" "test/adapter/json_test.rb" "test/adapter/null_test.rb" "test/adapter/polymorphic_test.rb" "test/adapter_test.rb" "test/array_serializer_test.rb" "test/cache_test.rb" "test/collection_serializer_test.rb" "test/generators/scaffold_controller_generator_test.rb" "test/generators/serializer_generator_test.rb" "test/grape_test.rb" "test/lint_test.rb" "test/logger_test.rb" "test/poro_test.rb" "test/serializable_resource_test.rb" "test/serializers/association_macros_test.rb" "test/serializers/associations_test.rb" "test/serializers/attribute_test.rb" "test/serializers/attributes_test.rb" "test/serializers/configuration_test.rb" "test/serializers/fieldset_test.rb" "test/serializers/meta_test.rb" "test/serializers/options_test.rb" "test/serializers/read_attribute_for_serialization_test.rb" "test/serializers/reflection_test.rb" "test/serializers/root_test.rb" "test/serializers/serialization_test.rb" "test/serializers/serializer_for_test.rb" "test/serializers/serializer_for_with_namespace_test.rb" ]
/home/runner/work/active_model_serializers/active_model_serializers/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/exe/rake:27:in `<top (required)>'
/opt/hostedtoolcache/Ruby/2.6.6/x64/bin/bundle:23:in `load'
/opt/hostedtoolcache/Ruby/2.6.6/x64/bin/bundle:23:in `<main>'
Tasks: TOP => default => test
(See full trace by running task with --trace)
Error: Process completed with exit code 1.
```
This commit is contained in:
Benjamin Fleischer 2020-12-31 17:15:21 -05:00 committed by GitHub
parent 6d651bc9e3
commit 60ba54a3b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 101 additions and 345 deletions

69
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,69 @@
---
name: CI
on:
- "push"
jobs:
test:
name: "Testing"
runs-on: ubuntu-18.04
strategy:
fail-fast: false
matrix:
include:
# Recent Rubies and Rails
- ruby-version: '2.6'
rails-version: '6.1'
- ruby-version: '2.6'
rails-version: '6.0'
- ruby-version: '2.7'
rails-version: '6.0'
- ruby-version: '2.6'
rails-version: '5.2'
# Old Rubies and Rails
- ruby-version: '2.5'
rails-version: '5.1'
bundler: '1'
- ruby-version: '2.4'
rails-version: '5.0'
bundler: '1'
- ruby-version: '2.4'
rails-version: '4.2'
bundler: '1'
# Failing with a stack trace in active support
# - ruby-version: '2.4'
# rails-version: '4.1'
# bundler: '1'
continue-on-error: "${{ endsWith(matrix.ruby-version, 'head') }}"
env:
CI: "1"
steps:
- name: "Checkout Code"
uses: "actions/checkout@v2"
timeout-minutes: 5
with:
fetch-depth: 0
- name: Install required libs
run: |
sudo apt-get -yqq install libsqlite3-dev
- name: "Build Ruby"
uses: ruby/setup-ruby@v1
with:
ruby-version: "${{ matrix.ruby-version }}"
bundler: "${{ matrix.bundler || 2 }}"
bundler-cache: true
env:
RAILS_VERSION: ${{ matrix.rails-version }}
- name: "Run tests"
run: |
bundle exec rake
env:
RAILS_VERSION: ${{ matrix.rails-version }}

View File

@ -1,110 +0,0 @@
# https://github.com/colszowka/simplecov#using-simplecov-for-centralized-config
# see https://github.com/colszowka/simplecov/blob/master/lib/simplecov/defaults.rb
# vim: set ft=ruby
## DEFINE VARIABLES
@minimum_coverage = ENV.fetch('COVERAGE_MINIMUM') {
case (defined?(RUBY_ENGINE) && RUBY_ENGINE) || "ruby"
when 'jruby', 'rbx'
96.0
else
98.1
end
}.to_f.round(2)
# rubocop:disable Style/DoubleNegation
ENV['FULL_BUILD'] ||= ENV['CI']
@running_ci = !!(ENV['FULL_BUILD'] =~ /\Atrue\z/i)
@generate_report = @running_ci || !!(ENV['COVERAGE'] =~ /\Atrue\z/i)
@output = STDOUT
# rubocop:enable Style/DoubleNegation
## CONFIGURE SIMPLECOV
SimpleCov.profiles.define 'app' do
coverage_dir 'coverage'
load_profile 'test_frameworks'
add_group 'Libraries', 'lib'
add_group 'Long files' do |src_file|
src_file.lines.count > 100
end
class MaxLinesFilter < SimpleCov::Filter
def matches?(source_file)
source_file.lines.count < filter_argument
end
end
add_group 'Short files', MaxLinesFilter.new(5)
# Exclude these paths from analysis
add_filter '/config/'
add_filter '/db/'
add_filter 'tasks'
add_filter '/.bundle/'
end
## START TRACKING COVERAGE (before activating SimpleCov)
require 'coverage'
Coverage.start
## ADD SOME CUSTOM REPORTING AT EXIT
SimpleCov.at_exit do
next if $! and not ($!.kind_of? SystemExit and $!.success?)
header = "#{'*' * 20} SimpleCov Results #{'*' * 20}"
results = SimpleCov.result.format!.join("\n")
exit_message = <<-EOF
#{header}
{{RESULTS}}
{{FAILURE_MESSAGE}}
#{'*' * header.size}
EOF
percent = Float(SimpleCov.result.covered_percent)
if percent < @minimum_coverage
failure_message = <<-EOF
Spec coverage was not high enough: #{percent.round(2)}% is < #{@minimum_coverage}%
EOF
exit_message.sub!('{{RESULTS}}', results).sub!('{{FAILURE_MESSAGE}}', failure_message)
@output.puts exit_message
abort(failure_message) if @generate_report
elsif @running_ci
exit_message.sub!('{{RESULTS}}', results).sub!('{{FAILURE_MESSAGE}}', <<-EOF)
Nice job! Spec coverage (#{percent.round(2)}%) is still at or above #{@minimum_coverage}%
EOF
@output.puts exit_message
end
end
## CAPTURE CONFIG IN CLOSURE 'AppCoverage.start'
## to defer running until test/test_helper.rb is loaded.
# rubocop:disable Style/MultilineBlockChain
AppCoverage = Class.new do
def initialize(&block)
@block = block
end
def start
@block.call
end
end.new do
SimpleCov.start 'app'
if @generate_report
if @running_ci
require 'codeclimate-test-reporter'
@output.puts '[COVERAGE] Running with SimpleCov Simple Formatter and CodeClimate Test Reporter'
formatters = [
SimpleCov::Formatter::SimpleFormatter,
CodeClimate::TestReporter::Formatter
]
else
@output.puts '[COVERAGE] Running with SimpleCov HTML Formatter'
formatters = [SimpleCov::Formatter::HTMLFormatter]
end
else
formatters = []
end
SimpleCov.formatters = formatters
end
# rubocop:enable Style/MultilineBlockChain

View File

@ -13,7 +13,6 @@
<td> <td>
<a href="https://codeclimate.com/github/rails-api/active_model_serializers"><img src="https://codeclimate.com/github/rails-api/active_model_serializers/badges/gpa.svg" alt="Code Quality"></a> <a href="https://codeclimate.com/github/rails-api/active_model_serializers"><img src="https://codeclimate.com/github/rails-api/active_model_serializers/badges/gpa.svg" alt="Code Quality"></a>
<a href="https://codebeat.co/projects/github-com-rails-api-active_model_serializers"><img src="https://codebeat.co/badges/a9ab35fa-8b5a-4680-9d4e-a81f9a55ebcd" alt="codebeat" ></a> <a href="https://codebeat.co/projects/github-com-rails-api-active_model_serializers"><img src="https://codebeat.co/badges/a9ab35fa-8b5a-4680-9d4e-a81f9a55ebcd" alt="codebeat" ></a>
<a href="https://codeclimate.com/github/rails-api/active_model_serializers/coverage"><img src="https://codeclimate.com/github/rails-api/active_model_serializers/badges/coverage.svg" alt="Test Coverage"></a>
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@ -5,10 +5,6 @@ begin
rescue LoadError rescue LoadError
puts 'You must `gem install bundler` and `bundle install` to run rake tasks' puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
end end
begin
require 'simplecov'
rescue LoadError # rubocop:disable Lint/HandleExceptions
end
import('lib/tasks/rubocop.rake') import('lib/tasks/rubocop.rake')
Bundler::GemHelper.install_tasks Bundler::GemHelper.install_tasks
@ -56,13 +52,20 @@ namespace :test do
# https://github.com/rails/rails/blob/3d590add45/railties/lib/rails/generators/app_base.rb#L345-L363 # https://github.com/rails/rails/blob/3d590add45/railties/lib/rails/generators/app_base.rb#L345-L363
_bundle_command = Gem.bin_path('bundler', 'bundle') _bundle_command = Gem.bin_path('bundler', 'bundle')
require 'bundler' require 'bundler'
Bundler.with_clean_env do with_clean_env = proc do
isolated_test_files.all? do |test_file| isolated_test_files.all? do |test_file|
command = "-w -I#{dir}/lib -I#{dir}/test #{Shellwords.shellescape(test_file)}" command = "-w -I#{dir}/lib -I#{dir}/test #{Shellwords.shellescape(test_file)}"
full_command = %("#{Gem.ruby}" #{command}) full_command = %("#{Gem.ruby}" #{command})
system(full_command) system(full_command)
end or fail 'Failures' # rubocop:disable Style/AndOr end or fail 'Failures' # rubocop:disable Style/AndOr
end end
bundler_method =
if Bundler.method_defined?(:with_unbundled_env)
:with_unbundled_env
else
:with_clean_env
end
Bundler.public_send(bundler_method, &with_clean_env)
end end
end end

View File

@ -55,9 +55,8 @@ Gem::Specification.new do |spec|
spec.add_development_dependency 'will_paginate', '~> 3.0', '>= 3.0.7' spec.add_development_dependency 'will_paginate', '~> 3.0', '>= 3.0.7'
spec.add_development_dependency 'bundler' spec.add_development_dependency 'bundler'
spec.add_development_dependency 'simplecov', '>= 0.11'
spec.add_development_dependency 'timecop', '~> 0.7' spec.add_development_dependency 'timecop', '~> 0.7'
spec.add_development_dependency 'grape', ['>= 0.13', '< 0.19.1'] spec.add_development_dependency 'grape', '>= 0.13'
spec.add_development_dependency 'json_schema' spec.add_development_dependency 'json_schema'
spec.add_development_dependency 'rake', ['>= 10.0', '< 13.0'] spec.add_development_dependency 'rake', '>= 10.0'
end end

View File

@ -18,8 +18,6 @@
- [Improve code quality](https://codeclimate.com/github/rails-api/active_model_serializers/code?sort=smell_count&sort_direction=desc). - [Improve code quality](https://codeclimate.com/github/rails-api/active_model_serializers/code?sort=smell_count&sort_direction=desc).
- [Improve amount of code exercised by tests](https://codeclimate.com/github/rails-api/active_model_serializers/coverage?sort=covered_percent&sort_direction=asc).
- [Fix RuboCop (Style) TODOS](https://github.com/rails-api/active_model_serializers/blob/master/.rubocop_todo.yml). - [Fix RuboCop (Style) TODOS](https://github.com/rails-api/active_model_serializers/blob/master/.rubocop_todo.yml).
- Delete and offsense, run `rake rubocop` (or possibly `rake rubocop:auto_correct`), - Delete and offsense, run `rake rubocop` (or possibly `rake rubocop:auto_correct`),
and [submit a PR](CONTRIBUTING.md#submitting-a-pull-request-pr). and [submit a PR](CONTRIBUTING.md#submitting-a-pull-request-pr).

View File

@ -71,13 +71,13 @@ module ActionController
def test_render_using_explicit_serializer def test_render_using_explicit_serializer
get :render_using_explicit_serializer get :render_using_explicit_serializer
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal '{"name":"Name 1"}', @response.body assert_equal '{"name":"Name 1"}', @response.body
end end
def test_render_array_using_explicit_serializer def test_render_array_using_explicit_serializer
get :render_array_using_explicit_serializer get :render_array_using_explicit_serializer
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
expected = [ expected = [
{ 'name' => 'Name 1' }, { 'name' => 'Name 1' },
@ -89,7 +89,7 @@ module ActionController
def test_render_array_using_implicit_serializer def test_render_array_using_implicit_serializer
get :render_array_using_implicit_serializer get :render_array_using_implicit_serializer
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
expected = [ expected = [
{ 'name' => 'Name 1' }, { 'name' => 'Name 1' },

View File

@ -155,7 +155,7 @@ module ActionController
description: 'Description 1' description: 'Description 1'
} }
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
end end
@ -174,7 +174,7 @@ module ActionController
} }
} }
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
end end
@ -183,7 +183,7 @@ module ActionController
get :render_array_using_custom_root get :render_array_using_custom_root
end end
expected = { custom_root: [{ name: 'Name 1', description: 'Description 1' }] } expected = { custom_root: [{ name: 'Name 1', description: 'Description 1' }] }
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
end end
@ -193,7 +193,7 @@ module ActionController
end end
expected = { custom_root: [] } expected = { custom_root: [] }
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
end end
@ -203,14 +203,14 @@ module ActionController
end end
expected = { custom_root: { name: 'Name 1', description: 'Description 1' } } expected = { custom_root: { name: 'Name 1', description: 'Description 1' } }
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
end end
def test_render_json_object_without_serializer def test_render_json_object_without_serializer
get :render_json_object_without_serializer get :render_json_object_without_serializer
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
expected_body = { error: 'Result is Invalid' } expected_body = { error: 'Result is Invalid' }
assert_equal expected_body.to_json, @response.body assert_equal expected_body.to_json, @response.body
end end
@ -218,14 +218,14 @@ module ActionController
def test_render_json_array_object_without_serializer def test_render_json_array_object_without_serializer
get :render_json_array_object_without_serializer get :render_json_array_object_without_serializer
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
expected_body = [{ error: 'Result is Invalid' }] expected_body = [{ error: 'Result is Invalid' }]
assert_equal expected_body.to_json, @response.body assert_equal expected_body.to_json, @response.body
end end
def test_render_array_using_implicit_serializer def test_render_array_using_implicit_serializer
get :render_array_using_implicit_serializer get :render_array_using_implicit_serializer
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
expected = [ expected = [
{ {
@ -261,7 +261,7 @@ module ActionController
} }
} }
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
end end
@ -284,7 +284,7 @@ module ActionController
} }
} }
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
end end
@ -313,7 +313,7 @@ module ActionController
Timecop.freeze(Time.zone.now) do Timecop.freeze(Time.zone.now) do
get :render_object_with_cache_enabled get :render_object_with_cache_enabled
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
get :render_changed_object_with_cache_enabled get :render_changed_object_with_cache_enabled
@ -349,7 +349,7 @@ module ActionController
} }
} }
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
actual = @response.body actual = @response.body
expected = expected.to_json expected = expected.to_json
if ENV['APPVEYOR'] && actual != expected if ENV['APPVEYOR'] && actual != expected
@ -364,7 +364,7 @@ module ActionController
get :render_fragment_changed_object_with_only_cache_enabled get :render_fragment_changed_object_with_only_cache_enabled
response = JSON.parse(@response.body) response = JSON.parse(@response.body)
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal 'ZOMG A ROLE', response['name'] assert_equal 'ZOMG A ROLE', response['name']
assert_equal 'HUEHUEBRBR', response['description'] assert_equal 'HUEHUEBRBR', response['description']
end end
@ -374,7 +374,7 @@ module ActionController
get :render_fragment_changed_object_with_except_cache_enabled get :render_fragment_changed_object_with_except_cache_enabled
response = JSON.parse(@response.body) response = JSON.parse(@response.body)
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal 5, response['rating'] assert_equal 5, response['rating']
assert_equal 'lol', response['content'] assert_equal 'lol', response['content']
end end
@ -395,7 +395,7 @@ module ActionController
} }
} }
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected_return, response assert_equal expected_return, response
end end
end end
@ -426,7 +426,7 @@ module ActionController
get :update_and_render_object_with_cache_enabled get :update_and_render_object_with_cache_enabled
assert_equal 'application/json', @response.content_type assert_match(%r{\Aapplication/json}, @response.content_type)
actual = @response.body actual = @response.body
expected = expected.to_json expected = expected.to_json
if ENV['APPVEYOR'] && actual != expected if ENV['APPVEYOR'] && actual != expected

View File

@ -1,198 +0,0 @@
# frozen_string_literal: true
require 'test_helper'
TestHelper.silence_warnings do
require 'grape'
end
require 'grape/active_model_serializers'
require 'kaminari'
require 'kaminari/hooks'
::Kaminari::Hooks.init
module ActiveModelSerializers
class GrapeTest < ActiveSupport::TestCase
include Rack::Test::Methods
module Models
def self.model1
ARModels::Post.new(id: 1, title: 'Dummy Title', body: 'Lorem Ipsum')
end
def self.model2
ARModels::Post.new(id: 2, title: 'Second Dummy Title', body: 'Second Lorem Ipsum')
end
def self.all
@all ||=
begin
model1.save!
model2.save!
ARModels::Post.all
end
end
def self.reset_all
ARModels::Post.delete_all
@all = nil
end
def self.collection_per
2
end
def self.collection
@collection ||=
begin
Kaminari.paginate_array(
[
Profile.new(id: 1, name: 'Name 1', description: 'Description 1', comments: 'Comments 1'),
Profile.new(id: 2, name: 'Name 2', description: 'Description 2', comments: 'Comments 2'),
Profile.new(id: 3, name: 'Name 3', description: 'Description 3', comments: 'Comments 3'),
Profile.new(id: 4, name: 'Name 4', description: 'Description 4', comments: 'Comments 4'),
Profile.new(id: 5, name: 'Name 5', description: 'Description 5', comments: 'Comments 5')
]
).page(1).per(collection_per)
end
end
end
class GrapeTest < Grape::API
format :json
TestHelper.silence_warnings do
include Grape::ActiveModelSerializers
end
def self.resources(*)
TestHelper.silence_warnings do
super
end
end
resources :grape do
get '/render' do
render Models.model1
end
get '/render_with_json_api' do
post = Models.model1
render post, meta: { page: 1, total_pages: 2 }, adapter: :json_api
end
get '/render_array_with_json_api' do
posts = Models.all
render posts, adapter: :json_api
end
get '/render_collection_with_json_api' do
posts = Models.collection
render posts, adapter: :json_api
end
get '/render_with_implicit_formatter' do
Models.model1
end
get '/render_array_with_implicit_formatter' do
Models.all
end
get '/render_collection_with_implicit_formatter' do
Models.collection
end
end
end
def app
Grape::Middleware::Globals.new(GrapeTest.new)
end
extend Minitest::Assertions
def self.run_one_method(*)
_, stderr = capture_io do
super
end
fail Minitest::Assertion, stderr if stderr !~ /grape/
end
def test_formatter_returns_json
get '/grape/render'
post = Models.model1
serializable_resource = serializable(post)
assert last_response.ok?
assert_equal serializable_resource.to_json, last_response.body
end
def test_render_helper_passes_through_options_correctly
get '/grape/render_with_json_api'
post = Models.model1
serializable_resource = serializable(post, serializer: ARModels::PostSerializer, adapter: :json_api, meta: { page: 1, total_pages: 2 })
assert last_response.ok?
assert_equal serializable_resource.to_json, last_response.body
end
def test_formatter_handles_arrays
get '/grape/render_array_with_json_api'
posts = Models.all
serializable_resource = serializable(posts, adapter: :json_api)
assert last_response.ok?
assert_equal serializable_resource.to_json, last_response.body
ensure
Models.reset_all
end
def test_formatter_handles_collections
get '/grape/render_collection_with_json_api'
assert last_response.ok?
representation = JSON.parse(last_response.body)
assert representation.include?('data')
assert representation['data'].count == Models.collection_per
assert representation.include?('links')
assert representation['links'].count > 0
end
def test_implicit_formatter
post = Models.model1
serializable_resource = serializable(post, adapter: :json_api)
with_adapter :json_api do
get '/grape/render_with_implicit_formatter'
end
assert last_response.ok?
assert_equal serializable_resource.to_json, last_response.body
end
def test_implicit_formatter_handles_arrays
posts = Models.all
serializable_resource = serializable(posts, adapter: :json_api)
with_adapter :json_api do
get '/grape/render_array_with_implicit_formatter'
end
assert last_response.ok?
assert_equal serializable_resource.to_json, last_response.body
ensure
Models.reset_all
end
def test_implicit_formatter_handles_collections
with_adapter :json_api do
get '/grape/render_collection_with_implicit_formatter'
end
representation = JSON.parse(last_response.body)
assert last_response.ok?
assert representation.include?('data')
assert representation['data'].count == Models.collection_per
assert representation.include?('links')
assert representation['links'].count > 0
end
end
end

View File

@ -68,6 +68,7 @@ module TestHelpers
fake_logger = Logger.new(nil) fake_logger = Logger.new(nil)
config.logger = fake_logger config.logger = fake_logger
Rails.application.routes.default_url_options = { host: 'example.com' } Rails.application.routes.default_url_options = { host: 'example.com' }
config.hosts << 'www.example.com' if Rails.version >= '6.0'
end end
def app.name; 'IsolatedRailsApp'; end # rubocop:disable Style/SingleLineMethods def app.name; 'IsolatedRailsApp'; end # rubocop:disable Style/SingleLineMethods
app.respond_to?(:secrets) && app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4' app.respond_to?(:secrets) && app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'

View File

@ -14,6 +14,8 @@ module ActiveModelSerializers
end end
config.filter_parameters += [:password] config.filter_parameters += [:password]
config.hosts << 'www.example.com' if Rails.version >= '6.0'
end end
app.routes.default_url_options = { host: 'example.com' } app.routes.default_url_options = { host: 'example.com' }

View File

@ -4,13 +4,6 @@
ENV['RAILS_ENV'] = 'test' ENV['RAILS_ENV'] = 'test'
require 'bundler/setup' require 'bundler/setup'
begin
require 'simplecov'
AppCoverage.start
rescue LoadError
STDERR.puts 'Running without SimpleCov'
end
require 'pry' require 'pry'
require 'timecop' require 'timecop'
require 'rails' require 'rails'