headhunter 0.1.7 → 0.1.8

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 (110) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +28 -3
  5. data/lib/headhunter.rb +11 -5
  6. data/lib/headhunter/css_hunter.rb +4 -3
  7. data/lib/headhunter/css_validator.rb +21 -15
  8. data/lib/headhunter/engine.rb +11 -0
  9. data/lib/headhunter/html_validator.rb +8 -6
  10. data/lib/headhunter/rails.rb +10 -12
  11. data/lib/headhunter/runner.rb +1 -1
  12. data/lib/headhunter/version.rb +1 -1
  13. data/lib/tasks/headhunter_tasks.rake +4 -0
  14. data/lib/tidy/{tidy → tidy2} +0 -0
  15. data/spec/dummy/Gemfile +9 -0
  16. data/spec/dummy/Gemfile.lock +178 -0
  17. data/spec/dummy/README.rdoc +28 -0
  18. data/spec/dummy/Rakefile +13 -0
  19. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  20. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  21. data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
  22. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  23. data/spec/dummy/app/controllers/posts_controller.rb +5 -0
  24. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  25. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  26. data/spec/dummy/app/views/posts/index.html.erb +21 -0
  27. data/spec/dummy/bin/bundle +3 -0
  28. data/spec/dummy/bin/rails +4 -0
  29. data/spec/dummy/bin/rake +4 -0
  30. data/spec/dummy/config.ru +4 -0
  31. data/spec/dummy/config/application.rb +26 -0
  32. data/spec/dummy/config/boot.rb +5 -0
  33. data/spec/dummy/config/database.yml +25 -0
  34. data/spec/dummy/config/environment.rb +5 -0
  35. data/spec/dummy/config/environments/development.rb +26 -0
  36. data/spec/dummy/config/environments/production.rb +80 -0
  37. data/spec/dummy/config/environments/test.rb +36 -0
  38. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  39. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  40. data/spec/dummy/config/initializers/inflections.rb +16 -0
  41. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  42. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  43. data/spec/dummy/config/initializers/session_store.rb +3 -0
  44. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  45. data/spec/dummy/config/locales/en.yml +23 -0
  46. data/spec/dummy/config/routes.rb +58 -0
  47. data/spec/dummy/log/development.log +247 -0
  48. data/spec/dummy/log/test.log +452 -0
  49. data/spec/dummy/public/404.html +58 -0
  50. data/spec/dummy/public/422.html +58 -0
  51. data/spec/dummy/public/500.html +57 -0
  52. data/spec/dummy/public/favicon.ico +0 -0
  53. data/spec/dummy/spec/features/bla_spec.rb +9 -0
  54. data/spec/dummy/spec/spec_helper.rb +16 -0
  55. data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  56. data/spec/dummy/tmp/cache/assets/development/sprockets/1e8f75a6b5b33970fb8e397347caa0a1 +0 -0
  57. data/spec/dummy/tmp/cache/assets/development/sprockets/24204f742af588c8166d3160b500d20f +0 -0
  58. data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  59. data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  60. data/spec/dummy/tmp/cache/assets/development/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
  61. data/spec/dummy/tmp/cache/assets/development/sprockets/416150dc3ac35079c94273cc46e90aa6 +0 -0
  62. data/spec/dummy/tmp/cache/assets/development/sprockets/510da110ae528e2d22533be39ff696c5 +0 -0
  63. data/spec/dummy/tmp/cache/assets/development/sprockets/5384ad85f52d3272dbc64d46ef3876a4 +0 -0
  64. data/spec/dummy/tmp/cache/assets/development/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
  65. data/spec/dummy/tmp/cache/assets/development/sprockets/c85016e7bbd4f3adbb7635d01f85d39b +0 -0
  66. data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  67. data/spec/dummy/tmp/cache/assets/development/sprockets/d066c004d1fd26ae76a61303a7a18145 +0 -0
  68. data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  69. data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  70. data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  71. data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  72. data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  73. data/spec/dummy/tmp/cache/assets/test/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
  74. data/spec/dummy/tmp/cache/assets/test/sprockets/416150dc3ac35079c94273cc46e90aa6 +0 -0
  75. data/spec/dummy/tmp/cache/assets/test/sprockets/5384ad85f52d3272dbc64d46ef3876a4 +0 -0
  76. data/spec/dummy/tmp/cache/assets/test/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
  77. data/spec/dummy/tmp/cache/assets/test/sprockets/c85016e7bbd4f3adbb7635d01f85d39b +0 -0
  78. data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  79. data/spec/dummy/tmp/cache/assets/test/sprockets/d066c004d1fd26ae76a61303a7a18145 +0 -0
  80. data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  81. data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  82. data/spec/files/css_hunter/valid.html +15 -0
  83. data/spec/files/css_validator/invalid.css +42 -0
  84. data/spec/files/css_validator/invalid_response.xml +40 -0
  85. data/spec/files/css_validator/valid.css +39 -0
  86. data/spec/files/css_validator/valid_response.xml +23 -0
  87. data/spec/files/html_validator/invalid.html +15 -0
  88. data/spec/files/html_validator/invalid_response.txt +1 -0
  89. data/spec/files/html_validator/valid.html +15 -0
  90. data/spec/files/html_validator/valid_response.txt +0 -0
  91. data/spec/files/html_with_srcset.html +14 -0
  92. data/spec/files/html_without_srcset.html +14 -0
  93. data/spec/files/invalid2.html +16 -0
  94. data/spec/files/valid-1.css +31 -0
  95. data/spec/files/valid-2.css +42 -0
  96. data/spec/files/valid-3.css +48 -0
  97. data/spec/files/valid.html5 +14 -0
  98. data/spec/files/valid_with_cache_busters.html +16 -0
  99. data/spec/files/valid_without_cache_busters.html +16 -0
  100. data/spec/lib/headhunter/css_hunter_spec.rb +83 -0
  101. data/spec/lib/headhunter/css_validator_spec.rb +196 -0
  102. data/spec/lib/headhunter/html_validator_spec.rb +143 -0
  103. data/spec/spec_helper.rb +25 -0
  104. metadata +193 -86
  105. data/Gemfile +0 -4
  106. data/Gemfile.lock +0 -78
  107. data/README.md +0 -78
  108. data/docs/headhunter.png +0 -0
  109. data/docs/money.png +0 -0
  110. data/docs/screenshot.png +0 -0
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
+ <title>Test Valid Page</title>
7
+ </head>
8
+
9
+ <body>
10
+
11
+ <h1>Test#valid</h1>
12
+ <p>This is an example valid html file</p>
13
+
14
+ </body>
15
+ </html>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+ <title>Test Valid Page</title>
6
+ </head>
7
+
8
+ <body>
9
+
10
+ <h1>Test#valid</h1>
11
+ <img src="/images/test.jpg" alt="test" srcset="/images/test.jpg">
12
+ <br>
13
+ </body>
14
+ </html>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+ <title>Test Valid Page</title>
6
+ </head>
7
+
8
+ <body>
9
+
10
+ <h1>Test#valid</h1>
11
+ <img src="/images/test.jpg" alt="test">
12
+ <br>
13
+ </body>
14
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+
3
+ <p>This isn't valid here</p>
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title>Test Invalid Page</title>
8
+ </head>
9
+
10
+ <body>
11
+
12
+ <h1>Test#invalid</h1>
13
+ <p><b>This is an example invalid html file</b></p>
14
+
15
+ </body>
16
+ </html>
@@ -0,0 +1,31 @@
1
+ html, body
2
+ {
3
+ background:#007086;
4
+ font-family:Arial,Helvetica,sans-serif;
5
+ font-size:0.83em;
6
+ margin:0;
7
+ padding:0;
8
+ }
9
+ ul, ul li
10
+ {
11
+ list-style-type: none;
12
+ }
13
+ .hidden
14
+ {
15
+ display: none;
16
+ }
17
+ a img
18
+ {
19
+ border: none;
20
+ }
21
+ a
22
+ {
23
+ text-decoration: none;
24
+ }
25
+ .clear-float
26
+ {
27
+ clear: both;
28
+ font-size: 1px;
29
+ height: 0px;
30
+ line-height: 0px;
31
+ }
@@ -0,0 +1,42 @@
1
+ html, body
2
+ {
3
+ background:#007086;
4
+ font-family:Arial,Helvetica,sans-serif;
5
+ font-size:0.83em;
6
+ margin:0;
7
+ padding:0;
8
+ }
9
+
10
+ *
11
+ {
12
+ margin:0;
13
+ padding:0;
14
+ }
15
+ ul, ul li
16
+ {
17
+ list-style-type: none;
18
+ }
19
+
20
+ .hidden
21
+ {
22
+ display: none;
23
+ }
24
+ a img
25
+ {
26
+ border: none;
27
+ }
28
+ a
29
+ {
30
+ text-decoration: none;
31
+ }
32
+ a:hover
33
+ {
34
+ text-decoration: underline;
35
+ }
36
+ .clear-float
37
+ {
38
+ clear: both;
39
+ font-size: 1px;
40
+ height: 0px;
41
+ line-height: 0px;
42
+ }
@@ -0,0 +1,48 @@
1
+ html, body
2
+ {
3
+ background:#007086;
4
+ font-family:Arial,Helvetica,sans-serif;
5
+ font-size:0.83em;
6
+ margin:0;
7
+ padding:0;
8
+ }
9
+
10
+ *
11
+ {
12
+ margin:0;
13
+ padding:0;
14
+ }
15
+ ul, ul li
16
+ {
17
+ list-style-type: none;
18
+ }
19
+ li:last-child {
20
+ padding-bottom: 0.2em;
21
+ }
22
+ .hidden
23
+ {
24
+ display: none;
25
+ }
26
+ a img
27
+ {
28
+ border: none;
29
+ }
30
+ a
31
+ {
32
+ text-decoration: none;
33
+ }
34
+ a[href^="ftp"]
35
+ {
36
+ text-decoration: underline;
37
+ }
38
+ a:hover
39
+ {
40
+ text-decoration: underline;
41
+ }
42
+ .clear-float
43
+ {
44
+ clear: both;
45
+ font-size: 1px;
46
+ height: 0px;
47
+ line-height: 0px;
48
+ }
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+ <title>Test Valid Page</title>
6
+ </head>
7
+
8
+ <body>
9
+
10
+ <h1>Test#valid</h1>
11
+ <p>This is an example valid html5 file</p>
12
+ <br>
13
+ </body>
14
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+ <title>Test Valid Page</title>
6
+ </head>
7
+
8
+ <body>
9
+
10
+ <h1>Test#valid</h1>
11
+ <p>This is an example valid html5 file</p>
12
+ <a href="/testing?655557777">Test link</a>
13
+ <img src="/images/test.jpg?123456" alt="test">
14
+ <br>
15
+ </body>
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+ <title>Test Valid Page</title>
6
+ </head>
7
+
8
+ <body>
9
+
10
+ <h1>Test#valid</h1>
11
+ <p>This is an example valid html5 file</p>
12
+ <a href="/testing">Test link</a>
13
+ <img src="/images/test.jpg" alt="test">
14
+ <br>
15
+ </body>
16
+ </html>
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ module Headhunter
4
+ describe CssHunter do
5
+ describe '#remove_pseudo_classes_from' do
6
+ subject { described_class.new }
7
+
8
+ it 'returns pseudo classes' do
9
+ expect(subject.remove_pseudo_classes_from('textarea:not(.something)')).to eq 'textarea'
10
+ end
11
+ end
12
+
13
+ describe '#bare_selector_from' do
14
+ subject { described_class.new }
15
+
16
+ it 'cleans a selector from stuff like pseudo classes' do
17
+ expect(subject.bare_selector_from('textarea:not(.something)')).to eq 'textarea'
18
+ end
19
+ end
20
+
21
+ describe '#add_css_selectors_from' do
22
+ subject { described_class.new }
23
+
24
+ it 'adds selectors' do
25
+ subject.add_css_selectors_from(read_file('css_validator/valid.css'))
26
+
27
+ expect(subject.error_selectors).to eq []
28
+ expect(subject.used_selectors).to eq []
29
+ expect(subject.unused_selectors).to match_array ['html', 'body', '*', 'ul', 'ul li', '.hidden', 'a img', 'a',
30
+ 'a:hover', '.clear-float']
31
+ end
32
+ end
33
+
34
+ describe '#detect_used_selectors_in' do
35
+ subject { described_class.new }
36
+
37
+ it 'adds selectors' do
38
+ subject.add_css_selectors_from(read_file('css_validator/valid.css'))
39
+
40
+ expect(subject.detect_used_selectors_in(read_file('css_hunter/valid.html'))).to match_array ['html', 'body', '*']
41
+ end
42
+
43
+ it 'gracefully ignores invalid rules' do
44
+ pending "Don't know how to do this"
45
+ end
46
+ end
47
+
48
+ describe '#process' do
49
+ subject { described_class.new }
50
+
51
+ it 'processes given html' do
52
+ subject.add_css_selectors_from(read_file('css_validator/valid.css'))
53
+ subject.process(read_file('css_hunter/valid.html'))
54
+
55
+ expect(subject.error_selectors).to eq []
56
+ expect(subject.used_selectors).to eq ['html', 'body', '*']
57
+ expect(subject.unused_selectors).to match_array ['ul', 'ul li', '.hidden', 'a img', 'a', 'a:hover',
58
+ '.clear-float']
59
+ end
60
+ end
61
+
62
+ describe '#statistics' do
63
+ subject do
64
+ css_hunter = described_class.new
65
+ css_hunter.add_css_selectors_from(read_file('css_validator/valid.css'))
66
+ css_hunter.process(read_file('css_hunter/valid.html'))
67
+ css_hunter.statistics
68
+ end
69
+
70
+ it "returns a text with nice statistics" do
71
+ expect(subject).to match 'Found 10 CSS selectors.'
72
+ expect(subject).to match '7 selectors are not in use:'
73
+ expect(subject).to match '.clear-float'
74
+ expect(subject).to match '.hidden'
75
+ expect(subject).to match 'a'
76
+ expect(subject).to match 'a img'
77
+ expect(subject).to match 'a:hover'
78
+ expect(subject).to match 'ul'
79
+ expect(subject).to match 'ul li'
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,196 @@
1
+ require 'spec_helper'
2
+
3
+ describe Headhunter::CssValidator do # TODO: "Module Headhunter"
4
+ describe '#validate' do
5
+ subject { described_class.new }
6
+
7
+ it 'adds a response when calling the validator succeeds' do
8
+ expect {
9
+ subject.validate(path_to_file('css_validator/invalid.css'))
10
+ }.to change { subject.responses.count }.by 1
11
+ end
12
+
13
+ it 'throws an exception when calling the validator fails'
14
+ end
15
+
16
+ describe '#extract_filename' do
17
+ subject { described_class.new }
18
+
19
+ it 'for a compiled asset, it returns the name of the file without the cache hash' do
20
+ filename = '/rails/root/public/assets/some-rails_asset-1f6355461e8ff118448a9649a392632c.css'
21
+ expect(subject.send(:extract_filename, filename)).to eq 'some-rails_asset.css'
22
+ end
23
+
24
+ it 'for any other file, it simply returns the name' do
25
+ filename = '/rails/root/public/assets/some_other-file.css'
26
+ expect(subject.send(:extract_filename, filename)).to eq 'some_other-file.css'
27
+ end
28
+ end
29
+
30
+ describe '#x_stylesheets_be' do
31
+ subject { described_class.new }
32
+
33
+ it "creates a grammatically correct sentence when there is no stylesheet" do
34
+ expect(subject.x_stylesheets_be(0)).to eq '0 stylesheet is'
35
+ end
36
+
37
+ it "creates a grammatically correct sentence when there is only one stylesheet" do
38
+ expect(subject.x_stylesheets_be(1)).to eq '1 stylesheet is'
39
+ end
40
+
41
+ it "creates a grammatically correct sentence when there is more than one stylesheet" do
42
+ expect(subject.x_stylesheets_be(2)).to eq '2 stylesheets are'
43
+ end
44
+ end
45
+
46
+ describe '#statistics' do
47
+ context 'for valid CSS' do
48
+ subject { described_class.new([path_to_file('css_validator/valid.css')]).statistics }
49
+
50
+ it "returns a text with nice statistics" do
51
+ expect(subject).to match 'Validated 1 stylesheet.'
52
+ expect(subject).to match 'All stylesheets are valid.'
53
+ end
54
+ end
55
+
56
+ context 'for invalid CSS' do
57
+ subject { described_class.new([path_to_file('css_validator/invalid.css')]).statistics }
58
+
59
+ it "returns a text with nice statistics" do
60
+ expect(subject).to match 'Validated 1 stylesheet.'
61
+ expect(subject).to match '1 stylesheet is invalid.'
62
+ expect(subject).to match 'invalid.css:'
63
+ expect(subject).to match "Line 8: Property wibble doesn't exist."
64
+ end
65
+ end
66
+ end
67
+
68
+ describe '#initialize' do
69
+ context 'for no CSS' do
70
+ subject { described_class.new }
71
+
72
+ it 'executes validation' do
73
+ expect(subject.valid_responses.size).to eq 0
74
+ expect(subject.invalid_responses.size).to eq 0
75
+ end
76
+ end
77
+
78
+ context 'for valid CSS' do
79
+ subject { described_class.new([path_to_file('css_validator/valid.css')]) }
80
+
81
+ it 'executes validation' do
82
+ expect(subject.valid_responses.size).to eq 1
83
+ expect(subject.invalid_responses.size).to eq 0
84
+ end
85
+ end
86
+
87
+ context 'for invalid CSS' do
88
+ subject { described_class.new([path_to_file('css_validator/invalid.css')]) }
89
+
90
+ it 'executes validation' do
91
+ expect(subject.invalid_responses.size).to eq 1
92
+ expect(subject.valid_responses.size).to eq 0
93
+ end
94
+ end
95
+ end
96
+
97
+ describe '#valid_responses' do
98
+ subject { described_class.new([path_to_file('css_validator/valid.css')]) }
99
+
100
+ it 'returns all valid responses' do
101
+ expect(subject.valid_responses.size).to eq 1
102
+ expect(subject.invalid_responses.size).to eq 0
103
+ end
104
+ end
105
+
106
+ describe '#invalid_responses' do
107
+ subject { described_class.new([path_to_file('css_validator/invalid.css')]) }
108
+
109
+ it 'returns all valid responses' do
110
+ expect(subject.invalid_responses.size).to eq 1
111
+ expect(subject.valid_responses.size).to eq 0
112
+ end
113
+ end
114
+ end
115
+
116
+ describe Headhunter::CssValidator::Response do
117
+ describe '#initialize' do
118
+ context 'valid response' do
119
+ subject { described_class.new(read_file('css_validator/valid_response.xml')) }
120
+
121
+ it { should be_valid }
122
+ end
123
+
124
+ context 'invalid response' do
125
+ subject { described_class.new(read_file('css_validator/invalid_response.xml')) }
126
+
127
+ it { should_not be_valid }
128
+ end
129
+ end
130
+
131
+ describe '#errors' do
132
+ context 'valid response' do
133
+ subject { described_class.new(read_file('css_validator/valid_response.xml')) }
134
+
135
+ it 'returns an empty array' do
136
+ expect(subject.errors).to eq []
137
+ end
138
+ end
139
+
140
+ context 'invalid response' do
141
+ subject { described_class.new(read_file('css_validator/invalid_response.xml')) }
142
+
143
+ it 'returns an array of errors' do
144
+ expect(subject.errors.size).to eq 1
145
+ expect(subject.errors.first).to be_a Headhunter::CssValidator::Response::Error
146
+ end
147
+ end
148
+ end
149
+
150
+ describe '#convert_soap_to_xml' do
151
+ subject { described_class.new }
152
+
153
+ it 'converts SOAP to XML' do
154
+ string = "this is the first line\n<m:errors><m:pipapo><bla>Bla!</bla</m:pipapo</m:errors>"
155
+ expect(subject.send :convert_soap_to_xml, string).to eq "<errors><pipapo><bla>Bla!</bla</pipapo</errors>"
156
+ end
157
+ end
158
+
159
+ describe '#remove_first_line_from' do
160
+ subject { described_class.new }
161
+
162
+ it 'removes the first line from a passed string' do
163
+ string = "this is the first line\nthis\nis the\nrest"
164
+ expect(subject.send :remove_first_line_from, string).to eq "this\nis the\nrest"
165
+ end
166
+ end
167
+
168
+ describe '#sanitize_prefixed_tags_from' do
169
+ subject { described_class.new }
170
+
171
+ it 'replaces tags like <m:error> with <error> in a passed string' do
172
+ string = "<m:errors><m:pipapo><bla>Bla!</bla</m:pipapo</m:errors>"
173
+ expect(subject.send :sanitize_prefixed_tags_from, string).to eq "<errors><pipapo><bla>Bla!</bla</pipapo</errors>"
174
+ end
175
+ end
176
+
177
+ describe '#uri' do
178
+ subject { described_class.new(read_file('css_validator/valid_response.xml')) }
179
+
180
+ it "returns the validated uri's path" do
181
+ expect(subject.send :uri).to eq 'file:tmp.css'
182
+ end
183
+ end
184
+ end
185
+
186
+ describe Headhunter::CssValidator::Response::Error do
187
+ describe '#initialize' do
188
+ subject { described_class.new(123, "Attribute xyz doesn't exist", context: 'something', anything_else: 'bla') }
189
+
190
+ it 'assigns the passed params correctly' do
191
+ expect(subject.line).to eq 123
192
+ expect(subject.message).to eq "Attribute xyz doesn't exist"
193
+ expect(subject.details).to eq context: 'something', anything_else: 'bla'
194
+ end
195
+ end
196
+ end