From 96482cac11240179ef69331c5ddafa38cf2be1cc Mon Sep 17 00:00:00 2001
From: Philip Cunningham <pcunningham@gitlab.com>
Date: Wed, 29 Sep 2021 23:48:48 +0000
Subject: [PATCH] Clean up DAST site tokens when site deleted

---
 ee/app/models/dast_site.rb       |  6 ++++++
 ee/spec/models/dast_site_spec.rb | 12 ++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/ee/app/models/dast_site.rb b/ee/app/models/dast_site.rb
index d080994251982..5bf52dc714a7f 100644
--- a/ee/app/models/dast_site.rb
+++ b/ee/app/models/dast_site.rb
@@ -11,8 +11,14 @@ class DastSite < ApplicationRecord
   validates :project_id, presence: true
   validate :dast_site_validation_project_id_fk
 
+  after_destroy :cleanup_dast_site_token
+
   private
 
+  def cleanup_dast_site_token
+    DastSiteToken.where(project_id: project.id, url: url).delete_all
+  end
+
   def dast_site_validation_project_id_fk
     return unless dast_site_validation_id
 
diff --git a/ee/spec/models/dast_site_spec.rb b/ee/spec/models/dast_site_spec.rb
index 583a157f9935a..a84be0c7cf86b 100644
--- a/ee/spec/models/dast_site_spec.rb
+++ b/ee/spec/models/dast_site_spec.rb
@@ -44,4 +44,16 @@
       end
     end
   end
+
+  describe 'callbacks' do
+    context 'when there is a related site token' do
+      let_it_be(:dast_site) { create(:dast_site, project: project) }
+      let_it_be(:dast_site_token) { create(:dast_site_token, project: dast_site.project, url: dast_site.url) }
+      let_it_be(:dast_site_validations) { create_list(:dast_site_validation, 5, dast_site_token: dast_site_token) }
+
+      it 'ensures it and associated site validations cleaned up on destroy' do
+        expect { dast_site.destroy! }.to change { DastSiteToken.count }.from(1).to(0).and change { DastSiteValidation.count }.from(5).to(0)
+      end
+    end
+  end
 end
-- 
GitLab