81 lines
3.4 KiB
Ruby
81 lines
3.4 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe FastJsonapi::ObjectSerializer do
|
|
include_context 'movie class'
|
|
include_context 'ams movie class'
|
|
|
|
before(:context) do
|
|
[:dash, :camel, :camel_lower, :underscore].each do |transform_type|
|
|
movie_serializer_name = "#{transform_type}_movie_serializer".classify
|
|
movie_type_serializer_name = "#{transform_type}_movie_type_serializer".classify
|
|
# https://stackoverflow.com/questions/4113479/dynamic-class-definition-with-a-class-name
|
|
movie_serializer_class = Object.const_set(
|
|
movie_serializer_name,
|
|
Class.new {
|
|
}
|
|
)
|
|
# https://rubymonk.com/learning/books/5-metaprogramming-ruby-ascent/chapters/24-eval/lessons/67-instance-eval
|
|
movie_serializer_class.instance_eval do
|
|
include FastJsonapi::ObjectSerializer
|
|
set_type :movie
|
|
set_key_transform transform_type
|
|
attributes :name, :release_year
|
|
has_many :actors
|
|
belongs_to :owner, record_type: :user
|
|
belongs_to :movie_type
|
|
end
|
|
movie_type_serializer_class = Object.const_set(
|
|
movie_type_serializer_name,
|
|
Class.new {
|
|
}
|
|
)
|
|
movie_type_serializer_class.instance_eval do
|
|
include FastJsonapi::ObjectSerializer
|
|
set_key_transform transform_type
|
|
set_type :movie_type
|
|
attributes :name
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when using dashes for word separation in the JSON API members' do
|
|
it 'returns correct hash when serializable_hash is called' do
|
|
serializable_hash = DashMovieSerializer.new([movie, movie]).serializable_hash
|
|
expect(serializable_hash[:data].length).to eq 2
|
|
expect(serializable_hash[:data][0][:relationships].length).to eq 3
|
|
expect(serializable_hash[:data][0][:relationships]).to have_key('movie-type'.to_sym)
|
|
expect(serializable_hash[:data][0][:attributes].length).to eq 2
|
|
expect(serializable_hash[:data][0][:attributes]).to have_key("release-year".to_sym)
|
|
|
|
serializable_hash = DashMovieSerializer.new(movie_struct).serializable_hash
|
|
expect(serializable_hash[:data][:relationships].length).to eq 3
|
|
expect(serializable_hash[:data][:relationships]).to have_key('movie-type'.to_sym)
|
|
expect(serializable_hash[:data][:attributes].length).to eq 2
|
|
expect(serializable_hash[:data][:attributes]).to have_key('release-year'.to_sym)
|
|
expect(serializable_hash[:data][:id]).to eq movie_struct.id.to_s
|
|
end
|
|
|
|
it 'returns type hypenated when trying to serializing a class with multiple words' do
|
|
movie_type = MovieType.new
|
|
movie_type.id = 3
|
|
movie_type.name = "x"
|
|
serializable_hash = DashMovieTypeSerializer.new(movie_type).serializable_hash
|
|
expect(serializable_hash[:data][:type].to_sym).to eq 'movie-type'.to_sym
|
|
end
|
|
end
|
|
|
|
context 'when using other key transforms' do
|
|
[:camel, :camel_lower, :underscore, :dash].each do |transform_type|
|
|
it "returns same thing as ams when using #{transform_type}" do
|
|
ams_movie = build_ams_movies(1).first
|
|
movie = build_movies(1).first
|
|
movie_serializer_class = "#{transform_type}_movie_serializer".classify.constantize
|
|
our_json = movie_serializer_class.new([movie]).serialized_json
|
|
ams_json = ActiveModelSerializers::SerializableResource.new([ams_movie], key_transform: transform_type).to_json
|
|
expect(our_json.length).to eq (ams_json.length)
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|