pouch 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/pouch/version.rb +1 -1
- data/lib/pouch.rb +77 -1
- data/pouch.gemspec +3 -0
- data/spec/pouch_spec.rb +168 -0
- data/spec/spec_helper.rb +8 -0
- metadata +39 -3
data/lib/pouch/version.rb
CHANGED
data/lib/pouch.rb
CHANGED
@@ -1,5 +1,81 @@
|
|
1
1
|
require "pouch/version"
|
2
2
|
|
3
3
|
module Pouch
|
4
|
-
|
4
|
+
|
5
|
+
class ContextualReplacementError < StandardError; end
|
6
|
+
|
7
|
+
def self.included base
|
8
|
+
base.extend self
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize browser, start = false, opts = {}
|
12
|
+
if start.is_a?(Hash) && opts.empty?
|
13
|
+
opts = start
|
14
|
+
start = false
|
15
|
+
end
|
16
|
+
|
17
|
+
@browser = browser
|
18
|
+
@context = standardize opts[:context] if opts[:context]
|
19
|
+
visit if self.respond_to?(:visit) && start
|
20
|
+
contextualize_methods
|
21
|
+
end
|
22
|
+
|
23
|
+
def browser
|
24
|
+
@browser
|
25
|
+
end
|
26
|
+
|
27
|
+
def context
|
28
|
+
@context
|
29
|
+
end
|
30
|
+
|
31
|
+
def page_url= str
|
32
|
+
define_method :visit do
|
33
|
+
self.browser.goto str
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def element tag, name, identifier, *args, &block
|
38
|
+
define_method name do
|
39
|
+
return browser.element_for tag, identifier unless block_given?
|
40
|
+
block.call browser.send('element_for', tag, identifier), *args
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def contextualize_methods
|
47
|
+
return unless context
|
48
|
+
context.each_with_object([]) do |ctxt, array|
|
49
|
+
next unless array.flatten.empty?
|
50
|
+
array << match_and_replace(ctxt)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def match_and_replace context
|
55
|
+
get_match(context).map{ |mthd| self.method mthd }.each{ |mthd| replace_method mthd, context }
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_match context
|
59
|
+
methods.select{ |mthd| mthd.to_s.start_with? "#{context}_" }.each_with_object([]) do |mthd, array|
|
60
|
+
unless respond_to? mthd.to_s.gsub("#{context}_", "")
|
61
|
+
raise ContextualReplacementError, "#{self.class} defined no standard method for replacement '#{mthd}'"
|
62
|
+
end
|
63
|
+
array << mthd
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def replace_method method, context
|
68
|
+
(class << self; self; end).class_eval{ define_method method.name.to_s.gsub("#{context}_",""), method }
|
69
|
+
end
|
70
|
+
|
71
|
+
def standardize context
|
72
|
+
context.map!{ |c| standardize c } if context.kind_of? Array
|
73
|
+
|
74
|
+
if [Array, String, Symbol].include? context.class
|
75
|
+
[context].flatten.map(&:to_s)
|
76
|
+
else
|
77
|
+
raise "Cannot define Pouch context as #{context.class}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
5
81
|
end
|
data/pouch.gemspec
CHANGED
@@ -18,6 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_runtime_dependency "watir-webdriver", "~> 0.6.11"
|
22
|
+
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
spec.add_development_dependency "rspec", "~> 3.0.0"
|
23
26
|
end
|
data/spec/pouch_spec.rb
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Pouch do
|
4
|
+
|
5
|
+
describe ".included" do
|
6
|
+
class Page; end
|
7
|
+
|
8
|
+
it "extends Pouch onto the base class" do
|
9
|
+
expect(Page).to receive(:extend).with(Pouch)
|
10
|
+
Page.send(:include, Pouch)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#initialize" do
|
15
|
+
class Page2; include Pouch; end
|
16
|
+
|
17
|
+
it "creates @browser variable" do
|
18
|
+
obj = Page2.new 'webdriver'
|
19
|
+
expect(obj.instance_variable_get :@browser).to eq 'webdriver'
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when instance does not respond to #visit" do
|
23
|
+
it "doesn't navigate to page_url if start=true" do
|
24
|
+
driver = double 'webdriver'
|
25
|
+
expect(driver).to_not receive(:goto).with('url')
|
26
|
+
Page2.new driver, true, context: 'test'
|
27
|
+
end
|
28
|
+
|
29
|
+
it "doesn't navigate to page_url if start=false" do
|
30
|
+
driver = double 'webdriver'
|
31
|
+
expect(driver).to_not receive(:goto).with('url')
|
32
|
+
Page2.new driver, false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when instance responds to #visit" do
|
37
|
+
it "doesn't navigate to page_url if start=false" do
|
38
|
+
Page2.send :page_url=, 'url'
|
39
|
+
driver = double 'webdriver'
|
40
|
+
expect(driver).to_not receive(:goto)
|
41
|
+
Page2.new driver, false
|
42
|
+
end
|
43
|
+
|
44
|
+
it "navigates to page_url if start=true" do
|
45
|
+
driver = double 'webdriver'
|
46
|
+
expect(driver).to receive(:goto).with('url')
|
47
|
+
Page2.new driver, true, context: 'test'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "with context" do
|
52
|
+
obj = ->(context){ Page2.new 'webdriver', context: context }
|
53
|
+
|
54
|
+
it "defines @context with String argument" do
|
55
|
+
expect(obj.call('my_context').instance_variable_get :@context).to eq ['my_context']
|
56
|
+
end
|
57
|
+
|
58
|
+
it "defines @context with Array argument" do
|
59
|
+
expect(obj.call(['my_context']).instance_variable_get :@context).to eq ['my_context']
|
60
|
+
end
|
61
|
+
|
62
|
+
it "defines @context with Symbol argument" do
|
63
|
+
expect(obj.call(:my_context).instance_variable_get :@context).to eq ['my_context']
|
64
|
+
end
|
65
|
+
|
66
|
+
it "defines @context with two Strings" do
|
67
|
+
expect(obj.call(['one', 'two']).instance_variable_get :@context).to eq ['one', 'two']
|
68
|
+
end
|
69
|
+
|
70
|
+
it "defines @context with two Arrays" do
|
71
|
+
expect(obj.call([['one'], ['two']]).instance_variable_get :@context).to eq ['one', 'two']
|
72
|
+
end
|
73
|
+
|
74
|
+
it "defines @context with two Symbols" do
|
75
|
+
expect(obj.call([:one, :two]).instance_variable_get :@context).to eq ['one', 'two']
|
76
|
+
end
|
77
|
+
|
78
|
+
it "defines @context with one String and one Array" do
|
79
|
+
expect(obj.call(['one', [:two]]).instance_variable_get :@context).to eq ['one', 'two']
|
80
|
+
end
|
81
|
+
|
82
|
+
it "defines @context with combination of Array, String, and Symbol" do
|
83
|
+
given = [:one, 'two', [:three, [:four, 'five'], :six], 'seven', ['eight', [['nine', [:ten]]]]]
|
84
|
+
expected = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']
|
85
|
+
expect(obj.call(given).instance_variable_get :@context).to eq expected
|
86
|
+
end
|
87
|
+
|
88
|
+
it "raises StandardError with Hash argument" do
|
89
|
+
expect{ obj.call({}) }.to raise_error(StandardError, /Hash/)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "raises StandardError if one argument is a Number" do
|
93
|
+
expect{ obj.call(['one', 2]) }.to raise_error(StandardError, /Fixnum/)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Page3
|
99
|
+
include Pouch
|
100
|
+
element(:a, :generic, id: 'generic')
|
101
|
+
element(:a, :blocked, id: 'blocked'){ |link| link.href }
|
102
|
+
element(:a, :different_generic, id: 'generic-diff')
|
103
|
+
element(:a, :different_blocked, id: 'blocked-diff'){ |link| link.href }
|
104
|
+
element(:a, :what_replacement, id: 'no-match')
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#browser" do
|
108
|
+
it "returns the browser instance" do
|
109
|
+
obj = Page3.new 'webdriver'
|
110
|
+
expect(obj.browser).to eq 'webdriver'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "#context" do
|
115
|
+
it "returns the page object context" do
|
116
|
+
obj = Page3.new 'webdriver', context: ['one', :two, ['three']]
|
117
|
+
expect(obj.context).to eq ['one', 'two', 'three']
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "#element" do
|
122
|
+
let(:browser){ double 'webdriver' }
|
123
|
+
let(:element){ double 'html_link' }
|
124
|
+
let(:page){ Page3.new browser }
|
125
|
+
let(:diff){ Page3.new browser, context: 'different' }
|
126
|
+
let(:what){ Page3.new browser, context: 'what' }
|
127
|
+
|
128
|
+
it "returns the link element by default" do
|
129
|
+
expect(browser).to receive(:element_for).with(:a, id:'generic').and_return(element)
|
130
|
+
expect(page.generic).to eq element
|
131
|
+
end
|
132
|
+
|
133
|
+
it "returns an element that can be clicked" do
|
134
|
+
expect(browser).to receive(:element_for).with(:a, id:'generic').and_return(element)
|
135
|
+
expect(element).to receive(:click)
|
136
|
+
page.generic.click
|
137
|
+
end
|
138
|
+
|
139
|
+
it "returns the result of the definition block" do
|
140
|
+
expect(browser).to receive(:element_for).with(:a, id:'blocked').and_return(element)
|
141
|
+
expect(element).to receive(:href).and_return("www.test.com")
|
142
|
+
expect(page.blocked).to eq "www.test.com"
|
143
|
+
end
|
144
|
+
|
145
|
+
context "with context" do
|
146
|
+
it "uses the replacement method" do
|
147
|
+
expect(browser).to receive(:element_for).with(:a, id:'generic-diff').and_return(element)
|
148
|
+
expect(diff.generic).to eq element
|
149
|
+
end
|
150
|
+
|
151
|
+
it "uses the replacement method with definition block" do
|
152
|
+
expect(browser).to receive(:element_for).with(:a, id:'blocked-diff').and_return(element)
|
153
|
+
expect(element).to receive(:href).and_return("www.diff.com")
|
154
|
+
expect(diff.blocked).to eq "www.diff.com"
|
155
|
+
end
|
156
|
+
|
157
|
+
it "uses the standard method when context matches no replacement" do
|
158
|
+
expect(browser).to receive(:element_for).with(:a, id:'generic').and_return(element)
|
159
|
+
expect(Page3.new(browser, context: 'test').generic).to eq element
|
160
|
+
end
|
161
|
+
|
162
|
+
it "throws an error with replacement but no standard method" do
|
163
|
+
expect{ what.replacement }.to raise_error Pouch::ContextualReplacementError, /Page3 defined no standard method for replacement/
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pouch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-11-
|
12
|
+
date: 2014-11-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: watir-webdriver
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.6.11
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.6.11
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: bundler
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -43,6 +59,22 @@ dependencies:
|
|
43
59
|
- - ~>
|
44
60
|
- !ruby/object:Gem::Version
|
45
61
|
version: '10.0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 3.0.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 3.0.0
|
46
78
|
description: A flexible page object DSL for responsive UI testing via automated browsers
|
47
79
|
and devices
|
48
80
|
email:
|
@@ -59,6 +91,8 @@ files:
|
|
59
91
|
- lib/pouch.rb
|
60
92
|
- lib/pouch/version.rb
|
61
93
|
- pouch.gemspec
|
94
|
+
- spec/pouch_spec.rb
|
95
|
+
- spec/spec_helper.rb
|
62
96
|
homepage: https://github.com/jdenen/pouch
|
63
97
|
licenses:
|
64
98
|
- MIT
|
@@ -84,5 +118,7 @@ rubygems_version: 1.8.23.2
|
|
84
118
|
signing_key:
|
85
119
|
specification_version: 3
|
86
120
|
summary: A flexible page object DSL for responsive UI testing
|
87
|
-
test_files:
|
121
|
+
test_files:
|
122
|
+
- spec/pouch_spec.rb
|
123
|
+
- spec/spec_helper.rb
|
88
124
|
has_rdoc:
|