require File.join(File.dirname(__FILE__), 'test_helper')

describe 'personal_access_token' do
  let(:base_cmd) { ['user', 'access-token'] }
  let(:user) do
    {
     :id => 1,
     :name => 'admin'
    }
  end
  let(:access_token) do
    {
      :id => 1,
      :user_id => user[:id],
      :name => 'test',
      :created_at => '01/10/2016',
      :expires_at => '01/02/2017',
      :last_used_at => '24/12/2016',
      :active? => false
    }
  end
  let(:active_access_token) do
    {
      :id => 2,
      :user_id => user[:id],
      :name => 'test2',
      :created_at => '01/10/2016',
      :expires_at => '01/02/2048',
      :last_used_at => '01/02/2018',
      :active? => true
    }
  end

  describe 'list' do
    let(:cmd) { base_cmd << 'list' }
    let(:params) { ['--user-id=1'] }

    it 'lists all access tokens for a given user' do
      api_expects(:personal_access_tokens, :index, 'List').with_params(
        'user_id' => '1', 'page' => 1, 'per_page' => 1000
      ).returns(index_response([access_token, active_access_token]))

      output = IndexMatcher.new([
        ['ID', 'NAME',  'ACTIVE', 'EXPIRES AT'],
        ['1',  'test',  'no',     '2017/02/01 00:00:00' ],
        ['2',  'test2', 'yes',    '2048/02/01 00:00:00' ]
      ])
      expected_result = success_result(output)

      result = run_cmd(cmd + params)
      assert_cmd(expected_result, result)
    end
  end

  describe 'create' do
    let(:cmd) { base_cmd << 'create' }
    let(:params) { ['--user-id=1', '--expires-at=01/01/2048', '--name=test'] }
    let(:access_token) do
      {
        :id => 1,
        :user_id => user[:id],
        :name => 'test',
        :expires_at => '01/01/2048',
        :token_value => 'value'
      }
    end

    it 'creates an access token to a given user' do
      api_expects(:personal_access_tokens, :create).with_params(
        'user_id' => '1', 'personal_access_token' => {
          'expires_at' => '01/01/2048', 'name' => 'test'
        }
      ).returns(access_token)

      expected_result = success_result(/#{access_token[:value]}/)

      result = run_cmd(cmd + params)
      assert_cmd(expected_result, result)
    end
  end

  describe 'info' do
    let(:cmd) { base_cmd << 'info' }
    let(:params) { ['--id=1', '--user-id=1'] }

    it 'shows the personal access token' do
      api_expects(:personal_access_tokens, :show, 'Show PAT').with_params(
        'id' => '1', 'user_id' => '1'
      ).returns(access_token)

      output = OutputMatcher.new([
        "Id:           1",
        "Name:         test",
        "Active:       no",
        "Expires at:   2017/02/01 00:00:00",
        "Created at:   2016/10/01 00:00:00",
        "Last used at: 2016/12/24 00:00:00",
      ])

      expected_result = success_result(output)

      result = run_cmd(cmd + params)
      assert_cmd(expected_result, result)
    end
  end

  describe 'revoke' do
    let(:cmd) { base_cmd << 'revoke' }
    let(:params) { ['--id=1', '--user-id=1'] }
    it 'deletes an access token to a given user' do
      api_expects(:personal_access_tokens, :destroy, 'Revoke PAT').with_params(
        'id' => '1', 'user_id' => '1'
      ).returns(access_token)

      expected_result = success_result(
        "Personal access token [#{access_token[:name]}] revoked.\n"
      )

      result = run_cmd(cmd + params)
      assert_cmd(expected_result, result)
    end
  end
end