require 'spec_helper'

describe 'Users API' do
  it 'sends the list of users' do
    users = [
      User.create(username: 'Test'),
      User.create(username: 'Test 2')
    ]

    get '/api/v1/users'

    expect(last_response.status).to eq(200)
    json = JSON.parse(last_response.body)

    expect(json['users'].length).to eq(users.count)
  end

  it 'returns a 404 for a user that does not exist' do
    invalid_user_id = User.maximum(:id).to_i + 1

    get '/api/v1/users/' + invalid_user_id.to_s + '/'

    expect(last_response.status).to eq(404)
  end

  it 'sends an individual user' do
    user = User.create(username: 'Test')

    get '/api/v1/users/' + user.id.to_s + '/'

    expect(last_response.status).to eq(200)
    json = JSON.parse(last_response.body)

    expect(json['user']['id']).to eq(user.id)
  end

  it 'creates a new user' do
    user_params = {
      username: 'Test'
    }

    post '/api/v1/users/', user: user_params

    expect(last_response.status).to eq(201)
    json = JSON.parse(last_response.body)

    expect(json['user']['username']).to eq(user_params[:username])
  end

  it 'updates an existing user' do
    user = User.create(username: 'Foo')

    expect(user.username).to eq('Foo')

    put '/api/v1/users/' + user.id.to_s + '/', user: { username: 'Bar' }

    updated_user = User.find(user.id)
    expect(last_response.status).to eq(204)
    expect(updated_user.username).to eq('Bar')
  end

  it 'destroys an existing user' do
    user = User.create(username: 'Foo')

    expect(user.id).to_not eq(nil)

    delete '/api/v1/users/' + user.id.to_s + '/'

    does_user_exist = User.where(id: user.id).exists?
    expect(last_response.status).to eq(204)
    expect(does_user_exist).to eq(false)
  end

  it 'sends a filtered list of users' do
    all_users = [
      User.create(username: 'Test'),
      User.create(username: 'Demo'),
      User.create(username: 'Test 2')
    ]

    filtered_users = [all_users[0], all_users[2]]

    get '/api/v1/users?filters%5Bsearch%5D=Test'

    expect(last_response.status).to eq(200)
    json = JSON.parse(last_response.body)

    expect(json['users'].length).to eq(filtered_users.count)
  end
end