# frozen_string_literal: true

require 'spec_helper'

describe Gitlab::Client do
  describe '.variables' do
    before do
      stub_get('/projects/3/variables', 'variables')
      @variables = Gitlab.variables(3)
    end

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

    it "returns an array of project's variables" do
      expect(@variables).to be_a Gitlab::PaginatedResponse
      expect(@variables.first.key).to eq('TEST_VARIABLE_1')
      expect(@variables.first.value).to eq('TEST_1')
    end
  end

  describe '.variable' do
    before do
      stub_get('/projects/3/variables/VARIABLE', 'variable')
      @variable = Gitlab.variable(3, 'VARIABLE')
    end

    it 'gets the correct resource' do
      expect(a_get('/projects/3/variables/VARIABLE')).to have_been_made
    end

    it 'returns information about a variable' do
      expect(@variable.key).to eq('VARIABLE')
      expect(@variable.value).to eq('the value')
    end
  end

  describe '.create_variable' do
    before do
      stub_post('/projects/3/variables', 'variable')
      @variable = Gitlab.create_variable(3, 'NEW_VARIABLE', 'new value')
    end

    it 'gets the correct resource' do
      body = { key: 'NEW_VARIABLE', value: 'new value' }
      expect(a_post('/projects/3/variables').with(body: body)).to have_been_made
    end

    it 'returns information about a new variable' do
      expect(@variable.key).to eq('VARIABLE')
      expect(@variable.value).to eq('the value')
    end
  end

  describe '.update_variable' do
    before do
      stub_put('/projects/3/variables/UPD_VARIABLE', 'variable')
      @variable = Gitlab.update_variable(3, 'UPD_VARIABLE', 'updated value')
    end

    it 'puts the correct resource' do
      body = { value: 'updated value' }
      expect(a_put('/projects/3/variables/UPD_VARIABLE').with(body: body)).to have_been_made
    end

    it 'returns information about an updated variable' do
      expect(@variable.key).to eq('VARIABLE')
      expect(@variable.value).to eq('the value')
    end
  end

  describe '.remove_variable' do
    before do
      stub_delete('/projects/3/variables/DEL_VARIABLE', 'variable')
      @variable = Gitlab.remove_variable(3, 'DEL_VARIABLE')
    end

    it 'gets the correct resource' do
      expect(a_delete('/projects/3/variables/DEL_VARIABLE')).to have_been_made
    end

    it 'returns information about a deleted variable' do
      expect(@variable.key).to eq('VARIABLE')
      expect(@variable.value).to eq('the value')
    end
  end

  describe '.group_variables' do
    before do
      stub_get('/groups/3/variables', 'variables')
      @variables = Gitlab.group_variables(3)
    end

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

    it "returns an array of group's variables" do
      expect(@variables).to be_a Gitlab::PaginatedResponse
      expect(@variables.first.key).to eq('TEST_VARIABLE_1')
      expect(@variables.first.value).to eq('TEST_1')
    end
  end

  describe '.group_variable' do
    before do
      stub_get('/groups/3/variables/VARIABLE', 'variable')
      @variable = Gitlab.group_variable(3, 'VARIABLE')
    end

    it 'gets the correct resource' do
      expect(a_get('/groups/3/variables/VARIABLE')).to have_been_made
    end

    it 'returns information about a variable' do
      expect(@variable.key).to eq('VARIABLE')
      expect(@variable.value).to eq('the value')
    end
  end

  describe '.create_group_variable' do
    before do
      stub_post('/groups/3/variables', 'variable')
      @variable = Gitlab.create_group_variable(3, 'NEW_VARIABLE', 'new value')
    end

    it 'gets the correct resource' do
      body = { key: 'NEW_VARIABLE', value: 'new value' }
      expect(a_post('/groups/3/variables').with(body: body)).to have_been_made
    end

    it 'returns information about a new variable' do
      expect(@variable.key).to eq('VARIABLE')
      expect(@variable.value).to eq('the value')
    end
  end

  describe '.update_group_variable' do
    before do
      stub_put('/groups/3/variables/UPD_VARIABLE', 'variable')
      @variable = Gitlab.update_group_variable(3, 'UPD_VARIABLE', 'updated value')
    end

    it 'puts the correct resource' do
      body = { value: 'updated value' }
      expect(a_put('/groups/3/variables/UPD_VARIABLE').with(body: body)).to have_been_made
    end

    it 'returns information about an updated variable' do
      expect(@variable.key).to eq('VARIABLE')
      expect(@variable.value).to eq('the value')
    end
  end

  describe '.remove_group_variable' do
    before do
      stub_delete('/groups/3/variables/DEL_VARIABLE', 'variable')
      @variable = Gitlab.remove_group_variable(3, 'DEL_VARIABLE')
    end

    it 'gets the correct resource' do
      expect(a_delete('/groups/3/variables/DEL_VARIABLE')).to have_been_made
    end

    it 'returns information about a deleted variable' do
      expect(@variable.key).to eq('VARIABLE')
      expect(@variable.value).to eq('the value')
    end
  end
end
