winton-sum 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Capfile +3 -0
- data/MIT-LICENSE +18 -0
- data/README.markdown +55 -0
- data/Rakefile +45 -0
- data/config/database.example.yml +10 -0
- data/config/deploy.example.rb +36 -0
- data/config/externals.yml +18 -0
- data/config/mail.example.yml +32 -0
- data/config/schedule.rb +20 -0
- data/config.ru +3 -0
- data/db/migrate/001_users.rb +22 -0
- data/db/migrate/002_user_emails.rb +15 -0
- data/features/front_page.feature +14 -0
- data/features/read_email.feature +446 -0
- data/features/receive_email.feature +59 -0
- data/features/step_definitions/email.rb +52 -0
- data/features/step_definitions/given.rb +60 -0
- data/features/step_definitions/then.rb +32 -0
- data/features/step_definitions/when.rb +41 -0
- data/features/support/env.rb +27 -0
- data/features/support/helpers.rb +44 -0
- data/features/support/rspec.rb +11 -0
- data/features/support/webrat.rb +3 -0
- data/features/update_user.feature +76 -0
- data/gemspec.rb +45 -0
- data/lib/sum/boot.rb +29 -0
- data/lib/sum/controller/cron.rb +12 -0
- data/lib/sum/controller/front.rb +6 -0
- data/lib/sum/controller/new.rb +15 -0
- data/lib/sum/helper/application.rb +8 -0
- data/lib/sum/helper/cron.rb +12 -0
- data/lib/sum/helper/new.rb +26 -0
- data/lib/sum/model/incoming_mail.rb +89 -0
- data/lib/sum/model/user.rb +286 -0
- data/lib/sum/model/user_email.rb +31 -0
- data/lib/sum/view/email.haml +70 -0
- data/lib/sum/view/field.haml +10 -0
- data/lib/sum/view/form.haml +12 -0
- data/lib/sum/view/front.haml +25 -0
- data/lib/sum/view/layout.haml +26 -0
- data/lib/sum/view/new.haml +15 -0
- data/lib/sum.rb +30 -0
- data/public/image/1.png +0 -0
- data/public/image/2.png +0 -0
- data/public/image/3.png +0 -0
- data/public/image/bg.png +0 -0
- data/public/image/bot.png +0 -0
- data/public/image/facebox/b.png +0 -0
- data/public/image/facebox/bl.png +0 -0
- data/public/image/facebox/br.png +0 -0
- data/public/image/facebox/closelabel.gif +0 -0
- data/public/image/facebox/loading.gif +0 -0
- data/public/image/facebox/tl.png +0 -0
- data/public/image/facebox/tr.png +0 -0
- data/public/image/favicon.png +0 -0
- data/public/image/field_off.png +0 -0
- data/public/image/field_on.png +0 -0
- data/public/image/ribbon.png +0 -0
- data/public/image/screenshot_receive.png +0 -0
- data/public/image/screenshot_send.png +0 -0
- data/public/image/submit.png +0 -0
- data/public/image/top.png +0 -0
- data/public/javascript/facebox.js +319 -0
- data/public/javascript/jquery-1.3.2.js +19 -0
- data/public/javascript/sum.js +9 -0
- data/public/style/facebox.css +95 -0
- data/public/style/ie.css +35 -0
- data/public/style/print.css +30 -0
- data/public/style/screen.css +256 -0
- data/public/style/sum.css +22 -0
- data/public/style/sum.less +135 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +58 -0
- data/spec/sum/model/incoming_mail_spec.rb +106 -0
- data/spec/sum/model/user_spec.rb +171 -0
- data/sum.gemspec +69 -0
- data/vendor/webrat/History.txt +358 -0
- data/vendor/webrat/MIT-LICENSE.txt +19 -0
- data/vendor/webrat/README.rdoc +85 -0
- data/vendor/webrat/Rakefile +200 -0
- data/vendor/webrat/install.rb +1 -0
- data/vendor/webrat/lib/webrat/core/configuration.rb +102 -0
- data/vendor/webrat/lib/webrat/core/elements/area.rb +31 -0
- data/vendor/webrat/lib/webrat/core/elements/element.rb +33 -0
- data/vendor/webrat/lib/webrat/core/elements/field.rb +409 -0
- data/vendor/webrat/lib/webrat/core/elements/form.rb +103 -0
- data/vendor/webrat/lib/webrat/core/elements/label.rb +31 -0
- data/vendor/webrat/lib/webrat/core/elements/link.rb +93 -0
- data/vendor/webrat/lib/webrat/core/elements/select_option.rb +35 -0
- data/vendor/webrat/lib/webrat/core/locators/area_locator.rb +38 -0
- data/vendor/webrat/lib/webrat/core/locators/button_locator.rb +54 -0
- data/vendor/webrat/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
- data/vendor/webrat/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
- data/vendor/webrat/lib/webrat/core/locators/field_locator.rb +25 -0
- data/vendor/webrat/lib/webrat/core/locators/field_named_locator.rb +41 -0
- data/vendor/webrat/lib/webrat/core/locators/form_locator.rb +19 -0
- data/vendor/webrat/lib/webrat/core/locators/label_locator.rb +34 -0
- data/vendor/webrat/lib/webrat/core/locators/link_locator.rb +74 -0
- data/vendor/webrat/lib/webrat/core/locators/locator.rb +20 -0
- data/vendor/webrat/lib/webrat/core/locators/select_option_locator.rb +59 -0
- data/vendor/webrat/lib/webrat/core/locators.rb +20 -0
- data/vendor/webrat/lib/webrat/core/logging.rb +24 -0
- data/vendor/webrat/lib/webrat/core/matchers/have_content.rb +73 -0
- data/vendor/webrat/lib/webrat/core/matchers/have_selector.rb +74 -0
- data/vendor/webrat/lib/webrat/core/matchers/have_tag.rb +21 -0
- data/vendor/webrat/lib/webrat/core/matchers/have_xpath.rb +147 -0
- data/vendor/webrat/lib/webrat/core/matchers.rb +4 -0
- data/vendor/webrat/lib/webrat/core/methods.rb +63 -0
- data/vendor/webrat/lib/webrat/core/mime.rb +29 -0
- data/vendor/webrat/lib/webrat/core/save_and_open_page.rb +48 -0
- data/vendor/webrat/lib/webrat/core/scope.rb +350 -0
- data/vendor/webrat/lib/webrat/core/session.rb +299 -0
- data/vendor/webrat/lib/webrat/core/xml/hpricot.rb +19 -0
- data/vendor/webrat/lib/webrat/core/xml/nokogiri.rb +76 -0
- data/vendor/webrat/lib/webrat/core/xml/rexml.rb +24 -0
- data/vendor/webrat/lib/webrat/core/xml.rb +115 -0
- data/vendor/webrat/lib/webrat/core.rb +14 -0
- data/vendor/webrat/lib/webrat/core_extensions/blank.rb +58 -0
- data/vendor/webrat/lib/webrat/core_extensions/deprecate.rb +8 -0
- data/vendor/webrat/lib/webrat/core_extensions/detect_mapped.rb +12 -0
- data/vendor/webrat/lib/webrat/core_extensions/meta_class.rb +6 -0
- data/vendor/webrat/lib/webrat/core_extensions/nil_to_param.rb +5 -0
- data/vendor/webrat/lib/webrat/core_extensions/tcp_socket.rb +27 -0
- data/vendor/webrat/lib/webrat/mechanize.rb +74 -0
- data/vendor/webrat/lib/webrat/merb.rb +9 -0
- data/vendor/webrat/lib/webrat/merb_multipart_support.rb +27 -0
- data/vendor/webrat/lib/webrat/merb_session.rb +82 -0
- data/vendor/webrat/lib/webrat/rack.rb +25 -0
- data/vendor/webrat/lib/webrat/rails.rb +106 -0
- data/vendor/webrat/lib/webrat/rspec-rails.rb +10 -0
- data/vendor/webrat/lib/webrat/selenium/application_server_factory.rb +40 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/base.rb +46 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/external.rb +26 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/merb.rb +50 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/rails.rb +44 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers.rb +5 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlink.js +12 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
- data/vendor/webrat/lib/webrat/selenium/matchers/have_content.rb +66 -0
- data/vendor/webrat/lib/webrat/selenium/matchers/have_selector.rb +49 -0
- data/vendor/webrat/lib/webrat/selenium/matchers/have_tag.rb +72 -0
- data/vendor/webrat/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
- data/vendor/webrat/lib/webrat/selenium/matchers.rb +4 -0
- data/vendor/webrat/lib/webrat/selenium/selenium_extensions.js +6 -0
- data/vendor/webrat/lib/webrat/selenium/selenium_rc_server.rb +84 -0
- data/vendor/webrat/lib/webrat/selenium/selenium_session.rb +248 -0
- data/vendor/webrat/lib/webrat/selenium/silence_stream.rb +18 -0
- data/vendor/webrat/lib/webrat/selenium.rb +81 -0
- data/vendor/webrat/lib/webrat/sinatra.rb +11 -0
- data/vendor/webrat/lib/webrat.rb +31 -0
- data/vendor/webrat/spec/fakes/test_session.rb +34 -0
- data/vendor/webrat/spec/integration/merb/Rakefile +35 -0
- data/vendor/webrat/spec/integration/merb/app/controllers/application.rb +2 -0
- data/vendor/webrat/spec/integration/merb/app/controllers/exceptions.rb +13 -0
- data/vendor/webrat/spec/integration/merb/app/controllers/testing.rb +27 -0
- data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
- data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
- data/vendor/webrat/spec/integration/merb/app/views/layout/application.html.erb +12 -0
- data/vendor/webrat/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
- data/vendor/webrat/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
- data/vendor/webrat/spec/integration/merb/config/environments/development.rb +15 -0
- data/vendor/webrat/spec/integration/merb/config/environments/rake.rb +11 -0
- data/vendor/webrat/spec/integration/merb/config/environments/test.rb +14 -0
- data/vendor/webrat/spec/integration/merb/config/init.rb +25 -0
- data/vendor/webrat/spec/integration/merb/config/rack.rb +11 -0
- data/vendor/webrat/spec/integration/merb/config/router.rb +34 -0
- data/vendor/webrat/spec/integration/merb/spec/spec.opts +1 -0
- data/vendor/webrat/spec/integration/merb/spec/spec_helper.rb +24 -0
- data/vendor/webrat/spec/integration/merb/spec/webrat_spec.rb +39 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
- data/vendor/webrat/spec/integration/rack/Rakefile +5 -0
- data/vendor/webrat/spec/integration/rack/app.rb +73 -0
- data/vendor/webrat/spec/integration/rack/test/helper.rb +20 -0
- data/vendor/webrat/spec/integration/rack/test/webrat_rack_test.rb +62 -0
- data/vendor/webrat/spec/integration/rails/Rakefile +30 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/application.rb +15 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/links_controller.rb +7 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/webrat_controller.rb +43 -0
- data/vendor/webrat/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
- data/vendor/webrat/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
- data/vendor/webrat/spec/integration/rails/app/helpers/links_helper.rb +2 -0
- data/vendor/webrat/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
- data/vendor/webrat/spec/integration/rails/app/views/fields/show.html.erb +9 -0
- data/vendor/webrat/spec/integration/rails/app/views/links/show.html.erb +5 -0
- data/vendor/webrat/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
- data/vendor/webrat/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
- data/vendor/webrat/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
- data/vendor/webrat/spec/integration/rails/config/boot.rb +109 -0
- data/vendor/webrat/spec/integration/rails/config/environment.rb +12 -0
- data/vendor/webrat/spec/integration/rails/config/environments/development.rb +17 -0
- data/vendor/webrat/spec/integration/rails/config/environments/selenium.rb +22 -0
- data/vendor/webrat/spec/integration/rails/config/environments/test.rb +22 -0
- data/vendor/webrat/spec/integration/rails/config/initializers/inflections.rb +10 -0
- data/vendor/webrat/spec/integration/rails/config/initializers/mime_types.rb +5 -0
- data/vendor/webrat/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
- data/vendor/webrat/spec/integration/rails/config/locales/en.yml +5 -0
- data/vendor/webrat/spec/integration/rails/config/routes.rb +18 -0
- data/vendor/webrat/spec/integration/rails/public/404.html +30 -0
- data/vendor/webrat/spec/integration/rails/public/422.html +30 -0
- data/vendor/webrat/spec/integration/rails/public/500.html +33 -0
- data/vendor/webrat/spec/integration/rails/script/about +4 -0
- data/vendor/webrat/spec/integration/rails/script/console +3 -0
- data/vendor/webrat/spec/integration/rails/script/dbconsole +3 -0
- data/vendor/webrat/spec/integration/rails/script/destroy +3 -0
- data/vendor/webrat/spec/integration/rails/script/generate +3 -0
- data/vendor/webrat/spec/integration/rails/script/performance/benchmarker +3 -0
- data/vendor/webrat/spec/integration/rails/script/performance/profiler +3 -0
- data/vendor/webrat/spec/integration/rails/script/performance/request +3 -0
- data/vendor/webrat/spec/integration/rails/script/plugin +3 -0
- data/vendor/webrat/spec/integration/rails/script/process/inspector +3 -0
- data/vendor/webrat/spec/integration/rails/script/process/reaper +3 -0
- data/vendor/webrat/spec/integration/rails/script/process/spawner +3 -0
- data/vendor/webrat/spec/integration/rails/script/runner +3 -0
- data/vendor/webrat/spec/integration/rails/script/server +3 -0
- data/vendor/webrat/spec/integration/rails/test/integration/button_click_test.rb +80 -0
- data/vendor/webrat/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
- data/vendor/webrat/spec/integration/rails/test/integration/link_click_test.rb +27 -0
- data/vendor/webrat/spec/integration/rails/test/integration/webrat_test.rb +97 -0
- data/vendor/webrat/spec/integration/rails/test/test_helper.rb +25 -0
- data/vendor/webrat/spec/integration/sinatra/Rakefile +5 -0
- data/vendor/webrat/spec/integration/sinatra/classic_app.rb +64 -0
- data/vendor/webrat/spec/integration/sinatra/modular_app.rb +16 -0
- data/vendor/webrat/spec/integration/sinatra/test/classic_app_test.rb +37 -0
- data/vendor/webrat/spec/integration/sinatra/test/modular_app_test.rb +18 -0
- data/vendor/webrat/spec/integration/sinatra/test/test_helper.rb +16 -0
- data/vendor/webrat/spec/private/core/configuration_spec.rb +116 -0
- data/vendor/webrat/spec/private/core/field_spec.rb +85 -0
- data/vendor/webrat/spec/private/core/link_spec.rb +24 -0
- data/vendor/webrat/spec/private/core/logging_spec.rb +10 -0
- data/vendor/webrat/spec/private/core/session_spec.rb +195 -0
- data/vendor/webrat/spec/private/mechanize/mechanize_session_spec.rb +81 -0
- data/vendor/webrat/spec/private/merb/attaches_file_spec.rb +93 -0
- data/vendor/webrat/spec/private/merb/merb_session_spec.rb +61 -0
- data/vendor/webrat/spec/private/nokogiri_spec.rb +77 -0
- data/vendor/webrat/spec/private/rails/attaches_file_spec.rb +81 -0
- data/vendor/webrat/spec/private/rails/rails_session_spec.rb +112 -0
- data/vendor/webrat/spec/private/selenium/application_servers/rails_spec.rb +26 -0
- data/vendor/webrat/spec/public/basic_auth_spec.rb +24 -0
- data/vendor/webrat/spec/public/check_spec.rb +191 -0
- data/vendor/webrat/spec/public/choose_spec.rb +118 -0
- data/vendor/webrat/spec/public/click_area_spec.rb +106 -0
- data/vendor/webrat/spec/public/click_button_spec.rb +496 -0
- data/vendor/webrat/spec/public/click_link_spec.rb +511 -0
- data/vendor/webrat/spec/public/fill_in_spec.rb +209 -0
- data/vendor/webrat/spec/public/locators/field_by_xpath_spec.rb +19 -0
- data/vendor/webrat/spec/public/locators/field_labeled_spec.rb +172 -0
- data/vendor/webrat/spec/public/locators/field_with_id_spec.rb +16 -0
- data/vendor/webrat/spec/public/matchers/contain_spec.rb +114 -0
- data/vendor/webrat/spec/public/matchers/have_selector_spec.rb +142 -0
- data/vendor/webrat/spec/public/matchers/have_tag_spec.rb +39 -0
- data/vendor/webrat/spec/public/matchers/have_xpath_spec.rb +136 -0
- data/vendor/webrat/spec/public/reload_spec.rb +10 -0
- data/vendor/webrat/spec/public/save_and_open_spec.rb +70 -0
- data/vendor/webrat/spec/public/select_date_spec.rb +112 -0
- data/vendor/webrat/spec/public/select_datetime_spec.rb +137 -0
- data/vendor/webrat/spec/public/select_spec.rb +249 -0
- data/vendor/webrat/spec/public/select_time_spec.rb +100 -0
- data/vendor/webrat/spec/public/selenium/application_server_factory_spec.rb +49 -0
- data/vendor/webrat/spec/public/selenium/application_servers/external_spec.rb +12 -0
- data/vendor/webrat/spec/public/selenium/selenium_session_spec.rb +37 -0
- data/vendor/webrat/spec/public/set_hidden_field_spec.rb +5 -0
- data/vendor/webrat/spec/public/submit_form_spec.rb +5 -0
- data/vendor/webrat/spec/public/visit_spec.rb +58 -0
- data/vendor/webrat/spec/public/within_spec.rb +177 -0
- data/vendor/webrat/spec/rcov.opts +1 -0
- data/vendor/webrat/spec/spec.opts +2 -0
- data/vendor/webrat/spec/spec_helper.rb +50 -0
- metadata +554 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
module Webrat
|
|
2
|
+
module Matchers
|
|
3
|
+
|
|
4
|
+
class HasContent #:nodoc:
|
|
5
|
+
def initialize(content)
|
|
6
|
+
@content = content
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def matches?(stringlike)
|
|
10
|
+
if Webrat.configuration.parse_with_nokogiri?
|
|
11
|
+
@document = Webrat.nokogiri_document(stringlike)
|
|
12
|
+
else
|
|
13
|
+
@document = Webrat.hpricot_document(stringlike)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
@element = Webrat::XML.inner_text(@document)
|
|
17
|
+
|
|
18
|
+
case @content
|
|
19
|
+
when String
|
|
20
|
+
@element.include?(@content)
|
|
21
|
+
when Regexp
|
|
22
|
+
@element.match(@content)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# ==== Returns
|
|
27
|
+
# String:: The failure message.
|
|
28
|
+
def failure_message
|
|
29
|
+
"expected the following element's content to #{content_message}:\n#{squeeze_space(@element)}"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# ==== Returns
|
|
33
|
+
# String:: The failure message to be displayed in negative matches.
|
|
34
|
+
def negative_failure_message
|
|
35
|
+
"expected the following element's content to not #{content_message}:\n#{squeeze_space(@element)}"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def squeeze_space(inner_text)
|
|
39
|
+
inner_text.gsub(/^\s*$/, "").squeeze("\n")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def content_message
|
|
43
|
+
case @content
|
|
44
|
+
when String
|
|
45
|
+
"include \"#{@content}\""
|
|
46
|
+
when Regexp
|
|
47
|
+
"match #{@content.inspect}"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Matches the contents of an HTML document with
|
|
53
|
+
# whatever string is supplied
|
|
54
|
+
def contain(content)
|
|
55
|
+
HasContent.new(content)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Asserts that the body of the response contain
|
|
59
|
+
# the supplied string or regexp
|
|
60
|
+
def assert_contain(content)
|
|
61
|
+
hc = HasContent.new(content)
|
|
62
|
+
assert hc.matches?(response_body), hc.failure_message
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Asserts that the body of the response
|
|
66
|
+
# does not contain the supplied string or regepx
|
|
67
|
+
def assert_not_contain(content)
|
|
68
|
+
hc = HasContent.new(content)
|
|
69
|
+
assert !hc.matches?(response_body), hc.negative_failure_message
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require "webrat/core/matchers/have_xpath"
|
|
2
|
+
|
|
3
|
+
module Webrat
|
|
4
|
+
module Matchers
|
|
5
|
+
|
|
6
|
+
class HaveSelector < HaveXpath #:nodoc:
|
|
7
|
+
# ==== Returns
|
|
8
|
+
# String:: The failure message.
|
|
9
|
+
def failure_message
|
|
10
|
+
"expected following output to contain a #{tag_inspect} tag:\n#{@document}"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# ==== Returns
|
|
14
|
+
# String:: The failure message to be displayed in negative matches.
|
|
15
|
+
def negative_failure_message
|
|
16
|
+
"expected following output to omit a #{tag_inspect}:\n#{@document}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def tag_inspect
|
|
20
|
+
options = @options.dup
|
|
21
|
+
count = options.delete(:count)
|
|
22
|
+
content = options.delete(:content)
|
|
23
|
+
|
|
24
|
+
html = "<#{@expected}"
|
|
25
|
+
options.each do |k,v|
|
|
26
|
+
html << " #{k}='#{v}'"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
if content
|
|
30
|
+
html << ">#{content}</#{@expected}>"
|
|
31
|
+
else
|
|
32
|
+
html << "/>"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
html
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def query
|
|
39
|
+
Nokogiri::CSS.parse(@expected.to_s).map do |ast|
|
|
40
|
+
ast.to_xpath
|
|
41
|
+
end.first
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Matches HTML content against a CSS 3 selector.
|
|
47
|
+
#
|
|
48
|
+
# ==== Parameters
|
|
49
|
+
# expected<String>:: The CSS selector to look for.
|
|
50
|
+
#
|
|
51
|
+
# ==== Returns
|
|
52
|
+
# HaveSelector:: A new have selector matcher.
|
|
53
|
+
def have_selector(name, attributes = {}, &block)
|
|
54
|
+
HaveSelector.new(name, attributes, &block)
|
|
55
|
+
end
|
|
56
|
+
alias_method :match_selector, :have_selector
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# Asserts that the body of the response contains
|
|
60
|
+
# the supplied selector
|
|
61
|
+
def assert_have_selector(name, attributes = {}, &block)
|
|
62
|
+
matcher = HaveSelector.new(name, attributes, &block)
|
|
63
|
+
assert matcher.matches?(response_body), matcher.failure_message
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Asserts that the body of the response
|
|
67
|
+
# does not contain the supplied string or regepx
|
|
68
|
+
def assert_have_no_selector(name, attributes = {}, &block)
|
|
69
|
+
matcher = HaveSelector.new(name, attributes, &block)
|
|
70
|
+
assert !matcher.matches?(response_body), matcher.negative_failure_message
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require "webrat/core/matchers/have_selector"
|
|
2
|
+
|
|
3
|
+
module Webrat
|
|
4
|
+
module HaveTagMatcher
|
|
5
|
+
|
|
6
|
+
def have_tag(*args, &block)
|
|
7
|
+
have_selector(*args, &block)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
alias_method :match_tag, :have_tag
|
|
11
|
+
|
|
12
|
+
def assert_have_tag(*args, &block)
|
|
13
|
+
assert_have_selector(*args, &block)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def assert_have_no_tag(*args, &block)
|
|
17
|
+
assert_have_no_selector(*args, &block)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
require "webrat/core/xml/nokogiri"
|
|
2
|
+
require "webrat/core/xml/rexml"
|
|
3
|
+
|
|
4
|
+
module Webrat
|
|
5
|
+
module Matchers
|
|
6
|
+
|
|
7
|
+
class HaveXpath #:nodoc:
|
|
8
|
+
def initialize(expected, options = {}, &block)
|
|
9
|
+
@expected = expected
|
|
10
|
+
@options = options
|
|
11
|
+
@block = block
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def matches?(stringlike, &block)
|
|
15
|
+
@block ||= block
|
|
16
|
+
matched = matches(stringlike)
|
|
17
|
+
|
|
18
|
+
if @options[:count]
|
|
19
|
+
matched.size == @options[:count] && (!@block || @block.call(matched))
|
|
20
|
+
else
|
|
21
|
+
matched.any? && (!@block || @block.call(matched))
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def matches(stringlike)
|
|
26
|
+
if Webrat.configuration.parse_with_nokogiri?
|
|
27
|
+
nokogiri_matches(stringlike)
|
|
28
|
+
else
|
|
29
|
+
rexml_matches(stringlike)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def rexml_matches(stringlike)
|
|
34
|
+
if REXML::Node === stringlike || Array === stringlike
|
|
35
|
+
@query = query.map { |q| q.gsub(%r'^//', './/') }
|
|
36
|
+
else
|
|
37
|
+
@query = query
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
add_options_conditions_to(@query)
|
|
41
|
+
|
|
42
|
+
@document = Webrat.rexml_document(stringlike)
|
|
43
|
+
|
|
44
|
+
@query.map do |q|
|
|
45
|
+
if @document.is_a?(Array)
|
|
46
|
+
@document.map { |d| REXML::XPath.match(d, q) }
|
|
47
|
+
else
|
|
48
|
+
REXML::XPath.match(@document, q)
|
|
49
|
+
end
|
|
50
|
+
end.flatten.compact
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def nokogiri_matches(stringlike)
|
|
54
|
+
if Nokogiri::XML::NodeSet === stringlike
|
|
55
|
+
@query = query.gsub(%r'^//', './/')
|
|
56
|
+
else
|
|
57
|
+
@query = query
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
add_options_conditions_to(@query)
|
|
61
|
+
|
|
62
|
+
@document = Webrat::XML.document(stringlike)
|
|
63
|
+
@document.xpath(*@query)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def add_options_conditions_to(query)
|
|
67
|
+
add_attributes_conditions_to(query)
|
|
68
|
+
add_content_condition_to(query)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def add_attributes_conditions_to(query)
|
|
72
|
+
attribute_conditions = []
|
|
73
|
+
|
|
74
|
+
@options.each do |key, value|
|
|
75
|
+
next if [:content, :count].include?(key)
|
|
76
|
+
attribute_conditions << "@#{key} = #{xpath_escape(value)}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
if attribute_conditions.any?
|
|
80
|
+
query << "[#{attribute_conditions.join(' and ')}]"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def add_content_condition_to(query)
|
|
85
|
+
if @options[:content]
|
|
86
|
+
query << "[contains(., #{xpath_escape(@options[:content])})]"
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def query
|
|
91
|
+
@expected
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# ==== Returns
|
|
95
|
+
# String:: The failure message.
|
|
96
|
+
def failure_message
|
|
97
|
+
"expected following text to match xpath #{@expected}:\n#{@document}"
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# ==== Returns
|
|
101
|
+
# String:: The failure message to be displayed in negative matches.
|
|
102
|
+
def negative_failure_message
|
|
103
|
+
"expected following text to not match xpath #{@expected}:\n#{@document}"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
protected
|
|
107
|
+
|
|
108
|
+
def xpath_escape(string)
|
|
109
|
+
if string.include?("'") && string.include?('"')
|
|
110
|
+
parts = string.split("'").map do |part|
|
|
111
|
+
"'#{part}'"
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
"concat(" + parts.join(", \"'\", ") + ")"
|
|
115
|
+
elsif string.include?("'")
|
|
116
|
+
"\"#{string}\""
|
|
117
|
+
else
|
|
118
|
+
"'#{string}'"
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Matches HTML content against an XPath query
|
|
125
|
+
#
|
|
126
|
+
# ==== Parameters
|
|
127
|
+
# expected<String>:: The XPath query to look for.
|
|
128
|
+
#
|
|
129
|
+
# ==== Returns
|
|
130
|
+
# HaveXpath:: A new have xpath matcher.
|
|
131
|
+
def have_xpath(expected, options = {}, &block)
|
|
132
|
+
HaveXpath.new(expected, options, &block)
|
|
133
|
+
end
|
|
134
|
+
alias_method :match_xpath, :have_xpath
|
|
135
|
+
|
|
136
|
+
def assert_have_xpath(expected, options = {}, &block)
|
|
137
|
+
hs = HaveXpath.new(expected, options, &block)
|
|
138
|
+
assert hs.matches?(response_body), hs.failure_message
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def assert_have_no_xpath(expected, options = {}, &block)
|
|
142
|
+
hs = HaveXpath.new(expected, options, &block)
|
|
143
|
+
assert !hs.matches?(response_body), hs.negative_failure_message
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|
|
147
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Webrat
|
|
2
|
+
module Methods #:nodoc:
|
|
3
|
+
|
|
4
|
+
def self.delegate_to_session(*meths)
|
|
5
|
+
meths.each do |meth|
|
|
6
|
+
self.class_eval <<-RUBY
|
|
7
|
+
def #{meth}(*args, &blk)
|
|
8
|
+
webrat_session.#{meth}(*args, &blk)
|
|
9
|
+
end
|
|
10
|
+
RUBY
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def webrat
|
|
15
|
+
webrat_session
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def webrat_session
|
|
19
|
+
@_webrat_session ||= ::Webrat::Session.new(webrat_adapter)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def webrat_adapter
|
|
23
|
+
@_webrat_adapter ||= Webrat.session_class.new(self)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# all of these methods delegate to the @session, which should
|
|
27
|
+
# be created transparently.
|
|
28
|
+
#
|
|
29
|
+
# Note that when using Webrat, #request also uses @session, so
|
|
30
|
+
# that #request and webrat native functions behave interchangably
|
|
31
|
+
|
|
32
|
+
delegate_to_session \
|
|
33
|
+
:visits, :visit,
|
|
34
|
+
:within,
|
|
35
|
+
:header, :http_accept, :basic_auth,
|
|
36
|
+
:save_and_open_page,
|
|
37
|
+
:fills_in, :fill_in,
|
|
38
|
+
:checks, :check,
|
|
39
|
+
:unchecks, :uncheck,
|
|
40
|
+
:chooses, :choose,
|
|
41
|
+
:selects, :select,
|
|
42
|
+
:attaches_file, :attach_file,
|
|
43
|
+
:current_page,
|
|
44
|
+
:current_url,
|
|
45
|
+
:clicks_link, :click_link,
|
|
46
|
+
:clicks_area, :click_area,
|
|
47
|
+
:clicks_button, :click_button,
|
|
48
|
+
:reload, :reloads,
|
|
49
|
+
:clicks_link_within, :click_link_within,
|
|
50
|
+
:field_labeled,
|
|
51
|
+
:select_option,
|
|
52
|
+
:set_hidden_field, :submit_form,
|
|
53
|
+
:request_page, :current_dom,
|
|
54
|
+
:response_body,
|
|
55
|
+
:selects_date, :selects_time, :selects_datetime,
|
|
56
|
+
:select_date, :select_time, :select_datetime,
|
|
57
|
+
:field_by_xpath,
|
|
58
|
+
:field_with_id,
|
|
59
|
+
:selenium,
|
|
60
|
+
:simulate, :automate,
|
|
61
|
+
:field_named
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Webrat #:nodoc:
|
|
2
|
+
module MIME #:nodoc:
|
|
3
|
+
|
|
4
|
+
def self.mime_type(string_or_symbol) #:nodoc:
|
|
5
|
+
if string_or_symbol.is_a?(String)
|
|
6
|
+
string_or_symbol
|
|
7
|
+
else
|
|
8
|
+
case string_or_symbol
|
|
9
|
+
when :text then "text/plain"
|
|
10
|
+
when :html then "text/html"
|
|
11
|
+
when :js then "text/javascript"
|
|
12
|
+
when :css then "text/css"
|
|
13
|
+
when :ics then "text/calendar"
|
|
14
|
+
when :csv then "text/csv"
|
|
15
|
+
when :xml then "application/xml"
|
|
16
|
+
when :rss then "application/rss+xml"
|
|
17
|
+
when :atom then "application/atom+xml"
|
|
18
|
+
when :yaml then "application/x-yaml"
|
|
19
|
+
when :multipart_form then "multipart/form-data"
|
|
20
|
+
when :url_encoded_form then "application/x-www-form-urlencoded"
|
|
21
|
+
when :json then "application/json"
|
|
22
|
+
else
|
|
23
|
+
raise ArgumentError.new("Invalid Mime type: #{string_or_symbol.inspect}")
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Webrat
|
|
2
|
+
module SaveAndOpenPage
|
|
3
|
+
# Saves the page out to RAILS_ROOT/tmp/ and opens it in the default
|
|
4
|
+
# web browser if on OS X. Useful for debugging.
|
|
5
|
+
#
|
|
6
|
+
# Example:
|
|
7
|
+
# save_and_open_page
|
|
8
|
+
def save_and_open_page
|
|
9
|
+
return unless File.exist?(saved_page_dir)
|
|
10
|
+
|
|
11
|
+
filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.html"
|
|
12
|
+
|
|
13
|
+
File.open(filename, "w") do |f|
|
|
14
|
+
f.write rewrite_css_and_image_references(response_body)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
open_in_browser(filename)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def open_in_browser(path) # :nodoc
|
|
21
|
+
require "launchy"
|
|
22
|
+
Launchy::Browser.run(path)
|
|
23
|
+
rescue LoadError
|
|
24
|
+
warn "Sorry, you need to install launchy to open pages: `gem install launchy`"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def rewrite_css_and_image_references(response_html) # :nodoc:
|
|
28
|
+
return response_html unless doc_root
|
|
29
|
+
response_html.gsub(/("|')\/(stylesheets|images)/, '\1' + doc_root + '/\2')
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def saved_page_dir #:nodoc:
|
|
33
|
+
File.expand_path(".")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def doc_root #:nodoc:
|
|
37
|
+
nil
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
# accessor for testing
|
|
43
|
+
def ruby_platform
|
|
44
|
+
RUBY_PLATFORM
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|