1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
# we need to run post_rails_init_spec as the latest
# because it cause unrevertable changes to runtime
# what is why I added "zzz_last" in the beginning
require 'spec_helper'
require "fileutils"
describe "after Rails initialization" do
NAME = Rails.root.join('app', 'assets', 'javascripts', 'routes.js').to_s
def sprockets_v3?
Sprockets::VERSION.to_i >= 3
end
def sprockets_context(environment, name, filename)
if sprockets_v3?
Sprockets::Context.new(environment: environment, name: name, filename: filename.to_s, metadata: {})
else
Sprockets::Context.new(environment, name, filename)
end
end
def evaluate(ctx, file)
if sprockets_v3?
ctx.load(ctx.environment.find_asset(file, pipeline: :default).uri).to_s
else
ctx.evaluate(file)
end
end
before(:each) do
FileUtils.rm_rf Rails.root.join('tmp/cache')
FileUtils.rm_f NAME
JsRoutes.generate!(NAME)
end
before(:all) do
Rails.configuration.eager_load = false
Rails.application.initialize!
end
it "should generate routes file" do
expect(File.exists?(NAME)).to be_truthy
end
it "should not rewrite routes file if nothing changed" do
routes_file_mtime = File.mtime(NAME)
JsRoutes.generate!(NAME)
expect(File.mtime(NAME)).to eq(routes_file_mtime)
end
it "should rewrite routes file if file content changed" do
# Change content of existed routes file (add space to the end of file).
File.open(NAME, 'a') { |f| f << ' ' }
routes_file_mtime = File.mtime(NAME)
sleep(1)
JsRoutes.generate!(NAME)
expect(File.mtime(NAME)).not_to eq(routes_file_mtime)
end
context "JsRoutes::Engine" do
TEST_ASSET_PATH = Rails.root.join('app','assets','javascripts','test.js')
before(:all) do
File.open(TEST_ASSET_PATH,'w') do |f|
f.puts "function() {}"
end
end
after(:all) do
FileUtils.rm_f(TEST_ASSET_PATH)
end
context "the preprocessor" do
before(:each) do
path = Rails.root.join('config','routes.rb').to_s
if sprockets_v3?
expect_any_instance_of(Sprockets::Context).to receive(:depend_on).with(path)
else
expect(ctx).to receive(:depend_on).with(path)
end
end
let!(:ctx) do
sprockets_context(Rails.application.assets,
'js-routes.js',
Pathname.new('js-routes.js'))
end
context "when dealing with js-routes.js" do
context "with Rails" do
context "and initialize on precompile" do
before(:each) do
Rails.application.config.assets.initialize_on_precompile = true
end
it "should render some javascript" do
expect(evaluate(ctx, 'js-routes.js')).to match(/routes = /)
end
end
context "and not initialize on precompile" do
before(:each) do
Rails.application.config.assets.initialize_on_precompile = false
end
it "should raise an exception if 3 version" do
expect(evaluate(ctx, 'js-routes.js')).to match(/routes = /)
end
end
end
end
end
context "when not dealing with js-routes.js" do
it "should not depend on routes.rb" do
ctx = sprockets_context(Rails.application.assets,
'test.js',
TEST_ASSET_PATH)
expect(ctx).not_to receive(:depend_on)
evaluate(ctx, 'test.js')
end
end
end
end
describe "JSRoutes thread safety" do
before do
begin
Rails.application.initialize!
rescue
end
end
it "can produce the routes from multiple threads" do
threads = 2.times.map do
Thread.start do
10.times {
expect { JsRoutes.generate }.to_not raise_error
}
end
end
threads.each do |thread|
thread.join
end
end
end
|