require 'spec_helper'

describe CountriesController, '-> JSON', type: :controller do

  it 'Index -> GET /resources.json' do
    3.times { create :country }

    get :index, format: :json

    response.status.should be 200 # OK
    response.content_type.should eq 'application/json'
    JSON.parse(response.body).each do |attributes|
      attributes['name'].should eq Country.find(attributes['id']).name
    end
  end

  it 'Show -> GET /resources/:id.json' do
    country = create :country

    get :show, format: :json, id: country.id

    response.status.should be 200 # OK
    response.content_type.should eq 'application/json'
    attributes = JSON.parse(response.body)
    attributes['id'].should eq country.id
    attributes['name'].should eq country.name
  end

  context 'Create -> POST /resources.json' do

    it 'Successfully' do
      attributes = attributes_for :country

      post :create, format: :json, country: attributes

      response.status.should be 201 # Created
      response.content_type.should eq 'application/json'
      country = JSON.parse(response.body)
      country['id'].should_not be_nil
      country['name'].should eq attributes[:name]

      Country.find_by_id(country['id']).should_not be_nil
    end

    it 'With errors' do
      post :create, format: :json

      response.status.should eq 422 # Unprocessable Entity
      response.content_type.should eq 'application/json'
      JSON.parse(response.body).should have_key 'name'
    end

  end

  context 'Update -> PUT /resources/:id.json' do

    it 'Successfully' do
      country = create :country
      attributes = {name: "#{country.name} updated"}

      put :update, format: :json, id: country.id, country: attributes

      response.status.should eq 204 # No Content
      response.content_type.should eq 'application/json'

      Country.find(country.id).name.should eq attributes[:name]
    end

    it 'With errors' do
      country = create :country

      put :update, format: :json, id: country.id, country: {name: nil}

      response.status.should eq 422 # Unprocessable Entity
      response.content_type.should eq 'application/json'
      JSON.parse(response.body).should have_key 'name'
    end

  end

  it 'Destroy -> DELETE /resources/:id.json' do
    country = create :country

    delete :destroy, format: :json, id: country.id

    response.status.should eq 204 # No Content
    response.content_type.should eq 'application/json'

    Country.find_by_id(country.id).should be_nil
  end

end