require_relative "spec_helper_initializer"
module ActionView::TestCase::Behavior
attr_accessor :request
describe "Webpacker::Helper" do
let(:application_stylesheet_chunks) { %w[/packs/1-c20632e7baf2c81200d3.chunk.css /packs/application-k344a6d59eef8632c9d1.chunk.css] }
let(:hello_stimulus_stylesheet_chunks) { %w[/packs/1-c20632e7baf2c81200d3.chunk.css /packs/hello_stimulus-k344a6d59eef8632c9d1.chunk.css] }
before :each do
extend Webpacker::Helper
extend ActionView::Helpers
extend ActionView::Helpers::AssetTagHelper
extend ActionView::TestCase::Behavior
@request = Class.new do
def send_early_hints(links) end
def base_url
"https://example.com"
end
end.new
@javascript_pack_tag_loaded = nil
end
it "#asset_pack_path generates correct path" do
expect(asset_pack_path("bootstrap.js")).to eq "/packs/bootstrap-300631c4f0e0f9c865bc.js"
expect(asset_pack_path("bootstrap.css")).to eq "/packs/bootstrap-c38deda30895059837cf.css"
end
it "#asset_pack_url generates correct url" do
expect(asset_pack_url("bootstrap.js")).to eq "https://example.com/packs/bootstrap-300631c4f0e0f9c865bc.js"
expect(asset_pack_url("bootstrap.css")).to eq "https://example.com/packs/bootstrap-c38deda30895059837cf.css"
end
it "#image_pack_path generates correct path" do
expect(image_pack_path("application.png")).to eq "/packs/application-k344a6d59eef8632c9d1.png"
expect(image_pack_path("image.jpg")).to eq "/packs/static/image-c38deda30895059837cf.jpg"
expect(image_pack_path("static/image.jpg")).to eq "/packs/static/image-c38deda30895059837cf.jpg"
expect(image_pack_path("nested/image.jpg")).to eq "/packs/static/nested/image-c38deda30895059837cf.jpg"
expect(image_pack_path("static/nested/image.jpg")).to eq "/packs/static/nested/image-c38deda30895059837cf.jpg"
end
it "#image_pack_url generates correct path" do
expect(image_pack_url("application.png")).to eq "https://example.com/packs/application-k344a6d59eef8632c9d1.png"
expect(image_pack_url("image.jpg")).to eq "https://example.com/packs/static/image-c38deda30895059837cf.jpg"
expect(image_pack_url("static/image.jpg")).to eq "https://example.com/packs/static/image-c38deda30895059837cf.jpg"
expect(image_pack_url("nested/image.jpg")).to eq "https://example.com/packs/static/nested/image-c38deda30895059837cf.jpg"
expect(image_pack_url("static/nested/image.jpg")).to eq "https://example.com/packs/static/nested/image-c38deda30895059837cf.jpg"
end
it "#image_pack_tag generates correct tags" do
expect(image_pack_tag("application.png", size: "16x10", alt: "Edit Entry")).to eq ""
expect(image_pack_tag("image.jpg", size: "16x10", alt: "Edit Entry")).to eq ""
expect(image_pack_tag("static/image.jpg", size: "16x10", alt: "Edit Entry")).to eq ""
expect(image_pack_tag("nested/image.jpg", size: "16x10", alt: "Edit Entry")).to eq ""
expect(image_pack_tag("static/nested/image.jpg", size: "16x10", alt: "Edit Entry")).to eq ""
expect(image_pack_tag("static/image.jpg", srcset: { "static/image-2x.jpg" => "2x" })).to eq ""
end
it "#favicon_pack_tag generates correct tags" do
expect(favicon_pack_tag("application.png", rel: "apple-touch-icon", type: "image/png")).to eq ""
expect(favicon_pack_tag("mb-icon.png", rel: "apple-touch-icon", type: "image/png")).to eq ""
expect(favicon_pack_tag("static/mb-icon.png", rel: "apple-touch-icon", type: "image/png")).to eq ""
expect(favicon_pack_tag("nested/mb-icon.png", rel: "apple-touch-icon", type: "image/png")).to eq ""
expect(favicon_pack_tag("static/nested/mb-icon.png", rel: "apple-touch-icon", type: "image/png")).to eq ""
end
it "#preload_pack_asset generates correct tag" do
if self.class.method_defined?(:preload_link_tag)
expect(preload_pack_asset("fonts/fa-regular-400.woff2")).to eq %()
else
expect { preload_pack_asset("fonts/fa-regular-400.woff2") }.to raise_error "You need Rails >= 5.2 to use this tag."
end
end
it "#javascript_pack_tag generates correct tags" do
expected = <<~HTML.chomp
HTML
expect(javascript_pack_tag("application", "bootstrap")).to eq expected
end
it "#javascript_pack_tag generates correct tags by passing `defer: false`" do
expected = <<~HTML.chomp
HTML
expect(javascript_pack_tag("application", "bootstrap", defer: false)).to eq expected
end
it "#javascript_pack_tag generates correct appended tag" do
append_javascript_pack_tag("bootstrap", defer: false)
expected = <<~HTML.chomp
HTML
expect(javascript_pack_tag("application")).to eq expected
end
it "#javascript_pack_tag generates correct prepended tag" do
append_javascript_pack_tag("bootstrap")
prepend_javascript_pack_tag("main")
expected = <<~HTML.chomp
HTML
expect(javascript_pack_tag("application")).to eq expected
end
it "#append_javascript_pack_tag raises error if called after calling #javascript_pack_tag" do
expected_error_message = \
"You can only call append_javascript_pack_tag before javascript_pack_tag helper. " +
"Please refer to https://github.com/shakacode/shakapacker/blob/master/README.md#view-helper-append_javascript_pack_tag-prepend_javascript_pack_tag-and-append_stylesheet_pack_tag for the usage guide"
expect {
javascript_pack_tag("application")
append_javascript_pack_tag("bootstrap", defer: false)
}.to raise_error(expected_error_message)
end
it "#prepend_javascript_pack_tag raises error if called after calling #javascript_pack_tag" do
expected_error_message = \
"You can only call prepend_javascript_pack_tag before javascript_pack_tag helper. " +
"Please refer to https://github.com/shakacode/shakapacker/blob/master/README.md#view-helper-append_javascript_pack_tag-prepend_javascript_pack_tag-and-append_stylesheet_pack_tag for the usage guide"
expect {
javascript_pack_tag("application")
prepend_javascript_pack_tag("bootstrap", defer: false)
}.to raise_error(expected_error_message)
end
it "#javascript_pack_tag generates correct tags by passing `defer: true`" do
expected = <<~HTML.chomp
HTML
expect(javascript_pack_tag("application", defer: true)).to eq expected
end
it "#javascript_pack_tag generates correct tags by passing symbol" do
expected = <<~HTML.chomp
HTML
expect(javascript_pack_tag(:application)).to eq expected
end
it "#javascript_pack_tag rases error on multiple invocations" do
expected_error_message = "To prevent duplicated chunks on the page, you should call javascript_pack_tag only once on the page. " +
"Please refer to https://github.com/shakacode/shakapacker/blob/master/README.md#view-helpers-javascript_pack_tag-and-stylesheet_pack_tag for the usage guide"
expect {
javascript_pack_tag(:application)
javascript_pack_tag(:bootstrap)
}.to raise_error(expected_error_message)
end
it "#stylesheet_pack_tag generates correct link tag with string arguments" do
expected = (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
.uniq
.map { |chunk| stylesheet_link_tag(chunk) }
.join("\n")
expect(stylesheet_pack_tag("application", "hello_stimulus")).to eq expected
end
it "#stylesheet_pack_tag generates correct link tag with symbol arguments" do
expected = (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
.uniq
.map { |chunk| stylesheet_link_tag(chunk) }
.join("\n")
expect(stylesheet_pack_tag(:application, :hello_stimulus)).to eq expected
end
it "#stylesheet_pack_tag generates correct link tag with mixed arguments" do
expected = (application_stylesheet_chunks)
.map { |chunk| stylesheet_link_tag(chunk, media: "all") }
.join("\n")
expect(stylesheet_pack_tag("application", media: "all")).to eq expected
end
it "#stylesheet_pack_tag allows multiple invocations" do
app_style = stylesheet_pack_tag(:application)
stimulus_style = stylesheet_pack_tag(:hello_stimulus)
expect(app_style).to eq application_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
expect(stimulus_style).to eq hello_stimulus_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
expect {
stylesheet_pack_tag(:application)
stylesheet_pack_tag(:hello_stimulus)
}.to_not raise_error
end
it "#stylesheet_pack_tag appends" do
append_stylesheet_pack_tag(:hello_stimulus)
expect(stylesheet_pack_tag(:application)).to eq \
(application_stylesheet_chunks + hello_stimulus_stylesheet_chunks).uniq.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
end
it "#stylesheet_pack_tag appends duplicate" do
append_stylesheet_pack_tag(:hello_stimulus)
append_stylesheet_pack_tag(:application)
expect(stylesheet_pack_tag(:application)).to eq \
(application_stylesheet_chunks + hello_stimulus_stylesheet_chunks).uniq.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
end
it "#stylesheet_pack_tag supports multiple invocations with different media attr" do
app_style = stylesheet_pack_tag(:application)
app_style_with_media = stylesheet_pack_tag(:application, media: "print")
hello_stimulus_style_with_media = stylesheet_pack_tag(:hello_stimulus, media: "all")
expect(app_style).to eq application_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
expect(app_style_with_media).to eq application_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk, media: "print") }.join("\n")
expect(hello_stimulus_style_with_media).to eq hello_stimulus_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk, media: "all") }.join("\n")
end
end
end