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