Skip to content
Snippets Groups Projects
Unverified Commit 290732a5 authored by Sébastien Gaya's avatar Sébastien Gaya
Browse files
parent f9ba8fb4
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
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
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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment