cms_scanner 0.0.18 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/core.rb +4 -3
  3. data/app/views/cli/core/finished.erb +1 -0
  4. data/app/views/json/core/finished.erb +1 -0
  5. data/cms_scanner.gemspec +13 -3
  6. data/lib/cms_scanner.rb +14 -2
  7. data/lib/cms_scanner/finders/finder.rb +16 -7
  8. data/lib/cms_scanner/finders/finder/enumerator.rb +4 -28
  9. data/lib/cms_scanner/finders/finder/fingerprinter.rb +60 -0
  10. data/lib/cms_scanner/finders/finding.rb +1 -1
  11. data/lib/cms_scanner/target/scope.rb +4 -1
  12. data/lib/cms_scanner/target/server/generic.rb +1 -1
  13. data/lib/cms_scanner/typhoeus/hydra.rb +10 -0
  14. data/lib/cms_scanner/version.rb +1 -1
  15. metadata +5 -203
  16. data/.gitignore +0 -7
  17. data/.rspec +0 -2
  18. data/.rubocop.yml +0 -10
  19. data/.travis.yml +0 -17
  20. data/Gemfile +0 -6
  21. data/Rakefile +0 -9
  22. data/spec/app/controllers/core_spec.rb +0 -167
  23. data/spec/app/controllers/interesting_files_spec.rb +0 -70
  24. data/spec/app/finders/interesting_files/fantastico_fileslist_spec.rb +0 -66
  25. data/spec/app/finders/interesting_files/headers_spec.rb +0 -36
  26. data/spec/app/finders/interesting_files/robots_txt_spec.rb +0 -54
  27. data/spec/app/finders/interesting_files/search_replace_db_2_spec.rb +0 -53
  28. data/spec/app/finders/interesting_files/xml_rpc_spec.rb +0 -136
  29. data/spec/app/finders/interesting_files_spec.rb +0 -12
  30. data/spec/app/formatters/cli_no_colour_spec.rb +0 -14
  31. data/spec/app/formatters/cli_spec.rb +0 -30
  32. data/spec/app/formatters/json_spec.rb +0 -30
  33. data/spec/app/models/fantastico_fileslist_spec.rb +0 -31
  34. data/spec/app/models/headers_spec.rb +0 -51
  35. data/spec/app/models/interesting_file_spec.rb +0 -69
  36. data/spec/app/models/robots_txt_spec.rb +0 -27
  37. data/spec/app/models/version_spec.rb +0 -51
  38. data/spec/app/models/xml_rpc_spec.rb +0 -46
  39. data/spec/app/views_spec.rb +0 -35
  40. data/spec/cache/.gitignore +0 -4
  41. data/spec/dummy_finding.rb +0 -25
  42. data/spec/dummy_independent_finders.rb +0 -26
  43. data/spec/dummy_unique_finders.rb +0 -33
  44. data/spec/fixtures/finders/interesting_files/fantastico_fileslist/fantastico_fileslist.txt +0 -12
  45. data/spec/fixtures/finders/interesting_files/file.txt +0 -4
  46. data/spec/fixtures/finders/interesting_files/headers/interesting.txt +0 -16
  47. data/spec/fixtures/finders/interesting_files/headers/no_interesting.txt +0 -12
  48. data/spec/fixtures/finders/interesting_files/robots_txt/robots.txt +0 -10
  49. data/spec/fixtures/finders/interesting_files/search_replace_db_2/searchreplacedb2.php +0 -188
  50. data/spec/fixtures/finders/interesting_files/xml_rpc/homepage_in_scope_pingback.html +0 -7
  51. data/spec/fixtures/finders/interesting_files/xml_rpc/homepage_out_of_scope_pingback.html +0 -7
  52. data/spec/fixtures/finders/interesting_files/xml_rpc/xmlrpc.php +0 -1
  53. data/spec/fixtures/output.txt +0 -0
  54. data/spec/fixtures/target/comments.html +0 -29
  55. data/spec/fixtures/target/platform/php/debug_log/debug.log +0 -2
  56. data/spec/fixtures/target/platform/php/fpd/wp_rss_functions.php +0 -2
  57. data/spec/fixtures/target/scope/index.html +0 -23
  58. data/spec/fixtures/target/server/apache/directory_listing/2.2.16.html +0 -15
  59. data/spec/fixtures/target/server/generic/server/apache/basic.txt +0 -5
  60. data/spec/fixtures/target/server/generic/server/iis/basic.txt +0 -6
  61. data/spec/fixtures/target/server/generic/server/not_detected.txt +0 -3
  62. data/spec/fixtures/target/server/iis/directory_listing/no_parent.html +0 -3
  63. data/spec/fixtures/target/server/iis/directory_listing/with_parent.html +0 -3
  64. data/spec/fixtures/views/base/ctrl/local.erb +0 -1
  65. data/spec/fixtures/views/base/ctrl/test.erb +0 -3
  66. data/spec/fixtures/views/base/global.erb +0 -1
  67. data/spec/fixtures/views/base/test.erb +0 -2
  68. data/spec/fixtures/views/based_format/test.erb +0 -1
  69. data/spec/fixtures/views/json/render_me.erb +0 -4
  70. data/spec/lib/browser_spec.rb +0 -140
  71. data/spec/lib/cache/file_store_spec.rb +0 -100
  72. data/spec/lib/cache/typhoeus_spec.rb +0 -28
  73. data/spec/lib/cms_scanner_spec.rb +0 -49
  74. data/spec/lib/controller_spec.rb +0 -30
  75. data/spec/lib/controllers_spec.rb +0 -48
  76. data/spec/lib/finders/confidence_spec.rb +0 -39
  77. data/spec/lib/finders/finder/enumerator_spec.rb +0 -89
  78. data/spec/lib/finders/finder/smart_url_checker/findings_spec.rb +0 -39
  79. data/spec/lib/finders/finder/smart_url_checker_spec.rb +0 -50
  80. data/spec/lib/finders/finder_spec.rb +0 -11
  81. data/spec/lib/finders/findings_spec.rb +0 -36
  82. data/spec/lib/finders/independent_finders_spec.rb +0 -134
  83. data/spec/lib/finders/same_type_finder_spec.rb +0 -24
  84. data/spec/lib/finders/same_type_finders_spec.rb +0 -126
  85. data/spec/lib/finders/unique_finder_spec.rb +0 -24
  86. data/spec/lib/finders/unique_finders_spec.rb +0 -222
  87. data/spec/lib/formatter_spec.rb +0 -145
  88. data/spec/lib/public_suffix/domain_spec.rb +0 -49
  89. data/spec/lib/sub_scanner_spec.rb +0 -45
  90. data/spec/lib/target/hashes_spec.rb +0 -90
  91. data/spec/lib/target/platforms_spec.rb +0 -13
  92. data/spec/lib/target/scope_spec.rb +0 -103
  93. data/spec/lib/target/servers_spec.rb +0 -13
  94. data/spec/lib/target_spec.rb +0 -69
  95. data/spec/lib/vulnerability/references_spec.rb +0 -75
  96. data/spec/lib/vulnerability_spec.rb +0 -27
  97. data/spec/lib/web_site_spec.rb +0 -121
  98. data/spec/output/core/finished.cli_no_colour +0 -3
  99. data/spec/output/core/finished.json +0 -5
  100. data/spec/output/core/started.cli_no_colour +0 -3
  101. data/spec/output/core/started.json +0 -5
  102. data/spec/output/interesting_files/empty.cli_no_colour +0 -2
  103. data/spec/output/interesting_files/empty.json +0 -5
  104. data/spec/output/interesting_files/findings.cli_no_colour +0 -30
  105. data/spec/output/interesting_files/findings.json +0 -75
  106. data/spec/shared_examples.rb +0 -11
  107. data/spec/shared_examples/browser_actions.rb +0 -30
  108. data/spec/shared_examples/finding.rb +0 -54
  109. data/spec/shared_examples/formatter_buffer.rb +0 -6
  110. data/spec/shared_examples/formatter_class_methods.rb +0 -26
  111. data/spec/shared_examples/independent_finder.rb +0 -31
  112. data/spec/shared_examples/target/platform/php.rb +0 -56
  113. data/spec/shared_examples/target/server/apache.rb +0 -32
  114. data/spec/shared_examples/target/server/generic.rb +0 -33
  115. data/spec/shared_examples/target/server/iis.rb +0 -37
  116. data/spec/shared_examples/views/core.rb +0 -26
  117. data/spec/shared_examples/views/interesting_files.rb +0 -36
  118. data/spec/spec_helper.rb +0 -43
@@ -1,7 +0,0 @@
1
- <head>
2
- <meta charset="UTF-8">
3
- <meta name="viewport" content="width=device-width">
4
- <title>WordPress 4.0 | Just another WordPress site</title>
5
- <link rel="profile" href="http://gmpg.org/xfn/11">
6
- <link rel="pingback" href="http://e.org/wp/xmlrpc.php">
7
- </head>
@@ -1,7 +0,0 @@
1
- <head>
2
- <meta charset="UTF-8">
3
- <meta name="viewport" content="width=device-width">
4
- <title>WordPress 4.0 | Just another WordPress site</title>
5
- <link rel="profile" href="http://gmpg.org/xfn/11">
6
- <link rel="pingback" href="http://wp.lab/wordpress-4.0/xmlrpc.php">
7
- </head>
@@ -1 +0,0 @@
1
- XML-RPC server accepts POST requests only.
File without changes
@@ -1,29 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en-US" class="no-js">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width">
6
- <link rel="profile" href="http://gmpg.org/xfn/11">
7
- <link rel="pingback" href="http://wp.lab/wordpress-4.1.1/xmlrpc.php">
8
- <!--[if lt IE 9]>
9
- <script src="http://wp.lab/wordpress-4.1.1/wp-content/themes/twentyfifteen/js/html5.js"></script>
10
- <![endif]-->
11
- <script>(function(){document.documentElement.className='js'})();</script>
12
- <title>WP 4.1.1 | Just another WordPress site</title>
13
- <meta name='robots' content='noindex,follow' />
14
-
15
- <!-- All in One SEO Pack 2.2.5.1 by Michael Torbert of Semper Fi Web Design -->
16
- <link rel="canonical" href="http://wp.lab/wordpress-4.1.1/" />
17
- <!-- /all in one seo pack -->
18
- <!--[if lt IE 9]>
19
- <link rel='stylesheet' id='twentyfifteen-ie-css' href='http://wp.lab/wordpress-4.1.1/wp-content/themes/twentyfifteen/css/ie.css?ver=20141010' type='text/css' media='all' />
20
- <![endif]-->
21
- <!--[if lt IE 8]>
22
- <link rel='stylesheet' id='twentyfifteen-ie7-css' href='http://wp.lab/wordpress-4.1.1/wp-content/themes/twentyfifteen/css/ie7.css?ver=20141010' type='text/css' media='all' />
23
- <![endif]-->
24
-
25
- <!-- .site-branding -->
26
- <!-- .site-header -->
27
-
28
- </body>
29
- </html>
@@ -1,2 +0,0 @@
1
- [11-Oct-2012 00:00:00] PHP Notice: Undefined index: ec_email in /var/www/wp/wp-content/plugins/easy-contact/econtact.php on line 33
2
- [11-Oct-2012 00:00:00] PHP Notice: Undefined index: ec_url in /var/www/wp/wp-content/plugins/easy-contact/econtact.php on line 34
@@ -1,2 +0,0 @@
1
-
2
- Fatal error: Call to undefined function _deprecated_file() in /short-path/rss-f.php on line 8
@@ -1,23 +0,0 @@
1
- <a href="http://e.org/f.txt">Link</a>
2
- <a href="http://e.org/f.txt">Link</a> <!-- Duplicates should be ignored -->
3
-
4
- <a href="mailto:mail@g.com">eMail me!</a>
5
- <a href="jaVaScript:alert(2)">Click me Fool !</a>
6
-
7
- <script src=" https://cdn.e.org/f2.js "></script> <!-- head & tail spaces should be removed -->
8
-
9
- <script src="/script/s.js"></script>
10
-
11
- <link rel="alternate" type="application/rss+xml" title="Spec" href="http://wp-lamp/robots.txt" />
12
-
13
- <link rel="canonical" href="https://duckduckgo.com/">
14
-
15
- <img src="http://out.of.scope.com/img.jpg" width="1000" height="288" alt="" />
16
-
17
- <a href="">Empty Link</a>
18
-
19
- <link rel="alternate" type="application/rss+xml" title="WordPress 4.1 &raquo; Feed" href="http://e.org/feed" />
20
-
21
- <img src="//img.jpg" width="" height="" alt="" /> <!-- currently this should not be detected -->
22
-
23
- <img src="//out.of.scope.com/img.jpg" width="" height="" alt="" />
@@ -1,15 +0,0 @@
1
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
2
- <html>
3
- <head>
4
- <title>Index of /wordpress-4.0/wp-content/plugins/wp-dbmanager</title>
5
- </head>
6
- <body>
7
- <h1>Index of /wordpress-4.0/wp-content/plugins/wp-dbmanager</h1>
8
- <table><tr><th><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr><tr><th colspan="5"><hr></th></tr>
9
- <tr><td valign="top"><img src="/icons/back.gif" alt="[DIR]"></td><td><a href="/wordpress-4.0/wp-content/plugins/">Parent Directory</a></td><td>&nbsp;</td><td align="right"> - </td><td>&nbsp;</td></tr>
10
- <tr><td valign="top"><img src="/icons/unknown.gif" alt="[ ]"></td><td><a href="backup.php">backup.php</a></td><td align="right">07-Oct-2014 18:43 </td><td align="right"> 10K</td><td>&nbsp;</td></tr>
11
- <tr><td valign="top"><img src="/icons/unknown.gif" alt="[ ]"></td><td><a href="database-empty.php">database-empty.php</a></td><td align="right">07-Oct-2014 18:43 </td><td align="right">3.9K</td><td>&nbsp;</td></tr>
12
- <tr><th colspan="5"><hr></th></tr>
13
- </table>
14
- <address>Apache/2.2.16 (Debian) Server at wp.lab Port 80</address>
15
- </body></html>
@@ -1,5 +0,0 @@
1
- Date: Sun, 12 Oct 2014 19:44:42 GMT
2
- Server: Apache/2.2.16 (Debian)
3
- X-Powered-By: PHP/5.3.3-7+squeeze19
4
- Vary: Accept-Encoding
5
- Content-Type: text/html
@@ -1,6 +0,0 @@
1
- Content-Length: 1027
2
- Content-Type: text/html; charset=UTF-8
3
- Server: Microsoft-IIS/7.5
4
- X-Powered-By: ASP.NET
5
- X-UA-Compatible: IE=EmulateIE7
6
- Date: Sun, 12 Oct 2014 20:15:14 GMT
@@ -1,3 +0,0 @@
1
- Date: Sun, 12 Oct 2014 19:44:42 GMT
2
- Vary: Accept-Encoding
3
- Content-Type: text/html
@@ -1,3 +0,0 @@
1
- <html><head><title>e.org - /dir/</title></head><body><H1>e.org - /dir/</H1><hr>
2
-
3
- <pre>10/8/2014 11:00 PM &lt;dir&gt; <A HREF="/sub-dir/">sub-dir</A>10/10/2014 10:00 PM 168 <A HREF="/web.config">web.config</A><br></pre><hr></body></html>
@@ -1,3 +0,0 @@
1
- <html><head><title>e.org - /dir/</title></head><body><H1>e.org - /dir/</H1><hr>
2
-
3
- <pre><A HREF="/">[To Parent Directory]</A><br><br> 10/8/2014 11:00 PM &lt;dir&gt; <A HREF="/sub-dir/">sub-dir</A>10/10/2014 10:00 PM 168 <A HREF="/web.config">web.config</A><br></pre><hr></body></html>
@@ -1 +0,0 @@
1
- Local View
@@ -1,3 +0,0 @@
1
- Test: <%= @var %>
2
- <%= render('local') %>
3
- <%= render('@global') %>
@@ -1 +0,0 @@
1
- Global View
@@ -1,2 +0,0 @@
1
- It <%= @test %>
2
- Views Dirs: <%= @views_directories %>
@@ -1 +0,0 @@
1
- Override the base/test.erb
@@ -1,4 +0,0 @@
1
- "test": <%= @test.to_json %>,
2
- <% if @var %>
3
- "var": <%= @var.to_json %>
4
- <% end %>
@@ -1,140 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe CMSScanner::Browser do
4
- it_behaves_like described_class::Actions
5
-
6
- subject(:browser) { described_class.instance(options) }
7
- before { described_class.reset }
8
- let(:options) { {} }
9
- let(:default) do
10
- {
11
- ssl_verifypeer: false, ssl_verifyhost: 2,
12
- headers: { 'User-Agent' => "CMSScanner v#{CMSScanner::VERSION}" }
13
- }
14
- end
15
-
16
- describe '#forge_request' do
17
- it 'returns a Typhoeus::Request' do
18
- expect(browser.forge_request('http://example.com')).to be_a Typhoeus::Request
19
- end
20
- end
21
-
22
- describe '#default_request_params' do
23
- its(:default_request_params) { should eq default }
24
-
25
- context 'when some attributes are set' do
26
- let(:options) do
27
- {
28
- cache_ttl: 200, connect_timeout: 10,
29
- http_auth: { username: 'log', password: 'pwd' },
30
- cookie_jar: '/tmp/cookie_jar.txt'
31
- }
32
- end
33
-
34
- let(:expected) do
35
- default.merge(
36
- cache_ttl: 200, connecttimeout: 10, userpwd: 'log:pwd',
37
- cookiejar: options[:cookie_jar], cookiefile: options[:cookie_jar]
38
- )
39
- end
40
-
41
- its(:default_request_params) { should eq expected }
42
- end
43
- end
44
-
45
- describe '#request_params' do
46
- context 'when no param is given' do
47
- its(:request_params) { should eq default }
48
- end
49
-
50
- context 'when params are supplied' do
51
- let(:params) { { another_param: true, headers: { 'Accept' => 'None' } } }
52
-
53
- it 'merges them (headers should be correctly merged)' do
54
- expect(browser.request_params(params)).to eq default
55
- .merge(params) { |key, oldval, newval| key == :headers ? oldval.merge(newval) : newval }
56
- end
57
-
58
- context 'when browser options' do
59
- let(:options) { { proxy: 'http://127.0.0.1:8080' } }
60
-
61
- it 'returns the correct hash' do
62
- expect(browser.request_params(params)).to eq default
63
- .merge(options)
64
- .merge(params) { |key, oldval, newval| key == :headers ? oldval.merge(newval) : newval }
65
- end
66
- end
67
- end
68
- end
69
-
70
- describe '#load_options' do
71
- context 'when no options' do
72
- it 'does not load anything' do
73
- described_class::OPTIONS.each do |sym|
74
- expected = sym == :user_agent ? "CMSScanner v#{CMSScanner::VERSION}" : nil
75
-
76
- expect(browser.send(sym)).to eq expected
77
- end
78
- end
79
- end
80
-
81
- context 'when options are supplied' do
82
- module CMSScanner
83
- # Test accessor
84
- class Browser
85
- attr_accessor :test
86
- end
87
- end
88
-
89
- let(:options) do
90
- { cache_ttl: 200, max_threads: 10, test: 'should not be set',
91
- user_agent: 'UA', proxy: false }
92
- end
93
-
94
- it 'merges the browser options only' do
95
- described_class::OPTIONS.each do |sym|
96
- expected = options.key?(sym) ? options[sym] : nil
97
-
98
- expect(browser.send(sym)).to eq expected
99
- end
100
-
101
- expect(browser.test).to be nil
102
- end
103
- end
104
- end
105
-
106
- describe '#hydra' do
107
- context 'when #max_threads is nil' do
108
- its('hydra.max_concurrency') { should eq 1 }
109
- end
110
-
111
- context 'when #max_threads' do
112
- let(:options) { { max_threads: 20 } }
113
-
114
- its('hydra.max_concurrency') { should eq options[:max_threads] }
115
- end
116
- end
117
-
118
- describe '#max_threads=' do
119
- after do
120
- browser.max_threads = @threads
121
-
122
- expect(browser.max_threads).to eq @expected
123
- expect(browser.hydra.max_concurrency).to eq @expected
124
- end
125
-
126
- context 'when <= 0' do
127
- it 'sets the @threads to 1' do
128
- @threads = -2
129
- @expected = 1
130
- end
131
- end
132
-
133
- context 'when > 0' do
134
- it 'sets the @threads' do
135
- @threads = 20
136
- @expected = @threads
137
- end
138
- end
139
- end
140
- end
@@ -1,100 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe CMSScanner::Cache::FileStore do
4
- let(:cache_dir) { File.join(CACHE, 'cache_file_store') }
5
- subject(:cache) { described_class.new(cache_dir) }
6
-
7
- before { FileUtils.rm_r(cache_dir, secure: true) if Dir.exist?(cache_dir) }
8
- after { cache.clean }
9
-
10
- describe '#new, #storage_path, #serializer' do
11
- its(:serializer) { should be Marshal }
12
- its(:storage_path) { should eq cache_dir }
13
- end
14
-
15
- describe '#clean' do
16
- it 'removes all files from the cache dir' do
17
- # let's create some files into the directory first
18
- (0..5).each do |i|
19
- File.new(File.join(cache.storage_path, "file_#{i}.txt"), File::CREAT)
20
- end
21
-
22
- expect(count_files_in_dir(cache.storage_path, 'file_*.txt')).to eq 6
23
- cache.clean
24
- expect(count_files_in_dir(cache.storage_path)).to eq 0
25
- end
26
- end
27
-
28
- describe '#read_entry?' do
29
- let(:key) { 'key1' }
30
-
31
- after do
32
- File.write(cache.entry_expiration_path(key), @expiration) if @expiration
33
-
34
- expect(cache.read_entry(key)).to eq @expected
35
- end
36
-
37
- context 'when the entry does not exists' do
38
- it 'returns nil' do
39
- @expected = nil
40
- end
41
- end
42
-
43
- context 'when the file is empty (marshal data too short error)' do
44
- it 'returns nil' do
45
- File.new(cache.entry_path(key), File::CREAT)
46
-
47
- @expiration = Time.now.to_i + 200
48
- @expected = nil
49
- end
50
- end
51
-
52
- context 'when the entry has expired' do
53
- it 'returns nil' do
54
- @expiration = Time.now.to_i - 200
55
- @expected = nil
56
- end
57
- end
58
-
59
- context 'when the entry has not expired' do
60
- it 'returns the entry' do
61
- File.write(cache.entry_path(key), cache.serializer.dump('testing data'))
62
-
63
- @expiration = Time.now.to_i + 600
64
- @expected = 'testing data'
65
- end
66
- end
67
- end
68
-
69
- describe '#write_entry' do
70
- after do
71
- cache.write_entry(@key, @data, @ttl)
72
- expect(cache.read_entry(@key)).to eq @expected
73
- end
74
-
75
- it 'should get the correct entry (string)' do
76
- @ttl = 10
77
- @key = 'some_key'
78
- @data = 'Hello World !'
79
- @expected = @data
80
- end
81
-
82
- context 'when cache_ttl <= 0' do
83
- it 'does not write the entry' do
84
- @ttl = 0
85
- @key = 'another_key'
86
- @data = 'Another Hello World !'
87
- @expected = nil
88
- end
89
- end
90
-
91
- context 'when cache_ttl is nil' do
92
- it 'does not write the entry' do
93
- @ttl = nil
94
- @key = 'test'
95
- @data = 'test'
96
- @expected = nil
97
- end
98
- end
99
- end
100
- end
@@ -1,28 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe CMSScanner::Cache::Typhoeus do
4
- subject(:cache) { described_class.new(cache_dir) }
5
-
6
- let(:cache_dir) { File.join(CACHE, 'typhoeus_cache') }
7
- let(:url) { 'http://example.com' }
8
- let(:request) { Typhoeus::Request.new(url, cache_ttl: 20) }
9
- let(:key) { request.hash.to_s }
10
-
11
- describe '#get' do
12
- it 'calls #read_entry' do
13
- expect(cache).to receive(:read_entry).with(key)
14
-
15
- cache.get(request)
16
- end
17
- end
18
-
19
- describe '#set' do
20
- let(:response) { Typhoeus::Response.new }
21
-
22
- it 'calls #write_entry' do
23
- expect(cache).to receive(:write_entry).with(key, response, request.cache_ttl)
24
-
25
- cache.set(request, response)
26
- end
27
- end
28
- end
@@ -1,49 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module CMSScanner
4
- module Controller
5
- # Failure class for testing
6
- class SpecFailure < Base
7
- def before_scan
8
- fail 'error spotted'
9
- end
10
- end
11
- end
12
- end
13
-
14
- describe CMSScanner::Scan do
15
- subject(:scanner) { described_class.new }
16
- let(:controller) { CMSScanner::Controller }
17
-
18
- describe '#new, #controllers' do
19
- its(:controllers) { should eq([controller::Core.new]) }
20
- end
21
-
22
- describe '#run' do
23
- it 'runs the controlllers and calls the formatter#beautify' do
24
- hydra = CMSScanner::Browser.instance.hydra
25
-
26
- expect(scanner.controllers).to receive(:run).ordered
27
- expect(hydra).to receive(:abort).ordered
28
- expect(hydra).to receive(:run).ordered
29
- expect(scanner.formatter).to receive(:beautify).ordered
30
-
31
- scanner.run
32
- end
33
-
34
- context 'when an error is raised during the #run' do
35
- it 'aborts the scan with the associated output' do
36
- scanner.controllers[0] = controller::SpecFailure.new
37
-
38
- expect(scanner.formatter).to receive(:output)
39
- .with('@scan_aborted', hash_including(:reason, :trace, :verbose))
40
-
41
- scanner.run
42
- end
43
- end
44
- end
45
-
46
- describe '#datastore' do
47
- its(:datastore) { should eq({}) }
48
- end
49
- end