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.
@@ -2,4 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 1.9.2
5
-
5
+ - 1.8.7
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]"
@@ -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"
@@ -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,12 @@
1
+ module FormObjectModel
2
+ class Field < Struct.new(:page, :name, :locator)
3
+ def ==(other)
4
+ if respond_to?(:has_value?)
5
+ has_value? other
6
+ else
7
+ super
8
+ end
9
+ end
10
+ end
11
+ end
12
+
@@ -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
- (class << self; self; end).class_eval do
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
+
@@ -1,3 +1,3 @@
1
1
  module FormObjectModel
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -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 with the value is the same" do
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.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-14 00:00:00.000000000 Z
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: 4303086123423288710
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: 4303086123423288710
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