# frozen_string_literal: true

require 'spec_helper'

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

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

    it "returns a paginated response of project's environments" do
      expect(@environments).to be_a Gitlab::PaginatedResponse
    end
  end

  describe '.environment' do
    before do
      stub_get('/projects/3/environments/12', 'environment')
      @environment = Gitlab.environment(3, 12)
    end

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

    it 'returns a single environment' do
      expect(@environment).to be_a Gitlab::ObjectifiedHash
    end

    it 'returns information about an environment' do
      expect(@environment.id).to eq(12)
      expect(@environment.name).to eq('staging')
    end
  end

  describe '.create_environment' do
    context 'without external_url' do
      before do
        stub_post('/projects/3/environments', 'environment')
        @environment = Gitlab.create_environment(3, 'staging')
      end

      it 'gets the correct resource' do
        expect(a_post('/projects/3/environments').with(body: { name: 'staging' })).to have_been_made
      end

      it 'returns a single environment' do
        expect(@environment).to be_a Gitlab::ObjectifiedHash
      end

      it 'returns information about an environment' do
        expect(@environment.name).to eq('staging')
      end
    end

    context 'with external_url' do
      before do
        stub_post('/projects/3/environments', 'environment')
        @environment = Gitlab.create_environment(3, 'staging', external_url: 'https://staging.example.gitlab.com')
      end

      it 'gets the correct resource' do
        expect(a_post('/projects/3/environments')
                 .with(body: { name: 'staging', external_url: 'https://staging.example.gitlab.com' })).to have_been_made
      end
    end
  end

  describe '.edit_environment' do
    before do
      stub_put('/projects/3/environments/12', 'environment')
      @environment = Gitlab.edit_environment(3, 12,
                                             name: 'staging',
                                             external_url: 'https://staging.example.gitlab.com')
    end

    it 'gets the correct resource' do
      expect(a_put('/projects/3/environments/12')
               .with(body: { name: 'staging', external_url: 'https://staging.example.gitlab.com' })).to have_been_made
    end

    it 'returns a single environment' do
      expect(@environment).to be_a Gitlab::ObjectifiedHash
    end

    it 'returns information about an environment' do
      expect(@environment.name).to eq('staging')
    end
  end

  describe '.delete_environment' do
    before do
      stub_delete('/projects/3/environments/12', 'environment')
      @environment = Gitlab.delete_environment(3, 12)
    end

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

    it 'returns a single pipeline' do
      expect(@environment).to be_a Gitlab::ObjectifiedHash
    end

    it 'returns information about a pipeline' do
      expect(@environment.name).to eq('staging')
    end
  end

  describe '.stop_environment' do
    before do
      stub_post('/projects/3/environments/12/stop', 'environment')
      @environment = Gitlab.stop_environment(3, 12)
    end

    it 'gets the correct resource' do
      expect(a_post('/projects/3/environments/12/stop')).to have_been_made
    end

    it 'returns a single pipeline' do
      expect(@environment).to be_a Gitlab::ObjectifiedHash
    end

    it 'returns information about a pipeline' do
      expect(@environment.name).to eq('staging')
    end
  end
end
