"Keine Einstellung namens __ vorhanden", wenn versucht wird, Specs für das Poll-Plugin auszuführen

Hallo,

ich entwickle ein Plugin und versuche, einige Tests zu schreiben. Wenn ich jedoch versuche, die Spezifikationen des Poll-Plugins über

bundle exec rake plugin:spec poll

auszuführen, wie hier gezeigt, erhalte ich folgenden Fehler:

Ein Fehler trat beim Laden von ./plugins/poll/spec/integration/poll_endpoints_spec.rb auf.
Failure/Error: 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)>'

Was mache ich falsch, wenn ich versuche, die Tests des Poll-Plugins auszuführen? Warum wird diese bestimmte Einstellung nicht in die Standardsprache geladen?

Vielen Dank.

Um nur die Poll-Spezifikationen auszuführen, lautet der Befehl: bundle exec rake "plugin:spec[poll]" (oder kürzer: bin/rake "plugin:spec[poll]"). Andernfalls werden alle Pluginspezifikationen ausgeführt.

Was den von dir erhaltenen Fehler betrifft, bin ich mir nicht sicher. Ist die Testdatenbank migriert? (bin/rails db:migrate RAILS_ENV=test)

2 „Gefällt mir“

Danke. Wie du gesagt hast, wurden alle Plugin-Specs ausgeführt, was ich umgangen habe, indem ich die anderen Plugins entfernt habe. Ich habe mich an diesem orientiert, aber es stellte sich heraus, dass die Klammern an der falschen Stelle waren.

Ja, die Datenbank wurde in der Testumgebung migriert. Ich habe diesen Fehler umgangen, indem ich die Zeile raise ArgumentError.new("No setting named '#{name}' exists") auskommentiert und durch einen puts ersetzt habe. Dabei zeigt sich, dass nur discourse_narrative_bot_enabled diesen Fehler auslöst; alle anderen Einstellungen funktionieren einwandfrei. Ich glaube nicht, dass wir etwas mit dieser Einstellung gemacht haben. Da meine Spec jedoch korrekt lief, während ich diesen Fehler ignorierte, kann ich die Workaround-Lösung in meinem lokalen Discourse belassen. Sobald ich herausfinde, was dies tatsächlich verursacht hat, werde ich diesen Beitrag aktualisieren.

1 „Gefällt mir“

Ich erhalte derzeit genau diesen Fehler in CI, wenn ich versuche, die Migrationen auf der Datenbank auszuführen:

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.

Verursacht durch diese Zeile im Kern:

1 „Gefällt mir“

Team, das bringt mich um.

Unser CI bricht bei db:migrate wegen diesem hier.

Es ist fast wortwörtlich eine Kopie von dem CI für das discourse-chat-Plugin, aber mit der Hinzufügung eines Cron-Zeitplans.

Unser CI funktioniert für PRs und Commits, aber bei Cron-Jobs schlägt es hier jedes Mal fehl.

Ich kann dies in der Rails-Konsole mit einem ähnlichen Block reproduzieren:

[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

Dies funktioniert, wenn ich folgendes eingebe:

[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

Und nur zur Überprüfung, es schlägt fehl mit:

[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

Daher schlage ich die folgende Änderung in einem PR vor, den ich gerne einreichen würde:

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

Aus irgendeinem Grund kann die Anwesenheit des Narrative Bot-Plugins nicht garantiert werden?

In diesen Beispielen haben Sie die Website-Einstellung als discourse_narrative_bot_enab und nicht als discourse_narrative_bot_enabled. Ich vermute, sobald das korrigiert ist, ist es nicht reproduzierbar?

Das Überraschendste hier ist:

Das deutet auf einen Unterschied in der Laufzeitumgebung für die geplanten Läufe hin :thinking:

Wenn ich mir einen der fehlgeschlagenen Logs ansehe, scheint es, dass GitHub das multilingual-Plugin direkt in das plugins-Verzeichnis klont, anstatt in sein eigenes Verzeichnis. Es deinstalliert also im Wesentlichen alle Kern-Plugins (und installiert sich selbst nicht richtig).

Ich vermute, um Cron zum Laufen zu bringen, müssen wir alle Vorkommen von github.event.repository.name durch etwas anderes ersetzen:

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

Wenn ich mir die Dokumentation ansehe, gibt es keinen konsistenten Weg, den Repository-Namen (ohne den Besitzer) zu erhalten, daher benötigen wir einige Tricks. Ich denke, das sollte funktionieren:

cc @cvx - vielleicht sollten wir diese Technik in der CI der Plugin/Theme-Vorlage verwenden?

2 „Gefällt mir“

Dies war beabsichtigt, um einen Fehler zu erzwingen (und ihn zu behandeln).

Oooh Gosh, guter Fang, danke!

2 „Gefällt mir“

gemerged, vielen Dank @David, das war sehr nett von dir.

Auf jeden Fall :beers: auf mich, wenn ich jemals in deiner Nähe bin! :slight_smile:

2 „Gefällt mir“

Zur Information, die Cron-Tests liefen gerade perfekt, nochmals vielen Dank.:tada:

1 „Gefällt mir“

@cvx hat mir gerade diesen Artikel geteilt:

Der provisorische Workaround für den Repository-Namen ist also für Cron-Jobs nicht mehr erforderlich :tada: cc @merefield

1 „Gefällt mir“