form_object_model 0.1.1 → 0.1.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/.travis.yml +1 -1
- data/README.md +2 -1
- data/form_object_model.gemspec +2 -2
- data/lib/form_object_model.rb +5 -0
- data/lib/form_object_model/field.rb +12 -0
- data/lib/form_object_model/field_module.rb +11 -0
- data/lib/form_object_model/form.rb +1 -72
- data/lib/form_object_model/radio_field.rb +37 -0
- data/lib/form_object_model/select_field.rb +20 -0
- data/lib/form_object_model/text_field.rb +16 -0
- data/lib/form_object_model/version.rb +1 -1
- data/spec/integration/form_object_model_spec.rb +11 -1
- data/spec/unit/field_spec.rb +40 -0
- metadata +13 -4
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# FormObjectModel
|
2
2
|
|
3
3
|
[](http://travis-ci.org/reinteractive-open/form-object-model)
|
4
|
+
[](https://codeclimate.com/github/reinteractive-open/form-object-model)
|
4
5
|
|
5
6
|
This gem lets you construct an object model
|
6
7
|
of a form you're using in your request specs.
|
@@ -35,7 +36,7 @@ So given the following form in a page:
|
|
35
36
|
Forms are defined like so:
|
36
37
|
|
37
38
|
```ruby
|
38
|
-
form = FormObjectModel.new do |fom|
|
39
|
+
form = FormObjectModel::Form.new do |fom|
|
39
40
|
form.text_field :name, "Name"
|
40
41
|
form.select :title, "Title"
|
41
42
|
form.radio :gender, "input[name = gender]"
|
data/form_object_model.gemspec
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
require File.expand_path('../lib/form_object_model/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Sean Geoghegan"]
|
6
|
-
gem.email = ["sean@seangeo.me"]
|
5
|
+
gem.authors = ["Sean Geoghegan", "Aaron Beckerman"]
|
6
|
+
gem.email = ["sean@seangeo.me", "aaron@aaronbeckerman.com"]
|
7
7
|
gem.description = %q{An OO form testing helper that makes Capayaba-based form testing easy.}
|
8
8
|
gem.summary = %q{An OO form testing helper that makes Capayaba-based form testing easy.}
|
9
9
|
gem.homepage = "https://github.com/reinteractive-open/form-object-model"
|
data/lib/form_object_model.rb
CHANGED
@@ -3,4 +3,9 @@ require "form_object_model/version"
|
|
3
3
|
require "form_object_model/form.rb"
|
4
4
|
require "form_object_model/helper.rb"
|
5
5
|
require "form_object_model/matcher.rb"
|
6
|
+
require "form_object_model/field.rb"
|
7
|
+
require "form_object_model/text_field.rb"
|
8
|
+
require "form_object_model/select_field.rb"
|
9
|
+
require "form_object_model/radio_field.rb"
|
10
|
+
require "form_object_model/field_module.rb"
|
6
11
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module FormObjectModel
|
2
|
+
# A module that defines the getter and setter for the field
|
3
|
+
# properties of a form.
|
4
|
+
class FieldModule < Module
|
5
|
+
def initialize(name, field)
|
6
|
+
define_method(name.to_sym) { |*args| field }
|
7
|
+
define_method("#{name}=".to_sym) { |val| field.fill(val) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
@@ -1,73 +1,5 @@
|
|
1
1
|
module FormObjectModel
|
2
2
|
class Form
|
3
|
-
Field = Struct.new(:page, :name, :locator)
|
4
|
-
class TextField < Field
|
5
|
-
def fill(value)
|
6
|
-
page.fill_in(locator, :with => value.to_s)
|
7
|
-
end
|
8
|
-
|
9
|
-
def has_value?(value)
|
10
|
-
page.has_field?(locator, :with => value.to_s)
|
11
|
-
end
|
12
|
-
|
13
|
-
def value
|
14
|
-
page.find_field(locator).value
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class SelectField < Field
|
19
|
-
def fill(value)
|
20
|
-
page.select(value.to_s, :from => locator)
|
21
|
-
end
|
22
|
-
|
23
|
-
def has_value?(value)
|
24
|
-
page.has_select?(locator, :selected => value.to_s)
|
25
|
-
end
|
26
|
-
|
27
|
-
def value
|
28
|
-
value = nil
|
29
|
-
page.within(page.find_field(locator)) do
|
30
|
-
value = page.find("option[selected]").text
|
31
|
-
end
|
32
|
-
value
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class RadioField < Field
|
37
|
-
# This lets you select the radio button by it's label instead of id
|
38
|
-
def fill(value)
|
39
|
-
if button = button_for(value)
|
40
|
-
button.set(true)
|
41
|
-
else
|
42
|
-
raise "Could not find button with locator '#{locator}' and label '#{value}'"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def has_value?(value)
|
47
|
-
button = button_for(value)
|
48
|
-
button && %w(checked true).include?(button['checked'])
|
49
|
-
end
|
50
|
-
|
51
|
-
def value
|
52
|
-
element = checked_element
|
53
|
-
element && element.value
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
def checked_element
|
58
|
-
page.all(locator).find {|b| b['checked'] == 'checked' }
|
59
|
-
end
|
60
|
-
|
61
|
-
def button_for(value)
|
62
|
-
label_ids = label_ids_for(value)
|
63
|
-
page.all(locator).find {|b| label_ids.include?(b['id']) }
|
64
|
-
end
|
65
|
-
|
66
|
-
def label_ids_for(value)
|
67
|
-
page.all("label:contains('#{value}')").map {|label| label['for'] }
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
3
|
attr_reader :page
|
72
4
|
|
73
5
|
def initialize(page)
|
@@ -108,10 +40,7 @@ module FormObjectModel
|
|
108
40
|
private
|
109
41
|
|
110
42
|
def define_field(name, field)
|
111
|
-
(
|
112
|
-
define_method(name) {|*args| field }
|
113
|
-
define_method("#{name.to_s}=".to_sym) {|val| field.fill(val) }
|
114
|
-
end
|
43
|
+
self.extend(FieldModule.new(name, field))
|
115
44
|
end
|
116
45
|
end
|
117
46
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module FormObjectModel
|
2
|
+
class RadioField < Field
|
3
|
+
# This lets you select the radio button by it's label instead of id
|
4
|
+
def fill(value)
|
5
|
+
if button = button_for(value)
|
6
|
+
button.set(true)
|
7
|
+
else
|
8
|
+
raise "Could not find button with locator '#{locator}' and label '#{value}'"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_value?(value)
|
13
|
+
button = button_for(value)
|
14
|
+
button && %w(checked true).include?(button['checked'])
|
15
|
+
end
|
16
|
+
|
17
|
+
def value
|
18
|
+
element = checked_element
|
19
|
+
element && element.value
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def checked_element
|
24
|
+
page.all(locator).find {|b| b['checked'] == 'checked' }
|
25
|
+
end
|
26
|
+
|
27
|
+
def button_for(value)
|
28
|
+
label_ids = label_ids_for(value)
|
29
|
+
page.all(locator).find {|b| label_ids.include?(b['id']) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def label_ids_for(value)
|
33
|
+
page.all("label:contains('#{value}')").map {|label| label['for'] }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module FormObjectModel
|
2
|
+
class SelectField < Field
|
3
|
+
def fill(value)
|
4
|
+
page.select(value.to_s, :from => locator)
|
5
|
+
end
|
6
|
+
|
7
|
+
def has_value?(value)
|
8
|
+
page.has_select?(locator, :selected => value.to_s)
|
9
|
+
end
|
10
|
+
|
11
|
+
def value
|
12
|
+
value = nil
|
13
|
+
page.within(page.find_field(locator)) do
|
14
|
+
value = page.find("option[selected]").text
|
15
|
+
end
|
16
|
+
value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module FormObjectModel
|
2
|
+
class TextField < Field
|
3
|
+
def fill(value)
|
4
|
+
page.fill_in(locator, :with => value.to_s)
|
5
|
+
end
|
6
|
+
|
7
|
+
def has_value?(value)
|
8
|
+
page.has_field?(locator, :with => value.to_s)
|
9
|
+
end
|
10
|
+
|
11
|
+
def value
|
12
|
+
page.find_field(locator).value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -75,10 +75,20 @@ describe FormObjectModel do
|
|
75
75
|
lambda { form.textfield1.should have_value("Other value") }.should raise_error(RSpec::Expectations::ExpectationNotMetError)
|
76
76
|
end
|
77
77
|
|
78
|
+
it "should fail (with ==) when the value of the field is different" do
|
79
|
+
page.fill_in("Text Field 1", :with => "A value")
|
80
|
+
lambda { form.textfield1.should == "Other value" }.should raise_error(RSpec::Expectations::ExpectationNotMetError)
|
81
|
+
end
|
82
|
+
|
78
83
|
it "should pass when the value of the field is the same" do
|
79
84
|
page.fill_in("Text Field 1", :with => "A value")
|
80
85
|
form.textfield1.should have_value("A value")
|
81
86
|
end
|
87
|
+
|
88
|
+
it "should pass (with ==) when the value of the field is the same" do
|
89
|
+
page.fill_in("Text Field 1", :with => "A value")
|
90
|
+
form.textfield1.should == "A value"
|
91
|
+
end
|
82
92
|
end
|
83
93
|
|
84
94
|
context "single select" do
|
@@ -92,7 +102,7 @@ describe FormObjectModel do
|
|
92
102
|
lambda { form.selectfield1.should have_value("Option 2") }.should raise_error(RSpec::Expectations::ExpectationNotMetError)
|
93
103
|
end
|
94
104
|
|
95
|
-
it "should pass
|
105
|
+
it "should pass when the value is the same" do
|
96
106
|
page.select("Option 2", :from => "Select Field")
|
97
107
|
form.selectfield1.should have_value("Option 2")
|
98
108
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FormObjectModel::Field do
|
4
|
+
context "when self responds to has_value?" do
|
5
|
+
before do
|
6
|
+
subject.stub(:respond_to?).with(:has_value?).and_return(true)
|
7
|
+
subject.should_receive(:has_value?).with("A value").and_return(true)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "==" do
|
11
|
+
it "calls has_value? with its argument" do
|
12
|
+
(subject == "A value").should be_true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "!=" do
|
17
|
+
it "calls has_value? with its argument" do
|
18
|
+
(subject != "A value").should be_false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when self does not respond to has_value?" do
|
24
|
+
before do
|
25
|
+
subject.stub(:respond_to?).with(:has_value?).and_return(false)
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "== method" do
|
29
|
+
it "behaves in the conventional way" do
|
30
|
+
(subject == "A value").should be_false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "!= method" do
|
35
|
+
it "behaves in the conventional way" do
|
36
|
+
(subject != "A value").should be_true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: form_object_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Sean Geoghegan
|
9
|
+
- Aaron Beckerman
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
13
|
+
date: 2012-08-15 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: capybara
|
@@ -62,6 +63,7 @@ dependencies:
|
|
62
63
|
description: An OO form testing helper that makes Capayaba-based form testing easy.
|
63
64
|
email:
|
64
65
|
- sean@seangeo.me
|
66
|
+
- aaron@aaronbeckerman.com
|
65
67
|
executables: []
|
66
68
|
extensions: []
|
67
69
|
extra_rdoc_files: []
|
@@ -74,12 +76,18 @@ files:
|
|
74
76
|
- Rakefile
|
75
77
|
- form_object_model.gemspec
|
76
78
|
- lib/form_object_model.rb
|
79
|
+
- lib/form_object_model/field.rb
|
80
|
+
- lib/form_object_model/field_module.rb
|
77
81
|
- lib/form_object_model/form.rb
|
78
82
|
- lib/form_object_model/helper.rb
|
79
83
|
- lib/form_object_model/matcher.rb
|
84
|
+
- lib/form_object_model/radio_field.rb
|
85
|
+
- lib/form_object_model/select_field.rb
|
86
|
+
- lib/form_object_model/text_field.rb
|
80
87
|
- lib/form_object_model/version.rb
|
81
88
|
- spec/integration/form_object_model_spec.rb
|
82
89
|
- spec/spec_helper.rb
|
90
|
+
- spec/unit/field_spec.rb
|
83
91
|
homepage: https://github.com/reinteractive-open/form-object-model
|
84
92
|
licenses: []
|
85
93
|
post_install_message:
|
@@ -94,7 +102,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
94
102
|
version: '0'
|
95
103
|
segments:
|
96
104
|
- 0
|
97
|
-
hash:
|
105
|
+
hash: -4576561865437419326
|
98
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
107
|
none: false
|
100
108
|
requirements:
|
@@ -103,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
111
|
version: '0'
|
104
112
|
segments:
|
105
113
|
- 0
|
106
|
-
hash:
|
114
|
+
hash: -4576561865437419326
|
107
115
|
requirements: []
|
108
116
|
rubyforge_project:
|
109
117
|
rubygems_version: 1.8.19
|
@@ -113,3 +121,4 @@ summary: An OO form testing helper that makes Capayaba-based form testing easy.
|
|
113
121
|
test_files:
|
114
122
|
- spec/integration/form_object_model_spec.rb
|
115
123
|
- spec/spec_helper.rb
|
124
|
+
- spec/unit/field_spec.rb
|