# frozen_string_literal: true

require 'spec_helper'

describe ReleaseTools::InternalRelease::DedicatedIssue do
  include ReleaseTools::InternalRelease::IssueHelper

  subject(:dedicated_issue) { described_class.new(versions: versions) }

  let(:client) { stub_const('ReleaseTools::GitlabClient', spy) }
  let(:helper) { stub_const('ReleaseTools::InternalRelease::IssueHelper', spy) }
  let(:release_managers) { [build(:user, username: 'a'), build(:user, username: 'b')] }
  let(:task_issue) { build(:issue, due_date: '2024-04-01') }
  let(:security_issue) { build(:issue, due_date: '2024-04-01', references: { full: 'gitlab-org/security/gitlab#1' }) }

  let(:schedule) do
    instance_spy(
      ReleaseTools::ReleaseManagers::Schedule,
      active_release_managers: release_managers
    )
  end

  let(:versions) do
    [
      ReleaseTools::Version.new('15.2.1-internal1'),
      ReleaseTools::Version.new('15.1.2-internal1')
    ]
  end

  before do
    allow(client)
      .to receive_messages(
        issues: [task_issue],
        issue_links: [security_issue]
      )

    allow(ReleaseTools::ReleaseManagers::Schedule)
      .to receive(:new)
      .and_return(schedule)
  end

  it_behaves_like 'issuable #initialize'

  describe '#title' do
    it 'returns the title' do
      expect(dedicated_issue.title).to eq('Internal release: 15.2.1-internal1, 15.1.2-internal1')
    end
  end

  describe '#assignees' do
    let(:dedicated_team_managers_ids) { %w[11218142 20257324 25360079] }

    it 'returns list of dedicated team managers GitLab IDs' do
      expect(dedicated_issue.assignees).to eq(dedicated_team_managers_ids)
    end
  end

  describe '#confidential?' do
    it 'returns true' do
      expect(dedicated_issue).to be_confidential
    end
  end

  describe '#labels' do
    let(:labels) { 'internal releases, group::GitLab Dedicated, severity::1' }

    it 'returns internal releases label' do
      expect(dedicated_issue.labels).to eq(labels)
    end
  end

  describe '#internal_versions_info' do
    it 'returns the internal versions' do
      expect(dedicated_issue.internal_versions_info).to eq('15.2.1-internal1, 15.1.2-internal1')
    end
  end

  describe '#release_versions_info' do
    it 'returns the minor versions' do
      expect(dedicated_issue.release_versions_info).to eq('15.2, 15.1')
    end
  end

  describe '#due_date' do
    it 'returns the same date as the task issue' do
      expect(dedicated_issue.due_date).to eq('2024-04-01')
    end
  end

  describe '#planned_due_date' do
    it 'returns the same date as the task issue' do
      expect(dedicated_issue.due_date).to eq('2024-04-01')
    end

    context 'when the task issue has no due date' do
      let(:task_issue) { build(:issue, due_date: nil) }
      let(:planned_due_date) { 'TBD - Release managers will provide an estimated date' }

      it 'returns the planned due date as tbd' do
        expect(dedicated_issue.planned_due_date).to eq(planned_due_date)
      end
    end
  end

  describe '#security_issues' do
    it 'returns linked security issues urls' do
      expect(dedicated_issue.security_issues).to eq(security_issue.web_url)
    end
  end

  describe '#release_managers_usernames' do
    let(:usernames) { '@a @b' }

    it 'returns usernames of active release managers' do
      expect(dedicated_issue.release_managers_usernames).to eq(usernames)
    end
  end
end
