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