"Aucun réglage nommé __ n'existe" en essayant d'exécuter des spécifications sur le plugin de sondage

Bonjour,

Je développe un plugin et j’essaie d’écrire quelques tests, mais lorsque j’essaie d’exécuter les spécifications du plugin poll via

bundle exec rake plugin:spec poll

comme indiqué ici, je reçois cette erreur :

Une erreur s’est produite lors du chargement de ./plugins/poll/spec/integration/poll_endpoints_spec.rb.
Échec de l’exécution : raise ArgumentError.new(“No setting named ‘#{name}’ exists”)

ArgumentError:
  No setting named 'discourse_narrative_bot_enabled' exists
# ./lib/site_settings/defaults_provider.rb:58:in `set_regardless_of_locale'
# ./config/environments/test.rb:74:in `block (3 levels) in <main>'
# ./config/environments/test.rb:63:in `tap'
# ./config/environments/test.rb:63:in `block (2 levels) in <main>'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:68:in `block in execute_hook'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:61:in `with_execution_control'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:66:in `execute_hook'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:52:in `block in run_load_hooks'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:51:in `each'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:51:in `run_load_hooks'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/application/finisher.rb:140:in `block in <module:Finisher>'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:32:in `instance_exec'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:32:in `run'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:61:in `block in run_initializers'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:60:in `run_initializers'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/application.rb:384:in `initialize!'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/railtie.rb:207:in `public_send'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/railtie.rb:207:in `method_missing'
# ./config/environment.rb:7:in `<top (required)>'
# ./spec/rails_helper.rb:56:in `require'
# ./spec/rails_helper.rb:56:in `<top (required)>'
# ./plugins/poll/spec/integration/poll_endpoints_spec.rb:3:in `require'
# ./plugins/poll/spec/integration/poll_endpoints_spec.rb:3:in `<top (required)>'

Qu’est-ce que je fais de mal en essayant d’exécuter les tests du plugin poll ? Pourquoi ce paramètre spécifique ne serait-il pas chargé dans la locale par défaut ?

Merci.

Pour exécuter uniquement les tests de poll, la commande est : bundle exec rake "plugin:spec[poll]" (ou plus court : bin/rake "plugin:spec[poll]"), sinon vous exécutez tous les tests des plugins.

Concernant l’erreur que vous rencontrez, je ne suis pas certain. La base de données de test a-t-elle été migrée ? (bin/rails db:migrate RAILS_ENV=test)

2 « J'aime »

Merci. Comme vous l’avez dit, cela a bien exécuté tous les tests des plugins, ce que j’ai contourné en supprimant les autres plugins. Je me basais sur cette discussion, mais il s’avère que les parenthèses étaient mal placées.

Oui, la base de données est migrée dans l’environnement de test. J’ai contourné cette erreur en commentant la ligne raise ArgumentError.new("No setting named '#{name}' exists") et en la remplaçant par un puts, et cela montre que seul discourse_narrative_bot_enabled déclenche cette erreur ; tous les autres paramètres sont corrects. Je ne pense pas que nous ayons fait quoi que ce soit avec ce paramètre. Quoi qu’il en soit, comme mon test s’est exécuté correctement en ignorant cette erreur, je peux laisser cette solution de contournement dans mon Discourse local. Quand je découvrirai la véritable cause, je mettrai à jour ce message.

1 « J'aime »

Je rencontre exactement cette erreur dans CI lorsque j’essaie d’exécuter les migrations sur la base de données :

Run bin/rake db:create
rake aborted!
ArgumentError: No setting named 'discourse_narrative_bot_enabled' exists
/home/runner/work/discourse-multilingual/discourse-multilingual/lib/site_settings/defaults_provider.rb:58:in `set_regardless_of_locale'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:73:in `block (3 levels) in <main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:63:in `tap'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:63:in `block (2 levels) in <main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:79:in `block in execute_hook'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:72:in `with_execution_control'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:77:in `execute_hook'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:63:in `block in run_load_hooks'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:62:in `each'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:62:in `run_load_hooks'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application/finisher.rb:87:in `block in <module:Finisher>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:32:in `instance_exec'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:32:in `run'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:60:in `run_initializers'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:372:in `initialize!'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environment.rb:7:in `<main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/zeitwerk-2.6.0/lib/zeitwerk/kernel.rb:35:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:348:in `require_environment!'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:511:in `block in run_tasks_blocks'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)
Error: Process completed with exit code 1.

Cela semble être causé par cette ligne dans le cœur du projet :

1 « J'aime »

Équipe, ça me tue.

Notre CI échoue sur db:migrate à cause de ça.

C’est presque mot pour mot une copie de la CI pour le plugin discourse-chat, mais avec l’ajout d’une planification cron.

Notre CI fonctionne pour les PR et les commits, mais lors de la tâche cron, elle échoue ici à chaque fois.

Je suis capable de reproduire cela sur la console Rails avec un bloc similaire :

[19] pry(main)> SiteSetting.defaults.tap do |s|
[19] pry(main)*   s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[19] pry(main)* end
ArgumentError: No setting named 'discourse_narrative_bot_enab' exists

Cela fonctionne si je mets :

[21] pry(main)> SiteSetting.defaults.tap do |s|
[21] pry(main)*   if s.has_setting? :discourse_narrative_bot_enab
[21] pry(main)*     s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[21] pry(main)*   end
[21] pry(main)* end

Et juste pour vérifier, échoue avec :

[21] pry(main)> SiteSetting.defaults.tap do |s|
[21] pry(main)*   if s.has_setting? :discourse_narrative_bot_enabled
[21] pry(main)*     s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[21] pry(main)*   end
[21] pry(main)* end

Je propose donc le changement suivant dans une PR que je serais heureux de soumettre :

 if ENV['LOAD_PLUGINS'] == '1' && s.has_setting? :discourse_narrative_bot_enabled

Pour une raison quelconque, la présence du plugin narrative bot ne peut être garantie ?

Dans ces exemples, le paramètre du site est discourse_narrative_bot_enab et non discourse_narrative_bot_enabled. Je suppose qu’une fois corrigé, ce ne sera plus reproductible ?

La chose la plus surprenante ici est :

Cela suggère une différence dans l’environnement d’exécution pour les exécutions planifiées :thinking:

En regardant l’un des logs d’échec, il semble que GitHub clone le plugin multilingue directement dans le répertoire plugins, plutôt que dans son propre répertoire. Il désinstalle donc essentiellement tous les plugins principaux (et ne parvient pas à s’installer correctement lui-même).

Je soupçonne que, pour que le cron fonctionne, nous devrons remplacer toutes les occurrences de github.event.repository.name par autre chose :

https://github.com/paviliondev/discourse-multilingual/blob/main/.github/workflows/plugin-tests.yml#L40

En regardant la documentation, il ne semble pas y avoir de moyen cohérent d’obtenir le nom du dépôt (sans le propriétaire), nous aurons donc besoin d’une astuce. Je pense que cela devrait suffire :

cc @cvx - peut-être devrions-nous utiliser cette technique dans la CI du modèle de plugin/thème ?

2 « J'aime »

C’était intentionnel pour forcer une erreur (et la gérer).

Oooh gosh, bonne trouvaille merci !

2 « J'aime »

fusionné, merci beaucoup @David, c’était très gentil de votre part.

Certainement :bières: de ma part si jamais je passe dans votre région ! :léger_sourire:

2 « J'aime »

Pour information, les tests cron se sont déroulés parfaitement, merci encore :tada:

1 « J'aime »

@cvx vient de partager cet article avec moi :

Le contournement « hacky » du nom du dépôt ne devrait donc plus être nécessaire pour les tâches cron :tada : cc @merefield

1 « J'aime »