# frozen_string_literal: true RSpec.describe ThemeJavascriptCompiler do let(:compiler) { ThemeJavascriptCompiler.new(1, 'marks') } let(:theme_id) { 22 } describe "#append_raw_template" do it 'uses the correct template paths' do template = "

hello

" name = "/path/to/templates1" compiler.append_raw_template("#{name}.raw", template) expect(compiler.content.to_s).to include("addRawTemplate(\"#{name}\"") name = "/path/to/templates2" compiler.append_raw_template("#{name}.hbr", template) expect(compiler.content.to_s).to include("addRawTemplate(\"#{name}\"") name = "/path/to/templates3" compiler.append_raw_template("#{name}.hbs", template) expect(compiler.content.to_s).to include("addRawTemplate(\"#{name}.hbs\"") end end describe "#append_ember_template" do it 'maintains module names so that discourse-boot.js can correct them' do compiler.append_ember_template("/connectors/blah-1", "{{var}}") expect(compiler.content.to_s).to include("define(\"discourse/theme-1/connectors/blah-1\", [\"exports\", \"@ember/template-factory\"]") compiler.append_ember_template("connectors/blah-2", "{{var}}") expect(compiler.content.to_s).to include("define(\"discourse/theme-1/connectors/blah-2\", [\"exports\", \"@ember/template-factory\"]") compiler.append_ember_template("javascripts/connectors/blah-3", "{{var}}") expect(compiler.content.to_s).to include("define(\"discourse/theme-1/javascripts/connectors/blah-3\", [\"exports\", \"@ember/template-factory\"]") end end describe "connector module name handling" do it 'separates colocated connectors to avoid module name clash' do # Colocated under `/connectors` compiler = ThemeJavascriptCompiler.new(1, 'marks') compiler.append_ember_template("connectors/outlet/blah-1", "{{var}}") compiler.append_module("console.log('test')", "connectors/outlet/blah-1") expect(compiler.content.to_s).to include("discourse/theme-1/connectors/outlet/blah-1") expect(compiler.content.to_s).to include("discourse/theme-1/templates/connectors/outlet/blah-1") # Colocated under `/templates/connectors` compiler = ThemeJavascriptCompiler.new(1, 'marks') compiler.append_ember_template("templates/connectors/outlet/blah-1", "{{var}}") compiler.append_module("console.log('test')", "templates/connectors/outlet/blah-1") expect(compiler.content.to_s).to include("discourse/theme-1/connectors/outlet/blah-1") expect(compiler.content.to_s).to include("discourse/theme-1/templates/connectors/outlet/blah-1") # Not colocated compiler = ThemeJavascriptCompiler.new(1, 'marks') compiler.append_ember_template("templates/connectors/outlet/blah-1", "{{var}}") compiler.append_module("console.log('test')", "connectors/outlet/blah-1") expect(compiler.content.to_s).to include("discourse/theme-1/connectors/outlet/blah-1") expect(compiler.content.to_s).to include("discourse/theme-1/templates/connectors/outlet/blah-1") end end describe "error handling" do it "handles syntax errors in raw templates" do expect do compiler.append_raw_template("sometemplate.hbr", "{{invalidtemplate") end.to raise_error(ThemeJavascriptCompiler::CompileError, /Parse error on line 1/) end it "handles syntax errors in ember templates" do expect do compiler.append_ember_template("sometemplate", "{{invalidtemplate") end.to raise_error(ThemeJavascriptCompiler::CompileError, /Parse error on line 1/) end end end