acop 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -29,6 +29,15 @@ Specify the url you want accessibility tested
29
29
 
30
30
  `acop -u http://www.google.com`
31
31
 
32
+ Specify the urls to be tested in a file (new line separated)
33
+
34
+ `acop -f ./list_of_urls.txt`
35
+
36
+ Scaffold rspec tests for a particular url or list of urls in a file. The gem will create a spec directory(if none exists) from where it is run. In addition it will create a spec file with a describe block for a particular url or list of urls. If the spec file being used already exists, the gem will append to the file.
37
+
38
+ `acop -u www.google.com -g rspec`
39
+ `acop -f list_of_urls -g rspec`
40
+
32
41
  Checkpoints
33
42
  -----------
34
43
  ### Standard Web Programming
@@ -7,17 +7,36 @@ module Acop
7
7
  options = {}
8
8
 
9
9
  option_parser = OptionParser.new do |opts|
10
- opts.banner = 'Usage: acop -u URL'
10
+ opts.banner = 'Usage: acop [options] [values]'
11
11
 
12
12
  opts.on('-u', '--url URL', 'Url to be accessibility tested') do |tag|
13
13
  options[:url] = tag
14
+ options[:url] = "http://" + options[:url] unless options[:url].include?("http")
15
+ end
16
+
17
+ opts.on('-f', '--file FILEPATH', "File with a list of urls' to be accessibility tested") do |tag|
18
+ options[:file] = tag
19
+ end
20
+
21
+ opts.on('-g', '--generate TEST_TYPE', "Generate tests of the specified type from the list of urls") do |tag|
22
+ options[:tests] = tag
14
23
  end
15
24
  end
16
25
 
17
26
  begin
18
27
  option_parser.parse!
19
- raise OptionParser::MissingArgument, "Url should be provided!" if options.keys.empty?
20
- raise OptionParser::InvalidArgument, "Url cannot be resolved!" unless valid_url?(options[:url])
28
+ raise OptionParser::MissingArgument, "Either Url or FilePath should be provided!" if options.keys.empty?
29
+ raise OptionParser::InvalidArgument, "Both Url and FilePath cannot be specified!" if(options[:url]!=nil and options[:file]!=nil)
30
+ raise OptionParser::MissingArgument, "Url or file with list of urls should be specified to generate tests" unless(options[:url] or options[:file])
31
+ if(options[:url]!=nil)
32
+ raise OptionParser::InvalidArgument, "Url cannot be resolved!" unless valid_url?(options[:url])
33
+ end
34
+ if(options[:file]!=nil)
35
+ raise OptionParser::InvalidArgument, "File does not exist or empty!" unless (file_exists?(options[:file]) and file_has_urls?(options[:file]))
36
+ end
37
+ if(options[:tests]!=nil)
38
+ raise OptionParser::InvalidArgument, "Invalid test type! Currently supports 'rspec'" unless expected_test_type?(options[:tests])
39
+ end
21
40
  rescue OptionParser::ParseError => e
22
41
  puts e.message
23
42
  puts
@@ -30,7 +49,6 @@ module Acop
30
49
 
31
50
  def self.valid_url?(url)
32
51
  begin
33
- url = "http://" + url unless url.include?("http")
34
52
  contents = open(url)
35
53
  return true
36
54
  rescue Exception => e
@@ -38,4 +56,16 @@ module Acop
38
56
  end
39
57
  end
40
58
 
59
+ def self.file_exists?(file)
60
+ return File.exists?(file)
61
+ end
62
+
63
+ def self.file_has_urls?(file)
64
+ urls = File.readlines(file, 'r')
65
+ return urls.size > 0
66
+ end
67
+
68
+ def self.expected_test_type?(test_type)
69
+ return true if(test_type == "rspec")
70
+ end
41
71
  end
@@ -1,28 +1,56 @@
1
1
  require 'open-uri'
2
2
  require 'nokogiri'
3
3
  require 'rexml/document'
4
+ require File.dirname(__FILE__) + '/rspec_writer.rb'
4
5
 
5
6
  module Acop
6
7
 
7
8
  class Enforcer
8
- attr_reader :ah, :source, :contents
9
+ attr_reader :ah, :options, :source, :contents
9
10
 
10
11
  def initialize(options={})
12
+ @options = options
11
13
  @ah = Helpers.new
12
- url = options[:url]
13
- url = "http://" + options[:url] unless options[:url].include?("http")
14
+ end
15
+
16
+ def get_url_contents(url)
17
+ url = URI.parse(url)
14
18
  @source = open(url)
15
19
  @contents = Nokogiri::HTML(@source)
16
20
  end
17
21
 
18
- def accessibility_checks
19
- error_messages = []
22
+ def formatted_url(url)
23
+ url = "http://" + url unless url.include?("http")
24
+ end
20
25
 
21
- self.methods.each do |method|
22
- error_messages << (self.public_send(method)) if method[0..5] == "check_"
26
+ def accessibility_checks
27
+ if(@options[:url])
28
+ Acop::RSpecWriter.new(options[:url]) if(options[:tests]=='rspec')
29
+ error_messages = []
30
+ length = 30 + @options[:url].length
31
+ puts "="*length
32
+ puts("==ACCESSIBILITY ISSUES FOR: #{@options[:url].chomp}==")
33
+ puts "="*length
34
+ get_url_contents(@options[:url])
35
+ self.methods.each do |method|
36
+ error_messages << (self.public_send(method)) if method[0..5] == "check_"
37
+ end
38
+ puts error_messages
39
+ else
40
+ urls = File.readlines(@options[:file])
41
+ urls.each do |url|
42
+ Acop::RSpecWriter.new(url) if(options[:tests]=='rspec')
43
+ error_messages = []
44
+ puts("===============================================")
45
+ puts("==ACCESSIBILITY ISSUES FOR: #{url.chomp}==")
46
+ puts("===============================================")
47
+ get_url_contents(formatted_url(url))
48
+ self.methods.each do |method|
49
+ error_messages << (self.public_send(method)) if method[0..5] == "check_"
50
+ end
51
+ puts error_messages
52
+ end
23
53
  end
24
-
25
- puts error_messages
26
54
  end
27
55
 
28
56
  def check_image_input_alt(source=@contents)
@@ -31,7 +59,7 @@ module Acop
31
59
  error_messages = []
32
60
  image_inputs.each do |input|
33
61
  if (@ah.attribute_empty_or_nil(input, "alt") and input.parent.name != "a")
34
- error_messages.push("Missing alt text/attribute for image button with id/name: " + (input['name'] || input['id'] || ""))
62
+ error_messages.push("Line #{input.line}: Missing alt text/attribute for image button with id/name: " + (input['name'] || input['id'] || ""))
35
63
  end
36
64
  end
37
65
  error_messages
@@ -42,7 +70,7 @@ module Acop
42
70
  error_messages = []
43
71
  image_elements.each do |element|
44
72
  if (@ah.attribute_empty_or_nil(element, "alt") and element.parent.name != "a")
45
- error_messages.push("Missing alt text/attribute for image with src: " + element['src'])
73
+ error_messages.push("Line #{element.line}: Missing alt text/attribute for image with src: " + element['src'])
46
74
  end
47
75
  end
48
76
  error_messages
@@ -54,7 +82,7 @@ module Acop
54
82
  image_links = []
55
83
  link_elements.each do |link_element|
56
84
  if(link_element['alt'] != "")
57
- error_messages.push("Alt Text not empty or nil for image link with src: " + link_element['src'])
85
+ error_messages.push("Line #{link_element.line}: Alt Text not empty or nil for image link with src: " + link_element['src'])
58
86
  end
59
87
  end
60
88
  error_messages
@@ -65,7 +93,7 @@ module Acop
65
93
  error_messages = []
66
94
  area_elements.each do |element|
67
95
  if (@ah.attribute_empty_or_nil(element, "alt"))
68
- error_messages.push("Missing alt text/attribute for area element with id/name: " + (element['name'] || element['id'] || ""))
96
+ error_messages.push("Line #{element.line}: Missing alt text/attribute for area element with id/name: " + (element['name'] || element['id'] || ""))
69
97
  end
70
98
  end
71
99
  error_messages
@@ -75,8 +103,8 @@ module Acop
75
103
  title_element = source.css('title')
76
104
  error_messages = []
77
105
  error_messages.push("Missing title element") if title_element.empty?
78
- error_messages.push("Empty title element") if(title_element.first and title_element.first.text == "")
79
- error_messages.push("More than 1 title element") if title_element.length > 1
106
+ error_messages.push("Line #{title_element.first.line}: Empty title element") if(title_element.first and title_element.first.text == "")
107
+ error_messages.push("Line #{title_element.first.line}: More than 1 title element") if title_element.length > 1
80
108
 
81
109
  error_messages
82
110
  end
@@ -84,7 +112,8 @@ module Acop
84
112
  def check_visual_formatting(source=@contents)
85
113
  error_messages = []
86
114
  %w{b i font center u}.each do |markup_element|
87
- error_messages.push("HTML visual formatting elements being used. Use CSS instead") unless source.css(markup_element).empty?
115
+ visual_formatting_fields = source.css(markup_element)
116
+ error_messages.push("Line #{visual_formatting_fields.first.line}: HTML visual formatting elements being used. Use CSS instead") unless visual_formatting_fields.empty?
88
117
  end
89
118
  error_messages
90
119
  end
@@ -94,7 +123,8 @@ module Acop
94
123
  iframe_elements = source.css("iframe")
95
124
  error_messages = []
96
125
  if(frame_elements.length > 0 or iframe_elements.length > 0)
97
- doctype = REXML::Document.new(@source.string).doctype
126
+ puts @source.readlines.first
127
+ doctype = REXML::Document.new(@source.readlines.first).doctype
98
128
  error_messages.push("Frames/iFrames present but doctype is missing") unless doctype
99
129
  end
100
130
  error_messages
@@ -111,17 +141,20 @@ module Acop
111
141
  hyperlinks = source.css("a")
112
142
  error_messages = []
113
143
  hyperlinks.each do |link|
114
- error_messages.push("Missing link text for link with href: #{link['href']}") if(link.text==nil or link.text=="")
144
+ error_messages.push("Line #{link.line}: Missing link text for link with href: #{link['href']}") if(link.text==nil or link.text=="")
115
145
  end
116
- hyperlink_text = hyperlinks.collect {|link| link.text }
117
- error_messages.push("Links should not have duplicate text") if(hyperlink_text != hyperlink_text.uniq)
146
+ hyperlink_text = hyperlinks.collect {|link| link.text.lstrip }
147
+ duplicate_hyperlink_text = hyperlink_text.select{|link| hyperlink_text.count(link) > 1}.uniq
148
+ duplicate_hyperlink_text.reject! {|text| text.empty? }
149
+ error_messages.push("Links should not have duplicate text: #{duplicate_hyperlink_text}") unless(duplicate_hyperlink_text.empty?)
118
150
  error_messages
119
151
  end
120
152
 
121
153
  def check_flashing_content(source=@contents)
122
154
  error_messages = []
123
155
  %w{blink marquee}.each do |flashing_element|
124
- error_messages.push("Flashing elements such as 'blink' or 'marquee' should not be used") unless source.css(flashing_element).empty?
156
+ flashing_element_fields = source.css(flashing_element)
157
+ error_messages.push("Line #{flashing_element_fields.first.line}: Flashing elements such as 'blink' or 'marquee' should not be used") unless flashing_element_fields.empty?
125
158
  end
126
159
  error_messages
127
160
  end
@@ -131,8 +164,8 @@ module Acop
131
164
  frame_elements = source.css("frame")
132
165
  error_messages = []
133
166
  frame_elements.each do |frame|
134
- error_messages.push("Missing frame title element") unless frame['title']
135
- error_messages.push("Empty frame title element") if frame['title'] == ""
167
+ error_messages.push("Line #{frame.line}: Missing frame title element") unless frame['title']
168
+ error_messages.push("Line #{frame.line}: Empty frame title element") if frame['title'] == ""
136
169
  end
137
170
  error_messages
138
171
  end
@@ -141,8 +174,8 @@ module Acop
141
174
  iframe_elements = source.css("iframe")
142
175
  error_messages = []
143
176
  iframe_elements.each do |iframe|
144
- error_messages.push("Missing iframe title element") unless iframe['title']
145
- error_messages.push("Empty iframe title element") if iframe['title'] == ""
177
+ error_messages.push("Line #{iframe.line}: Missing iframe title element") unless iframe['title']
178
+ error_messages.push("Line #{iframe.line}: Empty iframe title element") if iframe['title'] == ""
146
179
  end
147
180
  error_messages
148
181
  end
@@ -159,11 +192,11 @@ module Acop
159
192
  form_fields << form.css(element) unless element_fields.empty?
160
193
  end
161
194
  form_fields.flatten!
162
- form_fields.reject {|field| field.attr('submit') || field.attr('reset') || field.attr('button') }
195
+ form_fields.reject! {|field| field.attr('type') == 'submit' || field.attr('type') == 'reset' || field.attr('type') == 'button' }
163
196
 
164
197
  form_fields.each do |field|
165
198
  id = field.attr('id')
166
- error_messages.push("Missing label for form field with id/name: " + (id || field.attr('name') || "")) if (labels.select {|label| label['for'].to_s == id.to_s }.size < 1)
199
+ error_messages.push("Line #{field.line}: Missing label for form field with id/name: " + (id || field.attr('name') || "")) if (labels.select {|label| label['for'].to_s == id.to_s }.size < 1)
167
200
  end
168
201
  end
169
202
  error_messages
@@ -180,7 +213,7 @@ module Acop
180
213
  input_fields.each do |field|
181
214
  value_present = field.attr('value') != nil and field.attr('value') != ""
182
215
  label_absent = (labels.select {|label| label['for'].to_s == field.attr('id').to_s }.size) < 1
183
- error_messages.push("Missing value attribute/label present for input element with id/name: " + (field.attr('id').to_s || field.attr('name') || "")) unless(value_present and label_absent)
216
+ error_messages.push("Line #{field.line}: Missing value attribute/label present for input element with id/name: " + (field.attr('id').to_s || field.attr('name') || "")) unless(value_present and label_absent)
184
217
  end
185
218
  end
186
219
  error_messages
@@ -190,13 +223,13 @@ module Acop
190
223
  error_messages = []
191
224
  labels = source.css("label")
192
225
  labels.each do |label|
193
- error_messages.push("Missing label text for label with for attribute: #{label['for']}") if (label.text==nil or label.text=="")
226
+ error_messages.push("Line #{label.line}: Missing label text for label with for attribute: #{label['for']}") if (label.text==nil or label.text=="")
194
227
  end
195
228
 
196
229
  %w{legend button}.each do |control|
197
230
  fields = source.css(control)
198
231
  fields.each do |field|
199
- error_messages.push("Missing #{control} text for #{control}") if (field.text==nil or field.text=="")
232
+ error_messages.push("Line #{field.line}: Missing #{control} text for #{control}") if (field.text==nil or field.text=="")
200
233
  end
201
234
  end
202
235
  error_messages
@@ -217,7 +250,7 @@ module Acop
217
250
  end
218
251
  headings.flatten!
219
252
  headings.each do |heading|
220
- error_messages.push("Missing text for #{heading.name} element") if(heading.text==nil or heading.text=="")
253
+ error_messages.push("Line #{heading.line}: Missing text for #{heading.name} element") if(heading.text==nil or heading.text=="")
221
254
  end
222
255
  error_messages
223
256
  end
@@ -246,7 +279,7 @@ module Acop
246
279
  tables = source.css("table")
247
280
 
248
281
  tables.each do |table|
249
- error_messages.push("Missing table summary") if(table['summary'] == nil or table['summary'] == "")
282
+ error_messages.push("Line #{table.line}: Missing table summary") if(table['summary'] == nil or table['summary'] == "")
250
283
  end
251
284
  error_messages
252
285
  end
@@ -257,14 +290,14 @@ module Acop
257
290
 
258
291
  tables.each do |table|
259
292
  if table.css("th").empty?
260
- error_messages.push("Missing table headers for table with summary: " + (table['summary'] || ""))
293
+ error_messages.push("#{table.line}: Missing table headers for table with summary: " + (table['summary'] || ""))
261
294
  end
262
295
  end
263
296
 
264
297
  tables.each do |table|
265
298
  th_elements = table.css("th")
266
299
  th_elements.each do |th|
267
- error_messages.push("Missing scope for table header") if (th['scope'] == nil || th['scope'] == "")
300
+ error_messages.push("Line #{th.line}: Missing scope for table header") if (th['scope'] == nil || th['scope'] == "")
268
301
  end
269
302
  end
270
303
  error_messages
@@ -0,0 +1,50 @@
1
+ module Acop
2
+ class RSpecWriter
3
+ attr_writer :file
4
+ attr_reader :url
5
+
6
+ def initialize(url)
7
+ @url = url
8
+ Dir.mkdir("./spec") unless File.exists?("./spec")
9
+ if File.exists?("./spec/acop_spec.rb")
10
+ @file = File.open("./spec/acop_accessibility_spec.rb", 'a')
11
+ append_file(@url)
12
+ else
13
+ @file = File.open("./spec/acop_accessibility_spec.rb", 'w')
14
+ write_file(@url)
15
+ end
16
+ close_file
17
+ end
18
+
19
+ def append_file(url)
20
+ write_rspec(url)
21
+ end
22
+
23
+ def write_file(url)
24
+ write_requires
25
+ write_rspec(url)
26
+ end
27
+
28
+ def write_requires
29
+ @file.puts "require 'rspec/expectations'"
30
+ end
31
+
32
+ def write_rspec(url)
33
+ @file.puts "describe '#{url.chomp}' do"
34
+ @file.puts " it 'should pass accessibility tests' do"
35
+ @file.puts " output = `acop -u #{url.chomp}`"
36
+ @file.puts " output = output.split(\"\\n\").reject! {|line| line[0] == '='}"
37
+ @file.puts " puts '== ACCESSIBILITY ISSUES =='"
38
+ @file.puts " puts output"
39
+ @file.puts " output.should be_empty"
40
+ @file.puts " end"
41
+ @file.puts "end"
42
+ @file.puts
43
+ end
44
+
45
+ def close_file
46
+ @file.close
47
+ end
48
+ end
49
+ end
50
+
@@ -1,3 +1,3 @@
1
1
  module Acop
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -14,6 +14,7 @@ RSpec.configure do |config|
14
14
  it "should not return error messages when no issues with image tags" do
15
15
  stub_request(:any, "www.example.com").to_return(:body => "<html><body><input type='image' alt='alt text'/></body></html>", :status => 200)
16
16
  enf = Acop::Enforcer.new({:url => "www.example.com"})
17
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
17
18
  error_messages = enf.check_image_input_alt
18
19
  error_messages.should be_empty
19
20
  end
@@ -21,6 +22,7 @@ RSpec.configure do |config|
21
22
  it "should return error messages when alt tags absent from input image elements" do
22
23
  stub_request(:any, "www.example.com").to_return(:body => "<html><body><input type='image'/></body></html>", :status => 200)
23
24
  enf = Acop::Enforcer.new({:url => "www.example.com"})
25
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
24
26
  error_messages = enf.check_image_input_alt
25
27
  error_messages.should_not be_empty
26
28
  error_messages[0].should match("Missing alt text/attribute for image button")
@@ -29,6 +31,7 @@ RSpec.configure do |config|
29
31
  it "should return error messages when alt tags empty in input image elements" do
30
32
  stub_request(:any, "www.example.com").to_return(:body => "<html><body><input type='image' alt=''/></body></html>", :status => 200)
31
33
  enf = Acop::Enforcer.new({:url => "www.example.com"})
34
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
32
35
  error_messages = enf.check_image_input_alt
33
36
  error_messages.should_not be_empty
34
37
  error_messages[0].should match("Missing alt text/attribute for image button")
@@ -37,6 +40,7 @@ RSpec.configure do |config|
37
40
  it "should return error messages when alt tags absent from image elements" do
38
41
  stub_request(:any, "www.example.com").to_return(:body => "<html><body><img src='www.intuit.com'></body></html>", :status => 200)
39
42
  enf = Acop::Enforcer.new({:url => "www.example.com"})
43
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
40
44
  error_messages = enf.check_image_alt
41
45
  error_messages.should_not be_empty
42
46
  error_messages[0].should match("Missing alt text/attribute for image with src")
@@ -45,6 +49,7 @@ RSpec.configure do |config|
45
49
  it "should return error messages when alt tags empty in image elements" do
46
50
  stub_request(:any, "www.example.com").to_return(:body => "<html><body><img alt='' src='www.intuit.com'></body></html>", :status => 200)
47
51
  enf = Acop::Enforcer.new({:url => "www.example.com"})
52
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
48
53
  error_messages = enf.check_image_alt
49
54
  error_messages.should_not be_empty
50
55
  error_messages[0].should match("Missing alt text/attribute for image with src")
@@ -53,6 +58,7 @@ RSpec.configure do |config|
53
58
  it "should return error messages when alt tags absent from image links" do
54
59
  stub_request(:any, "www.example.com").to_return(:body => "<html><body><img src='www.intuit.com'></body></html>", :status => 200)
55
60
  enf = Acop::Enforcer.new({:url => "www.example.com"})
61
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
56
62
  error_messages = enf.check_image_alt
57
63
  error_messages.should_not be_empty
58
64
  error_messages[0].should match("Missing alt text/attribute for image with src")
@@ -61,6 +67,7 @@ RSpec.configure do |config|
61
67
  it "should have alt tags empty in image links" do
62
68
  stub_request(:any, "www.example.com").to_return(:body => "<a class='visually-hidden'><img id='img_link' src='\/try_qbo_free.png' alt=''/>Try QuickBooks Online for Free</a>", :status => 200)
63
69
  enf = Acop::Enforcer.new({:url => "www.example.com"})
70
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
64
71
  error_messages = enf.check_image_links
65
72
  error_messages.should be_empty
66
73
  end
@@ -68,6 +75,7 @@ RSpec.configure do |config|
68
75
  it "should return error messages when alt tags not empty in image links" do
69
76
  stub_request(:any, "www.example.com").to_return(:body => "<a class='visually-hidden'><img id='img_link' src='\/try_qbo_free.png' alt='bla bla'/>Try QuickBooks Online for Free</a>", :status => 200)
70
77
  enf = Acop::Enforcer.new({:url => "www.example.com"})
78
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
71
79
  error_messages = enf.check_image_links
72
80
  error_messages.should_not be_empty
73
81
  error_messages[0].should match("Alt Text not empty or nil for image link with src")
@@ -76,6 +84,7 @@ RSpec.configure do |config|
76
84
  it "should return error messages when alt tags nil in image links" do
77
85
  stub_request(:any, "www.example.com").to_return(:body => "<a class='visually-hidden'><img id='img_link' src='\/try_qbo_free.png' alt='bla bla'/>Try QuickBooks Online for Free</a>", :status => 200)
78
86
  enf = Acop::Enforcer.new({:url => "www.example.com"})
87
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
79
88
  error_messages = enf.check_image_links
80
89
  error_messages.should_not be_empty
81
90
  error_messages[0].should match("Alt Text not empty or nil for image link with src")
@@ -84,6 +93,7 @@ RSpec.configure do |config|
84
93
  it "should return error messages when alt tags not present in area elements" do
85
94
  stub_request(:any, "www.example.com").to_return(:body => "<area shape='rect' coords='0,0,82,126' href='sun.htm'>", :status => 200)
86
95
  enf = Acop::Enforcer.new({:url => "www.example.com"})
96
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
87
97
  error_messages = enf.check_areas
88
98
  error_messages.should_not be_empty
89
99
  error_messages[0].should match("Missing alt text/attribute for area element")
@@ -92,6 +102,7 @@ RSpec.configure do |config|
92
102
  it "should return error messages when alt tags empty in area elements" do
93
103
  stub_request(:any, "www.example.com").to_return(:body => "<area shape='rect' coords='0,0,82,126' href='sun.htm' alt=''>", :status => 200)
94
104
  enf = Acop::Enforcer.new({:url => "www.example.com"})
105
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
95
106
  error_messages = enf.check_areas
96
107
  error_messages.should_not be_empty
97
108
  error_messages[0].should match("Missing alt text/attribute for area element")
@@ -100,6 +111,7 @@ RSpec.configure do |config|
100
111
  it "should not return error messages when alt tags present in area elements" do
101
112
  stub_request(:any, "www.example.com").to_return(:body => "<area shape='rect' coords='0,0,82,126' href='sun.htm' alt='Sun'>", :status => 200)
102
113
  enf = Acop::Enforcer.new({:url => "www.example.com"})
114
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
103
115
  error_messages = enf.check_areas
104
116
  error_messages.should be_empty
105
117
  end
@@ -107,6 +119,7 @@ RSpec.configure do |config|
107
119
  it "should return error messages when title not present" do
108
120
  stub_request(:any, "www.example.com").to_return(:body => "<html><head></head></html>", :status => 200)
109
121
  enf = Acop::Enforcer.new({:url => "www.example.com"})
122
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
110
123
  error_messages = enf.check_page_title
111
124
  error_messages.should_not be_empty
112
125
  error_messages[0].should match("Missing title element")
@@ -115,6 +128,7 @@ RSpec.configure do |config|
115
128
  it "should return error messages when title element empty" do
116
129
  stub_request(:any, "www.example.com").to_return(:body => "<html><head><title></title></head></html>", :status => 200)
117
130
  enf = Acop::Enforcer.new({:url => "www.example.com"})
131
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
118
132
  error_messages = enf.check_page_title
119
133
  error_messages.should_not be_empty
120
134
  error_messages[0].should match("Empty title element")
@@ -123,6 +137,7 @@ RSpec.configure do |config|
123
137
  it "should return error messages when more than 1 title element" do
124
138
  stub_request(:any, "www.example.com").to_return(:body => "<html><head><title>Some Title</title><title>Another title</title></head></html>", :status => 200)
125
139
  enf = Acop::Enforcer.new({:url => "www.example.com"})
140
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
126
141
  error_messages = enf.check_page_title
127
142
  error_messages.should_not be_empty
128
143
  error_messages[0].should match("More than 1 title element")
@@ -131,6 +146,7 @@ RSpec.configure do |config|
131
146
  it "should return no error messages when frameset is not present" do
132
147
  stub_request(:any, "www.example.com").to_return(:body => "<frame src='frame_a.htm' title=''><frame src='frame_b.htm' title='bla'>", :status => 200)
133
148
  enf = Acop::Enforcer.new({:url => "www.example.com"})
149
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
134
150
  error_messages = enf.check_frame_title
135
151
  error_messages.should be_empty
136
152
  end
@@ -138,6 +154,7 @@ RSpec.configure do |config|
138
154
  it "should return error messages when frame/iframe present but no doctype" do
139
155
  stub_request(:any, "www.example.com").to_return(:body => "<!DOCTYPE Resource SYSTEM 'foo.dtd'><frameset cols='50%,50%'><frame src='frame_a.htm'/><frame src='frame_b.htm'/></frameset>", :status => 200)
140
156
  enf = Acop::Enforcer.new({:url => "www.example.com"})
157
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
141
158
  error_messages = enf.check_doctype
142
159
  puts error_messages
143
160
  error_messages.should be_empty
@@ -146,6 +163,7 @@ RSpec.configure do |config|
146
163
  it "should return error messages when frame does not have a title" do
147
164
  stub_request(:any, "www.example.com").to_return(:body => "<frameset cols='50%,50%'><frame src='frame_a.htm'><frame src='frame_b.htm'></frameset>", :status => 200)
148
165
  enf = Acop::Enforcer.new({:url => "www.example.com"})
166
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
149
167
  error_messages = enf.check_frame_title
150
168
  error_messages.should_not be_empty
151
169
  error_messages[0].should match("Missing frame title element")
@@ -154,6 +172,7 @@ RSpec.configure do |config|
154
172
  it "should return error messages when frame title is empty" do
155
173
  stub_request(:any, "www.example.com").to_return(:body => "<frameset cols='50%,50%'><frame src='frame_a.htm' title=''><frame src='frame_b.htm' title='bla'></frameset>", :status => 200)
156
174
  enf = Acop::Enforcer.new({:url => "www.example.com"})
175
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
157
176
  error_messages = enf.check_frame_title
158
177
  error_messages.should_not be_empty
159
178
  error_messages[0].should match("Empty frame title element")
@@ -162,6 +181,7 @@ RSpec.configure do |config|
162
181
  it "should return error messages when iframe does not have a title" do
163
182
  stub_request(:any, "www.example.com").to_return(:body => "<iframe src='www.google.com'></iframe>", :status => 200)
164
183
  enf = Acop::Enforcer.new({:url => "www.example.com"})
184
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
165
185
  error_messages = enf.check_iframe_title
166
186
  error_messages.should_not be_empty
167
187
  error_messages[0].should match("Missing iframe title element")
@@ -170,6 +190,7 @@ RSpec.configure do |config|
170
190
  it "should return error messages when iframe title is empty" do
171
191
  stub_request(:any, "www.example.com").to_return(:body => "<iframe title='' src='www.google.com'></iframe>", :status => 200)
172
192
  enf = Acop::Enforcer.new({:url => "www.example.com"})
193
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
173
194
  error_messages = enf.check_iframe_title
174
195
  error_messages.should_not be_empty
175
196
  error_messages[0].should match("Empty iframe title element")
@@ -178,6 +199,7 @@ RSpec.configure do |config|
178
199
  it "should not return error messages when form elements have labels" do
179
200
  stub_request(:any, "www.example.com").to_return(:body => '<form><textarea id="area" rows="3" cols="10" /><label for="area" /></form>', :status => 200)
180
201
  enf = Acop::Enforcer.new({:url => "www.example.com"})
202
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
181
203
  error_messages = enf.check_form_labels
182
204
  error_messages.should be_empty
183
205
  end
@@ -185,6 +207,7 @@ RSpec.configure do |config|
185
207
  it "should return error messages when form elements have labels" do
186
208
  stub_request(:any, "www.example.com").to_return(:body => '<form><textarea id="area" rows="3" cols="10" /></form>', :status => 200)
187
209
  enf = Acop::Enforcer.new({:url => "www.example.com"})
210
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
188
211
  error_messages = enf.check_form_labels
189
212
  error_messages.should_not be_empty
190
213
  end
@@ -192,6 +215,7 @@ RSpec.configure do |config|
192
215
  it "should not return error messages when form input (submit|reset|button) elements have value attribs and no labels" do
193
216
  stub_request(:any, "www.example.com").to_return(:body => '<form><input id="in" type="button" value="input_value"/></form>', :status => 200)
194
217
  enf = Acop::Enforcer.new({:url => "www.example.com"})
218
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
195
219
  error_messages = enf.check_form_inputs
196
220
  error_messages.should be_empty
197
221
  end
@@ -199,6 +223,7 @@ RSpec.configure do |config|
199
223
  it "should return error messages when form input (submit|reset|button) elements have value attribs and labels" do
200
224
  stub_request(:any, "www.example.com").to_return(:body => '<form><input id="in" type="button" value="input_value"/><label for="in" /></form>', :status => 200)
201
225
  enf = Acop::Enforcer.new({:url => "www.example.com"})
226
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
202
227
  error_messages = enf.check_form_inputs
203
228
  error_messages.should_not be_empty
204
229
  error_messages[0].should match("Missing value attribute/label present for input element")
@@ -207,6 +232,7 @@ RSpec.configure do |config|
207
232
  it "should return error messages when form input (submit|reset|button) elements have no value attribs and labels" do
208
233
  stub_request(:any, "www.example.com").to_return(:body => '<form><input id="in" type="button" /><label for="in" /></form>', :status => 200)
209
234
  enf = Acop::Enforcer.new({:url => "www.example.com"})
235
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
210
236
  error_messages = enf.check_form_inputs
211
237
  error_messages.should_not be_empty
212
238
  error_messages[0].should match("Missing value attribute/label present for input element")
@@ -215,6 +241,7 @@ RSpec.configure do |config|
215
241
  it "should return error messages when form input (submit|reset|button) elements have no value attribs and no labels" do
216
242
  stub_request(:any, "www.example.com").to_return(:body => '<form><input id="in" type="button" /><label for="in" /></form>', :status => 200)
217
243
  enf = Acop::Enforcer.new({:url => "www.example.com"})
244
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
218
245
  error_messages = enf.check_form_inputs
219
246
  error_messages.should_not be_empty
220
247
  error_messages[0].should match("Missing value attribute/label present for input element")
@@ -223,6 +250,7 @@ RSpec.configure do |config|
223
250
  it "should not return error messages when form input other than (submit|reset|button) elements have no value attribs and no labels" do
224
251
  stub_request(:any, "www.example.com").to_return(:body => '<form><input id="in" type="text" /><label for="in" /></form>', :status => 200)
225
252
  enf = Acop::Enforcer.new({:url => "www.example.com"})
253
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
226
254
  error_messages = enf.check_form_inputs
227
255
  error_messages.should be_empty
228
256
  end
@@ -230,6 +258,7 @@ RSpec.configure do |config|
230
258
  it "should not return error messages when labels have text" do
231
259
  stub_request(:any, "www.example.com").to_return(:body => '<label for="label1">Label 1</label><label for="label2">Label 2</label>', :status => 200)
232
260
  enf = Acop::Enforcer.new({:url => "www.example.com"})
261
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
233
262
  error_messages = enf.check_form_control_text
234
263
  error_messages.should be_empty
235
264
  end
@@ -237,6 +266,7 @@ RSpec.configure do |config|
237
266
  it "should return error messages when labels do not have text" do
238
267
  stub_request(:any, "www.example.com").to_return(:body => '<label for="label1">Label 1</label><label for="label2"></label>', :status => 200)
239
268
  enf = Acop::Enforcer.new({:url => "www.example.com"})
269
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
240
270
  error_messages = enf.check_form_control_text
241
271
  error_messages.should_not be_empty
242
272
  error_messages[0].should match("Missing label text for label")
@@ -245,6 +275,7 @@ RSpec.configure do |config|
245
275
  it "should not return error messages when legends have text" do
246
276
  stub_request(:any, "www.example.com").to_return(:body => '<legend>Legend 1</legend>', :status => 200)
247
277
  enf = Acop::Enforcer.new({:url => "www.example.com"})
278
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
248
279
  error_messages = enf.check_form_control_text
249
280
  error_messages.should be_empty
250
281
  end
@@ -252,6 +283,7 @@ RSpec.configure do |config|
252
283
  it "should return error messages when legends do not have text" do
253
284
  stub_request(:any, "www.example.com").to_return(:body => '<legend></legend>', :status => 200)
254
285
  enf = Acop::Enforcer.new({:url => "www.example.com"})
286
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
255
287
  error_messages = enf.check_form_control_text
256
288
  error_messages.should_not be_empty
257
289
  error_messages[0].should match("Missing legend text for legend")
@@ -260,6 +292,7 @@ RSpec.configure do |config|
260
292
  it "should not return error messages when buttons have text" do
261
293
  stub_request(:any, "www.example.com").to_return(:body => '<button type="button">Button 1</button>', :status => 200)
262
294
  enf = Acop::Enforcer.new({:url => "www.example.com"})
295
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
263
296
  error_messages = enf.check_form_control_text
264
297
  error_messages.should be_empty
265
298
  end
@@ -267,6 +300,7 @@ RSpec.configure do |config|
267
300
  it "should return error messages when buttons do not have text" do
268
301
  stub_request(:any, "www.example.com").to_return(:body => '<button type="button"></button>', :status => 200)
269
302
  enf = Acop::Enforcer.new({:url => "www.example.com"})
303
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
270
304
  error_messages = enf.check_form_control_text
271
305
  error_messages.should_not be_empty
272
306
  error_messages[0].should match("Missing button text for button")
@@ -275,6 +309,7 @@ RSpec.configure do |config|
275
309
  it "should return error_messages when document does not have level 1 heading" do
276
310
  stub_request(:any, "www.example.com").to_return(:body => '<h2>Heading 2</h2><p><h3>Heading 3</h3></p>', :status => 200)
277
311
  enf = Acop::Enforcer.new({:url => "www.example.com"})
312
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
278
313
  error_messages = enf.check_h1
279
314
  error_messages.should_not be_empty
280
315
  error_messages[0].should match("Missing heading level 1")
@@ -283,6 +318,7 @@ RSpec.configure do |config|
283
318
  it "should return error_messages when headings do not have text" do
284
319
  stub_request(:any, "www.example.com").to_return(:body => '<p><h1></h1></p><h2>Heading 2</h2><h3></h3>', :status => 200)
285
320
  enf = Acop::Enforcer.new({:url => "www.example.com"})
321
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
286
322
  error_messages = enf.check_heading_text
287
323
  error_messages.should_not be_empty
288
324
  error_messages[0].should match("Missing text for h1 element")
@@ -292,6 +328,7 @@ RSpec.configure do |config|
292
328
  it "should not return error_messages when document has correct heading structure" do
293
329
  stub_request(:any, "www.example.com").to_return(:body => '<body><p><h1>Heading 1</h1><h2>Heading 2</h2><p><h3>Heading 3</h3></p></body>', :status => 200)
294
330
  enf = Acop::Enforcer.new({:url => "www.example.com"})
331
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
295
332
  error_messages = enf.check_heading_structure
296
333
  error_messages.should be_empty
297
334
  end
@@ -299,6 +336,7 @@ RSpec.configure do |config|
299
336
  it "should return error_messages when document has incorrect heading structure" do
300
337
  stub_request(:any, "www.example.com").to_return(:body => '<p><h2>Heading 2</h2><h1>Heading 1</h1><p><h3>Heading 3</h3></p>', :status => 200)
301
338
  enf = Acop::Enforcer.new({:url => "www.example.com"})
339
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
302
340
  error_messages = enf.check_heading_structure
303
341
  error_messages.should_not be_empty
304
342
  error_messages[0].should match("First heading level should be h1")
@@ -307,6 +345,7 @@ RSpec.configure do |config|
307
345
  it "should return error_messages when document has incorrect heading structure" do
308
346
  stub_request(:any, "www.example.com").to_return(:body => '<p><h1>Heading 1</h1><h3>Heading 3</h3><p><h4>Heading 4</h4></p><h2>Heading 2</h2>', :status => 200)
309
347
  enf = Acop::Enforcer.new({:url => "www.example.com"})
348
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
310
349
  error_messages = enf.check_heading_structure
311
350
  error_messages.should_not be_empty
312
351
  error_messages[0].should match("Incorrect document heading structure")
@@ -315,6 +354,7 @@ RSpec.configure do |config|
315
354
  it "should return error_messages when table is missing table headers" do
316
355
  stub_request(:any, "www.example.com").to_return(:body => '<table summary="summary"><tr><td>Data 1</td></tr></table>', :status => 200)
317
356
  enf = Acop::Enforcer.new({:url => "www.example.com"})
357
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
318
358
  error_messages = enf.check_table_headers
319
359
  error_messages.should_not be_empty
320
360
  error_messages[0].should match("Missing table headers for table with summary: summary")
@@ -323,6 +363,7 @@ RSpec.configure do |config|
323
363
  it "should return error_messages when table headers are missing scope" do
324
364
  stub_request(:any, "www.example.com").to_return(:body => '<table summary="summary"><th>Table Heading</th><tr><td>Data 1</td></tr></table>', :status => 200)
325
365
  enf = Acop::Enforcer.new({:url => "www.example.com"})
366
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
326
367
  error_messages = enf.check_table_headers
327
368
  error_messages.should_not be_empty
328
369
  error_messages[0].should match("Missing scope for table header")
@@ -331,6 +372,7 @@ RSpec.configure do |config|
331
372
  it "should not return error_messages when table headers has scope" do
332
373
  stub_request(:any, "www.example.com").to_return(:body => '<table summary="summary"><th scope="row">Table Heading</th><tr><td>Data 1</td></tr></table>', :status => 200)
333
374
  enf = Acop::Enforcer.new({:url => "www.example.com"})
375
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
334
376
  error_messages = enf.check_table_headers
335
377
  error_messages.should be_empty
336
378
  end
@@ -338,6 +380,7 @@ RSpec.configure do |config|
338
380
  it "should return error_messages when table is missing summary" do
339
381
  stub_request(:any, "www.example.com").to_return(:body => '<table><th>Table Heading</th><tr><td>Data 1</td></tr></table>', :status => 200)
340
382
  enf = Acop::Enforcer.new({:url => "www.example.com"})
383
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
341
384
  error_messages = enf.check_table_summary
342
385
  error_messages.should_not be_empty
343
386
  error_messages[0].should match("Missing table summary")
@@ -346,6 +389,7 @@ RSpec.configure do |config|
346
389
  it "should return error_messages when html lang attribute is not specified" do
347
390
  stub_request(:any, "www.example.com").to_return(:body => '<html></html>', :status => 200)
348
391
  enf = Acop::Enforcer.new({:url => "www.example.com"})
392
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
349
393
  error_messages = enf.check_html_lang
350
394
  error_messages.should_not be_empty
351
395
  error_messages[0].should match("Missing lang attribute for html")
@@ -354,6 +398,7 @@ RSpec.configure do |config|
354
398
  it "should not return error_messages when html lang attribute is specified" do
355
399
  stub_request(:any, "www.example.com").to_return(:body => '<html lang="en"></html>', :status => 200)
356
400
  enf = Acop::Enforcer.new({:url => "www.example.com"})
401
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
357
402
  error_messages = enf.check_html_lang
358
403
  error_messages.should be_empty
359
404
  end
@@ -361,6 +406,7 @@ RSpec.configure do |config|
361
406
  it "should return error_messages when html visual formatting elements are used" do
362
407
  stub_request(:any, "www.example.com").to_return(:body => '<body><b>Bold text</b><p><i>Italicized Text</i></p></body>', :status => 200)
363
408
  enf = Acop::Enforcer.new({:url => "www.example.com"})
409
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
364
410
  error_messages = enf.check_visual_formatting
365
411
  error_messages.should_not be_empty
366
412
  error_messages[0].should match("HTML visual formatting elements being used")
@@ -369,6 +415,7 @@ RSpec.configure do |config|
369
415
  it "should return error_messages when html flashing elements are used" do
370
416
  stub_request(:any, "www.example.com").to_return(:body => '<body><blink>Blinking text</blink><p><marquee>Marquee Text</marquee></p></body>', :status => 200)
371
417
  enf = Acop::Enforcer.new({:url => "www.example.com"})
418
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
372
419
  error_messages = enf.check_flashing_content
373
420
  error_messages.should_not be_empty
374
421
  error_messages[0].should match("Flashing elements")
@@ -377,6 +424,7 @@ RSpec.configure do |config|
377
424
  it "should return error messages when link text is absent" do
378
425
  stub_request(:any, "www.example.com").to_return(:body => '<body><a href="www.google.com"></a></body>', :status => 200)
379
426
  enf = Acop::Enforcer.new({:url => "www.example.com"})
427
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
380
428
  error_messages = enf.check_hyperlinks
381
429
  error_messages.should_not be_empty
382
430
  error_messages[0].should match("Missing link text for link")
@@ -385,6 +433,7 @@ RSpec.configure do |config|
385
433
  it "should return error messages when there is duplicate link text" do
386
434
  stub_request(:any, "www.example.com").to_return(:body => '<body><a href="www.google.com">Go to Google</a><p><a href="www.google.com">Go to Google</a></p></body>', :status => 200)
387
435
  enf = Acop::Enforcer.new({:url => "www.example.com"})
436
+ enf.get_url_contents(enf.formatted_url("www.example.com"))
388
437
  error_messages = enf.check_hyperlinks
389
438
  error_messages.should_not be_empty
390
439
  error_messages[0].should match("Links should not have duplicate text")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -91,6 +91,7 @@ files:
91
91
  - bin/acop
92
92
  - lib/acop.rb
93
93
  - lib/acop/accessibility.rb
94
+ - lib/acop/rspec_writer.rb
94
95
  - lib/acop/version.rb
95
96
  - spec/acop_spec.rb
96
97
  homepage: https://github.com/eveningsamurai/acop