# frozen_string_literal: true

require 'test_helper'

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: {
          organization: false,
          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_match Mime[:json].to_s, 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_match Mime[:json].to_s, 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: JSON.parse(user.to_json) }
    instagram = 'https://www.instagram.com/vanessa/'

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

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

    # Check update result
    res = json_response(response.body)
    assert_equal 1, res[:group_id], "user's group does not match"
    assert_equal instagram, res[:profile_attributes][: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_match Mime[:json].to_s, response.content_type

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

    assert_match(/Kevin/, res[0][:name])
  end

  test 'admin changes the group of a member' do
    user = User.find(2)
    patch "/api/members/#{user.id}/",
          params: {
            user: {
              id: user.id,
              group_id: 2
            }
          }

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

    # Check search result
    res = json_response(response.body)
    assert_equal 2, res[:group_id]
  end
end