form_object_model 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://secure.travis-ci.org/reinteractive-open/form-object-model.png?branch=master)](http://travis-ci.org/reinteractive-open/form-object-model)
|
4
|
+
[![Code Climate](https://codeclimate.com/badge.png)](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
|