require 'spec_helper'
describe Arachni::Element::Link::DOM do
inputs = { 'param' => '1' }
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}/link" )
@auditor = Auditor.new( @page, @framework )
@link = @page.links.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_dom ) }
let(:auditor) { @auditor }
let(:inputtable) do
l = Arachni::Page.from_url( "#{url}/link/inputtable" ).links.first.dom
l.auditor = auditor
l
end
describe '#type' do
it 'returns :link_dom' do
expect(subject.type).to eq(:link_dom)
end
end
describe '.type' do
it 'returns :link_dom' do
expect(described_class.type).to eq(:link_dom)
end
end
describe '#parent' do
it 'returns the parent element' do
expect(subject.parent).to be_kind_of Arachni::Element::Link
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('/test/?param=some-name')
end
end
describe '#fragment_path' do
it 'returns the path from the URL fragment' do
expect(subject.fragment_path).to eq('/test/')
end
end
describe '#fragment_query' do
it 'returns the query from the URL fragment' do
expect(subject.fragment_query).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 '.data_from_node' do
it 'returns a hash with DOM data' do
expect(described_class.data_from_node( subject.node )).to eq({
inputs: {
'param' => 'some-name'
},
fragment: '/test/?param=some-name',
fragment_path: '/test/',
fragment_query: 'param=some-name'
})
end
it 'decodes inputs' do
html = "Stuff"
node = Nokogiri::HTML.fragment(html).children.first
expect(described_class.data_from_node( node )[:inputs]).to eq({
'stuff here' => '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