# frozen_string_literal: true

require 'spec_helper'

RSpec.describe MemberUserEntity do
  include OncallHelpers

  let_it_be_with_reload(:user) { create(:user) }

  let(:entity) { described_class.new(user, source: source) }
  let(:entity_hash) { entity.as_json }
  let(:source) { nil }

  it 'matches json schema' do
    expect(entity.to_json).to match_schema('entities/member_user')
  end

  context 'when using on-call management' do
    let_it_be(:group) { create(:group) }
    let_it_be(:project_1) { create(:project, group: group )}
    let_it_be(:project_2) { create(:project, group: group )}

    context 'with oncall schedules' do
      let_it_be(:oncall_schedule_1) { create_schedule_with_user(project_1, user) }
      let_it_be(:oncall_schedule_2) { create_schedule_with_user(project_2, user) }

      subject { entity_hash[:oncall_schedules] }

      context 'with no source given' do
        it { is_expected.to eq [] }
      end

      context 'source is project' do
        let(:source) { project_1 }

        it { is_expected.to contain_exactly(expected_hash(oncall_schedule_1)) }
      end

      context 'source is group' do
        let(:source) { group }

        it { is_expected.to contain_exactly(expected_hash(oncall_schedule_1), expected_hash(oncall_schedule_2)) }
      end

      private

      def get_url(schedule)
        Gitlab::Routing.url_helpers.project_incident_management_oncall_schedules_url(schedule.project)
      end

      def expected_hash(schedule)
        # for backwards compatibility
        super.merge(schedule_url: get_url(schedule))
      end
    end

    context 'with escalation policies' do
      let_it_be(:policy_1) { create(:incident_management_escalation_policy, project: project_1, rule_count: 0) }
      let_it_be(:rule_1) { create(:incident_management_escalation_rule, :with_user, policy: policy_1, user: user) }
      let_it_be(:policy_2) { create(:incident_management_escalation_policy, project: project_2, rule_count: 0) }
      let_it_be(:rule_2) { create(:incident_management_escalation_rule, :with_user, policy: policy_2, user: user) }

      subject { entity_hash[:escalation_policies] }

      context 'with no source given' do
        it { is_expected.to eq [] }
      end

      context 'source is project' do
        let(:source) { project_1 }

        it { is_expected.to contain_exactly(expected_hash(policy_1)) }
      end

      context 'source is group' do
        let(:source) { group }

        it { is_expected.to contain_exactly(expected_hash(policy_1), expected_hash(policy_2)) }
      end

      private

      def get_url(policy)
        Gitlab::Routing.url_helpers.project_incident_management_escalation_policies_url(policy.project)
      end
    end

    private

    def expected_hash(oncall_object)
      {
        name: oncall_object.name,
        url: get_url(oncall_object),
        project_name: oncall_object.project.name,
        project_url: Gitlab::Routing.url_helpers.project_url(oncall_object.project)
      }
    end
  end
end
