github.com/nycdavid/zeus@v0.0.0-20201208104106-9ba439429e03/rubygem/spec/load_tracking_spec.rb (about) 1 require 'zeus/load_tracking' 2 3 describe "Zeus::LoadTracking" do 4 let(:test_filename) { __FILE__ } 5 let(:test_dirname) { File.dirname(test_filename) } 6 7 class MyError < StandardError; end 8 9 def expect_to_load(expect_features, expect_err=NilClass) 10 buf = StringIO.new 11 Zeus::LoadTracking.set_feature_pipe(buf) 12 13 begin 14 Zeus::LoadTracking.track_features_loaded_by do 15 yield 16 end 17 rescue ScriptError => err 18 rescue => err 19 end 20 21 expect(err).to be_instance_of(expect_err) 22 expect(buf.string.strip.split("\n").sort).to eq(expect_features.sort) 23 end 24 25 def expand_asset_path(path) 26 File.join(__dir__, 'assets', path) 27 end 28 29 describe '.add_feature' do 30 it 'tracks full filepath' do 31 relative_path = Pathname.new(test_filename).relative_path_from(Pathname.new(Dir.pwd)).to_s 32 33 expect_to_load([test_filename]) do 34 Zeus::LoadTracking.add_feature(relative_path) 35 end 36 end 37 38 it 'tracks loads' do 39 target = expand_asset_path('load.rb') 40 41 # The first `load` in Travis also pulls enc/trans/single_byte.so from the 42 # Ruby VM for some reason. Loading twice is harmless since this file is empty. 43 load(target) 44 45 expect_to_load([target]) do 46 load(target) 47 end 48 end 49 50 it 'does not error outside a tracking block without Zeus configured' do 51 Zeus::LoadTracking.add_feature(test_filename) 52 end 53 end 54 55 describe '.track_features_loaded_by' do 56 context 'loading valid code' do 57 it 'tracks successful require_relative' do 58 expect_to_load([expand_asset_path('require_relative.rb')]) do 59 require_relative 'assets/require_relative' 60 end 61 end 62 63 it 'tracks successful require' do 64 expect_to_load([expand_asset_path('require.rb')]) do 65 require expand_asset_path('require') 66 end 67 end 68 end 69 70 context 'loading invalid code' do 71 it 'tracks requires that raise a SyntaxError' do 72 files = [expand_asset_path('invalid_syntax.rb')] 73 # SyntaxError does not have a backtrace in 2.3+ (https://bugs.ruby-lang.org/issues/12811) 74 if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3.0') 75 files << test_filename 76 end 77 78 expect_to_load(files, SyntaxError) do 79 require expand_asset_path('invalid_syntax') 80 end 81 end 82 83 it 'tracks requires that raise a RuntimeError' do 84 expect_to_load([test_filename, expand_asset_path('runtime_error.rb')], RuntimeError) do 85 require expand_asset_path('runtime_error') 86 end 87 end 88 89 it 'tracks requires that throw in a method call' do 90 expect_to_load([test_filename, expand_asset_path('raise.rb')], MyError) do 91 require expand_asset_path('raise') 92 raise_it(MyError) 93 end 94 end 95 end 96 end 97 end