113 lines
4.3 KiB
Ruby
113 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
require 'json'
|
|
|
|
RSpec.describe Gitlab::Webpack::Manifest do
|
|
let(:manifest) do
|
|
<<-EOF
|
|
{
|
|
"errors": [],
|
|
"assetsByChunkName": {
|
|
"entry1": [ "entry1.js", "entry1-a.js" ],
|
|
"entry2": "entry2.js"
|
|
}
|
|
}
|
|
EOF
|
|
end
|
|
|
|
around do |example|
|
|
Gitlab::Webpack::Manifest.clear_manifest!
|
|
|
|
example.run
|
|
|
|
Gitlab::Webpack::Manifest.clear_manifest!
|
|
end
|
|
|
|
shared_examples_for "a valid manifest" do
|
|
it "returns single entry asset paths from the manifest" do
|
|
expect(Gitlab::Webpack::Manifest.asset_paths("entry2")).to eq(["/public_path/entry2.js"])
|
|
end
|
|
|
|
it "returns multiple entry asset paths from the manifest" do
|
|
expect(Gitlab::Webpack::Manifest.asset_paths("entry1")).to eq(["/public_path/entry1.js", "/public_path/entry1-a.js"])
|
|
end
|
|
|
|
it "errors on a missing entry point" do
|
|
expect { Gitlab::Webpack::Manifest.asset_paths("herp") }.to raise_error(Gitlab::Webpack::Manifest::AssetMissingError)
|
|
end
|
|
end
|
|
|
|
before do
|
|
# Test that config variables work while we're here
|
|
allow(Gitlab.config.webpack.dev_server).to receive_messages(host: 'hostname', port: 2000, https: false)
|
|
allow(Gitlab.config.webpack).to receive(:manifest_filename).and_return('my_manifest.json')
|
|
allow(Gitlab.config.webpack).to receive(:public_path).and_return('public_path')
|
|
allow(Gitlab.config.webpack).to receive(:output_dir).and_return('manifest_output')
|
|
end
|
|
|
|
context "with dev server enabled" do
|
|
before do
|
|
allow(Gitlab.config.webpack.dev_server).to receive(:enabled).and_return(true)
|
|
|
|
stub_request(:get, "http://hostname:2000/public_path/my_manifest.json").to_return(body: manifest, status: 200)
|
|
end
|
|
|
|
describe ".asset_paths" do
|
|
it_behaves_like "a valid manifest"
|
|
|
|
it "errors if we can't find the manifest" do
|
|
allow(Gitlab.config.webpack).to receive(:manifest_filename).and_return('broken.json')
|
|
stub_request(:get, "http://hostname:2000/public_path/broken.json").to_raise(SocketError)
|
|
|
|
expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.to raise_error(Gitlab::Webpack::Manifest::ManifestLoadError)
|
|
end
|
|
|
|
describe "webpack errors" do
|
|
context "when webpack has 'Module build failed' errors in its manifest" do
|
|
it "errors" do
|
|
error_manifest = Gitlab::Json.parse(manifest).merge("errors" => [
|
|
"somethingModule build failed something",
|
|
"I am an error"
|
|
]).to_json
|
|
stub_request(:get, "http://hostname:2000/public_path/my_manifest.json").to_return(body: error_manifest, status: 200)
|
|
|
|
expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.to raise_error(Gitlab::Webpack::Manifest::WebpackError)
|
|
end
|
|
end
|
|
|
|
context "when webpack does not have 'Module build failed' errors in its manifest" do
|
|
it "does not error" do
|
|
error_manifest = Gitlab::Json.parse(manifest).merge("errors" => ["something went wrong"]).to_json
|
|
stub_request(:get, "http://hostname:2000/public_path/my_manifest.json").to_return(body: error_manifest, status: 200)
|
|
|
|
expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.not_to raise_error
|
|
end
|
|
end
|
|
|
|
it "does not error if errors is present but empty" do
|
|
error_manifest = Gitlab::Json.parse(manifest).merge("errors" => []).to_json
|
|
stub_request(:get, "http://hostname:2000/public_path/my_manifest.json").to_return(body: error_manifest, status: 200)
|
|
expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.not_to raise_error
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context "with dev server disabled" do
|
|
before do
|
|
allow(Gitlab.config.webpack.dev_server).to receive(:enabled).and_return(false)
|
|
stub_file_read(::Rails.root.join("manifest_output/my_manifest.json"), content: manifest)
|
|
end
|
|
|
|
describe ".asset_paths" do
|
|
it_behaves_like "a valid manifest"
|
|
|
|
it "errors if we can't find the manifest" do
|
|
allow(Gitlab.config.webpack).to receive(:manifest_filename).and_return('broken.json')
|
|
stub_file_read(::Rails.root.join("manifest_output/broken.json"), error: Errno::ENOENT)
|
|
expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.to raise_error(Gitlab::Webpack::Manifest::ManifestLoadError)
|
|
end
|
|
end
|
|
end
|
|
end
|