capybara-page-object 0.2.1 → 0.3.0

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 (50) hide show
  1. data/Gemfile +3 -1
  2. data/Gemfile.lock +15 -2
  3. data/Rakefile +27 -13
  4. data/VERSION +1 -1
  5. data/capybara-page-object.gemspec +55 -27
  6. data/lib/capybara-page-object.rb +6 -8
  7. data/lib/collections.rb +11 -0
  8. data/lib/element.rb +11 -0
  9. data/lib/element/anchor.rb +11 -0
  10. data/lib/element/form.rb +64 -0
  11. data/lib/element/form_field.rb +20 -0
  12. data/lib/element/image.rb +20 -0
  13. data/lib/element/input.rb +28 -0
  14. data/lib/element/list.rb +21 -0
  15. data/lib/element/listitem.rb +7 -0
  16. data/lib/element/meta.rb +16 -0
  17. data/lib/element/select.rb +16 -0
  18. data/lib/{table.rb → element/table.rb} +1 -3
  19. data/lib/element/textarea.rb +16 -0
  20. data/lib/{extractors → extractor}/common.rb +3 -11
  21. data/lib/{extractors → extractor}/page_level.rb +3 -13
  22. data/lib/html5_data.rb +14 -0
  23. data/lib/key_value.rb +11 -0
  24. data/lib/navigation.rb +16 -0
  25. data/lib/node.rb +76 -0
  26. data/spec/common_spec.rb +46 -0
  27. data/spec/element/anchor_spec.rb +15 -0
  28. data/spec/element/base_spec.rb +19 -0
  29. data/spec/element/form_field_spec.rb +28 -0
  30. data/spec/element/form_spec.rb +69 -0
  31. data/spec/element/image_spec.rb +30 -0
  32. data/spec/element/input_spec.rb +49 -0
  33. data/spec/element/list_spec.rb +47 -0
  34. data/spec/element/listitem_spec.rb +25 -0
  35. data/spec/element/meta_spec.rb +23 -0
  36. data/spec/element/select_spec.rb +36 -0
  37. data/spec/element/table_spec.rb +30 -0
  38. data/spec/element/textarea_spec.rb +19 -0
  39. data/{test/page.html → spec/fixtures/node.html} +0 -0
  40. data/{test → spec}/helper.rb +2 -11
  41. data/spec/node_spec.rb +45 -0
  42. metadata +120 -109
  43. data/lib/base.rb +0 -29
  44. data/lib/image.rb +0 -13
  45. data/lib/page.rb +0 -15
  46. data/test/image.html +0 -2
  47. data/test/table.html +0 -10
  48. data/test/test_image.rb +0 -20
  49. data/test/test_page.rb +0 -59
  50. data/test/test_table.rb +0 -20
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ describe "Image" do
4
+ context "#alt" do
5
+ it "returns the alt attribute" do
6
+ i = CapybaraPageObject::Image.from_string '<img alt="alt image">'
7
+ i.alt.should == 'alt image'
8
+ end
9
+
10
+ it "strips whitespace" do
11
+ i = CapybaraPageObject::Image.from_string '<img alt=" alt image ">'
12
+ i.alt.should == 'alt image'
13
+ end
14
+ end
15
+
16
+ context "#key" do
17
+ it "return the alt attribute" do
18
+ i = CapybaraPageObject::Image.from_string '<img alt="alt image">'
19
+ i.key.should == 'alt image'
20
+ end
21
+ end
22
+
23
+ context "#value" do
24
+ it "return the source image as a URI object" do
25
+ i = CapybaraPageObject::Image.from_string '<img src="image.jpg">'
26
+ i.value.class.should == URI::Generic
27
+ i.value.path.should == 'image.jpg'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,49 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ describe "Input" do
4
+ context "#key" do
5
+ it "return the name attribute" do
6
+ i = CapybaraPageObject::Input.from_string '<input name="foo"/>'
7
+ i.key.should == 'foo'
8
+ end
9
+ end
10
+
11
+ # TODO get this working
12
+ # context "#value" do
13
+ # it "delegates to the the Capybara::Node::Simple" do
14
+ # i = CapybaraPageObject::Input.from_string '<input name="foo" value="bar"/>'
15
+ # i.value.should == 'bar'
16
+ # end
17
+ # end
18
+
19
+ context "#untyped" do
20
+ it "is true if the input has no type attribute" do
21
+ input = CapybaraPageObject::Input.from_string '<input type="text">'
22
+ input.should_not be_untyped
23
+ end
24
+
25
+ it "is true if the input has no type attribute" do
26
+ input = CapybaraPageObject::Input.from_string '<input>'
27
+ input.should be_untyped
28
+ end
29
+ end
30
+
31
+ context "#checkable?" do
32
+ it "is true for a checkbox" do
33
+ checkbox = '<input type="checkbox">'
34
+ CapybaraPageObject::Input.from_string(checkbox).should be_checkable
35
+ end
36
+ it "is true for a radio button" do
37
+ radio = '<input type="radio">'
38
+ CapybaraPageObject::Input.from_string(radio).should be_checkable
39
+ end
40
+ it "is false an input with a blank type" do
41
+ none = '<input type="">'
42
+ CapybaraPageObject::Input.from_string(none).should_not be_checkable
43
+ end
44
+ it "is false for other kinds of input" do
45
+ text = '<input type="text">'
46
+ CapybaraPageObject::Input.from_string(text).should_not be_checkable
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,47 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ module CapybaraPageObject
4
+ class MyListItem < CapybaraPageObject::Node
5
+ def value
6
+ find('.description').text.strip
7
+ end
8
+ end
9
+ end
10
+
11
+ describe "List" do
12
+ before do
13
+ @list = CapybaraPageObject::List.from_string <<-EOF
14
+ <ul id="products">
15
+ <li>
16
+ <span class="description">iPhone</span>
17
+ <span class="price">$500</span>
18
+ </li>
19
+ <li>
20
+ <span class="description">iPad</span>
21
+ <span class="price">$800</span>
22
+ </li>
23
+ </ul>
24
+ EOF
25
+ end
26
+
27
+ context "#items" do
28
+ it "return the list items" do
29
+ @list.should have(2).items
30
+ end
31
+
32
+ it "accept a custom list item object" do
33
+ @list.items({:factory => CapybaraPageObject::MyListItem}).first.value.should == "iPhone"
34
+ end
35
+ end
36
+
37
+ context "#key" do
38
+ it "be the id" do
39
+ @list.key.should == 'products'
40
+ end
41
+
42
+ it "should handle ordered list (ol)" do
43
+ list = CapybaraPageObject::List.from_string '<ol id="ordered"></ol>'
44
+ list.key.should == 'ordered'
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ describe "Listitem" do
4
+ before do
5
+ @listitem = CapybaraPageObject::Listitem.from_string <<-EOF
6
+ <li id="foo">
7
+ <span class="description">iPhone</span>
8
+ <span class="price">$500</span>
9
+ </li>
10
+ EOF
11
+ end
12
+
13
+ # TODO better way of handling whitespace
14
+ context "#text" do
15
+ it "return the text of the list" do
16
+ @listitem.text.strip.should == "iPhone\n $500"
17
+ end
18
+ end
19
+
20
+ context "#key" do
21
+ it "return the id attribute" do
22
+ @listitem.key.should == 'foo'
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ describe "Meta" do
4
+ context "Meta" do
5
+ before do
6
+ @meta = CapybaraPageObject::Meta.from_string <<-EOF
7
+ <meta name="description" content="my description">
8
+ EOF
9
+ end
10
+
11
+ context "#key" do
12
+ it "return the name from the meta tag" do
13
+ @meta.key.should == 'description'
14
+ end
15
+ end
16
+
17
+ context "#value" do
18
+ it "return the description from the meta tag" do
19
+ @meta.value.should == 'my description'
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,36 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ describe "Select" do
4
+ before do
5
+ @select = CapybaraPageObject::Select.from_string '<select name="foo"></textarea>'
6
+ end
7
+
8
+ context "#key" do
9
+ it "returns the name attribute" do
10
+ @select.key.should == 'foo'
11
+ end
12
+ end
13
+
14
+ context "#value" do
15
+ it "returns an single item for a non-multiple select" do
16
+ s = CapybaraPageObject::Select.from_string <<-EOM
17
+ <select name="colour">
18
+ <option>red</option>
19
+ <option selected>blue</option>
20
+ </select>
21
+ EOM
22
+ s.value.should == 'blue'
23
+ end
24
+
25
+ it "returns an array for amultiple select" do
26
+ s = CapybaraPageObject::Select.from_string <<-EOM
27
+ <select name="countries" multiple>
28
+ <option>france</option>
29
+ <option selected>spain</option>
30
+ <option selected>germany</option>
31
+ </select>
32
+ EOM
33
+ s.value.should == ['spain', 'germany']
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ describe "CapybaraPageObject::Table" do
4
+ before do
5
+ @table = CapybaraPageObject::Table.from_string <<-EOF
6
+ <table id="table_1" class="table_1_class">
7
+ <tr id="table_1_tr_1">
8
+ <th id="table_1_th_1">TH1</th>
9
+ <th id="table_1_th_2">TH2</th>
10
+ </tr>
11
+ <tr id="table_1_tr_2">
12
+ <td id="table_1_td_1">TD1</td>
13
+ <td id="table_1_td_2">TD2</td>
14
+ </tr>
15
+ </table>
16
+ EOF
17
+ end
18
+
19
+ context "#rows" do
20
+ it "return the table's rows" do
21
+ @table.rows(:keys => 'id').should =~ ['table_1_tr_1', 'table_1_tr_2']
22
+ end
23
+ end
24
+
25
+ context "#headers" do
26
+ it "return the table's headers" do
27
+ @table.headers.collect(&:text).should =~ ["TH1", "TH2"]
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ describe "Textarea" do
4
+ before do
5
+ @textarea = CapybaraPageObject::Textarea.from_string '<textarea name="foo">bar</textarea>'
6
+ end
7
+
8
+ context "#key" do
9
+ it "returns the name attribute" do
10
+ @textarea.key.should == 'foo'
11
+ end
12
+ end
13
+
14
+ context "#value" do
15
+ it "return the content" do
16
+ @textarea.value.should == 'bar'
17
+ end
18
+ end
19
+ end
File without changes
@@ -1,5 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'bundler'
3
+ require 'pp'
3
4
  begin
4
5
  Bundler.setup(:default, :development)
5
6
  rescue Bundler::BundlerError => e
@@ -7,18 +8,8 @@ rescue Bundler::BundlerError => e
7
8
  $stderr.puts "Run `bundle install` to install missing gems"
8
9
  exit e.status_code
9
10
  end
10
- require 'test/unit'
11
- require 'shoulda'
11
+ require 'rspec'
12
12
 
13
13
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
14
  $LOAD_PATH.unshift(File.dirname(__FILE__))
15
15
  require 'capybara-page-object'
16
-
17
- class Test::Unit::TestCase
18
- end
19
-
20
- def load_sample_into_model(model)
21
- filename = model.to_s.split('::').last + '.html'
22
- html = File.open(File.dirname(__FILE__) + '/' + filename).read
23
- model.new(Capybara.string(html))
24
- end
data/spec/node_spec.rb ADDED
@@ -0,0 +1,45 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe "Page" do
4
+ context "Using the example.html" do
5
+ context "#title" do
6
+ it "returns the page title" do
7
+ node = CapybaraPageObject::Node.from_string '<title>Hello World</title>'
8
+ node.title.should == 'Hello World'
9
+ end
10
+ end
11
+
12
+ context "#meta_description" do
13
+ it "returns the meta description" do
14
+ node = CapybaraPageObject::Node.from_string '<meta name="description" content="meta description">'
15
+ node.meta_description.should == "meta description"
16
+ end
17
+ end
18
+
19
+ context "#meta_keywords" do
20
+ it "returns the meta keywords as an array" do
21
+ node = CapybaraPageObject::Node.from_string '<meta name="keywords" content="keyword 1, keyword 2">'
22
+ node.meta_keywords.should == ["keyword 1", "keyword 2"]
23
+ end
24
+ end
25
+
26
+ context "#classes" do
27
+ it "returns an array of class names" do
28
+ anchor = CapybaraPageObject::Anchor.from_string '<a class="foo bar">'
29
+ anchor.classes.should =~ ['foo', 'bar']
30
+ end
31
+ it "handles extraneous spacing" do
32
+ anchor = CapybaraPageObject::Anchor.from_string '<a class=" foo bar ">'
33
+ anchor.classes.should =~ ['foo', 'bar']
34
+ end
35
+ it "returns an empty array classes is empty" do
36
+ anchor = CapybaraPageObject::Anchor.from_string '<a class=" ">'
37
+ anchor.classes.should be_empty
38
+ end
39
+ it "returns an empty array when the classes attribute is not present" do
40
+ anchor = CapybaraPageObject::Anchor.from_string '<a/>'
41
+ anchor.classes.should be_empty
42
+ end
43
+ end
44
+ end
45
+ end
metadata CHANGED
@@ -1,106 +1,101 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: capybara-page-object
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 1
10
- version: 0.2.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Andy Waite
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-03-26 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- requirement: &id001 !ruby/object:Gem::Requirement
22
- none: false
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- hash: 3
27
- segments:
28
- - 0
29
- version: "0"
30
- version_requirements: *id001
12
+ date: 2012-04-01 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
31
15
  name: capybara
32
- prerelease: false
33
- type: :runtime
34
- - !ruby/object:Gem::Dependency
35
- requirement: &id002 !ruby/object:Gem::Requirement
16
+ requirement: &2161286340 !ruby/object:Gem::Requirement
36
17
  none: false
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- hash: 3
41
- segments:
42
- - 0
43
- version: "0"
44
- version_requirements: *id002
45
- name: shoulda
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
46
23
  prerelease: false
47
- type: :development
48
- - !ruby/object:Gem::Dependency
49
- requirement: &id003 !ruby/object:Gem::Requirement
24
+ version_requirements: *2161286340
25
+ - !ruby/object:Gem::Dependency
26
+ name: bundler
27
+ requirement: &2161285480 !ruby/object:Gem::Requirement
50
28
  none: false
51
- requirements:
29
+ requirements:
52
30
  - - ~>
53
- - !ruby/object:Gem::Version
54
- hash: 23
55
- segments:
56
- - 1
57
- - 0
58
- - 0
31
+ - !ruby/object:Gem::Version
59
32
  version: 1.0.0
60
- version_requirements: *id003
61
- name: bundler
62
- prerelease: false
63
33
  type: :development
64
- - !ruby/object:Gem::Dependency
65
- requirement: &id004 !ruby/object:Gem::Requirement
34
+ prerelease: false
35
+ version_requirements: *2161285480
36
+ - !ruby/object:Gem::Dependency
37
+ name: jeweler
38
+ requirement: &2161284700 !ruby/object:Gem::Requirement
66
39
  none: false
67
- requirements:
40
+ requirements:
68
41
  - - ~>
69
- - !ruby/object:Gem::Version
70
- hash: 7
71
- segments:
72
- - 1
73
- - 6
74
- - 4
42
+ - !ruby/object:Gem::Version
75
43
  version: 1.6.4
76
- version_requirements: *id004
77
- name: jeweler
44
+ type: :development
78
45
  prerelease: false
46
+ version_requirements: *2161284700
47
+ - !ruby/object:Gem::Dependency
48
+ name: rcov
49
+ requirement: &2161284060 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
79
55
  type: :development
80
- - !ruby/object:Gem::Dependency
81
- requirement: &id005 !ruby/object:Gem::Requirement
56
+ prerelease: false
57
+ version_requirements: *2161284060
58
+ - !ruby/object:Gem::Dependency
59
+ name: rspec
60
+ requirement: &2161283420 !ruby/object:Gem::Requirement
82
61
  none: false
83
- requirements:
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- hash: 3
87
- segments:
88
- - 0
89
- version: "0"
90
- version_requirements: *id005
91
- name: rcov
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2161283420
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: &2161282680 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 0.9.2.2
77
+ type: :development
92
78
  prerelease: false
79
+ version_requirements: *2161282680
80
+ - !ruby/object:Gem::Dependency
81
+ name: rdoc
82
+ requirement: &2161281960 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: '3.12'
93
88
  type: :development
89
+ prerelease: false
90
+ version_requirements: *2161281960
94
91
  description: Page Objects for Capybara
95
92
  email: andy@andywaite.com
96
93
  executables: []
97
-
98
94
  extensions: []
99
-
100
- extra_rdoc_files:
95
+ extra_rdoc_files:
101
96
  - LICENSE.txt
102
97
  - README.rdoc
103
- files:
98
+ files:
104
99
  - .document
105
100
  - Gemfile
106
101
  - Gemfile.lock
@@ -109,52 +104,68 @@ files:
109
104
  - Rakefile
110
105
  - VERSION
111
106
  - capybara-page-object.gemspec
112
- - lib/base.rb
113
107
  - lib/capybara-page-object.rb
114
- - lib/extractors/common.rb
115
- - lib/extractors/page_level.rb
116
- - lib/image.rb
117
- - lib/page.rb
118
- - lib/table.rb
119
- - test/helper.rb
120
- - test/image.html
121
- - test/page.html
122
- - test/table.html
123
- - test/test_image.rb
124
- - test/test_page.rb
125
- - test/test_table.rb
108
+ - lib/collections.rb
109
+ - lib/element.rb
110
+ - lib/element/anchor.rb
111
+ - lib/element/form.rb
112
+ - lib/element/form_field.rb
113
+ - lib/element/image.rb
114
+ - lib/element/input.rb
115
+ - lib/element/list.rb
116
+ - lib/element/listitem.rb
117
+ - lib/element/meta.rb
118
+ - lib/element/select.rb
119
+ - lib/element/table.rb
120
+ - lib/element/textarea.rb
121
+ - lib/extractor/common.rb
122
+ - lib/extractor/page_level.rb
123
+ - lib/html5_data.rb
124
+ - lib/key_value.rb
125
+ - lib/navigation.rb
126
+ - lib/node.rb
127
+ - spec/common_spec.rb
128
+ - spec/element/anchor_spec.rb
129
+ - spec/element/base_spec.rb
130
+ - spec/element/form_field_spec.rb
131
+ - spec/element/form_spec.rb
132
+ - spec/element/image_spec.rb
133
+ - spec/element/input_spec.rb
134
+ - spec/element/list_spec.rb
135
+ - spec/element/listitem_spec.rb
136
+ - spec/element/meta_spec.rb
137
+ - spec/element/select_spec.rb
138
+ - spec/element/table_spec.rb
139
+ - spec/element/textarea_spec.rb
140
+ - spec/fixtures/node.html
141
+ - spec/helper.rb
142
+ - spec/node_spec.rb
126
143
  homepage: http://github.com/andyw8/capybara-page-object
127
- licenses:
144
+ licenses:
128
145
  - MIT
129
146
  post_install_message:
130
147
  rdoc_options: []
131
-
132
- require_paths:
148
+ require_paths:
133
149
  - lib
134
- required_ruby_version: !ruby/object:Gem::Requirement
150
+ required_ruby_version: !ruby/object:Gem::Requirement
135
151
  none: false
136
- requirements:
137
- - - ">="
138
- - !ruby/object:Gem::Version
139
- hash: 3
140
- segments:
152
+ requirements:
153
+ - - ! '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ segments:
141
157
  - 0
142
- version: "0"
143
- required_rubygems_version: !ruby/object:Gem::Requirement
158
+ hash: 4021578390759105062
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
160
  none: false
145
- requirements:
146
- - - ">="
147
- - !ruby/object:Gem::Version
148
- hash: 3
149
- segments:
150
- - 0
151
- version: "0"
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
152
165
  requirements: []
153
-
154
166
  rubyforge_project:
155
- rubygems_version: 1.8.10
167
+ rubygems_version: 1.8.6
156
168
  signing_key:
157
169
  specification_version: 3
158
170
  summary: Page Objects for Capybara
159
171
  test_files: []
160
-