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
@@ -0,0 +1,65 @@
1
+ shared_examples_for 'dom_only' do |source|
2
+ it_should_behave_like 'element'
3
+ it_should_behave_like 'inputtable'
4
+ it_should_behave_like 'with_node'
5
+ it_should_behave_like 'with_dom', source
6
+
7
+ it "supports #{Arachni::RPC::Serializer}" do
8
+ expect(subject).to eq(Arachni::RPC::Serializer.deep_clone( subject ))
9
+ end
10
+
11
+ describe '.new' do
12
+ describe ':action' do
13
+ it 'sets the #action' do
14
+ expect(described_class.new( action: url ).action).to eq url
15
+ end
16
+
17
+ it 'sets the #url' do
18
+ expect(described_class.new( action: url ).url).to eq url
19
+ end
20
+ end
21
+
22
+ describe ':method' do
23
+ it 'sets the #method' do
24
+ expect(described_class.new(
25
+ action: url,
26
+ method: 'onclick'
27
+ ).method).to eq 'onclick'
28
+ end
29
+ end
30
+ end
31
+
32
+ describe '#mutation?' do
33
+ it 'returns false' do
34
+ expect(subject.mutation?).to be_falsey
35
+ end
36
+ end
37
+
38
+ describe '#coverage_id' do
39
+ it 'delegates to #dom' do
40
+ allow(subject.dom).to receive(:coverage_id).and_return( 'stuff' )
41
+ expect(subject.coverage_id).to eq 'stuff'
42
+ end
43
+ end
44
+
45
+ describe '#coverage_hash' do
46
+ it 'delegates to #dom' do
47
+ allow(subject.dom).to receive(:coverage_hash).and_return( 123 )
48
+ expect(subject.coverage_hash).to eq 123
49
+ end
50
+ end
51
+
52
+ describe '#id' do
53
+ it 'delegates to #dom' do
54
+ allow(subject.dom).to receive(:id).and_return( '123' )
55
+ expect(subject.id).to eq '123'
56
+ end
57
+ end
58
+
59
+ describe '#type' do
60
+ it "delegates to #{described_class}" do
61
+ allow(described_class).to receive(:type).and_return( :stuff )
62
+ expect(subject.type).to eq :stuff
63
+ end
64
+ end
65
+ end
@@ -46,7 +46,7 @@ shared_examples_for 'inputtable' do |options = {}|
46
46
  end
47
47
 
48
48
  it "supports #{Arachni::RPC::Serializer}" do
49
- subject.should == Arachni::RPC::Serializer.deep_clone( subject )
49
+ expect(subject).to eq(Arachni::RPC::Serializer.deep_clone( subject ))
50
50
  end
51
51
 
52
52
  describe '#to_rpc_data' do
@@ -54,7 +54,7 @@ shared_examples_for 'inputtable' do |options = {}|
54
54
 
55
55
  %w(inputs default_inputs).each do |attribute|
56
56
  it "includes '#{attribute}'" do
57
- data[attribute].should == subject.send( attribute )
57
+ expect(data[attribute]).to eq(subject.send( attribute ))
58
58
  end
59
59
  end
60
60
  end
@@ -65,7 +65,7 @@ shared_examples_for 'inputtable' do |options = {}|
65
65
 
66
66
  %w(inputs default_inputs).each do |attribute|
67
67
  it "restores '#{attribute}'" do
68
- restored.send( attribute ).should == subject.send( attribute )
68
+ expect(restored.send( attribute )).to eq(subject.send( attribute ))
69
69
  end
70
70
  end
71
71
  end
@@ -77,27 +77,12 @@ shared_examples_for 'inputtable' do |options = {}|
77
77
  k, v = orig.inputs.keys.first, 'value'
78
78
 
79
79
  subject.update( k => v )
80
- subject.affected_input_name = k
81
- subject.affected_input_value = v
82
- subject.seed = v
83
80
 
84
- subject.inputs.should_not == orig.inputs
85
- subject.affected_input_name.should_not == orig.affected_input_name
86
- subject.affected_input_value.should_not == orig.affected_input_value
87
- subject.seed.should_not == orig.seed
81
+ expect(subject.inputs).not_to eq(orig.inputs)
88
82
 
89
83
  subject.reset
90
84
 
91
- subject.inputs.should == orig.inputs
92
-
93
- subject.affected_input_name.should == orig.affected_input_name
94
- subject.affected_input_name.should be_nil
95
-
96
- subject.affected_input_value.should == orig.affected_input_value
97
- subject.affected_input_value.should be_nil
98
-
99
- subject.seed.should == orig.seed
100
- subject.seed.should be_nil
85
+ expect(subject.inputs).to eq(orig.inputs)
101
86
  end
102
87
  end
103
88
 
@@ -107,20 +92,20 @@ shared_examples_for 'inputtable' do |options = {}|
107
92
  context 'when it has the given inputs' do
108
93
  it 'returns true' do
109
94
  keys.each do |k|
110
- subject.has_inputs?( k.to_s.to_sym ).should be_true
111
- subject.has_inputs?( k.to_s ).should be_true
95
+ expect(subject.has_inputs?( k.to_s.to_sym )).to be_truthy
96
+ expect(subject.has_inputs?( k.to_s )).to be_truthy
112
97
  end
113
98
 
114
- subject.has_inputs?( *sym_keys ).should be_true
115
- subject.has_inputs?( *keys ).should be_true
99
+ expect(subject.has_inputs?( *sym_keys )).to be_truthy
100
+ expect(subject.has_inputs?( *keys )).to be_truthy
116
101
  end
117
102
  end
118
103
  context 'when it does not have the given inputs' do
119
104
  it 'returns false' do
120
- subject.has_inputs?( *non_existent_sym_keys ).should be_false
121
- subject.has_inputs?( *non_existent_keys ).should be_false
105
+ expect(subject.has_inputs?( *non_existent_sym_keys )).to be_falsey
106
+ expect(subject.has_inputs?( *non_existent_keys )).to be_falsey
122
107
 
123
- subject.has_inputs?( non_existent_keys.first ).should be_false
108
+ expect(subject.has_inputs?( non_existent_keys.first )).to be_falsey
124
109
  end
125
110
  end
126
111
  end
@@ -128,14 +113,14 @@ shared_examples_for 'inputtable' do |options = {}|
128
113
  context Array do
129
114
  context 'when it has the given inputs' do
130
115
  it 'returns true' do
131
- subject.has_inputs?( sym_keys ).should be_true
132
- subject.has_inputs?( keys ).should be_true
116
+ expect(subject.has_inputs?( sym_keys )).to be_truthy
117
+ expect(subject.has_inputs?( keys )).to be_truthy
133
118
  end
134
119
  end
135
120
  context 'when it does not have the given inputs' do
136
121
  it 'returns false' do
137
- subject.has_inputs?( non_existent_sym_keys ).should be_false
138
- subject.has_inputs?( non_existent_keys ).should be_false
122
+ expect(subject.has_inputs?( non_existent_sym_keys )).to be_falsey
123
+ expect(subject.has_inputs?( non_existent_keys )).to be_falsey
139
124
  end
140
125
  end
141
126
  end
@@ -143,15 +128,15 @@ shared_examples_for 'inputtable' do |options = {}|
143
128
  context Hash do
144
129
  context 'when it has the given inputs (names and values)' do
145
130
  it 'returns true' do
146
- subject.has_inputs?( subject.inputs ).should be_true
147
- subject.has_inputs?( subject.inputs.my_symbolize_keys ).should be_true
131
+ expect(subject.has_inputs?( subject.inputs )).to be_truthy
132
+ expect(subject.has_inputs?( subject.inputs.my_symbolize_keys )).to be_truthy
148
133
  end
149
134
  end
150
135
  context 'when it does not have the given inputs' do
151
136
  it 'returns false' do
152
- subject.has_inputs?(
137
+ expect(subject.has_inputs?(
153
138
  inputs.keys.first => "#{inputs.values.first} 1"
154
- ).should be_false
139
+ )).to be_falsey
155
140
  end
156
141
  end
157
142
  end
@@ -160,14 +145,14 @@ shared_examples_for 'inputtable' do |options = {}|
160
145
 
161
146
  describe '#inputs' do
162
147
  it 'is frozen' do
163
- subject.inputs.should be_frozen
148
+ expect(subject.inputs).to be_frozen
164
149
  end
165
150
  end
166
151
 
167
152
  describe '#inputtable_id' do
168
153
  before do
169
- described_class.any_instance.stub(:valid_input_name?) { true }
170
- described_class.any_instance.stub(:valid_input_value?) { true }
154
+ allow_any_instance_of(described_class).to receive(:valid_input_name?) { true }
155
+ allow_any_instance_of(described_class).to receive(:valid_input_value?) { true }
171
156
  end
172
157
 
173
158
  it 'takes into account input names' do
@@ -177,7 +162,7 @@ shared_examples_for 'inputtable' do |options = {}|
177
162
  c = subject.dup
178
163
  c.inputs = { 1 => 2 }
179
164
 
180
- e.inputtable_id.should == c.inputtable_id
165
+ expect(e.inputtable_id).to eq(c.inputtable_id)
181
166
 
182
167
  e = subject.dup
183
168
  e.inputs = { 1 => 2 }
@@ -185,7 +170,7 @@ shared_examples_for 'inputtable' do |options = {}|
185
170
  c = subject.dup
186
171
  c.inputs = { 2 => 2 }
187
172
 
188
- e.inputtable_id.should_not == c.inputtable_id
173
+ expect(e.inputtable_id).not_to eq(c.inputtable_id)
189
174
  end
190
175
 
191
176
  it 'takes into account input values' do
@@ -195,7 +180,7 @@ shared_examples_for 'inputtable' do |options = {}|
195
180
  c = subject.dup
196
181
  c.inputs = { 1 => 2 }
197
182
 
198
- e.inputtable_id.should == c.inputtable_id
183
+ expect(e.inputtable_id).to eq(c.inputtable_id)
199
184
 
200
185
  e = subject.dup
201
186
  e.inputs = { 1 => 1 }
@@ -203,7 +188,7 @@ shared_examples_for 'inputtable' do |options = {}|
203
188
  c = subject.dup
204
189
  c.inputs = { 1 => 2 }
205
190
 
206
- e.inputtable_id.should_not == c.inputtable_id
191
+ expect(e.inputtable_id).not_to eq(c.inputtable_id)
207
192
  end
208
193
 
209
194
  it 'ignores input order', if: !options[:single_input] do
@@ -213,7 +198,7 @@ shared_examples_for 'inputtable' do |options = {}|
213
198
  c = subject.dup
214
199
  c.inputs = { 3 => 4, 1 => 2 }
215
200
 
216
- e.inputtable_id.should == c.inputtable_id
201
+ expect(e.inputtable_id).to eq(c.inputtable_id)
217
202
  end
218
203
  end
219
204
 
@@ -221,20 +206,20 @@ shared_examples_for 'inputtable' do |options = {}|
221
206
  it 'assigns a hash of auditable inputs' do
222
207
  a = subject.dup
223
208
  a.inputs = { valid_key => 'my val' }
224
- a.inputs.should == { valid_key => 'my val' }
209
+ expect(a.inputs).to eq({ valid_key => 'my val' })
225
210
  end
226
211
 
227
212
  it 'converts all inputs to strings',
228
213
  if: described_class != Arachni::Element::JSON do
229
214
 
230
215
  subject.inputs = { valid_key.to_sym => nil }
231
- subject.inputs.should == { valid_key => '' }
216
+ expect(subject.inputs).to eq({ valid_key => '' })
232
217
  end
233
218
 
234
219
  context 'when the input name' do
235
220
  context 'contains invalid data' do
236
221
  it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Name}" do
237
- subject.stub(:valid_input_data?) { |data| data != valid_key }
222
+ allow(subject).to receive(:valid_input_data?) { |data| data != valid_key }
238
223
 
239
224
  expect do
240
225
  subject.inputs = { valid_key => 'blah' }
@@ -244,7 +229,7 @@ shared_examples_for 'inputtable' do |options = {}|
244
229
 
245
230
  context 'is invalid' do
246
231
  it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Name}" do
247
- subject.stub(:valid_input_name?) { false }
232
+ allow(subject).to receive(:valid_input_name?) { false }
248
233
 
249
234
  expect do
250
235
  subject.inputs = { valid_key => 'blah' }
@@ -256,7 +241,7 @@ shared_examples_for 'inputtable' do |options = {}|
256
241
  context 'when the input value' do
257
242
  context 'contains invalid data' do
258
243
  it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Value}" do
259
- subject.stub(:valid_input_data?) { |data| data != 'blah' }
244
+ allow(subject).to receive(:valid_input_data?) { |data| data != 'blah' }
260
245
 
261
246
  expect do
262
247
  subject.inputs = { valid_key => 'blah' }
@@ -266,7 +251,7 @@ shared_examples_for 'inputtable' do |options = {}|
266
251
 
267
252
  context 'is invalid' do
268
253
  it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Value}" do
269
- subject.stub(:valid_input_value?) { false }
254
+ allow(subject).to receive(:valid_input_value?) { false }
270
255
 
271
256
  expect do
272
257
  subject.inputs = { valid_key => 'blah' }
@@ -278,21 +263,21 @@ shared_examples_for 'inputtable' do |options = {}|
278
263
 
279
264
  describe '#valid_input_name_data?' do
280
265
  it 'returns true' do
281
- subject.valid_input_name_data?( valid_key ).should be_true
266
+ expect(subject.valid_input_name_data?( valid_key )).to be_truthy
282
267
  end
283
268
 
284
269
  context 'when the input name' do
285
270
  context 'contains invalid data' do
286
271
  it 'returns false' do
287
- subject.stub(:valid_input_data?) { false }
288
- subject.valid_input_name_data?( valid_key ).should be_false
272
+ allow(subject).to receive(:valid_input_data?) { false }
273
+ expect(subject.valid_input_name_data?( valid_key )).to be_falsey
289
274
  end
290
275
  end
291
276
 
292
277
  context 'is invalid' do
293
278
  it 'returns false' do
294
- subject.stub(:valid_input_name?) { false }
295
- subject.valid_input_name_data?( valid_key ).should be_false
279
+ allow(subject).to receive(:valid_input_name?) { false }
280
+ expect(subject.valid_input_name_data?( valid_key )).to be_falsey
296
281
  end
297
282
  end
298
283
  end
@@ -300,21 +285,21 @@ shared_examples_for 'inputtable' do |options = {}|
300
285
 
301
286
  describe '#valid_input_value_data?' do
302
287
  it 'returns true' do
303
- subject.valid_input_value_data?( 'blah' ).should be_true
288
+ expect(subject.valid_input_value_data?( 'blah' )).to be_truthy
304
289
  end
305
290
 
306
291
  context 'when the input value' do
307
292
  context 'contains invalid data' do
308
293
  it 'returns false' do
309
- subject.stub(:valid_input_data?) { false }
310
- subject.valid_input_value_data?( 'blah' ).should be_false
294
+ allow(subject).to receive(:valid_input_data?) { false }
295
+ expect(subject.valid_input_value_data?( 'blah' )).to be_falsey
311
296
  end
312
297
  end
313
298
 
314
299
  context 'is invalid' do
315
300
  it 'returns false' do
316
- subject.stub(:valid_input_value?) { false }
317
- subject.valid_input_value_data?( 'blah' ).should be_false
301
+ allow(subject).to receive(:valid_input_value?) { false }
302
+ expect(subject.valid_input_value_data?( 'blah' )).to be_falsey
318
303
  end
319
304
  end
320
305
  end
@@ -327,7 +312,7 @@ shared_examples_for 'inputtable' do |options = {}|
327
312
  updates = keys.inject({}) { |h, k| h.merge!( k => "#{k} val")}
328
313
 
329
314
  a.update( updates )
330
- a.inputs.should == updates
315
+ expect(a.inputs).to eq(updates)
331
316
  end
332
317
 
333
318
  it 'converts all inputs to strings',
@@ -335,16 +320,16 @@ shared_examples_for 'inputtable' do |options = {}|
335
320
 
336
321
  subject.inputs = { valid_key => 'stuff' }
337
322
  subject.update( { valid_key => nil } )
338
- subject.inputs.should == { valid_key => '' }
323
+ expect(subject.inputs).to eq({ valid_key => '' })
339
324
  end
340
325
 
341
326
  it 'returns self' do
342
- subject.update({}).should == subject
327
+ expect(subject.update({})).to eq(subject)
343
328
  end
344
329
 
345
330
  context 'when the input name is invalid' do
346
331
  it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Name}" do
347
- subject.stub(:valid_input_name?) { false }
332
+ allow(subject).to receive(:valid_input_name?) { false }
348
333
 
349
334
  expect do
350
335
  subject.update valid_key => 'blah'
@@ -354,7 +339,7 @@ shared_examples_for 'inputtable' do |options = {}|
354
339
 
355
340
  context 'when the input value is invalid' do
356
341
  it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Value}" do
357
- subject.stub(:valid_input_value?) { false }
342
+ allow(subject).to receive(:valid_input_value?) { false }
358
343
 
359
344
  expect do
360
345
  subject.update valid_key => 'blah'
@@ -372,27 +357,27 @@ shared_examples_for 'inputtable' do |options = {}|
372
357
  ].each do |updates|
373
358
  d = subject.dup
374
359
  d.update( updates )
375
- d.changes.should == updates
360
+ expect(d.changes).to eq(updates)
376
361
  end
377
362
  end
378
363
  end
379
364
 
380
365
  describe '#[]' do
381
366
  it ' serves as a reader to the #auditable hash' do
382
- subject[valid_key].should == subject.inputs[valid_key]
367
+ expect(subject[valid_key]).to eq(subject.inputs[valid_key])
383
368
  end
384
369
  end
385
370
 
386
371
  describe '#[]=' do
387
372
  it 'serves as a writer to the #inputs hash' do
388
373
  subject[valid_key] = 'val1'
389
- subject[valid_key].should == 'val1'
390
- subject[valid_key].should == subject.inputs[valid_key]
374
+ expect(subject[valid_key]).to eq('val1')
375
+ expect(subject[valid_key]).to eq(subject.inputs[valid_key])
391
376
  end
392
377
 
393
378
  context 'when the input name is invalid' do
394
379
  it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Name}" do
395
- subject.stub(:valid_input_name?) { false }
380
+ allow(subject).to receive(:valid_input_name?) { false }
396
381
 
397
382
  expect do
398
383
  subject[valid_key] = 'blah'
@@ -402,7 +387,7 @@ shared_examples_for 'inputtable' do |options = {}|
402
387
 
403
388
  context 'when the input value is invalid' do
404
389
  it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Value}" do
405
- subject.stub(:valid_input_value?) { false }
390
+ allow(subject).to receive(:valid_input_value?) { false }
406
391
 
407
392
  expect do
408
393
  subject[valid_key] = 'blah'
@@ -414,32 +399,32 @@ shared_examples_for 'inputtable' do |options = {}|
414
399
  describe '#try_input' do
415
400
  context 'when the operation is successful' do
416
401
  it 'returns true' do
417
- subject.try_input do
402
+ expect(subject.try_input do
418
403
  subject.inputs = subject.inputs
419
404
  nil
420
- end.should be_true
405
+ end).to be_truthy
421
406
  end
422
407
  end
423
408
 
424
409
  context 'when the operation fails' do
425
410
  context 'due to an invalid name' do
426
411
  it 'returns false' do
427
- subject.stub(:valid_input_name?) { false }
412
+ allow(subject).to receive(:valid_input_name?) { false }
428
413
 
429
- subject.try_input do
414
+ expect(subject.try_input do
430
415
  subject.inputs = inputs
431
416
  true
432
- end.should be_false
417
+ end).to be_falsey
433
418
  end
434
419
  end
435
420
  context 'due to an invalid value' do
436
421
  it 'returns false' do
437
- subject.stub(:valid_input_value?) { false }
422
+ allow(subject).to receive(:valid_input_value?) { false }
438
423
 
439
- subject.try_input do
424
+ expect(subject.try_input do
440
425
  subject.inputs = inputs
441
426
  true
442
- end.should be_false
427
+ end).to be_falsey
443
428
  end
444
429
  end
445
430
  end
@@ -447,7 +432,7 @@ shared_examples_for 'inputtable' do |options = {}|
447
432
 
448
433
  describe '#default_inputs' do
449
434
  it 'should be frozen' do
450
- subject.default_inputs.should be_frozen
435
+ expect(subject.default_inputs).to be_frozen
451
436
  end
452
437
 
453
438
  context 'when #inputs' do
@@ -455,12 +440,12 @@ shared_examples_for 'inputtable' do |options = {}|
455
440
  it 'returns original input name/vals' do
456
441
  orig_auditable = subject.inputs.dup
457
442
  subject.inputs = {}
458
- subject.default_inputs.should == orig_auditable
443
+ expect(subject.default_inputs).to eq(orig_auditable)
459
444
  end
460
445
  end
461
446
  context 'has not been modified' do
462
447
  it 'returns #inputs' do
463
- subject.default_inputs.should == subject.inputs
448
+ expect(subject.default_inputs).to eq(subject.inputs)
464
449
  end
465
450
  end
466
451
  end
@@ -469,20 +454,20 @@ shared_examples_for 'inputtable' do |options = {}|
469
454
  describe '#dup' do
470
455
  it 'preserves #inputs' do
471
456
  dup = subject.dup
472
- dup.inputs.should == subject.inputs
457
+ expect(dup.inputs).to eq(subject.inputs)
473
458
 
474
459
  dup[valid_key] = 'blah'
475
- subject.inputs[valid_key].should_not == 'blah'
460
+ expect(subject.inputs[valid_key]).not_to eq('blah')
476
461
 
477
- dup.dup[valid_key].should == 'blah'
462
+ expect(dup.dup[valid_key]).to eq('blah')
478
463
  end
479
464
  end
480
465
 
481
466
  describe '#to_h' do
482
467
  it 'returns a hash representation of self' do
483
468
  hash = subject.to_h
484
- hash[:inputs].should == subject.inputs
485
- hash[:default_inputs].should == subject.default_inputs
469
+ expect(hash[:inputs]).to eq(subject.inputs)
470
+ expect(hash[:default_inputs]).to eq(subject.default_inputs)
486
471
  end
487
472
  end
488
473