Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.rb136
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