require 'spec_helper'
describe Arachni::Element::LinkTemplate::DOM do
inputs = { 'param' => 'some-name' }
it_should_behave_like 'element_dom'
it_should_behave_like 'with_node'
it_should_behave_like 'with_auditor'
it_should_behave_like 'locatable_dom'
it_should_behave_like 'submittable_dom'
it_should_behave_like 'inputtable_dom', inputs: inputs
it_should_behave_like 'mutable_dom', inputs: inputs
it_should_behave_like 'auditable_dom'
def auditable_extract_parameters( page )
{ 'param' => Nokogiri::HTML(page.body).css('#container').text }
end
def run
auditor.browser_cluster.wait
end
before :each do
@framework = Arachni::Framework.new
@page = Arachni::Page.from_url( url )
@auditor = Auditor.new( @page, @framework )
Arachni::Options.audit.link_template_doms = [
/param\/(?.+)/,
/input1\/(?.+)\/input2\/(?.+)/
]
@link = @page.link_templates.first.dom
@link.auditor = @auditor
end
after :each do
@framework.clean_up
@framework.reset
end
subject { @link }
let(:parent) { @link.parent }
let(:url) { web_server_url_for( :link_template_dom ) }
let(:auditor) { @auditor }
let(:inputtable) do
l = Arachni::Page.from_url( "#{url}/inputtable" ).
link_templates.first.dom
l.auditor = auditor
l
end
let(:mutable) do
subject.dup
end
describe '#type' do
it 'returns :link_dom' do
expect(subject.type).to eq(:link_template_dom)
end
end
describe '.type' do
it 'returns :link_dom' do
expect(described_class.type).to eq(:link_template_dom)
end
end
describe '#extract_inputs' do
it "delegates to #{Arachni::Element::LinkTemplate}.extract_inputs" do
allow(Arachni::Element::LinkTemplate).to receive(:extract_inputs) { |arg| "#{arg}1" }
expect(subject.extract_inputs( 'blah' )).to eq('blah1')
end
end
describe '#parent' do
it 'returns the parent element' do
expect(subject.parent).to be_kind_of Arachni::Element::LinkTemplate
end
end
describe '#inputs' do
it 'parses query-style inputs from URL fragments' do
expect(subject.inputs).to eq({ 'param' => 'some-name' })
end
end
describe '#fragment' do
it 'returns the URL fragment' do
expect(subject.fragment).to eq('/param/some-name')
end
end
describe '#trigger' do
it 'triggers the event required to submit the element' do
inputs = { 'param' => 'The.Dude' }
subject.update inputs
called = false
subject.with_browser do |browser|
subject.browser = browser
subject.trigger
expect(subject.inputs).to eq(auditable_extract_parameters( browser.to_page ))
called = true
end
subject.auditor.browser_cluster.wait
expect(called).to be_truthy
end
it 'returns a playable transition' do
inputs = { 'param' => 'The.Dude' }
subject.update inputs
transitions = []
called = false
subject.with_browser do |browser|
subject.browser = browser
browser.load subject.page
transitions = subject.trigger
page = browser.to_page
expect(subject.inputs).to eq(auditable_extract_parameters( page ))
called = true
end
subject.auditor.browser_cluster.wait
expect(called).to be_truthy
called = false
auditor.with_browser do |browser|
browser.load subject.page
expect(auditable_extract_parameters( browser.to_page )).to eq(
{ 'param' => '' }
)
transitions.each do |transition|
transition.play browser
end
expect(auditable_extract_parameters( browser.to_page )).to eq(inputs)
called = true
end
auditor.browser_cluster.wait
expect(called).to be_truthy
end
end
describe '.to_rpc_data' do
it 'converts the #template to a string' do
expect(subject.to_rpc_data['template']).to eq(subject.template.source)
end
end
describe '.data_from_node' do
let(:node) { subject.node }
let(:data) { described_class.data_from_node( node ) }
it 'returns a hash with DOM data' do
expect(data).to eq({
inputs: {
'param' => 'some-name'
},
template: /param\/(?.+)/,
fragment: '/param/some-name'
})
end
it 'decodes the fragment before extracting inputs' do
html = "Stuff"
node = Nokogiri::HTML.fragment(html).children.first
expect(described_class.data_from_node( node )[:inputs]).to eq({
'param' => 'bl ah'
})
end
context 'when there is no URL fragment' do
let(:node) do
Nokogiri::HTML.fragment( "Stuff" ).
children.first
end
it 'return nil' do
expect(described_class.data_from_node( node )).to be_nil
end
end
context 'when there are no inputs' do
let(:node) do
Nokogiri::HTML.fragment( "Stuff" ).
children.first
end
it 'return nil' do
expect(described_class.data_from_node( node )).to be_nil
end
end
end
end