Skip to content

Feature: Member Name Styles #12

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions jsonapi_spec_helpers.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
spec.add_development_dependency "bundler", "~> 1.11"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_dependency "rspec", "~> 3.0"
spec.add_dependency "activesupport", ">= 4.1"
end
2 changes: 2 additions & 0 deletions lib/jsonapi_spec_helpers.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
require 'json'
require 'active_support'
require 'active_support/core_ext/string/inflections'
require 'jsonapi_spec_helpers/version'
require 'jsonapi_spec_helpers/helpers'
require 'jsonapi_spec_helpers/payload'
Expand Down
18 changes: 15 additions & 3 deletions lib/jsonapi_spec_helpers/payload.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,24 @@ def key(name, *args, &blk)
@no_keys.reject! { |k| k == name }
prc = blk
prc = ->(record) { record.send(name) } if prc.nil?
@keys[name] = options.merge(proc: prc)
@keys[member_name_for(name, options)] = options.merge(proc: prc)
end

def timestamps!
@keys[:created_at] = key(:created_at, String)
@keys[:updated_at] = key(:updated_at, String)
@keys[member_name_for(:created_at)] = key(:created_at, String)
@keys[member_name_for(:updated_at)] = key(:updated_at, String)
end

def member_name_style(style = :underscore)
@member_name_style = style
end

private

def member_name_for(name, options = {})
transform_method = options.fetch :member_name_style, (@member_name_style || :underscore)
transform_method = :dasherize if transform_method == :hyphen
name.to_s.send transform_method
end
end
end
110 changes: 110 additions & 0 deletions spec/assert_payload_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,116 @@
assert_payload(:post, post_record, json_item)
end

context 'with custom member name styles' do
let(:test_record) { double id: 1, first_name: 'First Name', last_name: 'Last Name' }

context 'when payload uses hyphens on all member names' do
before do
JsonapiSpecHelpers::Payload.register(:all_hyphens_object) do
member_name_style :hyphen
key(:first_name)
key(:last_name)
end
end

let(:json) do
{
'data' => {
'type' => 'test-object',
'id' => '1',
'attributes' => {
'first-name' => 'First Name',
'last-name' => 'Last Name'
}
}
}
end

it 'passes assertion' do
assert_payload(:all_hyphens_object, test_record, json_item)
end
end

context 'when payload uses hyphens on some member names' do
before do
JsonapiSpecHelpers::Payload.register(:some_hyphens_object) do
key :first_name
key :last_name, member_name_style: :hyphen
end
end

let(:json) do
{
'data' => {
'type' => 'test-object',
'id' => '1',
'attributes' => {
'first_name' => 'First Name',
'last-name' => 'Last Name'
}
}
}
end

it 'passes assertion' do
assert_payload(:some_hyphens_object, test_record, json_item)
end
end

context 'when payload uses spaces on all member names' do
before do
JsonapiSpecHelpers::Payload.register(:all_titleized_object) do
member_name_style :titleize
key :first_name
key :last_name
end
end

let(:json) do
{
'data' => {
'type' => 'test-object',
'id' => '1',
'attributes' => {
'First Name' => 'First Name',
'Last Name' => 'Last Name'
}
}
}
end

it 'passes assertion' do
assert_payload(:all_titleized_object, test_record, json_item)
end
end

context 'when payload uses spaces on some member names' do
before do
JsonapiSpecHelpers::Payload.register(:some_titleized_object) do
key :first_name
key :last_name, member_name_style: :titleize
end
end

let(:json) do
{
'data' => {
'type' => 'test-object',
'id' => '1',
'attributes' => {
'first_name' => 'First Name',
'Last Name' => 'Last Name'
}
}
}
end

it 'passes assertion' do
assert_payload(:some_titleized_object, test_record, json_item)
end
end
end

context 'when json value matches payload value, but wrong type' do
before do
json['data']['attributes']['views'] = '100'
Expand Down