tedium 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.travis.yml +9 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +150 -0
- data/Rakefile +6 -0
- data/lib/tedium.rb +23 -0
- data/lib/tedium/capybara/node_element.rb +19 -0
- data/lib/tedium/capybara/selectors.rb +72 -0
- data/lib/tedium/site_prism/action_dsl.rb +18 -0
- data/lib/tedium/site_prism/form_dsl.rb +39 -0
- data/lib/tedium/site_prism/has_record.rb +10 -0
- data/lib/tedium/site_prism/root_element_or_page.rb +14 -0
- data/lib/tedium/version.rb +3 -0
- data/lib/tedium/virtual_date_element.rb +33 -0
- data/spec/features/fill_in_checkboxes_spec.rb +21 -0
- data/spec/features/fill_in_dates_spec.rb +24 -0
- data/spec/features/fill_in_form_spec.rb +35 -0
- data/spec/features/have_record_spec.rb +15 -0
- data/spec/features/perform_actions_spec.rb +25 -0
- data/spec/features/select_options_by_value_spec.rb +26 -0
- data/spec/fixtures/action.html +2 -0
- data/spec/fixtures/checkbox.html +3 -0
- data/spec/fixtures/date.html +68 -0
- data/spec/fixtures/followed.html +2 -0
- data/spec/fixtures/form.html +15 -0
- data/spec/fixtures/record.html +4 -0
- data/spec/fixtures/select.html +5 -0
- data/spec/spec_helper.rb +30 -0
- data/tedium.gemspec +37 -0
- metadata +216 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 258164c5ea7bfe3aa42b680ae6d6a2443a96d9c1
|
4
|
+
data.tar.gz: 8e9d628b16f9645b89200f7b8ff0e6e983f82ddd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cd72b84371b4180094a5fdce5492729a012463d442e222c2ec8d17cbf7d73e11ccb8c20e03e7f60f9a806e3e77bdd972f243a3dc224fb86d36f4bd8241d659f0
|
7
|
+
data.tar.gz: 745577fab02b9c49ccf801499709a63d104e95ec4c96a747d5c1ec31dad25f78e9c4df8a902be4af21ebeb82f6e6cf5164839240501c06b961639feba19d2776
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Stefano Verna
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
# Tedium
|
2
|
+
|
3
|
+
[](https://travis-ci.org/cantierecreativo/tedium)
|
4
|
+
|
5
|
+
Remove the tedium of formulaic form filling with SitePrism and Capybara. Tedium allows you to specify a set of fields and actions to be performed rather than procedurally calling Capybara’s DSL methods on SitePrism elements.
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
class SignInPage < SitePrism::Page
|
11
|
+
fields :name, :email, :terms_of_service
|
12
|
+
submit_button
|
13
|
+
|
14
|
+
submission :sign_in, %w(name email terms_of_service)
|
15
|
+
end
|
16
|
+
|
17
|
+
feature 'New user registration' do
|
18
|
+
let(:sign_in_page) { SignInPage.new }
|
19
|
+
|
20
|
+
scenario 'successfull sign up' do
|
21
|
+
sign_in_page.load
|
22
|
+
sign_in_page.sign_in!('Stefano', 's.verna@cantierecreativo.net', true)
|
23
|
+
expect(page).to have_content t('user.create.success')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
```
|
27
|
+
|
28
|
+
## SitePrism DSL
|
29
|
+
|
30
|
+
### field
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
field(name, attribute_name = name)
|
34
|
+
```
|
35
|
+
|
36
|
+
Declares the presence of a field within the page. The selector used to find the input relies on Rails `name="model[attribute]"` attribute convention: `[name$="[attribute]"]`
|
37
|
+
|
38
|
+
If the underlying attribute name differs from the name you want to give to the page object field, provide the attribute name as the second argument.
|
39
|
+
|
40
|
+
Once a `:foobar` field is declared, the page object will define a `#foobar_field` method, which will return the corresponding Capybara node.
|
41
|
+
element.
|
42
|
+
|
43
|
+
### fields
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
fields(*names)
|
47
|
+
```
|
48
|
+
|
49
|
+
If you need to declare multiple fields at once, you can use this batch method.
|
50
|
+
|
51
|
+
### date_field
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
date_field(name, attribute_name = name)
|
55
|
+
```
|
56
|
+
|
57
|
+
Declares the presence of a `date_select` set of selects within the page. Once a `:date_of_birth` date_field is declared, the page object will define a `#date_of_birth_field` method, which will return a `Tedium::VirtualDateElement` instance. Calling `date_of_birth_field.set(Date.new)` will fill in the year, month and day selects with the correct values.
|
58
|
+
|
59
|
+
You can access to the specific year select element with `date_of_birth_field.year_element` method (the same applies also for month and day selects).
|
60
|
+
|
61
|
+
### submit_button
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
submit_button(role = nil)
|
65
|
+
```
|
66
|
+
|
67
|
+
Declares the presence of a submit button within the page. It can be either a `input[type=select]` or a `button`. If you pass an argument to the method (ie. `submit_button :sign_in`), the selector will be augmented with a `[role='sign-in']` filter (please note the automatic *dasherization*).
|
68
|
+
|
69
|
+
Once the submit button is declared, the page object will define a `#submit!`
|
70
|
+
method which will press the button.
|
71
|
+
|
72
|
+
### submission
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
submission(name, fields)
|
76
|
+
```
|
77
|
+
|
78
|
+
Declares a submission process.
|
79
|
+
|
80
|
+
Given the following page:
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
class SignInPage < SitePrism::Page
|
84
|
+
fields :name, :email, :terms_of_service
|
85
|
+
submit_button
|
86
|
+
|
87
|
+
submission :sign_in, %w(name email terms_of_service)
|
88
|
+
end
|
89
|
+
```
|
90
|
+
|
91
|
+
The page object will define a `#sign_in!` method, which will perform the following steps:
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
def sign_in!(name, email, terms_of_service)
|
95
|
+
name_field.set(name)
|
96
|
+
email_field.set(email)
|
97
|
+
terms_of_service_field.set(terms_of_service)
|
98
|
+
submit!
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
### action
|
103
|
+
|
104
|
+
```ruby
|
105
|
+
action(name, role = name)
|
106
|
+
```
|
107
|
+
|
108
|
+
Declares the presence of an action button/link within the page. Once a `:sign_out` action is declared, the page object will define a `#sign_out_element` method, which will return the corresponding Capybara node and a `#sign_out!` method, which will click on the element.
|
109
|
+
|
110
|
+
The selector relies on a `role` attribute present in the action element (see `submit_button` for details). If the role attribute differs from the name you want to give to the page object action, provide it as a second argument.
|
111
|
+
|
112
|
+
### actions
|
113
|
+
|
114
|
+
```ruby
|
115
|
+
actions(*names)
|
116
|
+
```
|
117
|
+
|
118
|
+
If you need to declare multiple actions at once, you can use this batch method.
|
119
|
+
|
120
|
+
### Changes to the Capybara node element #set method
|
121
|
+
|
122
|
+
In order to fill in text inputs, selects and checkboxes using the same API, Tedium extends the default `Capybara::Node::Element#set` behaviour, so that it will select the first option matching either the its value or its text:
|
123
|
+
|
124
|
+
```html
|
125
|
+
<select>
|
126
|
+
<option value='1'>Option 1</option>
|
127
|
+
<option value='2'>Option 2</option>
|
128
|
+
<option value='3'>Option 3</option>
|
129
|
+
</select>
|
130
|
+
```
|
131
|
+
```ruby
|
132
|
+
# both will select the second option
|
133
|
+
page.find_first('select').set('Option 2')
|
134
|
+
page.find_first('select').set('2')
|
135
|
+
```
|
136
|
+
|
137
|
+
### has_record?
|
138
|
+
|
139
|
+
Every SitePrism page inherits the `has_record?(record)` method, useful in conjunction with the [Rails `div_for` helper](http://devdocs.io/rails/actionview/helpers/recordtaghelper#method-i-div_for):
|
140
|
+
|
141
|
+
```erb
|
142
|
+
<%= div_for(@person, class: "foo") do %>
|
143
|
+
<%= @person.name %>
|
144
|
+
<% end %>
|
145
|
+
```
|
146
|
+
|
147
|
+
```ruby
|
148
|
+
expect(page).to have_record(@person) # this PASSes
|
149
|
+
```
|
150
|
+
|
data/Rakefile
ADDED
data/lib/tedium.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require "tedium/version"
|
2
|
+
|
3
|
+
require "tedium/capybara/selectors"
|
4
|
+
require "tedium/capybara/node_element"
|
5
|
+
|
6
|
+
require "tedium/site_prism/form_dsl"
|
7
|
+
require "tedium/site_prism/action_dsl"
|
8
|
+
require "tedium/site_prism/has_record"
|
9
|
+
require "tedium/site_prism/root_element_or_page"
|
10
|
+
|
11
|
+
require "site_prism"
|
12
|
+
|
13
|
+
[SitePrism::Page, SitePrism::Section].each do |klass|
|
14
|
+
klass.send :extend, Tedium::SitePrism::FormDsl
|
15
|
+
klass.send :extend, Tedium::SitePrism::ActionDsl
|
16
|
+
klass.send :include, Tedium::SitePrism::HasRecord
|
17
|
+
klass.send :include, Tedium::SitePrism::RootElementOrPage
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'capybara/node/element'
|
21
|
+
|
22
|
+
Capybara::Node::Element.send(:include, Tedium::Capybara::NodeElement)
|
23
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Tedium
|
2
|
+
module Capybara
|
3
|
+
module NodeElement
|
4
|
+
def self.included(base)
|
5
|
+
base.send(:alias_method, :original_set, :set)
|
6
|
+
base.send(:alias_method, :set, :augmented_select)
|
7
|
+
end
|
8
|
+
|
9
|
+
def augmented_select(value)
|
10
|
+
if tag_name == "select"
|
11
|
+
find(:option_with_value_or_label, value).select_option
|
12
|
+
else
|
13
|
+
original_set(value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require "capybara"
|
2
|
+
|
3
|
+
Capybara.add_selector(:input_for_field) do
|
4
|
+
label 'input for field'
|
5
|
+
|
6
|
+
xpath do |field|
|
7
|
+
XPath.descendant[
|
8
|
+
XPath.attr(:name).contains("[#{field}]") &
|
9
|
+
XPath.attr(:type).equals('hidden').inverse
|
10
|
+
]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Capybara.add_selector(:role) do
|
15
|
+
label 'element with role'
|
16
|
+
|
17
|
+
xpath do |role|
|
18
|
+
role = role.to_s.gsub(/_/, '-')
|
19
|
+
XPath.descendant[XPath.attr(:role).equals(role)]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
Capybara.add_selector(:submit_button) do
|
24
|
+
label 'submit button'
|
25
|
+
|
26
|
+
xpath do |role = nil|
|
27
|
+
|
28
|
+
selectors = [
|
29
|
+
XPath.descendant(:input)[XPath.attr(:type).equals('submit')],
|
30
|
+
XPath.descendant(:button)
|
31
|
+
]
|
32
|
+
|
33
|
+
if role
|
34
|
+
role = role.to_s.gsub(/_/, '-')
|
35
|
+
selectors.map! do |selector|
|
36
|
+
selector[XPath.attr(:role).equals(role)]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
selectors.inject(&:+)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
Capybara.add_selector(:record) do
|
45
|
+
xpath do |record|
|
46
|
+
dom_id = record_identifier.dom_id(record)
|
47
|
+
XPath.descendant[XPath.attr(:id).equals(dom_id)]
|
48
|
+
end
|
49
|
+
|
50
|
+
match do |record|
|
51
|
+
record.is_a?(ActiveModel::Naming)
|
52
|
+
end
|
53
|
+
|
54
|
+
def record_identifier
|
55
|
+
if defined?(ActionView::RecordIdentifier)
|
56
|
+
ActionView::RecordIdentifier
|
57
|
+
elsif defined?(ActionController::RecordIdentifier)
|
58
|
+
ActionController::RecordIdentifier
|
59
|
+
else
|
60
|
+
raise 'No RecordIdentifier found!'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
Capybara.add_selector :option_with_value_or_label do
|
66
|
+
label 'option with value or label'
|
67
|
+
|
68
|
+
xpath do |value|
|
69
|
+
XPath.descendant(:option)[XPath.text.equals(value) | XPath.attr(:value).equals(value)]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Tedium
|
2
|
+
module SitePrism
|
3
|
+
module ActionDsl
|
4
|
+
def action(name, role = name)
|
5
|
+
element "#{name}_element", :role, role
|
6
|
+
|
7
|
+
define_method "#{name}!" do
|
8
|
+
send("#{name}_element").click
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def actions(*names)
|
13
|
+
names.each { |n| action n }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "tedium/virtual_date_element"
|
2
|
+
|
3
|
+
module Tedium
|
4
|
+
module SitePrism
|
5
|
+
module FormDsl
|
6
|
+
def field(name, attribute_name = name)
|
7
|
+
element "#{name}_field", :input_for_field, attribute_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def fields(*names)
|
11
|
+
names.each { |n| field n }
|
12
|
+
end
|
13
|
+
|
14
|
+
def date_field(name, attribute_name = name)
|
15
|
+
define_method "#{name}_field" do
|
16
|
+
VirtualDateElement.new(root_element_or_page, attribute_name)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def submit_button(role = nil)
|
21
|
+
element :submit_button, :submit_button, role
|
22
|
+
|
23
|
+
define_method :submit! do
|
24
|
+
submit_button.click
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def submission(name, fields)
|
29
|
+
define_method "#{name}!" do |*args|
|
30
|
+
Array(fields).each_with_index do |field, i|
|
31
|
+
send("#{field}_field").set(args[i])
|
32
|
+
end
|
33
|
+
submit!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class VirtualDateElement
|
2
|
+
attr_reader :root_element, :attribute_name
|
3
|
+
|
4
|
+
def initialize(root_element, attribute_name)
|
5
|
+
@root_element = root_element
|
6
|
+
@attribute_name = attribute_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def set(date)
|
10
|
+
year_element.set(date.year)
|
11
|
+
month_element.set(date.month)
|
12
|
+
day_element.set(date.day)
|
13
|
+
end
|
14
|
+
|
15
|
+
def year_element
|
16
|
+
token_element('1i')
|
17
|
+
end
|
18
|
+
|
19
|
+
def month_element
|
20
|
+
token_element('2i')
|
21
|
+
end
|
22
|
+
|
23
|
+
def day_element
|
24
|
+
token_element('3i')
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def token_element(token)
|
30
|
+
root_element.find :input_for_field, "#{attribute_name}(#{token})"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Given a SitePrism page object with a checkbox field' do
|
4
|
+
let(:page_object) { page_object_klass.new }
|
5
|
+
|
6
|
+
let(:page_object_klass) do
|
7
|
+
Class.new(SitePrism::Page) do
|
8
|
+
field :terms_of_service
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
before do
|
13
|
+
visit 'checkbox'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'fills up the field' do
|
17
|
+
page_object.terms_of_service_field.set true
|
18
|
+
expect(page_object.terms_of_service_field).to be_checked
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Given a SitePrism page object with a date field' do
|
4
|
+
let(:page_object) { page_object_klass.new }
|
5
|
+
|
6
|
+
let(:page_object_klass) do
|
7
|
+
Class.new(SitePrism::Page) do
|
8
|
+
date_field :date_of_birth
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
before do
|
13
|
+
visit 'date'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'fills up all the tokens' do
|
17
|
+
page_object.date_of_birth_field.set Date.new(1985, 2, 15)
|
18
|
+
|
19
|
+
expect(page_object.date_of_birth_field.year_element.value).to eq '1985'
|
20
|
+
expect(page_object.date_of_birth_field.month_element.value).to eq '2'
|
21
|
+
expect(page_object.date_of_birth_field.day_element.value).to eq '15'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Given a SitePrism page object with some fields and a submission' do
|
4
|
+
let(:page_object) { page_object_klass.new }
|
5
|
+
|
6
|
+
let(:page_object_klass) do
|
7
|
+
Class.new(SitePrism::Page) do
|
8
|
+
fields :email, :password
|
9
|
+
submit_button :sign_in
|
10
|
+
|
11
|
+
submission :sign_in, %w(email password)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
visit 'form'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'finds the email field' do
|
20
|
+
expect(page_object.email_field).to be_present
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'finds the password field' do
|
24
|
+
expect(page_object.password_field).to be_present
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'finds the submit button' do
|
28
|
+
expect(page_object.submit_button).to be_present
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'performs the submission' do
|
32
|
+
page_object.sign_in!('foo@bar.com', 'qux')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Given any SitePrism page object' do
|
4
|
+
let(:page_object) { SitePrism::Page.new }
|
5
|
+
let(:record) { Project.new(12) }
|
6
|
+
|
7
|
+
before do
|
8
|
+
visit 'record'
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'I can use the have_selector matcher' do
|
12
|
+
expect(page_object).to have_record(record)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Given a SitePrism page object with an action' do
|
4
|
+
let(:page_object) { page_object_klass.new }
|
5
|
+
|
6
|
+
let(:page_object_klass) do
|
7
|
+
Class.new(SitePrism::Page) do
|
8
|
+
action :follow_project
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
before do
|
13
|
+
visit 'action'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'finds the action element' do
|
17
|
+
expect(page_object.follow_project_element).to be_present
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'performs the action' do
|
21
|
+
page_object.follow_project!
|
22
|
+
expect(page).to have_content 'Followed!'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Given a SitePrism page object with a select field' do
|
4
|
+
let(:page_object) { page_object_klass.new }
|
5
|
+
|
6
|
+
let(:page_object_klass) do
|
7
|
+
Class.new(SitePrism::Page) do
|
8
|
+
field :type
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
before do
|
13
|
+
visit 'select'
|
14
|
+
end
|
15
|
+
|
16
|
+
it '.set selects options by value' do
|
17
|
+
page_object.type_field.set 'public'
|
18
|
+
expect(page_object.type_field.value).to eq 'public'
|
19
|
+
end
|
20
|
+
|
21
|
+
it '.set selects options by label' do
|
22
|
+
page_object.type_field.set 'Public: fluff blargh'
|
23
|
+
expect(page_object.type_field.value).to eq 'public'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
<select name="user[date_of_birth(1i)]">
|
2
|
+
<option value="1987">1987</option>
|
3
|
+
<option value="1986">1986</option>
|
4
|
+
<option value="1985">1985</option>
|
5
|
+
<option value="1984">1984</option>
|
6
|
+
<option value="1983">1983</option>
|
7
|
+
<option value="1982">1982</option>
|
8
|
+
<option value="1981">1981</option>
|
9
|
+
<option value="1980">1980</option>
|
10
|
+
<option value="1979">1979</option>
|
11
|
+
<option value="1978">1978</option>
|
12
|
+
<option value="1977">1977</option>
|
13
|
+
<option value="1976">1976</option>
|
14
|
+
<option value="1975">1975</option>
|
15
|
+
<option value="1974">1974</option>
|
16
|
+
<option value="1973">1973</option>
|
17
|
+
<option value="1972">1972</option>
|
18
|
+
<option value="1971">1971</option>
|
19
|
+
<option value="1970">1970</option>
|
20
|
+
</select>
|
21
|
+
<select name="user[date_of_birth(2i)]">
|
22
|
+
<option value="1">January</option>
|
23
|
+
<option value="2">February</option>
|
24
|
+
<option value="3">March</option>
|
25
|
+
<option value="4">April</option>
|
26
|
+
<option value="5">May</option>
|
27
|
+
<option value="6">June</option>
|
28
|
+
<option value="7">July</option>
|
29
|
+
<option value="8">August</option>
|
30
|
+
<option value="9">September</option>
|
31
|
+
<option value="10">October</option>
|
32
|
+
<option value="11">November</option>
|
33
|
+
<option value="12">December</option>
|
34
|
+
</select>
|
35
|
+
<select name="user[date_of_birth(3i)]">
|
36
|
+
<option value="1">1</option>
|
37
|
+
<option value="2">2</option>
|
38
|
+
<option value="3">3</option>
|
39
|
+
<option value="4">4</option>
|
40
|
+
<option value="5">5</option>
|
41
|
+
<option value="6">6</option>
|
42
|
+
<option value="7">7</option>
|
43
|
+
<option value="8">8</option>
|
44
|
+
<option value="9">9</option>
|
45
|
+
<option value="10">10</option>
|
46
|
+
<option value="11">11</option>
|
47
|
+
<option value="12">12</option>
|
48
|
+
<option value="13">13</option>
|
49
|
+
<option value="14">14</option>
|
50
|
+
<option value="15">15</option>
|
51
|
+
<option value="16">16</option>
|
52
|
+
<option value="17">17</option>
|
53
|
+
<option value="18">18</option>
|
54
|
+
<option value="19">19</option>
|
55
|
+
<option value="20">20</option>
|
56
|
+
<option value="21">21</option>
|
57
|
+
<option value="22">22</option>
|
58
|
+
<option value="23">23</option>
|
59
|
+
<option value="24">24</option>
|
60
|
+
<option value="25">25</option>
|
61
|
+
<option value="26">26</option>
|
62
|
+
<option value="27">27</option>
|
63
|
+
<option value="28">28</option>
|
64
|
+
<option value="29">29</option>
|
65
|
+
<option value="30">30</option>
|
66
|
+
<option value="31">31</option>
|
67
|
+
</select>
|
68
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<form method="get">
|
2
|
+
<div style="margin:0;padding:0;display:inline">
|
3
|
+
<input name="utf8" type="hidden" value="✓" />
|
4
|
+
</div>
|
5
|
+
<div class="email">
|
6
|
+
<label for="session_email">Email</label>
|
7
|
+
<input name="session[email]" type="email" />
|
8
|
+
</div>
|
9
|
+
<div class="password">
|
10
|
+
<label for="session_password">Password</label>
|
11
|
+
<input name="session[password]" type="password" />
|
12
|
+
</div>
|
13
|
+
<input class="button" type="submit" value="Sign in" role="sign-in" />
|
14
|
+
</form>
|
15
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'capybara/dsl'
|
2
|
+
require 'tedium'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
require 'active_support/core_ext/object/blank'
|
6
|
+
require 'action_view/record_identifier'
|
7
|
+
require 'active_model'
|
8
|
+
|
9
|
+
class Project < Struct.new(:id)
|
10
|
+
extend ActiveModel::Naming
|
11
|
+
include ActiveModel::Conversion
|
12
|
+
end
|
13
|
+
|
14
|
+
module SpecHelper
|
15
|
+
def visit(page_name)
|
16
|
+
page.visit("/#{page_name}.html")
|
17
|
+
end
|
18
|
+
|
19
|
+
def page
|
20
|
+
@page ||= begin
|
21
|
+
Capybara.app = Rack::File.new(File.expand_path('../fixtures', __FILE__))
|
22
|
+
Capybara.current_session
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
RSpec.configure do |c|
|
28
|
+
c.include SpecHelper
|
29
|
+
end
|
30
|
+
|
data/tedium.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'tedium/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "tedium"
|
8
|
+
spec.version = Tedium::VERSION
|
9
|
+
spec.authors = ["Stefano Verna"]
|
10
|
+
spec.email = ["s.verna@cantierecreativo.net"]
|
11
|
+
spec.summary = %q{Simplify form filling with SitePrism}
|
12
|
+
spec.description = <<-DESCRIPTION.sub(/^ +/, '')
|
13
|
+
Removes the tedium of form filling with SitePrism by allowing you
|
14
|
+
to specify a set of fields, actions and submissions rather than
|
15
|
+
procedurally calling Capybara’s DSL methods.
|
16
|
+
DESCRIPTION
|
17
|
+
|
18
|
+
spec.homepage = "https://github.com/cantierecreativo/tedium"
|
19
|
+
spec.license = "MIT"
|
20
|
+
|
21
|
+
spec.files = `git ls-files`.split($/)
|
22
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
23
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
24
|
+
spec.require_paths = ["lib"]
|
25
|
+
|
26
|
+
spec.add_dependency 'site_prism'
|
27
|
+
spec.add_dependency 'activesupport'
|
28
|
+
|
29
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
30
|
+
spec.add_development_dependency "rake"
|
31
|
+
spec.add_development_dependency "rspec"
|
32
|
+
spec.add_development_dependency "pry"
|
33
|
+
spec.add_development_dependency "actionpack"
|
34
|
+
spec.add_development_dependency "activemodel"
|
35
|
+
spec.add_development_dependency "launchy"
|
36
|
+
end
|
37
|
+
|
metadata
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tedium
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Stefano Verna
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-03-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: site_prism
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: actionpack
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: activemodel
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: launchy
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
description: "Removes the tedium of form filling with SitePrism by allowing you\n
|
140
|
+
\ to specify a set of fields, actions and submissions rather than \n procedurally
|
141
|
+
calling Capybara’s DSL methods.\n"
|
142
|
+
email:
|
143
|
+
- s.verna@cantierecreativo.net
|
144
|
+
executables: []
|
145
|
+
extensions: []
|
146
|
+
extra_rdoc_files: []
|
147
|
+
files:
|
148
|
+
- .gitignore
|
149
|
+
- .travis.yml
|
150
|
+
- Gemfile
|
151
|
+
- LICENSE.txt
|
152
|
+
- README.md
|
153
|
+
- Rakefile
|
154
|
+
- lib/tedium.rb
|
155
|
+
- lib/tedium/capybara/node_element.rb
|
156
|
+
- lib/tedium/capybara/selectors.rb
|
157
|
+
- lib/tedium/site_prism/action_dsl.rb
|
158
|
+
- lib/tedium/site_prism/form_dsl.rb
|
159
|
+
- lib/tedium/site_prism/has_record.rb
|
160
|
+
- lib/tedium/site_prism/root_element_or_page.rb
|
161
|
+
- lib/tedium/version.rb
|
162
|
+
- lib/tedium/virtual_date_element.rb
|
163
|
+
- spec/features/fill_in_checkboxes_spec.rb
|
164
|
+
- spec/features/fill_in_dates_spec.rb
|
165
|
+
- spec/features/fill_in_form_spec.rb
|
166
|
+
- spec/features/have_record_spec.rb
|
167
|
+
- spec/features/perform_actions_spec.rb
|
168
|
+
- spec/features/select_options_by_value_spec.rb
|
169
|
+
- spec/fixtures/action.html
|
170
|
+
- spec/fixtures/checkbox.html
|
171
|
+
- spec/fixtures/date.html
|
172
|
+
- spec/fixtures/followed.html
|
173
|
+
- spec/fixtures/form.html
|
174
|
+
- spec/fixtures/record.html
|
175
|
+
- spec/fixtures/select.html
|
176
|
+
- spec/spec_helper.rb
|
177
|
+
- tedium.gemspec
|
178
|
+
homepage: https://github.com/cantierecreativo/tedium
|
179
|
+
licenses:
|
180
|
+
- MIT
|
181
|
+
metadata: {}
|
182
|
+
post_install_message:
|
183
|
+
rdoc_options: []
|
184
|
+
require_paths:
|
185
|
+
- lib
|
186
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - '>='
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
191
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
|
+
requirements:
|
193
|
+
- - '>='
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: '0'
|
196
|
+
requirements: []
|
197
|
+
rubyforge_project:
|
198
|
+
rubygems_version: 2.2.2
|
199
|
+
signing_key:
|
200
|
+
specification_version: 4
|
201
|
+
summary: Simplify form filling with SitePrism
|
202
|
+
test_files:
|
203
|
+
- spec/features/fill_in_checkboxes_spec.rb
|
204
|
+
- spec/features/fill_in_dates_spec.rb
|
205
|
+
- spec/features/fill_in_form_spec.rb
|
206
|
+
- spec/features/have_record_spec.rb
|
207
|
+
- spec/features/perform_actions_spec.rb
|
208
|
+
- spec/features/select_options_by_value_spec.rb
|
209
|
+
- spec/fixtures/action.html
|
210
|
+
- spec/fixtures/checkbox.html
|
211
|
+
- spec/fixtures/date.html
|
212
|
+
- spec/fixtures/followed.html
|
213
|
+
- spec/fixtures/form.html
|
214
|
+
- spec/fixtures/record.html
|
215
|
+
- spec/fixtures/select.html
|
216
|
+
- spec/spec_helper.rb
|