# frozen_string_literal: true

require 'spec_helper'

describe Gitlab::Client do
  describe '.runners' do
    before do
      stub_get('/runners', 'runners')
    end

    context 'without extra queries' do
      before do
        @runner = Gitlab.runners
      end

      it 'gets the correct resource' do
        expect(a_get('/runners')).to have_been_made
      end

      it 'returns a paginated response of runners' do
        expect(@runner).to be_a Gitlab::PaginatedResponse
        expect(@runner.first.id).to eq(6)
        expect(@runner.first.description).to eq('test-1-20150125')
      end
    end

    context 'with queries' do
      before do
        stub_get('/runners?type=instance_type', 'runners')
        @runner = Gitlab.runners(type: :instance_type)
      end

      it 'gets the correct resource' do
        expect(a_get('/runners').with(query: { type: :instance_type })).to have_been_made
      end

      it 'returns a paginated response of runners' do
        expect(@runner).to be_a Gitlab::PaginatedResponse
        expect(@runner.first.id).to eq(6)
        expect(@runner.first.description).to eq('test-1-20150125')
      end
    end
  end

  describe '.all_runners' do
    before do
      stub_get('/runners/all', 'runners')
    end

    context 'without extra queries' do
      before do
        @runner = Gitlab.all_runners
      end

      it 'gets the correct resource' do
        expect(a_get('/runners/all')).to have_been_made
      end

      it 'returns a paginated response of runners' do
        expect(@runner).to be_a Gitlab::PaginatedResponse
        expect(@runner.first.id).to eq(6)
        expect(@runner.first.description).to eq('test-1-20150125')
      end
    end

    context 'with queries' do
      before do
        stub_get('/runners/all?type=instance_type', 'runners')
        @runner = Gitlab.all_runners(type: :instance_type)
      end

      it 'gets the correct resource' do
        expect(a_get('/runners/all').with(query: { type: :instance_type })).to have_been_made
      end

      it 'returns a paginated response of runners' do
        expect(@runner).to be_a Gitlab::PaginatedResponse
        expect(@runner.first.id).to eq(6)
        expect(@runner.first.description).to eq('test-1-20150125')
      end
    end
  end

  describe '.runner' do
    before do
      stub_get('/runners/6', 'runner')
      @runners = Gitlab.runner(6)
    end

    it 'gets the correct resource' do
      expect(a_get('/runners/6')).to have_been_made
    end

    it 'returns a response of a runner' do
      expect(@runners).to be_a Gitlab::ObjectifiedHash
      expect(@runners.id).to eq(6)
      expect(@runners.description).to eq('test-1-20150125')
    end
  end

  describe '.update_runner' do
    before do
      stub_put('/runners/6', 'runner_edit').with(body: { description: 'abcefg' })
      @runner = Gitlab.update_runner(6, description: 'abcefg')
    end

    it 'gets the correct resource' do
      expect(a_put('/runners/6').with(body: { description: 'abcefg' })).to have_been_made
    end

    it 'returns an updated response of a runner' do
      expect(@runner).to be_a Gitlab::ObjectifiedHash
      expect(@runner.description).to eq('abcefg')
    end
  end

  describe '.delete_runner' do
    before do
      stub_delete('/runners/6', 'runner_delete')
      @runner = Gitlab.delete_runner(6)
    end

    it 'gets the correct resource' do
      expect(a_delete('/runners/6')).to have_been_made
    end

    it 'returns a response of the deleted runner' do
      expect(@runner).to be_a Gitlab::ObjectifiedHash
      expect(@runner.id).to eq(6)
    end
  end

  describe '.runner_jobs' do
    before do
      stub_get('/runners/1/jobs?status=running', 'runner_jobs')
      @jobs = Gitlab.runner_jobs(1, status: :running)
    end

    it 'gets the correct resource' do
      expect(a_get('/runners/1/jobs').with(query: { status: :running })).to have_been_made
    end
  end

  describe '.project_runners' do
    before do
      stub_get('/projects/1/runners', 'project_runners')
      @runners = Gitlab.project_runners(1)
    end

    it 'gets the correct resource' do
      expect(a_get('/projects/1/runners')).to have_been_made
    end

    it 'returns a paginated response of runners' do
      expect(@runners).to be_a Gitlab::PaginatedResponse
      expect(@runners.first.id).to eq(8)
      expect(@runners.first.description).to eq('test-2-20150125')
    end
  end

  describe '.project_enable_runner' do
    before do
      stub_post('/projects/1/runners', 'runner')
      @runner = Gitlab.project_enable_runner(1, 6)
    end

    it 'gets the correct resource' do
      expect(a_post('/projects/1/runners')).to have_been_made
    end

    it 'returns a response of the enabled runner' do
      expect(@runner).to be_a Gitlab::ObjectifiedHash
      expect(@runner.id).to eq(6)
      expect(@runner.description).to eq('test-1-20150125')
    end
  end

  describe '.project_disable_runner' do
    before do
      stub_delete('/projects/1/runners/6', 'runner')
      @runner = Gitlab.project_disable_runner(1, 6)
    end

    it 'gets the correct resource' do
      expect(a_delete('/projects/1/runners/6')).to have_been_made
    end

    it 'returns a response of the disabled runner' do
      expect(@runner).to be_a Gitlab::ObjectifiedHash
      expect(@runner.id).to eq(6)
      expect(@runner.description).to eq('test-1-20150125')
    end
  end

  describe '.group_runners' do
    before do
      stub_get('/groups/9/runners', 'group_runners')
    end

    context 'without extra queries' do
      before do
        @runners = Gitlab.group_runners(9)
      end

      it 'gets the correct resource' do
        expect(a_get('/groups/9/runners')).to have_been_made
      end

      it 'returns a paginated response of runners' do
        expect(@runners).to be_a Gitlab::PaginatedResponse
      end
    end

    context 'with queries' do
      before do
        stub_get('/groups/9/runners?type=instance_type', 'group_runners')
        @runner = Gitlab.group_runners(9, type: :instance_type)
      end

      it 'gets the correct resource' do
        expect(a_get('/groups/9/runners').with(query: { type: :instance_type })).to have_been_made
      end

      it 'returns a paginated response of runners' do
        expect(@runner).to be_a Gitlab::PaginatedResponse
      end
    end
  end

  describe '.register_runner' do
    before do
      stub_post('/runners', 'register_runner_response').with(body: { token: '6337ff461c94fd3fa32ba3b1ff4125', description: 'Some Description', active: true, locked: false })
      @register_runner_response = Gitlab.register_runner('6337ff461c94fd3fa32ba3b1ff4125', description: 'Some Description', active: true, locked: false)
    end

    it 'gets the correct resource' do
      expect(a_post('/runners')
        .with(body: { token: '6337ff461c94fd3fa32ba3b1ff4125', description: 'Some Description', active: true, locked: false })).to have_been_made
    end

    it 'returns correct response for the runner registration' do
      expect(@register_runner_response.token).to eq('6337ff461c94fd3fa32ba3b1ff4125')
    end
  end

  describe '.delete_registered_runner' do
    before do
      stub_delete('/runners', 'empty').with(body: { token: '6337ff461c94fd3fa32ba3b1ff4125' })
      Gitlab.delete_registered_runner('6337ff461c94fd3fa32ba3b1ff4125')
    end

    it 'gets the correct resource' do
      expect(a_delete('/runners')
        .with(body: { token: '6337ff461c94fd3fa32ba3b1ff4125' })).to have_been_made
    end
  end

  describe '.verify_auth_registered_runner' do
    before do
      stub_post('/runners/verify', 'empty').with(body: { token: '6337ff461c94fd3fa32ba3b1ff4125' })
      Gitlab.verify_auth_registered_runner('6337ff461c94fd3fa32ba3b1ff4125')
    end

    it 'gets the correct resource' do
      expect(a_post('/runners/verify')
        .with(body: { token: '6337ff461c94fd3fa32ba3b1ff4125' })).to have_been_made
    end
  end
end
