spec/models/concerns/namespaces/adjourned_deletable_spec.rb (202 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' RSpec.describe Namespaces::AdjournedDeletable, feature_category: :groups_and_projects do let(:model) do Class.new do include Namespaces::AdjournedDeletable end end let(:record) { model.new } describe '#self_deletion_in_progress?' do it 'raises NotImplementedError by default' do expect { record.self_deletion_in_progress? }.to raise_error(NotImplementedError) end context 'when implemented' do before do model.send(:define_method, :self_deletion_in_progress?) do true end end it 'returns the implemented value' do expect(record.self_deletion_in_progress?).to be_truthy end end end describe '#delayed_deletion_ready?' do context 'when deletion_adjourned_period is zero' do before do stub_application_setting(deletion_adjourned_period: 0) end it 'returns false' do expect(record.delayed_deletion_ready?).to be(false) expect(record.adjourned_deletion?).to be(false) expect(record.delayed_deletion_configured?).to be(false) expect(record.adjourned_deletion_configured?).to be(false) end end context 'when deletion_adjourned_period is positive' do before do stub_application_setting(deletion_adjourned_period: 7) end it 'returns true' do expect(record.delayed_deletion_ready?).to be(true) expect(record.adjourned_deletion?).to be(true) expect(record.delayed_deletion_configured?).to be(true) expect(record.adjourned_deletion_configured?).to be(true) end end end describe '#self_deletion_scheduled_deletion_created_on', :freeze_time do context 'when record responds to :marked_for_deletion_on' do it 'returns marked_for_deletion_on' do allow(record).to receive(:marked_for_deletion_on).and_return(Time.current) expect(record.self_deletion_scheduled_deletion_created_on).to eq(Time.current) end end context 'when record does not respond to :marked_for_deletion_on' do it 'returns nil' do expect(record.self_deletion_scheduled_deletion_created_on).to be_nil end end end describe '#self_deletion_scheduled?' do context 'when self_deletion_scheduled_deletion_created_on is nil' do it 'returns false' do expect(record.self_deletion_scheduled?).to be(false) expect(record.marked_for_deletion?).to be(false) end end context 'when self_deletion_scheduled_deletion_created_on is present' do before do allow(record).to receive(:self_deletion_scheduled_deletion_created_on).and_return(Time.current) end it 'returns true' do expect(record.self_deletion_scheduled?).to be(true) expect(record.marked_for_deletion?).to be(true) end end end describe '#first_scheduled_for_deletion_in_hierarchy_chain' do it 'returns nil' do expect(record.first_scheduled_for_deletion_in_hierarchy_chain).to be_nil end end describe '#deletion_in_progress_or_scheduled_in_hierarchy_chain?' do context 'when #self_deletion_in_progress? is false' do before do allow(record).to receive(:self_deletion_in_progress?).and_return(false) end it 'returns false' do expect(record.deletion_in_progress_or_scheduled_in_hierarchy_chain?).to be_falsy end context 'when #scheduled_for_deletion_in_hierarchy_chain? is true' do before do allow(record).to receive(:scheduled_for_deletion_in_hierarchy_chain?).and_return(true) end it 'returns true' do expect(record.deletion_in_progress_or_scheduled_in_hierarchy_chain?).to be_truthy end end end context 'when #self_deletion_in_progress? is true' do before do allow(record).to receive(:self_deletion_in_progress?).and_return(true) end it 'returns true' do expect(record.deletion_in_progress_or_scheduled_in_hierarchy_chain?).to be_truthy end end end describe Namespace do describe '#self_deletion_in_progress?' do context 'when deleted_at is nil' do let_it_be(:namespace) { create(:namespace) } it 'returns false' do expect(namespace.self_deletion_in_progress?).to be_falsy end end context 'when deleted_at is not nil' do let_it_be(:namespace) { create(:namespace) { |n| n.deleted_at = Time.current } } it 'returns true' do expect(namespace.self_deletion_in_progress?).to be_truthy end end end describe '#first_scheduled_for_deletion_in_hierarchy_chain' do let_it_be_with_reload(:group) { create(:group) } context 'when the group has been marked for deletion' do before do create(:group_deletion_schedule, group: group, marked_for_deletion_on: 1.day.ago) end it 'returns the group' do expect(group.first_scheduled_for_deletion_in_hierarchy_chain).to eq(group) end end context 'when the parent group has been marked for deletion' do let(:parent_group) { create(:group_with_deletion_schedule, marked_for_deletion_on: 1.day.ago) } let(:group) { create(:group, parent: parent_group) } it 'returns the parent group' do expect(group.first_scheduled_for_deletion_in_hierarchy_chain).to eq(parent_group) end end context 'when parent group has not been marked for deletion' do let(:parent_group) { create(:group) } let(:group) { create(:group, parent: parent_group) } it 'returns nil' do expect(group.first_scheduled_for_deletion_in_hierarchy_chain).to be_nil end end describe 'ordering of parents marked for deletion' do let(:group_a) { create(:group_with_deletion_schedule, marked_for_deletion_on: 1.day.ago) } let(:subgroup_a) { create(:group_with_deletion_schedule, marked_for_deletion_on: 1.day.ago, parent: group_a) } let(:group) { create(:group, parent: subgroup_a) } it 'returns the ancestors marked for deletion, ordered from closest to farthest' do expect(group.first_scheduled_for_deletion_in_hierarchy_chain).to eq(subgroup_a) end end end end describe Project do describe '#self_deletion_in_progress?' do context 'when pending_delete is false' do let_it_be(:project) { create(:project, pending_delete: false) } it 'returns false' do expect(project.self_deletion_in_progress?).to be_falsy end end context 'when pending_delete is true' do let_it_be(:project) { create(:project, pending_delete: true) } it 'returns true' do expect(project.self_deletion_in_progress?).to be_truthy end end end describe '#first_scheduled_for_deletion_in_hierarchy_chain' do context 'when the parent group has been marked for deletion' do let_it_be(:parent_group) do create(:group_with_deletion_schedule, marked_for_deletion_on: 1.day.ago) end let_it_be(:project) { create(:project, namespace: parent_group) } it 'returns the parent group' do expect(project.first_scheduled_for_deletion_in_hierarchy_chain).to eq(parent_group) end end context 'when parent group has not been marked for deletion' do let_it_be(:parent_group) { create(:group) } let_it_be(:project) { create(:project, namespace: parent_group) } it 'returns nil' do expect(project.first_scheduled_for_deletion_in_hierarchy_chain).to be_nil end end describe 'ordering of parents marked for deletion' do let_it_be(:group_a) { create(:group_with_deletion_schedule, marked_for_deletion_on: 1.day.ago) } let_it_be(:subgroup_a) do create(:group_with_deletion_schedule, marked_for_deletion_on: 1.day.ago, parent: group_a) end let_it_be(:project) { create(:project, namespace: subgroup_a) } it 'returns the ancestors marked for deletion, ordered from closest to farthest' do expect(project.first_scheduled_for_deletion_in_hierarchy_chain).to eq(subgroup_a) end end end end end