RSpec.describe '/api/v1/<%= file_name.pluralize.tr('_', '-') %>' do

describe 'GET /' do
  subject { -> { get api_v1_<%= file_name.pluralize %>_path } }

  let!(:<%= file_name %>) { create(:<%= factory_name %>) }

  it 'responds with 200 OK' do
    subject.call
    expect(last_response.status).to eq(200)
  end

  it 'responds with the <%= file_name.pluralize.humanize.downcase %>' do
    subject.call
    expect(parsed_response['data']).to match_array([
      a_hash_including('id' => <%= file_name %>.id)
    ])
  end
end

describe 'GET /:id' do
  subject { -> { get api_v1_<%= file_name %>_path(<%= file_name %>) } }

  let!(:<%= file_name %>) { create(:<%= factory_name %>) }

  it 'responds with 200 OK' do
    subject.call
    expect(last_response.status).to eq(200)
  end

  it 'responds with the <%= file_name.humanize.downcase %>' do
    subject.call
    expect(parsed_response).to match(a_hash_including(
      'id' => <%= file_name %>.id
    ))
  end
end

describe 'POST /' do
  subject { -> { post api_v1_<%= file_name.pluralize %>_path, <%= file_name %>.to_json } }

  let(:<%= file_name %>) { attributes_for(:<%= factory_name %>) }

  it 'responds with 201 Created' do
    subject.call
    expect(last_response.status).to eq(201)
  end

  it 'creates a new <%= file_name.humanize.downcase %>' do
    expect(subject).to change(<%= full_class_name %>, :count).by(1)
  end

  it 'responds with the new <%= file_name.humanize.downcase %>' do
    subject.call
    expect(parsed_response).to match(a_hash_including(<%= file_name %>.stringify_keys))
  end
end

describe 'PATCH /:id' do
  subject do
    proc do
      patch api_v1_<%= file_name %>_path(<%= file_name %>), new_<%= file_name %>.to_json
      <%= file_name %>.reload
    end
  end

  let!(:<%= file_name %>) { create(:<%= factory_name %>) }
  let(:new_<%= file_name %>) { attributes_for(:<%= factory_name %>) }

  it 'responds with 200 OK' do
    subject.call
    expect(last_response.status).to eq(200)
  end

  it 'updates the <%= file_name.humanize.downcase %>' do
    subject.call
    expect(<%= file_name %>.as_json).to match(a_hash_including(new_<%= file_name %>.stringify_keys))
  end

  it 'responds with the updated <%= file_name.humanize.downcase %>' do
    subject.call
    expect(parsed_response).to match(a_hash_including(new_<%= file_name %>.stringify_keys))
  end
end

describe 'DELETE /:id' do
  subject { -> { delete api_v1_<%= file_name %>_path(<%= file_name %>) } }

  let!(:<%= file_name %>) { create(:<%= factory_name %>) }

  it 'deletes the <%= file_name.humanize.downcase %>' do
    expect(subject).to change(<%= full_class_name %>, :count).by(-1)
  end

  it 'responds with 204 No Content' do
    subject.call
    expect(last_response.status).to eq(204)
  end
end

end