capybara-page-object 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
-