2020-02-01 01:16:34 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
require 'nokogiri'
|
|
|
|
|
|
|
|
describe Gitlab::Asciidoc::IncludeProcessor do
|
|
|
|
let_it_be(:project) { create(:project, :repository) }
|
|
|
|
|
|
|
|
let(:processor_context) do
|
|
|
|
{
|
|
|
|
project: project,
|
|
|
|
max_includes: max_includes,
|
|
|
|
ref: ref
|
|
|
|
}
|
|
|
|
end
|
|
|
|
let(:ref) { project.repository.root_ref }
|
|
|
|
let(:max_includes) { 10 }
|
|
|
|
|
|
|
|
let(:reader) { Asciidoctor::PreprocessorReader.new(document, lines, 'file.adoc') }
|
|
|
|
let(:document) { Asciidoctor::Document.new(lines) }
|
|
|
|
|
|
|
|
subject(:processor) { described_class.new(processor_context) }
|
|
|
|
|
|
|
|
let(:a_blob) { double(:Blob, readable_text?: true, data: a_data) }
|
|
|
|
let(:a_data) { StringIO.new('include::b.adoc[]') }
|
|
|
|
|
|
|
|
let(:lines) { [':max-include-depth: 1000'] + Array.new(10, 'include::a.adoc[]') }
|
|
|
|
|
|
|
|
before do
|
|
|
|
allow(project.repository).to receive(:blob_at).with(ref, 'a.adoc').and_return(a_blob)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#include_allowed?' do
|
|
|
|
it 'allows the first include' do
|
|
|
|
expect(processor.send(:include_allowed?, 'foo.adoc', reader)).to be_truthy
|
|
|
|
end
|
|
|
|
|
2020-03-09 13:42:32 +05:30
|
|
|
it 'allows the Nth + 1 include' do
|
|
|
|
(max_includes - 1).times { processor.send(:read_blob, ref, 'a.adoc') }
|
|
|
|
|
|
|
|
expect(processor.send(:include_allowed?, 'foo.adoc', reader)).to be_truthy
|
|
|
|
end
|
|
|
|
|
2020-02-01 01:16:34 +05:30
|
|
|
it 'disallows the Nth + 1 include' do
|
|
|
|
max_includes.times { processor.send(:read_blob, ref, 'a.adoc') }
|
|
|
|
|
|
|
|
expect(processor.send(:include_allowed?, 'foo.adoc', reader)).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|