diff options
Diffstat (limited to 'spec/services/environments/schedule_to_delete_review_apps_service_spec.rb')
-rw-r--r-- | spec/services/environments/schedule_to_delete_review_apps_service_spec.rb | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/spec/services/environments/schedule_to_delete_review_apps_service_spec.rb b/spec/services/environments/schedule_to_delete_review_apps_service_spec.rb new file mode 100644 index 00000000000..401d6203b2c --- /dev/null +++ b/spec/services/environments/schedule_to_delete_review_apps_service_spec.rb @@ -0,0 +1,136 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe Environments::ScheduleToDeleteReviewAppsService do + include ExclusiveLeaseHelpers + + let_it_be(:maintainer) { create(:user) } + let_it_be(:developer) { create(:user) } + let_it_be(:reporter) { create(:user) } + let_it_be(:project) { create(:project, :private, :repository, namespace: maintainer.namespace) } + + let(:service) { described_class.new(project, current_user, before: 30.days.ago, dry_run: dry_run) } + let(:dry_run) { false } + let(:current_user) { maintainer } + + before do + project.add_maintainer(maintainer) + project.add_developer(developer) + project.add_reporter(reporter) + end + + describe "#execute" do + subject { service.execute } + + shared_examples "can schedule for deletion" do + let!(:old_stopped_review_env) { create(:environment, :with_review_app, :stopped, created_at: 31.days.ago, project: project) } + let!(:new_stopped_review_env) { create(:environment, :with_review_app, :stopped, project: project) } + let!(:old_active_review_env) { create(:environment, :with_review_app, :available, created_at: 31.days.ago, project: project) } + let!(:old_stopped_other_env) { create(:environment, :stopped, created_at: 31.days.ago, project: project) } + let!(:new_stopped_other_env) { create(:environment, :stopped, project: project) } + let!(:old_active_other_env) { create(:environment, :available, created_at: 31.days.ago, project: project) } + let!(:already_deleting_env) { create(:environment, :with_review_app, :stopped, created_at: 31.days.ago, project: project, auto_delete_at: 1.day.from_now) } + let(:already_deleting_time) { already_deleting_env.reload.auto_delete_at } + + context "live run" do + let(:dry_run) { false } + + around do |example| + freeze_time { example.run } + end + + it "marks the correct environment as scheduled_entries" do + expect(subject.success?).to be_truthy + expect(subject.scheduled_entries).to contain_exactly(old_stopped_review_env) + expect(subject.unprocessable_entries).to be_empty + + old_stopped_review_env.reload + new_stopped_review_env.reload + old_active_review_env.reload + old_stopped_other_env.reload + new_stopped_other_env.reload + old_active_other_env.reload + already_deleting_env.reload + + expect(old_stopped_review_env.auto_delete_at).to eq(1.week.from_now) + expect(new_stopped_review_env.auto_delete_at).to be_nil + expect(old_active_review_env.auto_delete_at).to be_nil + expect(old_stopped_other_env.auto_delete_at).to be_nil + expect(new_stopped_other_env.auto_delete_at).to be_nil + expect(old_active_other_env.auto_delete_at).to be_nil + expect(already_deleting_env.auto_delete_at).to eq(already_deleting_time) + end + end + + context "dry run" do + let(:dry_run) { true } + + it "returns the same but doesn't update the record" do + expect(subject.success?).to be_truthy + expect(subject.scheduled_entries).to contain_exactly(old_stopped_review_env) + expect(subject.unprocessable_entries).to be_empty + + old_stopped_review_env.reload + new_stopped_review_env.reload + old_active_review_env.reload + old_stopped_other_env.reload + new_stopped_other_env.reload + old_active_other_env.reload + already_deleting_env.reload + + expect(old_stopped_review_env.auto_delete_at).to be_nil + expect(new_stopped_review_env.auto_delete_at).to be_nil + expect(old_active_review_env.auto_delete_at).to be_nil + expect(old_stopped_other_env.auto_delete_at).to be_nil + expect(new_stopped_other_env.auto_delete_at).to be_nil + expect(old_active_other_env.auto_delete_at).to be_nil + expect(already_deleting_env.auto_delete_at).to eq(already_deleting_time) + end + end + + describe "execution in parallel" do + before do + stub_exclusive_lease_taken(service.send(:key)) + end + + it "does not execute unsafe_mark_scheduled_entries_environments" do + expect(service).not_to receive(:unsafe_mark_scheduled_entries_environments) + + expect(subject.success?).to be_falsey + expect(subject.status).to eq(:conflict) + end + end + end + + context "as a maintainer" do + let(:current_user) { maintainer } + + it_behaves_like "can schedule for deletion" + end + + context "as a developer" do + let(:current_user) { developer } + + it_behaves_like "can schedule for deletion" + end + + context "as a reporter" do + let(:current_user) { reporter } + + it "fails to delete environments" do + old_stopped_review_env = create(:environment, :with_review_app, :stopped, created_at: 31.days.ago, project: project) + + expect(subject.success?).to be_falsey + + # Both of these should be empty as we fail before testing them + expect(subject.scheduled_entries).to be_empty + expect(subject.unprocessable_entries).to be_empty + + old_stopped_review_env.reload + + expect(old_stopped_review_env.auto_delete_at).to be_nil + end + end + end +end |