From a2aaa0c394b0fccf64d599f6f680c87637d08a48 Mon Sep 17 00:00:00 2001
From: pabois <pierreandre.boissinot@noesya.coop>
Date: Thu, 23 Nov 2023 12:23:07 +0100
Subject: [PATCH] change async method

---
 app/jobs/communication/clean_websites_job.rb  | 11 ++++++++++
 app/models/concerns/with_dependencies.rb      | 14 +++++-------
 .../communication/website/connection_test.rb  | 17 +++++++++++---
 .../communication/website/dependency_test.rb  | 22 +++++++++++++++++--
 4 files changed, 50 insertions(+), 14 deletions(-)
 create mode 100644 app/jobs/communication/clean_websites_job.rb

diff --git a/app/jobs/communication/clean_websites_job.rb b/app/jobs/communication/clean_websites_job.rb
new file mode 100644
index 000000000..1edd3ae39
--- /dev/null
+++ b/app/jobs/communication/clean_websites_job.rb
@@ -0,0 +1,11 @@
+class Communication::CleanWebsitesJob < ApplicationJob
+  queue_as :default
+
+  def perform(websites_ids)
+    websites = Communication::Website.where(id: websites_ids)
+    websites.each do |website|
+      website.destroy_obsolete_connections
+      website.destroy_obsolete_git_files
+    end
+  end
+end
\ No newline at end of file
diff --git a/app/models/concerns/with_dependencies.rb b/app/models/concerns/with_dependencies.rb
index 5c0d26488..f0c5870f2 100644
--- a/app/models/concerns/with_dependencies.rb
+++ b/app/models/concerns/with_dependencies.rb
@@ -32,7 +32,7 @@ module WithDependencies
       snapshot_direct_sources.each do |direct_source|
         direct_source.sync_with_git
       end
-      clean_websites(Communication::Website.where(id: website_ids))
+      clean_websites(website_ids)
       # TODO: Actuellement, on ne nettoie pas les références
       # Exemple : Quand on supprime un auteur, il n'est pas nettoyé dans le static de ses anciens posts.
       # Un save du website le fera en nocturne pour l'instant.
@@ -114,18 +114,14 @@ module WithDependencies
     # puts "  missing_dependencies_after_save #{ missing_dependencies_after_save }"
     # puts
     if missing_dependencies_after_save.any? || unpublished_by_last_save?
-      clean_websites(websites_to_clean)
+      clean_websites(websites_to_clean.pluck(:id))
     end
   end
-  handle_asynchronously :clean_websites_if_necessary, queue: :default
-
-  def clean_websites(websites)
+  
+  def clean_websites(websites_ids)
     # Les objets directs et les objets indirects (et les websites) répondent !
     return unless respond_to?(:is_direct_object?)
-    websites.each do |website|
-      website.destroy_obsolete_connections
-      website.destroy_obsolete_git_files
-    end
+    Communication::CleanWebsitesJob.perform_later(websites_ids)
   end
 
   def websites_to_clean
diff --git a/test/models/communication/website/connection_test.rb b/test/models/communication/website/connection_test.rb
index 2bf68e198..fe5564338 100644
--- a/test/models/communication/website/connection_test.rb
+++ b/test/models/communication/website/connection_test.rb
@@ -28,6 +28,8 @@ require "test_helper"
 
 # rails test test/models/communication/website/connection_test.rb
 class Communication::Website::ConnectionTest < ActiveSupport::TestCase
+  include ActiveJob::TestHelper
+
   def test_unpublish_indirect_does_nothing
     page = communication_website_pages(:page_with_no_dependency)
     setup_page_connections(page)
@@ -64,7 +66,10 @@ class Communication::Website::ConnectionTest < ActiveSupport::TestCase
 
     # On supprime le bloc qui contient PA : -2 (parce que PA doit être supprimé aussi)
     assert_difference -> { Communication::Website::Connection.count } => -2 do
-      page.blocks.find_by(position: 2).destroy
+      assert_enqueued_with(job: Communication::CleanWebsitesJob) do
+        page.blocks.find_by(position: 2).destroy
+      end
+      perform_enqueued_jobs
     end
   end
 
@@ -82,7 +87,10 @@ class Communication::Website::ConnectionTest < ActiveSupport::TestCase
     # Suppression d'un objet indirect qui a en dépendance un autre objet utilisé ailleurs (dans le cas précédent si PA était utilisé par une autre source)
     # On supprime le bloc qui contient PA : -3 (parce que PA doit être supprimé aussi ainsi que son bloc Organisations mais pas Noesya, toujours connectée via le block 3)
     assert_difference -> { Communication::Website::Connection.count } => -3 do
-      page.blocks.find_by(position: 2).destroy
+      assert_enqueued_with(job: Communication::CleanWebsitesJob) do
+        page.blocks.find_by(position: 2).destroy
+      end
+      perform_enqueued_jobs
     end
   end
 
@@ -136,7 +144,10 @@ class Communication::Website::ConnectionTest < ActiveSupport::TestCase
 
     # En déconnectant l'école du site, on supprime les connexions créées précédemment
     assert_difference -> { Communication::Website::Connection.count } => -6 do
-      website_with_github.update(about: nil)
+      assert_enqueued_with(job: Communication::CleanWebsitesJob) do
+        website_with_github.update(about: nil)   
+      end
+      perform_enqueued_jobs
     end
   end
 
diff --git a/test/models/communication/website/dependency_test.rb b/test/models/communication/website/dependency_test.rb
index 7e4f1afe6..20f72639e 100644
--- a/test/models/communication/website/dependency_test.rb
+++ b/test/models/communication/website/dependency_test.rb
@@ -2,6 +2,8 @@ require "test_helper"
 
 # rails test test/models/communication/website/dependency_test.rb
 class Communication::Website::DependencyTest < ActiveSupport::TestCase
+  include ActiveJob::TestHelper
+
   def test_page_dependencies
     # Rien : 0 dépendances
     page = communication_website_pages(:page_with_no_dependency)
@@ -31,7 +33,13 @@ class Communication::Website::DependencyTest < ActiveSupport::TestCase
     # On modifie le target du block
     Delayed::Job.destroy_all
     block.data = "{ \"elements\": [ { \"id\": \"#{olivia.id}\" } ] }"
-    block.save
+    # On vérifie qu'on enqueue le job qui clean les websites
+    assert_enqueued_with(job: Communication::CleanWebsitesJob) do
+      block.save
+    end
+
+    perform_enqueued_jobs
+
     # On vérifie qu'on appelle bien la méthode destroy_obsolete_git_files sur le site de la page
     assert(destroy_obsolete_git_files_job)
 
@@ -41,7 +49,13 @@ class Communication::Website::DependencyTest < ActiveSupport::TestCase
     # - une tâche pour resynchroniser la page
     # - une tâche de nettoyage des git files (dépendances du bloc supprimé)
     Delayed::Job.destroy_all
-    block.destroy
+
+    assert_enqueued_with(job: Communication::CleanWebsitesJob) do
+      block.destroy
+    end
+
+    perform_enqueued_jobs
+    
     assert(sync_with_git_job(page))
     assert(destroy_obsolete_git_files_job)
 
@@ -106,6 +120,10 @@ class Communication::Website::DependencyTest < ActiveSupport::TestCase
     find_performable_method_job(:sync_with_git_without_delay, object)
   end
 
+  def clean_websites_job(object)
+    find_performable_method_job(:clean_websites_without_delay, object)
+  end
+
   def destroy_obsolete_git_files_job(website = website_with_github)
     find_performable_method_job(:destroy_obsolete_git_files_without_delay, website)
   end
-- 
GitLab