# frozen_string_literal: true

require 'spec_helper'

describe ReleaseTools::MergeRequest do
  it_behaves_like 'issuable #initialize'
  it_behaves_like 'merge_request #accept'
  it_behaves_like 'issuable #url'

  it_behaves_like 'issuable #create', :create_merge_request do
    let(:project_path) { subject.project.path }
  end

  describe '#source_branch' do
    it 'raises if source_branch is not set' do
      expect { described_class.new.source_branch }.to raise_error(ArgumentError, 'Please set a `source_branch`!')
    end

    it 'can be set' do
      expect(described_class.new(source_branch: 'foo').source_branch).to eq('foo')
    end
  end

  describe '#target_branch' do
    it 'defaults to `master`' do
      expect(described_class.new.target_branch).to eq('master')
    end

    it 'can be set' do
      expect(described_class.new(target_branch: 'foo').target_branch).to eq('foo')
    end
  end

  describe '#to_reference' do
    it 'returns the valid reference string' do
      merge_request = described_class.new
      allow(merge_request).to receive(:iid).and_return(1234)

      expect(merge_request.to_reference).to eq('gitlab-org/gitlab!1234')
    end
  end

  describe '#conflicts' do
    it 'returns nil if no conflicts are given' do
      expect(described_class.new.conflicts).to be_nil
    end

    it 'returns array of conflicts if given' do
      expect(described_class.new(conflicts: %i[a b c]).conflicts).to eq(%i[a b c])
    end
  end

  describe '#conflicts?' do
    it 'returns false if conflicts are nil' do
      expect(described_class.new.conflicts?).to be_falsey
    end

    it 'returns false if conflicts are empty' do
      expect(described_class.new(conflicts: %i[]).conflicts?).to be_falsey
    end

    it 'returns true of conflicts are given' do
      expect(described_class.new(conflicts: %i[a b c]).conflicts?).to be_truthy
    end
  end

  describe '#remote_issuable' do
    it 'searches by source_branch' do
      expect(ReleaseTools::GitlabClient)
        .to receive(:merge_requests)
        .with(subject.project.path, { state: 'opened', source_branch: 'foo' })
        .and_return([])

      described_class.new(source_branch: 'foo').remote_issuable
    end
  end

  describe '#web_url' do
    it 'return web_url attribute' do
      expect(described_class.new(web_url: 'foo').web_url).to eq('foo')
    end

    it 'calls #url method when there is no web_url attribute' do
      mr = described_class.new
      expect(mr).to receive(:url).and_return(nil)

      mr.web_url
    end
  end
end
