From 290732a57b70c89d90fd68c4a909d152b9b88b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com> Date: Mon, 24 Apr 2023 10:47:22 +0200 Subject: [PATCH] splitted tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pierre-André Boissinot <pierreandre.boissinot@noesya.coop> --- app/models/concerns/as_indirect_object.rb | 13 ++- ...connections_test.rb => connection_test.rb} | 102 ++++++++++++------ ...ependencies_test.rb => dependency_test.rb} | 6 +- 3 files changed, 80 insertions(+), 41 deletions(-) rename test/models/communication/website/{connections_test.rb => connection_test.rb} (58%) rename test/models/communication/website/{dependencies_test.rb => dependency_test.rb} (77%) diff --git a/app/models/concerns/as_indirect_object.rb b/app/models/concerns/as_indirect_object.rb index e715065ea..56b45d6f7 100644 --- a/app/models/concerns/as_indirect_object.rb +++ b/app/models/concerns/as_indirect_object.rb @@ -7,15 +7,14 @@ module AsIndirectObject included do # Les blocs sont des objets indirects, mais n'ont pas de GitFiles, on n'inclut donc pas WithGitFiles ici - include WithDependencies include WithDependenciesSynchronization include WithReferences - has_many :connections, + has_many :connections, as: :indirect_object, class_name: 'Communication::Website::Connection' # Pas dependent_destroy parce que le processus est plus sophistiqué, et est fait dans la méthode destroy - has_many :websites, + has_many :websites, through: :connections # Ce serait super de faire la ligne ci-dessous, mais Rails ne sait pas faire ça avec un objet polymorphe (direct_source) # has_many :direct_sources, through: :connections @@ -52,11 +51,11 @@ module AsIndirectObject # On est obligés d'overwrite la méthode destroy pour éviter un problème d'œuf et de poule. # On a besoin que les websites puissent recalculer leurs recursive_dependencies # et on a besoin que ces recursive_dependencies n'incluent pas l'objet courant, puisqu'il est "en cours de destruction" (ni ses propres recursive_dependencies). - # Mais si on détruit juste l'objet et qu'on fait un `after_destroy :clean_website_connections` + # Mais si on détruit juste l'objet et qu'on fait un `after_destroy :clean_website_connections` # on ne peut plus accéder aux websites (puisque l'objet est déjà détruit et ses connexions en cascades). - # Donc : - # 1. on stocke les websites - # 2. PUIS on détruit les connexions + # Donc : + # 1. on stocke les websites + # 2. PUIS on détruit les connexions # 3. PUIS on détruit l'objet (la méthode destroy normale) # 4. PUIS on demande aux websites stockés de nettoyer leurs connexions self.transaction do diff --git a/test/models/communication/website/connections_test.rb b/test/models/communication/website/connection_test.rb similarity index 58% rename from test/models/communication/website/connections_test.rb rename to test/models/communication/website/connection_test.rb index 673579a77..08803d47a 100644 --- a/test/models/communication/website/connections_test.rb +++ b/test/models/communication/website/connection_test.rb @@ -1,20 +1,84 @@ require "test_helper" -# rails test test/models/communication/website/connections_test.rb -class Communication::Website::ConnectionsTest < ActiveSupport::TestCase - test "connect objects to page" do +# rails test test/models/communication/website/connection_test.rb +class Communication::Website::ConnectionTest < ActiveSupport::TestCase + test "unpublish indirect does nothing" do + page = communication_website_pages(:page_with_no_dependency) + setup_page_connections(page) - # Au début, rien + # On dépublie un bloc : +0 + assert_no_difference("Communication::Website::Connection.count") do + page.blocks.second.update(published: false) + end + end + + test "unpublish direct does nothing" do page = communication_website_pages(:page_with_no_dependency) + setup_page_connections(page) + + # On dépublie la page ayant un bloc chapitre : +0 + assert_no_difference("Communication::Website::Connection.count") do + page.update(published: false) + end + end + + test "deleting direct removes all its connections" do + page = communication_website_pages(:page_with_no_dependency) + setup_page_connections(page) + + # On supprime la page ayant un bloc chapitre, et ainsi toutes ses connexions : -10 + assert_difference -> { Communication::Website::Connection.count } => -10 do + page.destroy + end + end + + test "deleting indirect removes all its connections" do + page = communication_website_pages(:page_with_no_dependency) + setup_page_connections(page) + + # 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 + end + end + + test "deleting indirect with a dependency having 2 sources should keep a connection for this dependency somewhere else" do + page = communication_website_pages(:page_with_no_dependency) + setup_page_connections(page) + # TODO 3 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) + end + + test "unpublish indirect ..." do + page = communication_website_pages(:page_with_no_dependency) + setup_page_connections(page) + # TODO 4 Désactivation d'objet indirect + end + + test "deleting direct with indirect dependency having 2 sources ..." do + page = communication_website_pages(:page_with_no_dependency) + setup_page_connections(page) + # TODO 5 Suppression d'objet direct avec indirect connecté par 2 canaux (le problème du saumon) + # https://developers.osuny.org/docs/admin/communication/sites-web/dependencies/iteration-4/#olivia-et-le-saumon-de-schr%C3%B6dinger + end + + test "connecting indirect to website directly" do + page = communication_website_pages(:page_with_no_dependency) + setup_page_connections(page) + # TODO 6 Connexion d'un objet indirect au website directement (about) + end + + private + + def setup_page_connections(page) assert_no_difference("Communication::Website::Connection.count") do page.save end - # On ajoute un block "Chapitre" : +1 + # On ajoute un block "Chapitre" : +1 assert_difference -> { Communication::Website::Connection.count } => 1 do page.blocks.create(position: 1, published: true, template_kind: :chapter) end - + # On connecte PA via un block "Personnes" : +2 assert_difference -> { Communication::Website::Connection.count } => 2 do block = page.blocks.create(position: 2, published: true, template_kind: :organization_chart) @@ -22,7 +86,7 @@ class Communication::Website::ConnectionsTest < ActiveSupport::TestCase block.save end - # On ajoute noesya via un block "Organisations" : +4 parce que noesya a un block "Personnes" avec Olivia + # On ajoute noesya via un block "Organisations" : +4 parce que noesya a un block "Personnes" avec Olivia assert_difference -> { Communication::Website::Connection.count } => 4 do block = page.blocks.create(position: 3, published: true, template_kind: :partners) block.data = "{ \"elements\": [ { \"id\": \"#{noesya.id}\" } ] }" @@ -42,29 +106,5 @@ class Communication::Website::ConnectionsTest < ActiveSupport::TestCase block.data = "{ \"elements\": [ { \"id\": \"#{noesya.id}\" } ] }" block.save end - - # On dépublie un bloc : +0 - assert_no_difference("Communication::Website::Connection.count") do - page.blocks.second.update(published: false) - end - - # TODO 1 Suppression d'objet direct - - # TODO 2 Désactivation d'objet direct - - # Suppression d'objet indirect - # 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 - end - - # TODO 3 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) - - # TODO 4 Désactivation d'objet indirect - - # TODO 5 Suppression d'objet direct avec indirect connecté par 2 canaux (le problème du saumon) - # https://developers.osuny.org/docs/admin/communication/sites-web/dependencies/iteration-4/#olivia-et-le-saumon-de-schr%C3%B6dinger - - # TODO 6 Connexion d'un objet indirect au website directement (about) end end diff --git a/test/models/communication/website/dependencies_test.rb b/test/models/communication/website/dependency_test.rb similarity index 77% rename from test/models/communication/website/dependencies_test.rb rename to test/models/communication/website/dependency_test.rb index a1245d762..e8812d107 100644 --- a/test/models/communication/website/dependencies_test.rb +++ b/test/models/communication/website/dependency_test.rb @@ -1,12 +1,12 @@ require "test_helper" -# rails test test/models/communication/website/dependencies_test.rb -class Communication::Website::DependenciesTest < ActiveSupport::TestCase +# rails test test/models/communication/website/dependency_test.rb +class Communication::Website::DependencyTest < ActiveSupport::TestCase test "page" do # Rien : 0 dépendances page = communication_website_pages(:page_with_no_dependency) assert_equal 0, page.recursive_dependencies.count - + # On ajoute un block "Chapitre" : 7 dépendances (les 6 composants du chapitre + le chapitre) page = communication_website_pages(:page_with_no_dependency) page.blocks.create(position: 1, published: true, template_kind: :chapter) -- GitLab