# frozen_string_literal: true

class MembersTest < ActionDispatch::IntegrationTest
  # Called before every test method runs. Can be used
  # to set up fixture information.
  def setup
    @admin = User.find_by(username: 'admin')
    login_as(@admin, scope: :user)
  end

  test 'admin creates member' do
    group_id = Group.first.id
    email = 'robert.dubois@gmail.com'

    VCR.use_cassette('members_admin_create_success') do
      post members_path, params: { user: {
        username: 'bob',
        email: email,
        group_id: group_id,
        profile_attributes: {
          last_name: 'Dubois',
          first_name: 'Robert',
          phone: '0485232145'
        },
        invoicing_profile_attributes: {
          address_attributes: {
            address: '21 grand rue, 73110 Bourget-en-Huile'
          }
        },
        statistic_profile_attributes: {
          gender: true,
          birthday: '2018-02-08'
        }
      } }.to_json, headers: default_headers
    end

    # Check response format & status
    assert_equal 201, response.status, response.body
    assert_equal Mime[:json], response.content_type

    # Check that the user's match
    user = json_response(response.body)
    assert_equal email, user[:email], "user's mail does not match"
    assert_equal group_id, user[:group_id], "user's group does not match"
  end

  test 'admin fails to update member group' do
    user = User.friendly.find('kdumas')

    # we cannot update an kevin's group because he's got a running subscription
    put "/api/members/#{user.id}", params: { user: {
      group_id: 1
    } }.to_json, headers: default_headers

    # Check response format & status
    assert_equal 422, response.status, response.body
    assert_equal Mime[:json], response.content_type

    # Check error message
    res = json_response(response.body)
    assert_equal I18n.t('members.unable_to_change_the_group_while_a_subscription_is_running'), res[:group_id][0], 'invalid error message'
  end

  test 'admin successfully updates a member' do
    user = User.friendly.find('vlonchamp')
    user_hash = {
      user: {
        profile_attributes: JSON.parse(user.to_json)['profile']
      }.merge(JSON.parse(user.to_json))
    }
    instagram = 'https://www.instagram.com/vanessa/'

    put "/api/members/#{user.id}", params: user_hash.deep_merge(
      user: {
        group_id: 2,
        profile_attributes: {
          instagram: instagram
        }
      }
    ).to_json, headers: default_headers

    # Check response format & status
    assert_equal 200, response.status, response.body
    assert_equal Mime[:json], response.content_type

    # Check update result
    res = json_response(response.body)
    assert_equal 2, res[:group_id], "user's group does not match"
    assert_equal instagram, res[:profile][:instagram], "user's social network not updated"
  end

  # test 'admin search for autocompletion of a member s name' do
  # get '/api/members/search/kevin?subscription=true'

  ## Check response format & status
  # assert_equal 200, response.status, response.body
  # assert_equal Mime[:json], response.content_type

  ## Check search result
  # res = json_response(response.body)
  # assert_equal 1, res.length

  # assert_match /Kevin/, res[0][:name]
  # end
end