examples/relevance/tarantula/form_submission_example.rb in relevance-tarantula-0.2.1 vs examples/relevance/tarantula/form_submission_example.rb in relevance-tarantula-0.3.2
- old
+ new
@@ -1,71 +1,171 @@
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "example_helper.rb"))
-describe "Relevance::Tarantula::FormSubmission" do
+describe Relevance::Tarantula::FormSubmission do
- # TODO: add more from field types to this example form as needed
- before do
- @tag = Hpricot(<<END)
-<form action="/session" method="post">
- <input id="email" name="email" size="30" type="text" />
- <textarea id="comment" name="comment"value="1" />
- <input name="commit" type="submit" value="Postit" />
- <input name="secret" type="hidden" value="secret" />
- <select id="foo_opened_on_1i" name="foo[opened_on(1i)]">
- <option value="2003">2003</option>
- <option value="2004">2004</option>
- </select>
-</form>
-END
- @form = Relevance::Tarantula::Form.new(@tag.at('form'))
- @fs = Relevance::Tarantula::FormSubmission.new(@form)
- end
+ describe "with a good form" do
+ # TODO: add more from field types to this example form as needed
+ before do
+ @tag = Hpricot(%q{
+ <form action="/session" method="post">
+ <input id="email" name="email" size="30" type="text" />
+ <textarea id="comment" name="comment"value="1" />
+ <input name="commit" type="submit" value="Postit" />
+ <input name="secret" type="hidden" value="secret" />
+ <select id="foo_opened_on_1i" name="foo[opened_on(1i)]">
+ <option value="2003">2003</option>
+ <option value="2004">2004</option>
+ </select>
+ </form>
+ })
+ end
+
+ describe "crawl" do
+
+ it "converts ActiveRecord::RecordNotFound into a 404" do
+ (crawler = stub_everything).expects(:submit).raises(ActiveRecord::RecordNotFound)
+ form = Relevance::Tarantula::FormSubmission.new(make_form(@tag.at('form'), crawler))
+ response = form.crawl
+ response.code.should == "404"
+ response.content_type.should == "text/plain"
+ response.body.should == "ActiveRecord::RecordNotFound"
+ end
+
+ it "submits the form and logs response" do
+ doc = Hpricot('<form action="/action" method="post"/>')
+ form = make_form(doc.at('form'))
+ fs = Relevance::Tarantula::FormSubmission.new(form)
+ form.crawler.expects(:submit).returns(stub(:code => "200"))
+ fs.expects(:log).with("Response 200 for #{fs}")
+ fs.crawl
+ end
+
+ end
+
+ describe "with default attack" do
+ before do
+ @form = make_form(@tag.at('form'))
+ @fs = Relevance::Tarantula::FormSubmission.new(@form)
+ end
- it "can mutate text areas" do
- @fs.stubs(:random_int).returns("42")
- @fs.mutate_text_areas(@form).should == {"comment" => "42"}
- end
+ it "can mutate text areas" do
+ @fs.attack.stubs(:random_int).returns("42")
+ @fs.mutate_text_areas(@form).should == {"comment" => "42"}
+ end
- it "can mutate selects" do
- Hpricot::Elements.any_instance.stubs(:rand).returns(stub(:[] => "2006-stub"))
- @fs.mutate_selects(@form).should == {"foo[opened_on(1i)]" => "2006-stub"}
- end
+ it "can mutate selects" do
+ Hpricot::Elements.any_instance.stubs(:rand).returns(stub(:[] => "2006-stub"))
+ @fs.mutate_selects(@form).should == {"foo[opened_on(1i)]" => "2006-stub"}
+ end
- it "can mutate inputs" do
- @fs.stubs(:random_int).returns("43")
- @fs.mutate_inputs(@form).should == {"commit"=>"43", "secret"=>"43", "email"=>"43"}
- end
+ it "can mutate inputs" do
+ @fs.attack.stubs(:random_int).returns("43")
+ @fs.mutate_inputs(@form).should == {"commit"=>"43", "secret"=>"43", "email"=>"43"}
+ end
- it "has a signature based on action and fields" do
- @fs.signature.should == ['/session', [
- "comment",
- "commit",
- "email",
- "foo[opened_on(1i)]",
- "secret"]]
- end
+ it "has a signature based on action and fields" do
+ @fs.signature.should == ['/session', [
+ "comment",
+ "commit",
+ "email",
+ "foo[opened_on(1i)]",
+ "secret"],
+ @fs.attack.name]
+ end
- it "has a friendly to_s" do
- @fs.to_s.should =~ %r{^/session post}
+ it "has a friendly to_s" do
+ @fs.to_s.should =~ %r{^/session post}
+ end
+ end
+
+ describe "with a custom attack" do
+ before do
+ @form = make_form(@tag.at('form'))
+ @attack = Relevance::Tarantula::Attack.new(:name => 'foo_name',
+ :input => 'foo_code',
+ :output => 'foo_code')
+ @fs = Relevance::Tarantula::FormSubmission.new(@form, @attack)
+ end
+
+ it "can mutate text areas" do
+ @fs.mutate_text_areas(@form).should == {"comment" => "foo_code"}
+ end
+
+ it "can mutate selects" do
+ Hpricot::Elements.any_instance.stubs(:rand).returns(stub(:[] => "2006-stub"))
+ @fs.mutate_selects(@form).should == {"foo[opened_on(1i)]" => "2006-stub"}
+ end
+
+ it "can mutate inputs" do
+ @fs.mutate_inputs(@form).should == {"commit"=>"foo_code", "secret"=>"foo_code", "email"=>"foo_code"}
+ end
+
+ it "has a signature based on action, fields, and attack name" do
+ @fs.signature.should == ['/session', [
+ "comment",
+ "commit",
+ "email",
+ "foo[opened_on(1i)]",
+ "secret"],
+ "foo_name"
+ ]
+ end
+
+ it "has a friendly to_s" do
+ @fs.to_s.should =~ %r{^/session post}
+ end
+
+ it "processes all its attacks" do
+ Relevance::Tarantula::FormSubmission.stubs(:attacks).returns([
+ Relevance::Tarantula::Attack.new({:name => 'foo_name1', :input => 'foo_input', :output => 'foo_output'}),
+ Relevance::Tarantula::Attack.new({:name => 'foo_name2', :input => 'foo_input', :output => 'foo_output'}),
+ ])
+ Relevance::Tarantula::FormSubmission.mutate(@form).size.should == 2
+ end
+
+ it "maps hash attacks to Attack instances" do
+ saved_attacks = Relevance::Tarantula::FormSubmission.instance_variable_get("@attacks")
+ begin
+ Relevance::Tarantula::FormSubmission.instance_variable_set("@attacks", [{ :name => "attack name"}])
+ Relevance::Tarantula::FormSubmission.attacks.should == [Relevance::Tarantula::Attack.new({:name => "attack name"})]
+ ensure
+ # isolate this test properly
+ Relevance::Tarantula::FormSubmission.instance_variable_set("@attacks", saved_attacks)
+ end
+ end
+ end
end
- it "can generate a random whole number" do
- @fs.random_whole_number.should >= 0
- Fixnum.should === @fs.random_whole_number
- end
-end
+ describe "with a crummy form" do
+ before do
+ @tag = Hpricot(%q{
+ <form action="/session" method="post">
+ <input value="no_name" />
+ </form>
+ })
+ end
+
+ describe "with default attack" do
+ before do
+ @form = make_form(@tag.at('form'))
+ @fs = Relevance::Tarantula::FormSubmission.new(@form)
+ end
-describe "Relevance::Tarantula::FormSubmission for a crummy form" do
- before do
- @tag = Hpricot(<<END)
-<form action="/session" method="post">
- <input value="no_name" />
-</form>
-END
- @form = Relevance::Tarantula::Form.new(@tag.at('form'))
- @fs = Relevance::Tarantula::FormSubmission.new(@form)
+ it "ignores unnamed inputs" do
+ @fs.mutate_inputs(@form).should == {}
+ end
+ end
+
+ describe "with a custom attack" do
+ before do
+ @form = make_form(@tag.at('form'))
+ @fs = Relevance::Tarantula::FormSubmission.new(@form, {:name => 'foo_name', :input => 'foo_code', :output => 'foo_code'})
+ end
+
+ it "ignores unnamed inputs" do
+ @fs.mutate_inputs(@form).should == {}
+ end
+ end
+
end
- it "ignores unnamed inputs" do
- @fs.mutate_inputs(@form).should == {}
- end
end