arachni 1.2.1 → 1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (373) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/Gemfile +1 -1
  4. data/README.md +16 -5
  5. data/components/checks/active/ldap_injection/errors.txt +1 -0
  6. data/components/checks/active/source_code_disclosure.rb +1 -1
  7. data/components/checks/active/unvalidated_redirect.rb +6 -6
  8. data/components/checks/active/unvalidated_redirect_dom.rb +10 -7
  9. data/components/checks/passive/grep/captcha.rb +14 -5
  10. data/components/checks/passive/grep/form_upload.rb +7 -3
  11. data/components/checks/passive/grep/hsts.rb +3 -3
  12. data/components/checks/passive/grep/html_objects.rb +2 -3
  13. data/components/checks/passive/grep/http_only_cookies.rb +2 -3
  14. data/components/checks/passive/grep/insecure_cookies.rb +1 -1
  15. data/components/checks/passive/grep/password_autocomplete.rb +2 -2
  16. data/components/checks/passive/grep/unencrypted_password_forms.rb +7 -7
  17. data/components/checks/passive/grep/x_frame_options.rb +2 -2
  18. data/components/checks/passive/http_put.rb +2 -3
  19. data/components/path_extractors/comments.rb +3 -3
  20. data/components/path_extractors/scripts.rb +10 -1
  21. data/components/plugins/defaults/autothrottle.rb +27 -18
  22. data/components/plugins/defaults/meta/remedies/discovery.rb +30 -33
  23. data/components/plugins/defaults/meta/remedies/timing_attacks.rb +7 -11
  24. data/components/plugins/login_script.rb +9 -3
  25. data/components/plugins/proxy.rb +4 -3
  26. data/components/reporters/html.rb +11 -14
  27. data/components/reporters/html/default/issue.erb +13 -38
  28. data/components/reporters/html/default/issue/info.erb +1 -1
  29. data/components/reporters/html/default/summary/issues/by_name.erb +3 -3
  30. data/components/reporters/stdout.rb +62 -71
  31. data/components/reporters/xml.rb +26 -40
  32. data/components/reporters/xml/schema.xsd +43 -89
  33. data/lib/arachni/browser.rb +52 -3
  34. data/lib/arachni/browser/javascript.rb +3 -3
  35. data/lib/arachni/browser/javascript/scripts/taint_tracer.js +46 -25
  36. data/lib/arachni/browser_cluster.rb +61 -0
  37. data/lib/arachni/browser_cluster/job.rb +21 -1
  38. data/lib/arachni/browser_cluster/jobs/browser_provider.rb +3 -1
  39. data/lib/arachni/browser_cluster/jobs/resource_exploration.rb +2 -1
  40. data/lib/arachni/browser_cluster/jobs/resource_exploration/event_trigger.rb +2 -1
  41. data/lib/arachni/browser_cluster/jobs/taint_trace.rb +3 -2
  42. data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger.rb +1 -1
  43. data/lib/arachni/browser_cluster/worker.rb +5 -0
  44. data/lib/arachni/check/auditor.rb +22 -12
  45. data/lib/arachni/data/framework.rb +13 -1
  46. data/lib/arachni/data/issues.rb +9 -25
  47. data/lib/arachni/element/base.rb +9 -3
  48. data/lib/arachni/element/capabilities/analyzable.rb +2 -6
  49. data/lib/arachni/element/capabilities/analyzable/differential.rb +24 -7
  50. data/lib/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +23 -23
  51. data/lib/arachni/element/capabilities/auditable.rb +0 -6
  52. data/lib/arachni/element/capabilities/dom_only.rb +61 -0
  53. data/lib/arachni/element/capabilities/with_dom.rb +3 -1
  54. data/lib/arachni/element/cookie.rb +35 -5
  55. data/lib/arachni/element/cookie/dom.rb +13 -4
  56. data/lib/arachni/element/{capabilities/auditable/dom.rb → dom.rb} +20 -68
  57. data/lib/arachni/element/dom/capabilities/auditable.rb +29 -0
  58. data/lib/arachni/element/dom/capabilities/inputtable.rb +27 -0
  59. data/lib/arachni/element/dom/capabilities/mutable.rb +21 -0
  60. data/lib/arachni/element/dom/capabilities/submittable.rb +52 -0
  61. data/lib/arachni/element/form.rb +12 -1
  62. data/lib/arachni/element/form/capabilities/mutable.rb +2 -1
  63. data/lib/arachni/element/form/capabilities/with_dom.rb +0 -1
  64. data/lib/arachni/element/form/dom.rb +9 -3
  65. data/lib/arachni/element/header.rb +14 -33
  66. data/lib/arachni/element/header/capabilities/inputtable.rb +29 -0
  67. data/lib/arachni/element/header/capabilities/mutable.rb +51 -0
  68. data/lib/arachni/element/input/dom.rb +71 -0
  69. data/lib/arachni/element/json.rb +2 -0
  70. data/lib/arachni/element/link.rb +3 -0
  71. data/lib/arachni/element/link/capabilities/with_dom.rb +0 -1
  72. data/lib/arachni/element/link/dom.rb +16 -3
  73. data/lib/arachni/element/link/dom/capabilities/submittable.rb +29 -0
  74. data/lib/arachni/element/link_template.rb +3 -5
  75. data/lib/arachni/element/link_template/capabilities/inputtable.rb +5 -0
  76. data/lib/arachni/element/link_template/capabilities/with_dom.rb +0 -1
  77. data/lib/arachni/element/link_template/dom.rb +16 -3
  78. data/lib/arachni/element/link_template/dom/capabilities/submittable.rb +29 -0
  79. data/lib/arachni/element/server.rb +3 -5
  80. data/lib/arachni/element/ui_form.rb +106 -0
  81. data/lib/arachni/element/ui_form/dom.rb +107 -0
  82. data/lib/arachni/element/ui_input.rb +62 -0
  83. data/lib/arachni/element/xml.rb +2 -1
  84. data/lib/arachni/framework.rb +7 -5
  85. data/lib/arachni/framework/parts/audit.rb +0 -1
  86. data/lib/arachni/framework/parts/check.rb +1 -0
  87. data/lib/arachni/framework/parts/data.rb +4 -0
  88. data/lib/arachni/framework/parts/state.rb +0 -2
  89. data/lib/arachni/http/client.rb +17 -6
  90. data/lib/arachni/http/proxy_server.rb +52 -5
  91. data/lib/arachni/http/request.rb +1 -1
  92. data/lib/arachni/issue.rb +34 -179
  93. data/lib/arachni/issue/severity.rb +2 -0
  94. data/lib/arachni/option_groups/audit.rb +22 -2
  95. data/lib/arachni/option_groups/browser_cluster.rb +15 -0
  96. data/lib/arachni/page.rb +3 -2
  97. data/lib/arachni/parser.rb +24 -5
  98. data/lib/arachni/platform/manager.rb +1 -2
  99. data/lib/arachni/rpc/server/framework.rb +3 -4
  100. data/lib/arachni/rpc/server/framework/multi_instance.rb +2 -1
  101. data/lib/arachni/session.rb +1 -1
  102. data/lib/arachni/trainer.rb +4 -7
  103. data/lib/arachni/watir/element.rb +12 -1
  104. data/lib/version +1 -1
  105. data/spec/arachni/browser/element_locator_spec.rb +43 -43
  106. data/spec/arachni/browser/javascript/dom_monitor_spec.rb +44 -44
  107. data/spec/arachni/browser/javascript/proxy/stub_spec.rb +17 -14
  108. data/spec/arachni/browser/javascript/proxy_spec.rb +24 -24
  109. data/spec/arachni/browser/javascript/taint_tracer/frame/called_function_spec.rb +11 -11
  110. data/spec/arachni/browser/javascript/taint_tracer/frame_spec.rb +7 -7
  111. data/spec/arachni/browser/javascript/taint_tracer/sink/data_flow_spec.rb +13 -13
  112. data/spec/arachni/browser/javascript/taint_tracer/sink/execution_flow_spec.rb +7 -7
  113. data/spec/arachni/browser/javascript/taint_tracer_spec.rb +568 -558
  114. data/spec/arachni/browser/javascript_spec.rb +73 -63
  115. data/spec/arachni/browser_cluster/job/result_spec.rb +3 -3
  116. data/spec/arachni/browser_cluster/job_spec.rb +68 -48
  117. data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger/result_spec.rb +2 -2
  118. data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger_spec.rb +5 -4
  119. data/spec/arachni/browser_cluster/jobs/resource_exploration/result_spec.rb +2 -2
  120. data/spec/arachni/browser_cluster/jobs/resource_exploration_spec.rb +5 -5
  121. data/spec/arachni/browser_cluster/worker_spec.rb +87 -70
  122. data/spec/arachni/browser_cluster_spec.rb +64 -39
  123. data/spec/arachni/browser_spec.rb +692 -527
  124. data/spec/arachni/check/auditor_spec.rb +177 -147
  125. data/spec/arachni/check/base_spec.rb +33 -33
  126. data/spec/arachni/check/manager_spec.rb +15 -15
  127. data/spec/arachni/component/base_spec.rb +8 -8
  128. data/spec/arachni/component/manager_spec.rb +100 -99
  129. data/spec/arachni/component/options/address_spec.rb +3 -3
  130. data/spec/arachni/component/options/base_spec.rb +7 -7
  131. data/spec/arachni/component/options/bool_spec.rb +9 -9
  132. data/spec/arachni/component/options/float_spec.rb +6 -6
  133. data/spec/arachni/component/options/int_spec.rb +5 -5
  134. data/spec/arachni/component/options/multiple_choice_spec.rb +12 -12
  135. data/spec/arachni/component/options/object_spec.rb +2 -2
  136. data/spec/arachni/component/options/path_spec.rb +3 -3
  137. data/spec/arachni/component/options/port_spec.rb +5 -5
  138. data/spec/arachni/component/options/string_spec.rb +3 -3
  139. data/spec/arachni/component/options/url_spec.rb +4 -4
  140. data/spec/arachni/component/utilities_spec.rb +2 -2
  141. data/spec/arachni/data/framework/rpc_spec.rb +10 -9
  142. data/spec/arachni/data/framework_spec.rb +65 -46
  143. data/spec/arachni/data/issues_spec.rb +39 -77
  144. data/spec/arachni/data/plugins_spec.rb +11 -11
  145. data/spec/arachni/data/session_spec.rb +6 -6
  146. data/spec/arachni/data_spec.rb +8 -8
  147. data/spec/arachni/element/body_spec.rb +10 -10
  148. data/spec/arachni/element/capabilities/analyzable/differential_spec.rb +39 -21
  149. data/spec/arachni/element/capabilities/analyzable/{taint_spec.rb → signature_spec.rb} +63 -63
  150. data/spec/arachni/element/capabilities/analyzable/timeout_spec.rb +51 -51
  151. data/spec/arachni/element/capabilities/with_scope/scope_spec.rb +5 -5
  152. data/spec/arachni/element/cookie/dom_spec.rb +37 -18
  153. data/spec/arachni/element/cookie_spec.rb +206 -139
  154. data/spec/arachni/element/form/dom_spec.rb +36 -19
  155. data/spec/arachni/element/form_spec.rb +210 -187
  156. data/spec/arachni/element/generic_dom_spec.rb +14 -14
  157. data/spec/arachni/element/header_spec.rb +35 -17
  158. data/spec/arachni/element/json_spec.rb +53 -31
  159. data/spec/arachni/element/link/dom_spec.rb +46 -28
  160. data/spec/arachni/element/link_spec.rb +58 -40
  161. data/spec/arachni/element/link_template/dom_spec.rb +47 -29
  162. data/spec/arachni/element/link_template_spec.rb +79 -61
  163. data/spec/arachni/element/path_spec.rb +1 -1
  164. data/spec/arachni/element/server_spec.rb +33 -32
  165. data/spec/arachni/element/ui_form/ui_form_dom_spec.rb +164 -0
  166. data/spec/arachni/element/ui_form_spec.rb +242 -0
  167. data/spec/arachni/element/ui_input/dom_spec.rb +157 -0
  168. data/spec/arachni/element/ui_input_spec.rb +136 -0
  169. data/spec/arachni/element/xml_spec.rb +42 -24
  170. data/spec/arachni/element_filter_spec.rb +49 -48
  171. data/spec/arachni/error_spec.rb +3 -3
  172. data/spec/arachni/framework/parts/audit_spec.rb +64 -63
  173. data/spec/arachni/framework/parts/browser_spec.rb +16 -16
  174. data/spec/arachni/framework/parts/check_spec.rb +3 -3
  175. data/spec/arachni/framework/parts/data_spec.rb +48 -48
  176. data/spec/arachni/framework/parts/platform_spec.rb +3 -3
  177. data/spec/arachni/framework/parts/plugin_spec.rb +7 -6
  178. data/spec/arachni/framework/parts/report_spec.rb +7 -7
  179. data/spec/arachni/framework/parts/scope_spec.rb +16 -16
  180. data/spec/arachni/framework/parts/state_spec.rb +68 -69
  181. data/spec/arachni/framework_spec.rb +39 -31
  182. data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +32 -32
  183. data/spec/arachni/http/client_spec.rb +219 -208
  184. data/spec/arachni/http/cookie_jar_spec.rb +72 -72
  185. data/spec/arachni/http/headers_spec.rb +14 -14
  186. data/spec/arachni/http/proxy_server_spec.rb +43 -42
  187. data/spec/arachni/http/request_spec.rb +105 -103
  188. data/spec/arachni/http/response/scope_spec.rb +24 -24
  189. data/spec/arachni/http/response_spec.rb +50 -49
  190. data/spec/arachni/issue/severity_spec.rb +10 -9
  191. data/spec/arachni/issue_spec.rb +71 -369
  192. data/spec/arachni/option_groups/audit_spec.rb +114 -114
  193. data/spec/arachni/option_groups/browser_cluster_spec.rb +20 -3
  194. data/spec/arachni/option_groups/datastore_spec.rb +6 -6
  195. data/spec/arachni/option_groups/dispatcher_spec.rb +19 -19
  196. data/spec/arachni/option_groups/http_spec.rb +11 -11
  197. data/spec/arachni/option_groups/input_spec.rb +31 -27
  198. data/spec/arachni/option_groups/output_spec.rb +2 -2
  199. data/spec/arachni/option_groups/paths_spec.rb +17 -17
  200. data/spec/arachni/option_groups/rpc_spec.rb +2 -2
  201. data/spec/arachni/option_groups/scope_spec.rb +40 -40
  202. data/spec/arachni/option_groups/session_spec.rb +6 -5
  203. data/spec/arachni/option_groups/snapshot_spec.rb +4 -4
  204. data/spec/arachni/options_spec.rb +46 -45
  205. data/spec/arachni/page/dom/transition_spec.rb +74 -72
  206. data/spec/arachni/page/dom_spec.rb +35 -35
  207. data/spec/arachni/page/scope_spec.rb +15 -15
  208. data/spec/arachni/page_spec.rb +217 -217
  209. data/spec/arachni/parser_spec.rb +106 -104
  210. data/spec/arachni/platform/fingerprinter_spec.rb +17 -14
  211. data/spec/arachni/platform/list_spec.rb +33 -33
  212. data/spec/arachni/platform/manager_spec.rb +67 -64
  213. data/spec/arachni/plugin/base_spec.rb +10 -10
  214. data/spec/arachni/plugin/manager_spec.rb +38 -37
  215. data/spec/arachni/report_spec.rb +43 -40
  216. data/spec/arachni/reporter/base_spec.rb +15 -15
  217. data/spec/arachni/reporter/manager_spec.rb +4 -4
  218. data/spec/arachni/reporter/options_spec.rb +6 -6
  219. data/spec/arachni/rpc/client/base_spec.rb +6 -6
  220. data/spec/arachni/rpc/client/dispatcher_spec.rb +2 -2
  221. data/spec/arachni/rpc/client/instance_spec.rb +6 -6
  222. data/spec/arachni/rpc/server/active_options_spec.rb +11 -8
  223. data/spec/arachni/rpc/server/base_spec.rb +5 -5
  224. data/spec/arachni/rpc/server/checks/manager_spec.rb +8 -8
  225. data/spec/arachni/rpc/server/dispatcher/node_spec.rb +37 -37
  226. data/spec/arachni/rpc/server/dispatcher/service_spec.rb +15 -14
  227. data/spec/arachni/rpc/server/dispatcher_spec.rb +36 -35
  228. data/spec/arachni/rpc/server/framework/distributor_spec.rb +36 -36
  229. data/spec/arachni/rpc/server/framework_multi_spec.rb +340 -336
  230. data/spec/arachni/rpc/server/framework_spec.rb +90 -85
  231. data/spec/arachni/rpc/server/instance_spec.rb +126 -107
  232. data/spec/arachni/rpc/server/output_spec.rb +1 -1
  233. data/spec/arachni/rpc/server/plugin/manager_spec.rb +6 -6
  234. data/spec/arachni/ruby/array_spec.rb +42 -42
  235. data/spec/arachni/ruby/hash_spec.rb +20 -18
  236. data/spec/arachni/ruby/io_spec.rb +2 -2
  237. data/spec/arachni/ruby/object_spec.rb +1 -1
  238. data/spec/arachni/ruby/set_spec.rb +3 -3
  239. data/spec/arachni/ruby/string_spec.rb +30 -30
  240. data/spec/arachni/ruby/webrick_spec.rb +2 -2
  241. data/spec/arachni/scope_spec.rb +1 -1
  242. data/spec/arachni/session_spec.rb +67 -64
  243. data/spec/arachni/snapshot_spec.rb +15 -15
  244. data/spec/arachni/state/audit_spec.rb +11 -11
  245. data/spec/arachni/state/element_filter_spec.rb +6 -6
  246. data/spec/arachni/state/framework/rpc_spec.rb +12 -12
  247. data/spec/arachni/state/framework_spec.rb +125 -121
  248. data/spec/arachni/state/http_spec.rb +7 -7
  249. data/spec/arachni/state/options_spec.rb +7 -7
  250. data/spec/arachni/state/plugins_spec.rb +8 -8
  251. data/spec/arachni/state_spec.rb +10 -10
  252. data/spec/arachni/support/buffer/autoflush_spec.rb +16 -16
  253. data/spec/arachni/support/buffer/base_spec.rb +39 -39
  254. data/spec/arachni/support/cache/least_cost_replacement_spec.rb +18 -18
  255. data/spec/arachni/support/cache/least_recently_pushed_spec.rb +24 -24
  256. data/spec/arachni/support/cache/least_recently_used_spec.rb +20 -20
  257. data/spec/arachni/support/cache/preference_spec.rb +4 -4
  258. data/spec/arachni/support/cache/random_replacement_spec.rb +8 -8
  259. data/spec/arachni/support/crypto/rsa_aes_cbc_spec.rb +1 -1
  260. data/spec/arachni/support/database/hash_spec.rb +44 -43
  261. data/spec/arachni/support/database/queue_spec.rb +27 -27
  262. data/spec/arachni/support/lookup/hash_set_spec.rb +8 -8
  263. data/spec/arachni/support/lookup/moolb_spec.rb +3 -3
  264. data/spec/arachni/support/mixins/observable_spec.rb +6 -6
  265. data/spec/arachni/support/signature_spec.rb +19 -19
  266. data/spec/arachni/trainer_spec.rb +39 -39
  267. data/spec/arachni/typhoeus/hydra_spec.rb +2 -2
  268. data/spec/arachni/uri/scope_spec.rb +66 -66
  269. data/spec/arachni/uri_spec.rb +107 -105
  270. data/spec/arachni/utilities_spec.rb +40 -40
  271. data/spec/components/checks/active/csrf_spec.rb +8 -8
  272. data/spec/components/checks/active/no_sql_injection_spec.rb +1 -1
  273. data/spec/components/checks/active/sql_injection_spec.rb +16 -16
  274. data/spec/components/checks/active/trainer_spec.rb +4 -4
  275. data/spec/components/checks/active/unvalidated_redirect_dom_spec.rb +4 -2
  276. data/spec/components/checks/active/xpath_injection_spec.rb +1 -1
  277. data/spec/components/checks/active/xss_dom_script_context_spec.rb +51 -21
  278. data/spec/components/checks/active/xss_dom_spec.rb +46 -24
  279. data/spec/components/checks/passive/allowed_methods_spec.rb +1 -1
  280. data/spec/components/checks/passive/grep/cookie_set_for_parent_domain_spec.rb +1 -1
  281. data/spec/components/checks/passive/grep/hsts_spec.rb +2 -2
  282. data/spec/components/checks/passive/grep/http_only_cookies_spec.rb +1 -1
  283. data/spec/components/checks/passive/grep/insecure_cookies_spec.rb +1 -1
  284. data/spec/components/checks/passive/grep/insecure_cors_policy_spec.rb +2 -2
  285. data/spec/components/checks/passive/grep/password_autocomplete_spec.rb +1 -1
  286. data/spec/components/checks/passive/grep/private_ip_spec.rb +3 -3
  287. data/spec/components/checks/passive/grep/unencrypted_password_forms_spec.rb +1 -1
  288. data/spec/components/checks/passive/grep/x_frame_options_spec.rb +2 -2
  289. data/spec/components/checks/passive/interesting_responses_spec.rb +2 -2
  290. data/spec/components/checks/passive/webdav_spec.rb +1 -1
  291. data/spec/components/checks/passive/xst_spec.rb +1 -1
  292. data/spec/components/fingerprinters/servers/apache_spec.rb +2 -2
  293. data/spec/components/path_extractors/comments_spec.rb +5 -1
  294. data/spec/components/path_extractors/scripts_spec.rb +5 -2
  295. data/spec/components/plugins/autologin_spec.rb +22 -22
  296. data/spec/components/plugins/autothrottle_spec.rb +6 -5
  297. data/spec/components/plugins/content_types_spec.rb +4 -4
  298. data/spec/components/plugins/cookie_collector_spec.rb +5 -5
  299. data/spec/components/plugins/exec_spec.rb +12 -12
  300. data/spec/components/plugins/form_dicattack_spec.rb +3 -3
  301. data/spec/components/plugins/headers_collector_spec.rb +8 -8
  302. data/spec/components/plugins/healthmap_spec.rb +3 -3
  303. data/spec/components/plugins/http_dicattack_spec.rb +3 -3
  304. data/spec/components/plugins/login_script_spec.rb +79 -22
  305. data/spec/components/plugins/meta/remedies/discovery_spec.rb +3 -2
  306. data/spec/components/plugins/meta/remedies/timing_attacks_spec.rb +3 -3
  307. data/spec/components/plugins/meta/uniformity_spec.rb +2 -2
  308. data/spec/components/plugins/restrict_to_dom_state_spec.rb +1 -1
  309. data/spec/components/plugins/script_spec.rb +1 -1
  310. data/spec/components/plugins/uncommon_headers_spec.rb +2 -2
  311. data/spec/components/plugins/vector_collector_spec.rb +2 -2
  312. data/spec/components/plugins/vector_feed_spec.rb +40 -40
  313. data/spec/components/plugins/waf_detector_spec.rb +6 -6
  314. data/spec/components/reporters/json_spec.rb +4 -4
  315. data/spec/components/reporters/marshal_spec.rb +2 -2
  316. data/spec/components/reporters/yaml_spec.rb +3 -2
  317. data/spec/external/wavsep/active/sqli_spec.rb +1 -3
  318. data/spec/spec_helper.rb +4 -0
  319. data/spec/support/factories/element/ui_form.rb +14 -0
  320. data/spec/support/factories/element/ui_input.rb +13 -0
  321. data/spec/support/factories/issue.rb +0 -13
  322. data/spec/support/fixtures/report.afr +0 -0
  323. data/spec/support/fixtures/{taint_check/taint.rb → signature_check/signature.rb} +2 -2
  324. data/spec/support/helpers/browser_cluster/jobs/taint_tracer.rb +11 -11
  325. data/spec/support/helpers/framework.rb +1 -1
  326. data/spec/support/helpers/pages.rb +2 -2
  327. data/spec/support/servers/arachni/browser.rb +139 -0
  328. data/spec/support/servers/arachni/browser/javascript/taint_tracer.rb +40 -0
  329. data/spec/support/servers/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +0 -0
  330. data/spec/support/servers/arachni/element/input/input_dom.rb +102 -0
  331. data/spec/support/servers/arachni/element/ui_form/ui_form_dom.rb +238 -0
  332. data/spec/support/servers/checks/active/trainer_check.rb +7 -7
  333. data/spec/support/servers/checks/active/unvalidated_redirect_dom.rb +22 -6
  334. data/spec/support/servers/checks/active/xss_dom.rb +50 -0
  335. data/spec/support/servers/checks/active/xss_dom_script_context.rb +53 -0
  336. data/spec/support/shared/browser/javascript/taint_tracer/sink/base.rb +6 -6
  337. data/spec/support/shared/check.rb +10 -12
  338. data/spec/support/shared/component/options/base.rb +24 -24
  339. data/spec/support/shared/element/base.rb +25 -25
  340. data/spec/support/shared/element/capabilities/auditable.rb +116 -140
  341. data/spec/support/shared/element/capabilities/dom_only.rb +65 -0
  342. data/spec/support/shared/element/capabilities/inputtable.rb +71 -86
  343. data/spec/support/shared/element/capabilities/mutable.rb +122 -111
  344. data/spec/support/shared/element/capabilities/refreshable.rb +10 -10
  345. data/spec/support/shared/element/capabilities/{submitable.rb → submittable.rb} +26 -26
  346. data/spec/support/shared/element/capabilities/with_auditor.rb +10 -10
  347. data/spec/support/shared/element/capabilities/with_dom.rb +8 -8
  348. data/spec/support/shared/element/capabilities/with_node.rb +4 -6
  349. data/spec/support/shared/element/capabilities/with_scope.rb +2 -2
  350. data/spec/support/shared/element/capabilities/with_source.rb +6 -8
  351. data/spec/support/shared/element/dom.rb +144 -0
  352. data/spec/support/shared/element/dom/auditable.rb +42 -0
  353. data/spec/support/shared/element/dom/inputtable.rb +5 -0
  354. data/spec/support/shared/element/dom/mutable.rb +3 -0
  355. data/spec/support/shared/element/dom/submittable.rb +119 -0
  356. data/spec/support/shared/external/wavsep.rb +3 -3
  357. data/spec/support/shared/fingerprinter.rb +2 -2
  358. data/spec/support/shared/framework.rb +1 -1
  359. data/spec/support/shared/http/message.rb +9 -9
  360. data/spec/support/shared/option_group.rb +17 -17
  361. data/spec/support/shared/path_extractor.rb +1 -1
  362. data/spec/support/shared/plugin.rb +2 -2
  363. data/spec/support/shared/support/cache.rb +57 -57
  364. data/spec/support/shared/support/lookup.rb +25 -25
  365. data/ui/cli/framework.rb +22 -11
  366. data/ui/cli/framework/option_parser.rb +15 -0
  367. data/ui/cli/option_parser.rb +8 -1
  368. data/ui/cli/output.rb +2 -1
  369. metadata +54 -20
  370. data/components/checks/active/xss_dom_inputs.rb +0 -236
  371. data/spec/components/checks/active/xss_dom_inputs_spec.rb +0 -30
  372. data/spec/support/servers/checks/active/xss_dom_inputs.rb +0 -59
  373. data/spec/support/shared/element/capabilities/auditable/dom.rb +0 -322
@@ -12,22 +12,22 @@ describe Arachni::Page::Scope do
12
12
 
13
13
  describe '#out?' do
14
14
  it 'returns false' do
15
- subject.out?.should be_false
15
+ expect(subject.out?).to be_falsey
16
16
  end
17
17
 
18
18
  context "when #{Arachni::HTTP::Response::Scope}#out?" do
19
19
  context true do
20
20
  it 'returns true' do
21
21
  # We can't stub #out? because we also override it.
22
- Arachni::HTTP::Response::Scope.any_instance.stub(:exclude?) { true }
23
- subject.out?.should be_true
22
+ allow_any_instance_of(Arachni::HTTP::Response::Scope).to receive(:exclude?) { true }
23
+ expect(subject.out?).to be_truthy
24
24
  end
25
25
  end
26
26
 
27
27
  context false do
28
28
  it 'returns false' do
29
- Arachni::HTTP::Response::Scope.any_instance.stub(:exclude?) { false }
30
- subject.out?.should be_false
29
+ allow_any_instance_of(Arachni::HTTP::Response::Scope).to receive(:exclude?) { false }
30
+ expect(subject.out?).to be_falsey
31
31
  end
32
32
  end
33
33
  end
@@ -35,15 +35,15 @@ describe Arachni::Page::Scope do
35
35
  context 'when #dom_depth_limit_reached?' do
36
36
  context true do
37
37
  it 'returns true' do
38
- subject.stub(:dom_depth_limit_reached?) { true }
39
- subject.out?.should be_true
38
+ allow(subject).to receive(:dom_depth_limit_reached?) { true }
39
+ expect(subject.out?).to be_truthy
40
40
  end
41
41
  end
42
42
 
43
43
  context false do
44
44
  it 'returns false' do
45
- subject.stub(:dom_depth_limit_reached?) { false }
46
- subject.out?.should be_false
45
+ allow(subject).to receive(:dom_depth_limit_reached?) { false }
46
+ expect(subject.out?).to be_falsey
47
47
  end
48
48
  end
49
49
  end
@@ -54,24 +54,24 @@ describe Arachni::Page::Scope do
54
54
  context 'been exceeded' do
55
55
  it 'returns true' do
56
56
  scope.dom_depth_limit = 2
57
- page.dom.stub(:depth) { 3 }
57
+ allow(page.dom).to receive(:depth) { 3 }
58
58
 
59
- subject.dom_depth_limit_reached?.should be_true
59
+ expect(subject.dom_depth_limit_reached?).to be_truthy
60
60
  end
61
61
  end
62
62
 
63
63
  context 'not been exceeded' do
64
64
  it 'returns false' do
65
65
  scope.dom_depth_limit = 2
66
- page.dom.stub(:depth) { 1 }
67
- subject.dom_depth_limit_reached?.should be_false
66
+ allow(page.dom).to receive(:depth) { 1 }
67
+ expect(subject.dom_depth_limit_reached?).to be_falsey
68
68
  end
69
69
  end
70
70
 
71
71
  context 'not been set' do
72
72
  it 'returns false' do
73
- page.dom.stub(:depth) { 3 }
74
- subject.dom_depth_limit_reached?.should be_false
73
+ allow(page.dom).to receive(:depth) { 3 }
74
+ expect(subject.dom_depth_limit_reached?).to be_falsey
75
75
  end
76
76
  end
77
77
  end
@@ -48,36 +48,36 @@ describe Arachni::Page do
48
48
 
49
49
  it "supports #{Arachni::RPC::Serializer}" do
50
50
  page_with_nonces.forms = page_with_nonces.forms
51
- page_with_nonces.should == Arachni::RPC::Serializer.deep_clone( page_with_nonces )
51
+ expect(page_with_nonces).to eq(Arachni::RPC::Serializer.deep_clone( page_with_nonces ))
52
52
  end
53
53
 
54
54
  describe '#to_rpc_data' do
55
55
  subject { rpc_subject }
56
56
 
57
57
  it "includes 'metadata'" do
58
- data['metadata'].should == subject.metadata
58
+ expect(data['metadata']).to eq(subject.metadata)
59
59
  end
60
60
 
61
61
  %w(response dom).each do |attribute|
62
62
  it "includes '#{attribute}'" do
63
- data[attribute].should == subject.send( attribute ).to_rpc_data
63
+ expect(data[attribute]).to eq(subject.send( attribute ).to_rpc_data)
64
64
  end
65
65
  end
66
66
 
67
67
  it "includes 'forms'" do
68
- data['forms'].should == subject.forms.map(&:to_rpc_data)
68
+ expect(data['forms']).to eq(subject.forms.map(&:to_rpc_data))
69
69
  end
70
70
 
71
71
  it "includes 'do_not_audit_elements'" do
72
- data['do_not_audit_elements'].should be_true
72
+ expect(data['do_not_audit_elements']).to be_truthy
73
73
  end
74
74
 
75
75
  it "includes 'element_audit_whitelist'" do
76
- data['element_audit_whitelist'].should == subject.element_audit_whitelist.to_a
76
+ expect(data['element_audit_whitelist']).to eq(subject.element_audit_whitelist.to_a)
77
77
  end
78
78
 
79
79
  it "does not include 'cookie_jar'" do
80
- data.should_not include 'cookie_jar'
80
+ expect(data).not_to include 'cookie_jar'
81
81
  end
82
82
  end
83
83
 
@@ -88,50 +88,50 @@ describe Arachni::Page do
88
88
 
89
89
  %w(response dom metadata forms).each do |attribute|
90
90
  it "restores '#{attribute}'" do
91
- restored.send( attribute ).should == subject.send( attribute )
91
+ expect(restored.send( attribute )).to eq(subject.send( attribute ))
92
92
  end
93
93
  end
94
94
 
95
95
  it "restores #{described_class::DOM}#page" do
96
- restored.dom.page.should == subject
96
+ expect(restored.dom.page).to eq(subject)
97
97
  end
98
98
 
99
99
  it "restores 'do_not_audit_elements'" do
100
- restored.instance_variable_get(:@do_not_audit_elements).should be_true
100
+ expect(restored.instance_variable_get(:@do_not_audit_elements)).to be_truthy
101
101
  end
102
102
 
103
103
  it "restores 'element_audit_whitelist'" do
104
- restored.element_audit_whitelist.should == subject.element_audit_whitelist
104
+ expect(restored.element_audit_whitelist).to eq(subject.element_audit_whitelist)
105
105
  end
106
106
 
107
107
  it 'restores Arachni::Element::Form#node of #forms' do
108
108
  form = subject.forms.last
109
- form.node.should be_kind_of Nokogiri::XML::Element
110
- form.node.should be_true
109
+ expect(form.node).to be_kind_of Nokogiri::XML::Element
110
+ expect(form.node).to be_truthy
111
111
 
112
- restored.forms.last.node.to_s.should == form.node.to_s
112
+ expect(restored.forms.last.node.to_s).to eq(form.node.to_s)
113
113
  end
114
114
 
115
115
  it 'restores Arachni::Element::Link#node of #links' do
116
116
  link = subject.links.last
117
- link.node.should be_kind_of Nokogiri::XML::Element
118
- link.node.should be_true
117
+ expect(link.node).to be_kind_of Nokogiri::XML::Element
118
+ expect(link.node).to be_truthy
119
119
 
120
- restored.links.last.node.to_s.should == link.node.to_s
120
+ expect(restored.links.last.node.to_s).to eq(link.node.to_s)
121
121
  end
122
122
 
123
123
  context Arachni::Page::DOM do
124
124
  [:url, :skip_states, :transitions, :data_flow_sinks, :execution_flow_sinks].each do |m|
125
125
  it "restores ##{m}" do
126
126
  # Make sure we're not comparing nils.
127
- subject.dom.send( m ).should be_true
127
+ expect(subject.dom.send( m )).to be_truthy
128
128
 
129
129
  # Make sure we're not comparing empty stuff.
130
130
  if (enumerable = restored.dom.send( m )).is_a? Enumerable
131
- enumerable.should be_any
131
+ expect(enumerable).to be_any
132
132
  end
133
133
 
134
- restored.dom.send( m ).should == subject.dom.send( m )
134
+ expect(restored.dom.send( m )).to eq(subject.dom.send( m ))
135
135
  end
136
136
  end
137
137
  end
@@ -145,18 +145,18 @@ describe Arachni::Page do
145
145
  page = described_class.new( response: response )
146
146
  parser = Arachni::Parser.new( response )
147
147
 
148
- page.url.should == parser.url
149
- page.method.should == parser.response.request.method
150
- page.response.should == parser.response
151
- page.body.should == parser.response.body
152
- page.query_vars.should == parser.link_vars
153
- page.paths.should == parser.paths
154
- page.links.should == parser.links
155
- page.forms.should == parser.forms
156
- page.cookies.should == parser.cookies_to_be_audited
157
- page.headers.should == parser.headers
158
- page.cookie_jar.should == parser.cookie_jar
159
- page.text?.should == parser.text?
148
+ expect(page.url).to eq(parser.url)
149
+ expect(page.method).to eq(parser.response.request.method)
150
+ expect(page.response).to eq(parser.response)
151
+ expect(page.body).to eq(parser.response.body)
152
+ expect(page.query_vars).to eq(parser.link_vars)
153
+ expect(page.paths).to eq(parser.paths)
154
+ expect(page.links).to eq(parser.links)
155
+ expect(page.forms).to eq(parser.forms)
156
+ expect(page.cookies).to eq(parser.cookies_to_be_audited)
157
+ expect(page.headers).to eq(parser.headers)
158
+ expect(page.cookie_jar).to eq(parser.cookie_jar)
159
+ expect(page.text?).to eq(parser.text?)
160
160
  end
161
161
  end
162
162
 
@@ -165,18 +165,18 @@ describe Arachni::Page do
165
165
  parser = Arachni::Parser.new( response )
166
166
  page = described_class.new( parser: parser )
167
167
 
168
- page.url.should == parser.url
169
- page.method.should == parser.response.request.method
170
- page.response.should == parser.response
171
- page.body.should == parser.response.body
172
- page.query_vars.should == parser.link_vars
173
- page.paths.should == parser.paths
174
- page.links.should == parser.links
175
- page.forms.should == parser.forms
176
- page.cookies.should == parser.cookies_to_be_audited
177
- page.headers.should == parser.headers
178
- page.cookie_jar.should == parser.cookie_jar
179
- page.text?.should == parser.text?
168
+ expect(page.url).to eq(parser.url)
169
+ expect(page.method).to eq(parser.response.request.method)
170
+ expect(page.response).to eq(parser.response)
171
+ expect(page.body).to eq(parser.response.body)
172
+ expect(page.query_vars).to eq(parser.link_vars)
173
+ expect(page.paths).to eq(parser.paths)
174
+ expect(page.links).to eq(parser.links)
175
+ expect(page.forms).to eq(parser.forms)
176
+ expect(page.cookies).to eq(parser.cookies_to_be_audited)
177
+ expect(page.headers).to eq(parser.headers)
178
+ expect(page.cookie_jar).to eq(parser.cookie_jar)
179
+ expect(page.text?).to eq(parser.text?)
180
180
  end
181
181
  end
182
182
 
@@ -192,8 +192,8 @@ describe Arachni::Page do
192
192
  }
193
193
  ).dom
194
194
 
195
- dom.url.should == 'http://test/#/stuff'
196
- dom.transitions.should == [ page: :load ]
195
+ expect(dom.url).to eq('http://test/#/stuff')
196
+ expect(dom.transitions).to eq([ page: :load ])
197
197
  end
198
198
  end
199
199
  end
@@ -214,16 +214,16 @@ describe Arachni::Page do
214
214
  describe '#element_audit_whitelist' do
215
215
  describe 'by default' do
216
216
  it 'returns an empty Set' do
217
- subject.element_audit_whitelist.should be_empty
218
- subject.element_audit_whitelist.should be_kind_of Set
217
+ expect(subject.element_audit_whitelist).to be_empty
218
+ expect(subject.element_audit_whitelist).to be_kind_of Set
219
219
  end
220
220
  end
221
221
  end
222
222
 
223
223
  describe '#performer' do
224
224
  it "returns the #{Arachni::HTTP::Request}#performer" do
225
- page.request.stub(:performer){ :stuff }
226
- subject.performer.should == :stuff
225
+ allow(page.request).to receive(:performer){ :stuff }
226
+ expect(subject.performer).to eq(:stuff)
227
227
  end
228
228
  end
229
229
 
@@ -232,14 +232,14 @@ describe Arachni::Page do
232
232
  context Arachni::Element::Capabilities::Auditable do
233
233
  it 'updates the #element_audit_whitelist' do
234
234
  subject.update_element_audit_whitelist subject.elements.first
235
- subject.element_audit_whitelist.should include subject.elements.first.coverage_hash
235
+ expect(subject.element_audit_whitelist).to include subject.elements.first.coverage_hash
236
236
  end
237
237
  end
238
238
 
239
239
  context Integer do
240
240
  it 'updates the #element_audit_whitelist' do
241
241
  subject.update_element_audit_whitelist subject.elements.first.coverage_hash
242
- subject.element_audit_whitelist.should include subject.elements.first.coverage_hash
242
+ expect(subject.element_audit_whitelist).to include subject.elements.first.coverage_hash
243
243
  end
244
244
  end
245
245
 
@@ -247,16 +247,16 @@ describe Arachni::Page do
247
247
  context Arachni::Element::Capabilities::Auditable do
248
248
  it 'updates the #element_audit_whitelist' do
249
249
  subject.update_element_audit_whitelist [subject.elements[0],subject.elements[1]]
250
- subject.element_audit_whitelist.should include subject.elements[0].coverage_hash
251
- subject.element_audit_whitelist.should include subject.elements[1].coverage_hash
250
+ expect(subject.element_audit_whitelist).to include subject.elements[0].coverage_hash
251
+ expect(subject.element_audit_whitelist).to include subject.elements[1].coverage_hash
252
252
  end
253
253
  end
254
254
 
255
255
  context Integer do
256
256
  it 'updates the #element_audit_whitelist' do
257
257
  subject.update_element_audit_whitelist [subject.elements[0].coverage_hash, subject.elements[1].coverage_hash]
258
- subject.element_audit_whitelist.should include subject.elements[0].coverage_hash
259
- subject.element_audit_whitelist.should include subject.elements[1].coverage_hash
258
+ expect(subject.element_audit_whitelist).to include subject.elements[0].coverage_hash
259
+ expect(subject.element_audit_whitelist).to include subject.elements[1].coverage_hash
260
260
  end
261
261
  end
262
262
  end
@@ -266,19 +266,19 @@ describe Arachni::Page do
266
266
  describe '#do_not_audit_elements' do
267
267
  it 'forces #audit_element? to always return false' do
268
268
  subject.do_not_audit_elements
269
- subject.element_audit_whitelist.should be_empty
270
- subject.audit_element?( subject.elements.first ).should be_false
269
+ expect(subject.element_audit_whitelist).to be_empty
270
+ expect(subject.audit_element?( subject.elements.first )).to be_falsey
271
271
 
272
272
  subject.update_element_audit_whitelist subject.elements.first
273
- subject.audit_element?( subject.elements.first ).should be_false
273
+ expect(subject.audit_element?( subject.elements.first )).to be_falsey
274
274
  end
275
275
  end
276
276
 
277
277
  describe '#audit_element?' do
278
278
  context 'when there is no #element_audit_whitelist' do
279
279
  it 'returns true' do
280
- subject.element_audit_whitelist.should be_empty
281
- subject.audit_element?( subject.elements.first ).should be_true
280
+ expect(subject.element_audit_whitelist).to be_empty
281
+ expect(subject.audit_element?( subject.elements.first )).to be_truthy
282
282
  end
283
283
  end
284
284
 
@@ -288,14 +288,14 @@ describe Arachni::Page do
288
288
  context Integer do
289
289
  it 'returns true' do
290
290
  subject.update_element_audit_whitelist subject.elements.first
291
- subject.audit_element?( subject.elements.first.coverage_hash ).should be_true
291
+ expect(subject.audit_element?( subject.elements.first.coverage_hash )).to be_truthy
292
292
  end
293
293
  end
294
294
 
295
295
  context Arachni::Element::Capabilities::Auditable do
296
296
  it 'returns true' do
297
297
  subject.update_element_audit_whitelist subject.elements.first
298
- subject.audit_element?( subject.elements.first ).should be_true
298
+ expect(subject.audit_element?( subject.elements.first )).to be_truthy
299
299
  end
300
300
  end
301
301
  end
@@ -305,14 +305,14 @@ describe Arachni::Page do
305
305
  context Integer do
306
306
  it 'returns false' do
307
307
  subject.update_element_audit_whitelist subject.elements.first
308
- subject.audit_element?( subject.elements.last.coverage_hash ).should be_false
308
+ expect(subject.audit_element?( subject.elements.last.coverage_hash )).to be_falsey
309
309
  end
310
310
  end
311
311
 
312
312
  context Arachni::Element::Capabilities::Auditable do
313
313
  it 'returns false' do
314
314
  subject.update_element_audit_whitelist subject.elements.first
315
- subject.audit_element?( subject.elements.last ).should be_false
315
+ expect(subject.audit_element?( subject.elements.last )).to be_falsey
316
316
  end
317
317
  end
318
318
  end
@@ -322,27 +322,27 @@ describe Arachni::Page do
322
322
 
323
323
  describe '#response' do
324
324
  it 'returns the HTTP response for that page' do
325
- page.response.should == response
325
+ expect(page.response).to eq(response)
326
326
  end
327
327
  end
328
328
 
329
329
  describe '#request' do
330
330
  it 'returns the HTTP request for that page' do
331
- page.request.should == response.request
331
+ expect(page.request).to eq(response.request)
332
332
  end
333
333
  end
334
334
 
335
335
  describe '#body=' do
336
336
  it 'sets the #body' do
337
337
  subject.body = 'stuff'
338
- subject.body.should == 'stuff'
338
+ expect(subject.body).to eq('stuff')
339
339
  end
340
340
  it 'sets the applicable #parser body' do
341
341
  subject.body = 'stuff'
342
- subject.parser.body.should == 'stuff'
342
+ expect(subject.parser.body).to eq('stuff')
343
343
  end
344
344
  it 'calls #clear_cache' do
345
- subject.should receive(:clear_cache)
345
+ expect(subject).to receive(:clear_cache)
346
346
  subject.body = 'stuff'
347
347
  end
348
348
  it 'resets the #has_script? flag' do
@@ -351,24 +351,24 @@ describe Arachni::Page do
351
351
  headers: { 'content-type' => 'text/html' }
352
352
  )
353
353
 
354
- page.has_script?.should be_false
354
+ expect(page.has_script?).to be_falsey
355
355
  page.body = '<script></script>'
356
- page.has_script?.should be_true
356
+ expect(page.has_script?).to be_truthy
357
357
  end
358
358
  end
359
359
 
360
360
  describe '#parser' do
361
361
  it 'is lazy-loaded' do
362
- subject.cache[:parser].should be_nil
363
- subject.parser.should be_kind_of Arachni::Parser
364
- subject.cache[:parser].should == subject.parser
362
+ expect(subject.cache[:parser]).to be_nil
363
+ expect(subject.parser).to be_kind_of Arachni::Parser
364
+ expect(subject.cache[:parser]).to eq(subject.parser)
365
365
  end
366
366
 
367
367
  it 'is cached' do
368
368
  s = subject.dup
369
369
 
370
370
  s.parser
371
- Arachni::Parser.should_not receive(:new)
371
+ expect(Arachni::Parser).not_to receive(:new)
372
372
  s.parser
373
373
  end
374
374
 
@@ -377,11 +377,11 @@ describe Arachni::Page do
377
377
  response: response.tap { |r| r.body = 'blah'},
378
378
  body: 'stuff'
379
379
  )
380
- page.body.should == 'stuff'
381
- page.parser.body.should == page.body
380
+ expect(page.body).to eq('stuff')
381
+ expect(page.parser.body).to eq(page.body)
382
382
 
383
383
  page.body = 'stuff2'
384
- page.parser.body.should == page.body
384
+ expect(page.parser.body).to eq(page.body)
385
385
  end
386
386
  end
387
387
 
@@ -391,18 +391,18 @@ describe Arachni::Page do
391
391
 
392
392
  describe "##{element}" do
393
393
  it 'sets the correct #page association' do
394
- subject.send(element).each { |e| e.page.should == subject }
394
+ subject.send(element).each { |e| expect(e.page).to eq(subject) }
395
395
  end
396
396
 
397
397
  it 'is lazy-loaded' do
398
- subject.cache[element].should be_nil
399
- subject.send(element).should be_any
400
- subject.cache[element].should == subject.send(element)
398
+ expect(subject.cache[element]).to be_nil
399
+ expect(subject.send(element)).to be_any
400
+ expect(subject.cache[element]).to eq(subject.send(element))
401
401
  end
402
402
 
403
403
  it 'delegates to Parser' do
404
404
  s = subject.dup
405
- s.parser.should receive(parser_method).and_return([])
405
+ expect(s.parser).to receive(parser_method).and_return([])
406
406
  s.send(element)
407
407
  end
408
408
 
@@ -410,12 +410,12 @@ describe Arachni::Page do
410
410
  s = subject.dup
411
411
 
412
412
  s.send(element)
413
- s.parser.should_not receive(parser_method)
413
+ expect(s.parser).not_to receive(parser_method)
414
414
  s.send(element)
415
415
  end
416
416
 
417
417
  it 'is frozen' do
418
- subject.send(element).should be_frozen
418
+ expect(subject.send(element)).to be_frozen
419
419
  end
420
420
  end
421
421
 
@@ -425,33 +425,33 @@ describe Arachni::Page do
425
425
  let(:list) { [element_klass.new( url: subject.url, inputs: { test: 1 } )] }
426
426
 
427
427
  it "sets the page ##{element}" do
428
- subject.send(element).should be_any
428
+ expect(subject.send(element)).to be_any
429
429
  subject.send("#{element}=", [])
430
- subject.send(element).should be_empty
430
+ expect(subject.send(element)).to be_empty
431
431
  subject.send("#{element}=", list)
432
- subject.send(element).should == list
432
+ expect(subject.send(element)).to eq(list)
433
433
  end
434
434
 
435
435
  it 'caches it' do
436
- subject.cache[element].should be_nil
436
+ expect(subject.cache[element]).to be_nil
437
437
  subject.send("#{element}=", list)
438
- subject.cache[element].should == list
438
+ expect(subject.cache[element]).to eq(list)
439
439
  end
440
440
 
441
441
  it "sets the #page association on the #{element_klass} elements" do
442
442
  subject.send( "#{element}=", list )
443
- subject.send(element).first.page.should == subject
443
+ expect(subject.send(element).first.page).to eq(subject)
444
444
  end
445
445
 
446
446
  it 'freezes the list' do
447
- subject.send(element).should be_frozen
447
+ expect(subject.send(element)).to be_frozen
448
448
  end
449
449
  end
450
450
  end
451
451
 
452
452
  describe '#platforms' do
453
453
  it 'returns platforms for the given page' do
454
- page.platforms.should be_kind_of Arachni::Platform::Manager
454
+ expect(page.platforms).to be_kind_of Arachni::Platform::Manager
455
455
  end
456
456
  end
457
457
 
@@ -459,39 +459,39 @@ describe Arachni::Page do
459
459
  context 'when the page has' do
460
460
  context '<script>' do
461
461
  it 'returns true' do
462
- create_page(
462
+ expect(create_page(
463
463
  body: '<Script>var i = '';</script>',
464
464
  headers: { 'content-type' => 'text/html' }
465
- ).has_script?.should be_true
465
+ ).has_script?).to be_truthy
466
466
  end
467
467
  end
468
468
  context 'elements with event attributes' do
469
469
  it 'returns true' do
470
- create_page(
470
+ expect(create_page(
471
471
  body: '<a onMouseOver="doStuff();">Stuff</a>',
472
472
  headers: { 'content-type' => 'text/html' }
473
- ).has_script?.should be_true
473
+ ).has_script?).to be_truthy
474
474
  end
475
475
  end
476
476
  context 'anchors with javacript: in href' do
477
477
  it 'returns true' do
478
- create_page(
478
+ expect(create_page(
479
479
  body: '<a href="JavaScript:doStuff();">Stuff</a>',
480
480
  headers: { 'content-type' => 'text/html' }
481
- ).has_script?.should be_true
481
+ ).has_script?).to be_truthy
482
482
  end
483
483
  end
484
484
  context 'forms with javacript: in action' do
485
485
  it 'returns true' do
486
- create_page(
486
+ expect(create_page(
487
487
  body: '<form action="javascript:doStuff();"></form>',
488
488
  headers: { 'content-type' => 'text/html' }
489
- ).has_script?.should be_true
489
+ ).has_script?).to be_truthy
490
490
  end
491
491
  end
492
492
  context 'no client-side code' do
493
493
  it 'returns false' do
494
- create_page( body: 'stuff' ).has_script?.should be_false
494
+ expect(create_page( body: 'stuff' ).has_script?).to be_falsey
495
495
  end
496
496
  end
497
497
  end
@@ -500,19 +500,19 @@ describe Arachni::Page do
500
500
  describe '#has_elements?' do
501
501
  context 'when the page has any of the given elements' do
502
502
  it 'returns true' do
503
- create_page(
503
+ expect(create_page(
504
504
  body: '<fOrM></form>',
505
505
  headers: { 'content-type' => 'text/html' }
506
- ).has_elements?( 'form', 'script' ).should be_true
506
+ ).has_elements?( 'form', 'script' )).to be_truthy
507
507
  end
508
508
  end
509
509
 
510
510
  context 'when the page has none of the given elements' do
511
511
  it 'returns false' do
512
- create_page(
512
+ expect(create_page(
513
513
  body: '<fOrM></form>',
514
514
  headers: { 'content-type' => 'text/html' }
515
- ).has_elements?( 'a', 'script' ).should be_false
515
+ ).has_elements?( 'a', 'script' )).to be_falsey
516
516
  end
517
517
  end
518
518
  end
@@ -520,13 +520,13 @@ describe Arachni::Page do
520
520
  describe '#text?' do
521
521
  context 'when the HTTP response is text/html' do
522
522
  it 'returns true' do
523
- Arachni::Parser.new( Factory[:html_response] ).page.text?.should be_true
523
+ expect(Arachni::Parser.new( Factory[:html_response] ).page.text?).to be_truthy
524
524
  end
525
525
  end
526
526
 
527
527
  context 'when the response is not text based' do
528
528
  it 'returns false' do
529
- Arachni::Parser.new( Factory[:binary_response] ).page.text?.should be_false
529
+ expect(Arachni::Parser.new( Factory[:binary_response] ).page.text?).to be_falsey
530
530
  end
531
531
  end
532
532
  end
@@ -542,19 +542,19 @@ describe Arachni::Page do
542
542
 
543
543
  c = p.dup
544
544
  c.links |= [Arachni::Element::Link.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
545
- c.should_not == p
545
+ expect(c).not_to eq(p)
546
546
 
547
547
  c = p.dup
548
548
  c.forms |= [Arachni::Element::Form.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
549
- c.should_not == p
549
+ expect(c).not_to eq(p)
550
550
 
551
551
  c = p.dup
552
552
  c.cookies |= [Arachni::Element::Cookie.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
553
- c.should_not == p
553
+ expect(c).not_to eq(p)
554
554
 
555
555
  c = p.dup
556
556
  c.dom.push_transition described_class::DOM::Transition.new( "<a href='#' id='stuff'>", :onhover )
557
- c.should_not == p
557
+ expect(c).not_to eq(p)
558
558
  end
559
559
  end
560
560
  context 'when the pages are identical' do
@@ -565,7 +565,7 @@ describe Arachni::Page do
565
565
  p.cookies |= [Arachni::Element::Cookie.new( url: 'http://test.com', inputs: { 'test' => 'stuff' } )]
566
566
 
567
567
  c = p.dup
568
- c.should == p
568
+ expect(c).to eq(p)
569
569
 
570
570
  p.links |= [Arachni::Element::Link.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
571
571
  p.forms |= [Arachni::Element::Form.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
@@ -577,7 +577,7 @@ describe Arachni::Page do
577
577
  c.cookies |= [Arachni::Element::Cookie.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
578
578
  c.dom.push_transition described_class::DOM::Transition.new( "<a href='#' id='stuff'>", :onhover )
579
579
 
580
- c.should == p
580
+ expect(c).to eq(p)
581
581
  end
582
582
  end
583
583
  end
@@ -592,15 +592,15 @@ describe Arachni::Page do
592
592
 
593
593
  c = p.dup
594
594
  c.links |= [Arachni::Element::Link.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
595
- c.should_not eql p
595
+ expect(c).not_to eql p
596
596
 
597
597
  c = p.dup
598
598
  c.forms |= [Arachni::Element::Form.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
599
- c.should_not eql p
599
+ expect(c).not_to eql p
600
600
 
601
601
  c = p.dup
602
602
  c.cookies |= [Arachni::Element::Cookie.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
603
- c.should_not eql p
603
+ expect(c).not_to eql p
604
604
  end
605
605
  end
606
606
  context 'when the pages are identical' do
@@ -611,7 +611,7 @@ describe Arachni::Page do
611
611
  p.cookies |= [Arachni::Element::Cookie.new( url: 'http://test.com', inputs: { 'test' => 'stuff' } )]
612
612
 
613
613
  c = p.dup
614
- c.should eql p
614
+ expect(c).to eql p
615
615
 
616
616
  c = p.dup
617
617
  p.links |= [Arachni::Element::Link.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
@@ -621,7 +621,7 @@ describe Arachni::Page do
621
621
  c.links |= [Arachni::Element::Link.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
622
622
  c.forms |= [Arachni::Element::Form.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
623
623
  c.cookies |= [Arachni::Element::Cookie.new( url: 'http://test.com', inputs: { 'test' => 'stuff2' } )]
624
- c.should eql p
624
+ expect(c).to eql p
625
625
  end
626
626
  end
627
627
  end
@@ -630,21 +630,21 @@ describe Arachni::Page do
630
630
  context 'when the page has a title' do
631
631
  it 'returns the page title' do
632
632
  title = 'Stuff here'
633
- create_page( body: "<title>#{title}</title>" ).title.should == title
634
- create_page( body: '<title></title>' ).title.should == ''
633
+ expect(create_page( body: "<title>#{title}</title>" ).title).to eq(title)
634
+ expect(create_page( body: '<title></title>' ).title).to eq('')
635
635
  end
636
636
  end
637
637
  context 'when the page does not have a title' do
638
638
  it 'returns nil' do
639
- create_page.title.should be_nil
640
- create_page( body: '' ).title.should be_nil
639
+ expect(create_page.title).to be_nil
640
+ expect(create_page( body: '' ).title).to be_nil
641
641
  end
642
642
  end
643
643
  end
644
644
 
645
645
  describe '#elements' do
646
646
  it 'returns all page elements' do
647
- page.elements.should == (page.links | page.forms | page.cookies | page.headers)
647
+ expect(page.elements).to eq(page.links | page.forms | page.cookies | page.headers)
648
648
  end
649
649
  end
650
650
 
@@ -654,30 +654,30 @@ describe Arachni::Page do
654
654
 
655
655
  elements = page.elements
656
656
  element = elements.pop
657
- element.scope.stub(:in?) { false }
657
+ allow(element.scope).to receive(:in?) { false }
658
658
 
659
- page.elements_within_scope.should == (elements - [element])
659
+ expect(page.elements_within_scope).to eq(elements - [element])
660
660
  end
661
661
  end
662
662
 
663
663
  describe '#clear_cache' do
664
664
  it 'returns self' do
665
- subject.clear_cache.should == subject
665
+ expect(subject.clear_cache).to eq(subject)
666
666
  end
667
667
 
668
668
  it 'clears the #cache' do
669
669
  cachable = [:query_vars, :links, :forms, :cookies, :headers, :paths,
670
670
  :document, :parser]
671
671
 
672
- subject.cache.keys.should be_empty
672
+ expect(subject.cache.keys).to be_empty
673
673
 
674
674
  cachable.each do |attribute|
675
675
  subject.send attribute
676
676
  end
677
677
 
678
- subject.cache.keys.sort.should == cachable.sort
678
+ expect(subject.cache.keys.sort).to eq(cachable.sort)
679
679
  subject.clear_cache
680
- subject.cache.keys.should be_empty
680
+ expect(subject.cache.keys).to be_empty
681
681
  end
682
682
 
683
683
  [:links, :forms, :cookies, :headers].each do |type|
@@ -685,21 +685,21 @@ describe Arachni::Page do
685
685
  it 'does not empty their cache' do
686
686
  subject.send("#{type}=", subject.send(type))
687
687
  subject.clear_cache
688
- subject.cache.keys.should == [type]
689
- subject.cache[type].should == subject.send(type)
688
+ expect(subject.cache.keys).to eq([type])
689
+ expect(subject.cache[type]).to eq(subject.send(type))
690
690
  end
691
691
  end
692
692
  end
693
693
 
694
694
  context 'when #forms have nonces' do
695
695
  it 'preserves them' do
696
- page_with_nonces.forms.map { |f| f.nonce_name }.sort.
697
- should == %w(nonce nonce2).sort
696
+ expect(page_with_nonces.forms.map { |f| f.nonce_name }.sort).
697
+ to eq(%w(nonce nonce2).sort)
698
698
 
699
699
  page_with_nonces.clear_cache
700
700
 
701
- page_with_nonces.forms.map { |f| f.nonce_name }.sort.
702
- should == %w(nonce nonce2).sort
701
+ expect(page_with_nonces.forms.map { |f| f.nonce_name }.sort).
702
+ to eq(%w(nonce nonce2).sort)
703
703
  end
704
704
  end
705
705
  end
@@ -708,38 +708,38 @@ describe Arachni::Page do
708
708
  it 'clears the #cache' do
709
709
  s = subject.dup
710
710
  s.prepare_for_report
711
- s.cache.should be_empty
711
+ expect(s.cache).to be_empty
712
712
  end
713
713
 
714
714
  it 'removes #dom#digest' do
715
715
  subject.dom.digest = 'stuff'
716
716
  subject.prepare_for_report
717
- subject.dom.digest.should be_nil
717
+ expect(subject.dom.digest).to be_nil
718
718
  end
719
719
 
720
720
  it 'removes #dom#skip_states' do
721
- subject.dom.skip_states.should be_true
721
+ expect(subject.dom.skip_states).to be_truthy
722
722
  subject.prepare_for_report
723
- subject.dom.digest.should be_nil
723
+ expect(subject.dom.digest).to be_nil
724
724
  end
725
725
 
726
726
  it 'returns self' do
727
- subject.prepare_for_report.should == subject
727
+ expect(subject.prepare_for_report).to eq(subject)
728
728
  end
729
729
 
730
730
  context 'if the body is not #text?' do
731
731
  let(:page) { Factory[:binary_response].to_page }
732
732
 
733
733
  it 'clears it' do
734
- page.body.should_not be_empty
734
+ expect(page.body).not_to be_empty
735
735
  page.prepare_for_report
736
- page.body.should be_empty
736
+ expect(page.body).to be_empty
737
737
  end
738
738
 
739
739
  it 'clears the #response#body' do
740
- page.response.body.should_not be_empty
740
+ expect(page.response.body).not_to be_empty
741
741
  page.prepare_for_report
742
- page.response.body.should be_empty
742
+ expect(page.response.body).to be_empty
743
743
  end
744
744
  end
745
745
  end
@@ -754,8 +754,8 @@ describe Arachni::Page do
754
754
 
755
755
  subject.update_metadata
756
756
 
757
- subject.metadata['form']['nonce_name'][form.coverage_hash].should == form.inputs.keys.first
758
- subject.metadata['form']['skip_dom'][form.coverage_hash].should == true
757
+ expect(subject.metadata['form']['nonce_name'][form.coverage_hash]).to eq(form.inputs.keys.first)
758
+ expect(subject.metadata['form']['skip_dom'][form.coverage_hash]).to eq(true)
759
759
  end
760
760
  end
761
761
 
@@ -776,8 +776,8 @@ describe Arachni::Page do
776
776
 
777
777
  subject.reload_metadata
778
778
 
779
- form.nonce_name.should == form.inputs.keys.first
780
- form.skip_dom.should == true
779
+ expect(form.nonce_name).to eq(form.inputs.keys.first)
780
+ expect(form.skip_dom).to eq(true)
781
781
  end
782
782
  end
783
783
 
@@ -796,7 +796,7 @@ describe Arachni::Page do
796
796
 
797
797
  subject.import_metadata( dpage )
798
798
 
799
- subject.metadata.should == dpage.metadata
799
+ expect(subject.metadata).to eq(dpage.metadata)
800
800
  end
801
801
 
802
802
  context 'when a type is given' do
@@ -814,24 +814,24 @@ describe Arachni::Page do
814
814
 
815
815
  subject.import_metadata( dpage, :skip_dom )
816
816
 
817
- subject.metadata['form']['nonce_name'].should be_nil
818
- subject.metadata['form']['skip_dom'][form.coverage_hash].should == true
817
+ expect(subject.metadata['form']['nonce_name']).to be_nil
818
+ expect(subject.metadata['form']['skip_dom'][form.coverage_hash]).to eq(true)
819
819
  end
820
820
  end
821
821
  end
822
822
 
823
823
  describe '#to_h' do
824
824
  it 'converts the page to a hash' do
825
- subject.to_h.should be_kind_of Hash
825
+ expect(subject.to_h).to be_kind_of Hash
826
826
 
827
827
  subject.to_h.each do |k, v|
828
- v.should == subject.send(k)
828
+ expect(v).to eq(subject.send(k))
829
829
  end
830
830
  end
831
831
 
832
832
  [:document, :do_not_audit_elements, :has_custom_elements, :parser].each do |k|
833
833
  it "does not include ':#{k}'" do
834
- subject.to_h.should_not include k
834
+ expect(subject.to_h).not_to include k
835
835
  end
836
836
  end
837
837
  end
@@ -840,7 +840,7 @@ describe Arachni::Page do
840
840
  describe "##{method}" do
841
841
  it 'returns a copy of the page' do
842
842
  dupped = subject.send(method)
843
- dupped.should == subject
843
+ expect(dupped).to eq(subject)
844
844
  end
845
845
 
846
846
  [:response, :metadata, :body, :links, :forms, :cookies, :headers, :cookie_jar, :paths].each do |m|
@@ -848,49 +848,49 @@ describe Arachni::Page do
848
848
  dupped = subject.send(method)
849
849
 
850
850
  # Make sure we're not comparing nils.
851
- subject.send( m ).should be_true
851
+ expect(subject.send( m )).to be_truthy
852
852
 
853
853
  # Make sure we're not comparing empty stuff.
854
854
  if (enumerable = dupped.send( m )).is_a? Enumerable
855
- enumerable.should be_any
855
+ expect(enumerable).to be_any
856
856
  end
857
857
 
858
- dupped.send( m ).should == subject.send( m )
858
+ expect(dupped.send( m )).to eq(subject.send( m ))
859
859
  end
860
860
  end
861
861
 
862
862
  it 'preserves #element_audit_whitelist' do
863
863
  subject.update_element_audit_whitelist subject.elements.first
864
864
  dupped = subject.send(method)
865
- dupped.element_audit_whitelist.should include subject.elements.first.coverage_hash
865
+ expect(dupped.element_audit_whitelist).to include subject.elements.first.coverage_hash
866
866
  end
867
867
 
868
868
  it 'preserves Arachni::Element::Form#node of #forms' do
869
869
  form = subject.forms.last
870
- form.node.should be_kind_of Nokogiri::XML::Element
871
- form.node.should be_true
870
+ expect(form.node).to be_kind_of Nokogiri::XML::Element
871
+ expect(form.node).to be_truthy
872
872
 
873
- subject.send(method).forms.last.node.to_s.should == form.node.to_s
873
+ expect(subject.send(method).forms.last.node.to_s).to eq(form.node.to_s)
874
874
  end
875
875
 
876
876
  it 'preserves Arachni::Element::Link#node of #links' do
877
877
  link = subject.links.last
878
- link.node.should be_kind_of Nokogiri::XML::Element
879
- link.node.should be_true
878
+ expect(link.node).to be_kind_of Nokogiri::XML::Element
879
+ expect(link.node).to be_truthy
880
880
 
881
- subject.send(method).links.last.node.to_s.should == link.node.to_s
881
+ expect(subject.send(method).links.last.node.to_s).to eq(link.node.to_s)
882
882
  end
883
883
 
884
884
  it 'preserves #page associations for #elements' do
885
885
  dup = subject.send(method)
886
- dup.elements.should be_any
887
- dup.elements.each { |e| e.page.should == subject }
886
+ expect(dup.elements).to be_any
887
+ dup.elements.each { |e| expect(e.page).to eq(subject) }
888
888
  end
889
889
 
890
890
  context 'when #forms have nonces' do
891
891
  it 'preserves them' do
892
- page_with_nonces.forms.map { |f| f.nonce_name }.sort.should == %w(nonce nonce2).sort
893
- page_with_nonces.send(method).forms.map { |f| f.nonce_name }.sort.should == %w(nonce nonce2).sort
892
+ expect(page_with_nonces.forms.map { |f| f.nonce_name }.sort).to eq(%w(nonce nonce2).sort)
893
+ expect(page_with_nonces.send(method).forms.map { |f| f.nonce_name }.sort).to eq(%w(nonce nonce2).sort)
894
894
  end
895
895
  end
896
896
 
@@ -900,14 +900,14 @@ describe Arachni::Page do
900
900
  dupped = subject.send(method)
901
901
 
902
902
  # Make sure we're not comparing nils.
903
- subject.dom.send( m ).should be_true
903
+ expect(subject.dom.send( m )).to be_truthy
904
904
 
905
905
  # Make sure we're not comparing empty stuff.
906
906
  if (enumerable = dupped.dom.send( m )).is_a? Enumerable
907
- enumerable.should be_any
907
+ expect(enumerable).to be_any
908
908
  end
909
909
 
910
- dupped.dom.send( m ).should == subject.dom.send( m )
910
+ expect(dupped.dom.send( m )).to eq(subject.dom.send( m ))
911
911
  end
912
912
  end
913
913
  end
@@ -917,13 +917,13 @@ describe Arachni::Page do
917
917
 
918
918
  describe '.from_url' do
919
919
  it 'returns a page from the given url' do
920
- described_class.from_url( url + 'with_nonce' ).should be_kind_of described_class
920
+ expect(described_class.from_url( url + 'with_nonce' )).to be_kind_of described_class
921
921
  end
922
922
 
923
923
  context 'when #forms have nonces' do
924
924
  it 'preserves them' do
925
- described_class.from_url( url + 'with_nonce' ).forms.
926
- map { |f| f.nonce_name }.sort.should == %w(nonce nonce2).sort
925
+ expect(described_class.from_url( url + 'with_nonce' ).forms.
926
+ map { |f| f.nonce_name }.sort).to eq(%w(nonce nonce2).sort)
927
927
  end
928
928
  end
929
929
  end
@@ -958,25 +958,25 @@ describe Arachni::Page do
958
958
  }
959
959
 
960
960
  page = Arachni::Page.from_data( data )
961
- page.code.should == data[:response][:code]
962
- page.url.should == data[:url]
963
- page.body.should == data[:body]
964
- page.paths.should == data[:paths]
961
+ expect(page.code).to eq(data[:response][:code])
962
+ expect(page.url).to eq(data[:url])
963
+ expect(page.body).to eq(data[:body])
964
+ expect(page.paths).to eq(data[:paths])
965
965
 
966
- page.links.should == data[:links]
967
- page.forms.should == data[:forms]
968
- page.cookies.should == data[:cookies]
969
- page.headers.should == data[:headers]
966
+ expect(page.links).to eq(data[:links])
967
+ expect(page.forms).to eq(data[:forms])
968
+ expect(page.cookies).to eq(data[:cookies])
969
+ expect(page.headers).to eq(data[:headers])
970
970
 
971
- page.cookie_jar.should == data[:cookie_jar]
971
+ expect(page.cookie_jar).to eq(data[:cookie_jar])
972
972
 
973
- page.response.code.should == data[:response][:code]
974
- page.response.url.should == data[:url]
975
- page.response.body.should == data[:body]
976
- page.response.request.url.should == data[:url]
973
+ expect(page.response.code).to eq(data[:response][:code])
974
+ expect(page.response.url).to eq(data[:url])
975
+ expect(page.response.body).to eq(data[:body])
976
+ expect(page.response.request.url).to eq(data[:url])
977
977
 
978
- page.dom.url.should == data[:dom][:url]
979
- page.dom.transitions.should == data[:dom][:transitions]
978
+ expect(page.dom.url).to eq(data[:dom][:url])
979
+ expect(page.dom.transitions).to eq(data[:dom][:transitions])
980
980
  end
981
981
 
982
982
  context 'when no HTTP data is given' do
@@ -987,21 +987,21 @@ describe Arachni::Page do
987
987
  }
988
988
 
989
989
  page = Arachni::Page.from_data( data )
990
- page.url.should == data[:url]
991
- page.body.should == data[:body]
992
- page.code.should == 200
990
+ expect(page.url).to eq(data[:url])
991
+ expect(page.body).to eq(data[:body])
992
+ expect(page.code).to eq(200)
993
993
 
994
- page.links.should == []
995
- page.forms.should == []
996
- page.cookies.should == []
997
- page.headers.should == []
994
+ expect(page.links).to eq([])
995
+ expect(page.forms).to eq([])
996
+ expect(page.cookies).to eq([])
997
+ expect(page.headers).to eq([])
998
998
 
999
- page.cookie_jar.should == []
999
+ expect(page.cookie_jar).to eq([])
1000
1000
 
1001
- page.response.code.should == 200
1002
- page.response.url.should == data[:url]
1003
- page.response.body.should == data[:body]
1004
- page.response.request.url.should == data[:url]
1001
+ expect(page.response.code).to eq(200)
1002
+ expect(page.response.url).to eq(data[:url])
1003
+ expect(page.response.body).to eq(data[:body])
1004
+ expect(page.response.request.url).to eq(data[:url])
1005
1005
  end
1006
1006
  end
1007
1007
  end
@@ -1009,21 +1009,21 @@ describe Arachni::Page do
1009
1009
  describe '.from_response' do
1010
1010
  it 'creates a page from an HTTP response' do
1011
1011
  page = Arachni::Page.from_response( response )
1012
- page.class.should == Arachni::Page
1012
+ expect(page.class).to eq(Arachni::Page)
1013
1013
  parser = Arachni::Parser.new( response )
1014
1014
 
1015
- page.url.should == parser.url
1016
- page.method.should == parser.response.request.method
1017
- page.response.should == parser.response
1018
- page.body.should == parser.response.body
1019
- page.query_vars.should == parser.link_vars
1020
- page.paths.should == parser.paths
1021
- page.links.should == parser.links
1022
- page.forms.should == parser.forms
1023
- page.cookies.should == parser.cookies_to_be_audited
1024
- page.headers.should == parser.headers
1025
- page.cookie_jar.should == parser.cookie_jar
1026
- page.text?.should == parser.text?
1015
+ expect(page.url).to eq(parser.url)
1016
+ expect(page.method).to eq(parser.response.request.method)
1017
+ expect(page.response).to eq(parser.response)
1018
+ expect(page.body).to eq(parser.response.body)
1019
+ expect(page.query_vars).to eq(parser.link_vars)
1020
+ expect(page.paths).to eq(parser.paths)
1021
+ expect(page.links).to eq(parser.links)
1022
+ expect(page.forms).to eq(parser.forms)
1023
+ expect(page.cookies).to eq(parser.cookies_to_be_audited)
1024
+ expect(page.headers).to eq(parser.headers)
1025
+ expect(page.cookie_jar).to eq(parser.cookie_jar)
1026
+ expect(page.text?).to eq(parser.text?)
1027
1027
 
1028
1028
  end
1029
1029
  end