diff --git a/lib/react_on_rails/doctor.rb b/lib/react_on_rails/doctor.rb index efe5f80006..c49eca4591 100644 --- a/lib/react_on_rails/doctor.rb +++ b/lib/react_on_rails/doctor.rb @@ -173,6 +173,7 @@ def check_development check_procfile_dev check_bin_dev_script check_gitignore + check_async_usage end def check_javascript_bundles @@ -1146,6 +1147,130 @@ def safe_display_config_value(label, config, method_name) checker.add_info(" #{label}: ") end end + + # Comment patterns used for filtering out commented async usage + ERB_COMMENT_PATTERN = /<%\s*#.*javascript_pack_tag/ + HAML_COMMENT_PATTERN = /^\s*-#.*javascript_pack_tag/ + SLIM_COMMENT_PATTERN = %r{^\s*/.*javascript_pack_tag} + HTML_COMMENT_PATTERN = /') + end + + it "returns empty array" do + files = doctor.send(:scan_view_files_for_async_pack_tag) + expect(files).to be_empty + end + end + + context "when async is only in Slim comments" do + before do + allow(Dir).to receive(:glob).with("app/views/**/*.erb").and_return([]) + allow(Dir).to receive(:glob).with("app/views/**/*.haml").and_return([]) + allow(Dir).to receive(:glob).with("app/views/**/*.slim").and_return([]) + allow(Dir).to receive(:glob).with("app/views/**/*.slim") + .and_return(["app/views/layouts/application.html.slim"]) + allow(File).to receive(:exist?).with("app/views/layouts/application.html.slim").and_return(true) + allow(File).to receive(:read).with("app/views/layouts/application.html.slim") + .and_return('/ = javascript_pack_tag "app", :async') + end + + it "returns empty array" do + files = doctor.send(:scan_view_files_for_async_pack_tag) + expect(files).to be_empty + end + end + + context "when view files contain Slim javascript_pack_tag with :async" do + before do + allow(Dir).to receive(:glob).with("app/views/**/*.erb").and_return([]) + allow(Dir).to receive(:glob).with("app/views/**/*.haml").and_return([]) + allow(Dir).to receive(:glob).with("app/views/**/*.slim").and_return([]) + allow(Dir).to receive(:glob).with("app/views/**/*.slim") + .and_return(["app/views/layouts/application.html.slim"]) + allow(File).to receive(:exist?).with("app/views/layouts/application.html.slim").and_return(true) + allow(File).to receive(:read).with("app/views/layouts/application.html.slim") + .and_return('= javascript_pack_tag "app", :async') + allow(doctor).to receive(:relativize_path).with("app/views/layouts/application.html.slim") + .and_return("app/views/layouts/application.html.slim") + end + + it "returns files with async" do + files = doctor.send(:scan_view_files_for_async_pack_tag) + expect(files).to include("app/views/layouts/application.html.slim") + end + end + + context "when javascript_pack_tag spans multiple lines" do + before do + allow(Dir).to receive(:glob).with("app/views/**/*.erb") + .and_return(["app/views/layouts/application.html.erb"]) + allow(Dir).to receive(:glob).with("app/views/**/*.haml").and_return([]) + allow(Dir).to receive(:glob).with("app/views/**/*.slim").and_return([]) + allow(File).to receive(:exist?).with("app/views/layouts/application.html.erb").and_return(true) + allow(File).to receive(:read).with("app/views/layouts/application.html.erb") + .and_return("<%= javascript_pack_tag \"app\",\n :async %>") + allow(doctor).to receive(:relativize_path).with("app/views/layouts/application.html.erb") + .and_return("app/views/layouts/application.html.erb") + end + + it "returns files with async" do + files = doctor.send(:scan_view_files_for_async_pack_tag) + expect(files).to include("app/views/layouts/application.html.erb") + end + end + end + + describe "#config_has_async_loading_strategy?" do + context "when config file has :async strategy" do + before do + allow(File).to receive(:exist?).with("config/initializers/react_on_rails.rb").and_return(true) + allow(File).to receive(:read).with("config/initializers/react_on_rails.rb") + .and_return("config.generated_component_packs_loading_strategy = :async") + end + + it "returns true" do + expect(doctor.send(:config_has_async_loading_strategy?)).to be true + end + end + + context "when config file has different strategy" do + before do + allow(File).to receive(:exist?).with("config/initializers/react_on_rails.rb").and_return(true) + allow(File).to receive(:read).with("config/initializers/react_on_rails.rb") + .and_return("config.generated_component_packs_loading_strategy = :defer") + end + + it "returns false" do + expect(doctor.send(:config_has_async_loading_strategy?)).to be false + end + end + + context "when config file does not exist" do + before do + allow(File).to receive(:exist?).with("config/initializers/react_on_rails.rb").and_return(false) + end + + it "returns false" do + expect(doctor.send(:config_has_async_loading_strategy?)).to be false + end + end + + context "when :async strategy is commented out" do + before do + allow(File).to receive(:exist?).with("config/initializers/react_on_rails.rb").and_return(true) + allow(File).to receive(:read).with("config/initializers/react_on_rails.rb") + .and_return("# config.generated_component_packs_loading_strategy = :async") + end + + it "returns false" do + expect(doctor.send(:config_has_async_loading_strategy?)).to be false + end + end + end end