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