Skip to content
Snippets Groups Projects
dependency_test.rb 3.91 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
require "test_helper"

Sébastien Gaya's avatar
Sébastien Gaya committed
# rails test test/models/communication/website/dependency_test.rb
class Communication::Website::DependencyTest < ActiveSupport::TestCase
pabois's avatar
pabois committed
  def test_page_dependencies
Arnaud Levy's avatar
Arnaud Levy committed
    # Rien : 0 dépendances
    page = communication_website_pages(:page_with_no_dependency)
    assert_equal 0, page.recursive_dependencies.count
Sébastien Gaya's avatar
Sébastien Gaya committed

pabois's avatar
pabois committed
    #  On ajoute un block "Chapitre" : 7 dépendances (les 6 composants du chapitre + le block lui même)
Arnaud Levy's avatar
Arnaud Levy committed
    page.blocks.create(position: 1, published: true, template_kind: :chapter)
    assert_equal 7, page.recursive_dependencies.count
  end
pabois's avatar
pabois committed

  def test_change_block_dependencies
    page = communication_website_pages(:page_with_no_dependency)

Sébastien Gaya's avatar
Sébastien Gaya committed
    # On ajoute un block Personnes lié à Arnaud : 9 dépendances
    # - le block Personnes (1)
    # - 4 composants du template du block + 1 élément (5)
    # - 2 composants de l'élément du template (2)
Arnaud Levy's avatar
Arnaud Levy committed
    # - la personne en dépendance du composant Person (1)
pabois's avatar
pabois committed
    block = page.blocks.create(position: 1, published: true, template_kind: :organization_chart)
    block.data = "{ \"elements\": [ { \"id\": \"#{arnaud.id}\" } ] }"
    block.save
Sébastien Gaya's avatar
Sébastien Gaya committed

pabois's avatar
pabois committed
    page = page.reload
Sébastien Gaya's avatar
Sébastien Gaya committed

pabois's avatar
pabois committed
    assert_equal 9, page.recursive_dependencies.count
Sébastien Gaya's avatar
Sébastien Gaya committed

pabois's avatar
pabois committed
    # On modifie le target du block
Arnaud Levy's avatar
Arnaud Levy committed
    Delayed::Job.destroy_all
pabois's avatar
pabois committed
    block.data = "{ \"elements\": [ { \"id\": \"#{olivia.id}\" } ] }"
    block.save
Arnaud Levy's avatar
Arnaud Levy committed
    # On vérifie qu'on appelle bien la méthode destroy_obsolete_git_files sur le site de la page
Arnaud Levy's avatar
Arnaud Levy committed
    assert(destroy_obsolete_git_files_job)
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
    assert_equal 9, page.recursive_dependencies.count
Sébastien Gaya's avatar
Sébastien Gaya committed

    # Vérifie qu'on a bien
    # - une tâche pour resynchroniser la page
    # - une tâche de nettoyage si le block est supprimé
Arnaud Levy's avatar
Arnaud Levy committed
    Delayed::Job.destroy_all
    block.destroy
    assert(sync_with_git_job(page))
Arnaud Levy's avatar
Arnaud Levy committed
    assert(destroy_obsolete_git_files_job)

Arnaud Levy's avatar
Arnaud Levy committed
  end
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
  def test_change_website_dependencies
    dependencies_before_count = website_with_github.recursive_dependencies.count
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
    # On modifie l'about du website en ajoutant une école
    website_with_github.update(about: default_school)
Arnaud Levy's avatar
Arnaud Levy committed
    refute(destroy_obsolete_git_files_job)
Arnaud Levy's avatar
Arnaud Levy committed
    delta = website_with_github.recursive_dependencies.count - dependencies_before_count
Sébastien Gaya's avatar
Sébastien Gaya committed
    # En ajoutant l'école, on rajoute en dépendances :
    # - L'école, et ses formations et diplômes en cascade (3)
    # - Les catégories d'actus liés aux formations, soit la catégorie racine et la catégorie de default_program (2)
    # - N'ayant pas été créés avant, le save du website va créer les 3 menus par défaut : primary, legal et social (3)
    # Donc un total de 3 + 2 + 3 = 8 dépendances
    assert_equal 8, delta
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
    Delayed::Job.destroy_all
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
    # On enlève l'about du website
    website_with_github.update(about: nil)
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
    # On vérifie qu'on appelle bien la méthode destroy_obsolete_git_files sur le site
Arnaud Levy's avatar
Arnaud Levy committed
    assert(destroy_obsolete_git_files_job)
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
  end

Sébastien Gaya's avatar
Sébastien Gaya committed
  # TODO : Utile?
Arnaud Levy's avatar
Arnaud Levy committed
  def test_change_menu_item_dependencies
Arnaud Levy's avatar
Arnaud Levy committed
    menu = communication_website_menus(:primary_menu)
Arnaud Levy's avatar
Arnaud Levy committed

    item = menu.items.create(university: default_university, website: website_with_github, kind: :blank, title: 'Test')
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
    item.kind = :page
    item.about = communication_website_pages(:page_with_no_dependency)
    item.save
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
    # Comme les menu items ne répondent pas à is_direct_object? du coup aucune tâche de nettoyage n'est ajoutée
    item.destroy
    refute(destroy_obsolete_git_files_job)
Arnaud Levy's avatar
Arnaud Levy committed
  end

  protected

  def sync_with_git_job(object)
    find_performable_method_job(:sync_with_git_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)
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  # On ne peut pas utiliser assert_enqueued_jobs sur les méthodes asynchrones gérées avec handle_asynchronously
  def find_performable_method_job(method, object)
Arnaud Levy's avatar
Arnaud Levy committed
    Delayed::Job.all.detect { |job|
      job.payload_object.method_name == method &&
        job.payload_object.object == object
Arnaud Levy's avatar
Arnaud Levy committed
    }
pabois's avatar
pabois committed
  end
Arnaud Levy's avatar
Arnaud Levy committed
end