require 'test_helper' module ActiveModelSerializers module Adapter class JsonApi class RelationshipTest < ActiveSupport::TestCase setup do @blog = Blog.new(id: 1) @author = Author.new(id: 1, name: 'Steve K.', blog: @blog) @serializer = BlogSerializer.new(@blog) ActionController::Base.cache_store.clear end def test_relationship_with_data expected = { data: { id: '1', type: 'blogs' } } test_relationship(expected, options: { include_data: true }) end def test_relationship_with_nil_model @serializer = BlogSerializer.new(nil) expected = { data: nil } test_relationship(expected, options: { include_data: true }) end def test_relationship_with_nil_serializer @serializer = nil expected = { data: nil } test_relationship(expected, options: { include_data: true }) end def test_relationship_with_data_array posts = [Post.new(id: 1), Post.new(id: 2)] @serializer = ActiveModel::Serializer::CollectionSerializer.new(posts) @author.posts = posts @author.blog = nil expected = { data: [ { id: '1', type: 'posts' }, { id: '2', type: 'posts' } ] } test_relationship(expected, options: { include_data: true }) end def test_relationship_data_not_included test_relationship({}, options: { include_data: false }) end def test_relationship_simple_link links = { self: 'a link' } test_relationship({ links: { self: 'a link' } }, links: links) end def test_relationship_many_links links = { self: 'a link', related: 'another link' } expected = { links: { self: 'a link', related: 'another link' } } test_relationship(expected, links: links) end def test_relationship_block_link links = { self: proc { "#{object.id}" } } expected = { links: { self: "#{@blog.id}" } } test_relationship(expected, links: links) end def test_relationship_block_link_with_meta links = { self: proc do href "#{object.id}" meta(id: object.id) end } expected = { links: { self: { href: "#{@blog.id}", meta: { id: @blog.id } } } } test_relationship(expected, links: links) end def test_relationship_simple_meta meta = { id: '1' } expected = { meta: meta } test_relationship(expected, meta: meta) end def test_relationship_block_meta meta = proc do { id: object.id } end expected = { meta: { id: @blog.id } } test_relationship(expected, meta: meta) end def test_relationship_with_everything links = { self: 'a link', related: proc do href "#{object.id}" meta object.id end } meta = proc do { id: object.id } end expected = { data: { id: '1', type: 'blogs' }, links: { self: 'a link', related: { href: '1', meta: 1 } }, meta: { id: @blog.id } } test_relationship(expected, meta: meta, options: { include_data: true }, links: links) end private def test_relationship(expected, params = {}) options = params.fetch(:options, {}) links = params.fetch(:links, {}) meta = params[:meta] parent_serializer = AuthorSerializer.new(@author) relationship = Relationship.new(parent_serializer, @serializer, options, links, meta) assert_equal(expected, relationship.as_json) end end end end end