require 'spec_helper'

describe Encore::Entity::Output::JSON do
  describe :InstanceMethods do
    describe :as_json do
      context 'for simple entity' do
        before do
          # Create a model
          spawn_model :User

          # Create an entity
          spawn_entity :UserEntity do
            expose :name
          end

          run_migration do
            create_table(:users, force: true) do |t|
              t.string :name
            end
          end
        end

        let(:user) { User.create(name: 'Art Vandelay') }
        let(:entity) { UserEntity.new(user) }
        let(:json) { entity.as_json }

        it { expect(json.keys).to include :id, :name }
        it { expect(json[:id]).to eql user.id }
        it { expect(json[:name]).to eql 'Art Vandelay' }
      end

      context 'for entity with associations' do
        before do
          # Create a model
          spawn_model :User do
            has_many :comments
          end

          # Create a model
          spawn_model :Comment

          # Create an entity
          spawn_entity :UserEntity do
            expose :name
            expose_many :comments
          end

          run_migration do
            create_table(:users, force: true) do |t|
              t.string :name
            end

            create_table(:comments, force: true) do |t|
              t.text :body
              t.integer :user_id
            end
          end
        end

        let(:user) do
          User.create(name: 'Art Vandelay').tap do |user|
            user.comments << Comment.create(body: 'Test 1')
            user.comments << Comment.create(body: 'Test 2')
          end
        end

        let(:entity) { UserEntity.new(user) }
        let(:json) { entity.as_json }

        it { expect(json.keys).to include :id, :name, :comments }
        it { expect(json[:comments]).to be_instance_of Array }
        it { expect(json[:comments]).to include *Comment.pluck(:id) }
      end
    end
  end
end