124 lines
2.4 KiB
Ruby
124 lines
2.4 KiB
Ruby
RSpec.shared_context 'jsonapi-serializers movie class' do
|
|
before(:context) do
|
|
# models
|
|
class JSMovie
|
|
attr_accessor :id, :name, :release_year, :actors, :owner, :movie_type
|
|
end
|
|
|
|
class JSActor
|
|
attr_accessor :id, :name, :email
|
|
end
|
|
|
|
class JSUser
|
|
attr_accessor :id, :name
|
|
end
|
|
|
|
class JSMovieType
|
|
attr_accessor :id, :name
|
|
end
|
|
|
|
# serializers
|
|
class JSActorSerializer
|
|
include JSONAPI::Serializer
|
|
attributes :name, :email
|
|
|
|
def type
|
|
'actor'
|
|
end
|
|
end
|
|
class JSUserSerializer
|
|
include JSONAPI::Serializer
|
|
attributes :name
|
|
|
|
def type
|
|
'user'
|
|
end
|
|
end
|
|
class JSMovieTypeSerializer
|
|
include JSONAPI::Serializer
|
|
attributes :name
|
|
|
|
def type
|
|
'movie_type'
|
|
end
|
|
end
|
|
class JSMovieSerializer
|
|
include JSONAPI::Serializer
|
|
attributes :name, :release_year
|
|
has_many :actors
|
|
has_one :owner
|
|
has_one :movie_type
|
|
|
|
def type
|
|
'movie'
|
|
end
|
|
end
|
|
|
|
class JSONAPISSerializer
|
|
def initialize(data, options = {})
|
|
@options = options.merge(is_collection: true)
|
|
@data = data
|
|
end
|
|
|
|
def to_json
|
|
JSONAPI::Serializer.serialize(@data, @options).to_json
|
|
end
|
|
|
|
def to_hash
|
|
JSONAPI::Serializer.serialize(@data, @options)
|
|
end
|
|
end
|
|
end
|
|
|
|
after(:context) do
|
|
classes_to_remove = %i[
|
|
JSMovie
|
|
JSActor
|
|
JSUser
|
|
JSMovieType
|
|
JSONAPISSerializer
|
|
JSActorSerializer
|
|
JSUserSerializer
|
|
JSMovieTypeSerializer
|
|
JSMovieSerializer]
|
|
classes_to_remove.each do |klass_name|
|
|
Object.send(:remove_const, klass_name) if Object.constants.include?(klass_name)
|
|
end
|
|
end
|
|
|
|
let(:js_actors) do
|
|
3.times.map do |i|
|
|
a = JSActor.new
|
|
a.id = i + 1
|
|
a.name = "Test #{a.id}"
|
|
a.email = "test#{a.id}@test.com"
|
|
a
|
|
end
|
|
end
|
|
|
|
let(:js_user) do
|
|
ams_user = JSUser.new
|
|
ams_user.id = 3
|
|
ams_user
|
|
end
|
|
|
|
let(:js_movie_type) do
|
|
ams_movie_type = JSMovieType.new
|
|
ams_movie_type.id = 1
|
|
ams_movie_type.name = 'episode'
|
|
ams_movie_type
|
|
end
|
|
|
|
def build_js_movies(count)
|
|
count.times.map do |i|
|
|
m = JSMovie.new
|
|
m.id = i + 1
|
|
m.name = 'test movie'
|
|
m.actors = js_actors
|
|
m.owner = js_user
|
|
m.movie_type = js_movie_type
|
|
m
|
|
end
|
|
end
|
|
end
|