mobilify 1.2.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/changes.md +6 -0
- data/lib/mobilify.rb +55 -19
- data/lib/mobilify/version.rb +1 -1
- data/spec/mobilify_spec.rb +159 -0
- data/spec/support/page.rb +12 -0
- metadata +9 -13
- data/spec/multiple_context_spec.rb +0 -29
- data/spec/page_object_spec.rb +0 -11
- data/spec/simple_context_spec.rb +0 -23
- data/spec/spec_helper.rb +0 -15
- data/spec/support/khan_academy.rb +0 -12
data/changes.md
ADDED
data/lib/mobilify.rb
CHANGED
@@ -4,37 +4,73 @@ require 'page-object'
|
|
4
4
|
module Mobilify
|
5
5
|
include PageObject
|
6
6
|
|
7
|
+
#
|
8
|
+
# Build page object with context(s) for method replacement
|
9
|
+
#
|
7
10
|
def initialize(browser, opts = {})
|
8
11
|
super(browser, opts[:visit] || false)
|
9
|
-
@context = opts[:context]
|
12
|
+
@context = set_context opts[:context]
|
10
13
|
mobilify! if @context
|
11
14
|
end
|
12
15
|
|
13
|
-
|
16
|
+
#
|
17
|
+
# Returns context(s) passed to page object instance construction
|
18
|
+
#
|
19
|
+
# @return [Array]
|
20
|
+
#
|
21
|
+
def context
|
22
|
+
@context
|
23
|
+
end
|
24
|
+
alias :context? :context
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
#
|
29
|
+
# Include page-object too
|
30
|
+
#
|
31
|
+
def self.included klass
|
14
32
|
klass.send :include, PageObject
|
15
33
|
end
|
16
34
|
|
17
|
-
|
18
|
-
|
35
|
+
#
|
36
|
+
# Format given context(s) to Mobilify's liking
|
37
|
+
#
|
38
|
+
def set_context config
|
39
|
+
return nil if config.nil?
|
40
|
+
config.kind_of?(Array) ? config.flatten.map(&:to_sym) : [config].map(&:to_sym)
|
19
41
|
end
|
20
42
|
|
43
|
+
#
|
44
|
+
# Iterate over contexts for method replacement
|
45
|
+
#
|
21
46
|
def mobilify!
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
contexts.flatten.each do |c|
|
26
|
-
next if match
|
27
|
-
context = c.to_s
|
28
|
-
methods.
|
29
|
-
select { |m| m.to_s.start_with? "#{context}_" }.
|
30
|
-
select { |m| respond_to? m.to_s.gsub("#{context}_", '') }.
|
31
|
-
map { |m| self.method(m) }.each do |method|
|
32
|
-
(class << self; self; end).class_eval do
|
33
|
-
define_method(method.name.to_s.gsub("#{context}_", ''), method)
|
34
|
-
match = true
|
35
|
-
end
|
36
|
-
end
|
47
|
+
@context.each_with_object([]) do |c, array|
|
48
|
+
next unless array.flatten.empty?
|
49
|
+
array << match_and_replace(c.to_s)
|
37
50
|
end
|
38
51
|
end
|
39
52
|
|
53
|
+
#
|
54
|
+
# Method replacement
|
55
|
+
#
|
56
|
+
def match_and_replace context
|
57
|
+
get_contextual_match(context).map { |m| self.method(m) }.each do |method|
|
58
|
+
replace! method, context
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
#
|
63
|
+
# Find page object methods matching the given context
|
64
|
+
#
|
65
|
+
def get_contextual_match context
|
66
|
+
methods.select{ |m| m.to_s.start_with? "#{context}_" }.select{ |m| respond_to? m.to_s.gsub("#{context}_","") }
|
67
|
+
end
|
68
|
+
|
69
|
+
#
|
70
|
+
# Redefine contextually matching method as original method
|
71
|
+
#
|
72
|
+
def replace! method, context
|
73
|
+
(class << self; self; end).class_eval{ define_method(method.name.to_s.gsub("#{context}_",""), method) }
|
74
|
+
end
|
75
|
+
|
40
76
|
end
|
data/lib/mobilify/version.rb
CHANGED
@@ -0,0 +1,159 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'support/page'
|
3
|
+
|
4
|
+
describe Mobilify do
|
5
|
+
before :all do
|
6
|
+
@browser = Watir::Browser.new
|
7
|
+
@mobilify = ->(context = nil){ Page.new @browser, context: context }
|
8
|
+
end
|
9
|
+
|
10
|
+
it "includes PageObject" do
|
11
|
+
expect(Page.included_modules[1]).to eq PageObject
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when given no context" do
|
15
|
+
it "does not perform method replacement" do
|
16
|
+
page = @mobilify.call
|
17
|
+
expect(page.login_element.inspect).to include("log-in-link ellipsis highlight")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when given a single context" do
|
22
|
+
it "does not perform method replacement for an invalid context" do
|
23
|
+
page = @mobilify.call 'wrong'
|
24
|
+
expect(page.login_element.inspect).to include("log-in-link ellipsis highlight")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "does not perform method replacement without an original method" do
|
28
|
+
page = @mobilify.call 'other'
|
29
|
+
expect(page.other_button_element.inspect).to include("other-button-class")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "does not perform method replacement without the correct context" do
|
33
|
+
page = @mobilify.call 'mobile'
|
34
|
+
expect(page.other_button_element.inspect).to include("other-button-class")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "performs method replacement for a valid context" do
|
38
|
+
page = @mobilify.call 'mobile'
|
39
|
+
expect(page.login_element.inspect).to include("simple-button big-button")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when given multiple contexts" do
|
44
|
+
it "does not perform method replacement for invalid contexts" do
|
45
|
+
page = @mobilify.call ['no_match', 'wrong']
|
46
|
+
expect(page.login_element.inspect).to include("log-in-link ellipsis highlight")
|
47
|
+
end
|
48
|
+
|
49
|
+
context "and the first context matches" do
|
50
|
+
it "performs method replacement with the first matching context" do
|
51
|
+
page = @mobilify.call ['mobile', 'wrong']
|
52
|
+
expect(page.login_element.inspect).to include("simple-button big-button")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "does not perform method replacement with the second matching context" do
|
56
|
+
page = @mobilify.call ['mobile', 'desktop']
|
57
|
+
expect(page.login_element.inspect).to include("simple-button big-button")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "and the second context matches" do
|
62
|
+
it "performs method replacement with the second context" do
|
63
|
+
page = @mobilify.call ['wrong', 'mobile']
|
64
|
+
expect(page.login_element.inspect).to include("simple-button big-button")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "and the first and last contexts match" do
|
69
|
+
it "performs method replacement with the first matching context" do
|
70
|
+
page = @mobilify.call ['mobile', 'wrong', 'ignore', 'nothing', 'desktop']
|
71
|
+
expect(page.login_element.inspect).to include("simple-button big-button")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#initialize" do
|
77
|
+
context "without context" do
|
78
|
+
it "returns the page object instance" do
|
79
|
+
expect(@mobilify.call).to be_a Page
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "with context" do
|
84
|
+
it "returns the page object instance" do
|
85
|
+
expect(@mobilify.call 'mobile').to be_a Page
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#context" do
|
91
|
+
it "returns nil when for context" do
|
92
|
+
page = @mobilify.call
|
93
|
+
expect(page.context).to be_nil
|
94
|
+
end
|
95
|
+
|
96
|
+
it "returns an array for one context" do
|
97
|
+
page = @mobilify.call 'desktop'
|
98
|
+
expect(page.context).to eq [:desktop]
|
99
|
+
end
|
100
|
+
|
101
|
+
it "returns an array for multiple contexts" do
|
102
|
+
page = @mobilify.call ['one', 'two', 'three']
|
103
|
+
expect(page.context).to eq [:one, :two, :three]
|
104
|
+
end
|
105
|
+
|
106
|
+
it "can be called as #context?" do
|
107
|
+
page = @mobilify.call 'desktop'
|
108
|
+
expect(page.context?).to eq [:desktop]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#set_context" do
|
113
|
+
let(:page){ @mobilify.call }
|
114
|
+
|
115
|
+
it "returns nil when given nil" do
|
116
|
+
expect(page.send :set_context, nil).to be_nil
|
117
|
+
end
|
118
|
+
|
119
|
+
context "when given a single context" do
|
120
|
+
it "converts context into an array" do
|
121
|
+
expect(page.send :set_context, :one).to eq [:one]
|
122
|
+
end
|
123
|
+
|
124
|
+
it "converts strings to symbols" do
|
125
|
+
expect(page.send :set_context, "one").to eq [:one]
|
126
|
+
end
|
127
|
+
|
128
|
+
it "flattens a single-element array" do
|
129
|
+
expect(page.send :set_context, [:one]).to eq [:one]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context "when given multiple contexts" do
|
134
|
+
it "converts strings to symbols" do
|
135
|
+
expect(page.send :set_context, ["one", "two"]).to eq [:one, :two]
|
136
|
+
end
|
137
|
+
|
138
|
+
it "flattens multiple arrays" do
|
139
|
+
expect(page.send :set_context, [[:one, :two], [:three, :four]]).to eq [:one, :two, :three, :four]
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "#get_contextual_match" do
|
145
|
+
let(:page){ @mobilify.call }
|
146
|
+
|
147
|
+
it "returns an array" do
|
148
|
+
expect(page.send :get_contextual_match, "one").to be_an Array
|
149
|
+
end
|
150
|
+
|
151
|
+
it "returns an empty array with invalid context" do
|
152
|
+
expect(page.send :get_contextual_match, "one").to be_empty
|
153
|
+
end
|
154
|
+
|
155
|
+
it "returns three-item array with valid context" do
|
156
|
+
expect(page.send(:get_contextual_match, "mobile").size).to eq 3
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'mobilify'
|
2
|
+
|
3
|
+
class Page
|
4
|
+
include Mobilify
|
5
|
+
|
6
|
+
link(:login, class: "log-in-link ellipsis highlight")
|
7
|
+
link(:desktop_login, class: "log-in-link ellipsis highlight")
|
8
|
+
link(:mobile_login, class: "simple-button big-button")
|
9
|
+
|
10
|
+
button(:other_button, class: "other-button-class")
|
11
|
+
end
|
12
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mobilify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-11-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: page-object
|
@@ -135,14 +135,12 @@ files:
|
|
135
135
|
- LICENSE.txt
|
136
136
|
- README.md
|
137
137
|
- Rakefile
|
138
|
+
- changes.md
|
138
139
|
- lib/mobilify.rb
|
139
140
|
- lib/mobilify/version.rb
|
140
141
|
- mobilify.gemspec
|
141
|
-
- spec/
|
142
|
-
- spec/
|
143
|
-
- spec/simple_context_spec.rb
|
144
|
-
- spec/spec_helper.rb
|
145
|
-
- spec/support/khan_academy.rb
|
142
|
+
- spec/mobilify_spec.rb
|
143
|
+
- spec/support/page.rb
|
146
144
|
homepage: http://github.com/jdenen/mobilify
|
147
145
|
licenses:
|
148
146
|
- MIT
|
@@ -164,13 +162,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
162
|
version: '0'
|
165
163
|
requirements: []
|
166
164
|
rubyforge_project:
|
167
|
-
rubygems_version: 1.8.23
|
165
|
+
rubygems_version: 1.8.23.2
|
168
166
|
signing_key:
|
169
167
|
specification_version: 3
|
170
168
|
summary: page-object methods invoked with one call but defined contextually
|
171
169
|
test_files:
|
172
|
-
- spec/
|
173
|
-
- spec/
|
174
|
-
|
175
|
-
- spec/spec_helper.rb
|
176
|
-
- spec/support/khan_academy.rb
|
170
|
+
- spec/mobilify_spec.rb
|
171
|
+
- spec/support/page.rb
|
172
|
+
has_rdoc:
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Mobilify do
|
4
|
-
after :each do
|
5
|
-
@browser.close
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "uses default method when given contexts do not apply" do
|
9
|
-
Given(:desktop) { KhanAcademy.new(desktop_browser, { :visit => true, :context => [:no_match, :wrong] }) }
|
10
|
-
Then { desktop.login_element.inspect.should include("log-in-link ellipsis highlight") }
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "uses only applicable context given" do
|
14
|
-
context "when applicable context is first in the array" do
|
15
|
-
Given(:mobile) { KhanAcademy.new(mobile_browser, { :visit => true, :context => [:mobile, :wrong] }) }
|
16
|
-
Then { mobile.login_element.inspect.should include("simple-button big-button") }
|
17
|
-
end
|
18
|
-
|
19
|
-
context "when applicable context is second in the array" do
|
20
|
-
Given(:mobile) { KhanAcademy.new(mobile_browser, { :visit => true, :context => [:wrong, :mobile] }) }
|
21
|
-
Then { mobile.login_element.inspect.should include("simple-button big-button") }
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe "uses first context given when multiple applicable contexts are given" do
|
26
|
-
Given(:mobile) { KhanAcademy.new(mobile_browser, { :visit => true, :context => [:mobile, :ignored] }) }
|
27
|
-
Then { mobile.login_element.inspect.should include("simple-button big-button") }
|
28
|
-
end
|
29
|
-
end
|
data/spec/page_object_spec.rb
DELETED
data/spec/simple_context_spec.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Mobilify do
|
4
|
-
after :each do
|
5
|
-
@browser.close
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "uses default method when no context is given" do
|
9
|
-
Given(:desktop) { KhanAcademy.new(desktop_browser, { :visit => true }) }
|
10
|
-
Then { desktop.login_element.inspect.should include("log-in-link ellipsis highlight") }
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "uses default method when non-applicable context is given" do
|
14
|
-
Given(:desktop) { KhanAcademy.new(desktop_browser, { :visit => true, :context => :wrong }) }
|
15
|
-
Then { desktop.login_element.inspect.should include("log-in-link ellipsis highlight") }
|
16
|
-
end
|
17
|
-
|
18
|
-
describe "uses contextual method for the given context" do
|
19
|
-
Given(:mobile) { KhanAcademy.new(mobile_browser, { :context => :mobile, :visit => true }) }
|
20
|
-
Then { mobile.login_element.inspect.should include("simple-button big-button") }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
data/spec/spec_helper.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'rspec'
|
2
|
-
require 'rspec-given'
|
3
|
-
require 'watir-webdriver'
|
4
|
-
require 'webdriver-user-agent'
|
5
|
-
require './lib/mobilify'
|
6
|
-
require 'support/khan_academy'
|
7
|
-
|
8
|
-
def desktop_browser
|
9
|
-
@browser = Watir::Browser.new :firefox
|
10
|
-
end
|
11
|
-
|
12
|
-
def mobile_browser
|
13
|
-
device = Webdriver::UserAgent.driver(:browser => :firefox, :agent => :iphone)
|
14
|
-
@browser = Watir::Browser.new device
|
15
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require "./lib/mobilify"
|
2
|
-
|
3
|
-
class KhanAcademy
|
4
|
-
include Mobilify
|
5
|
-
|
6
|
-
page_url "http://www.khanacademy.org"
|
7
|
-
|
8
|
-
link(:login, :class => "log-in-link ellipsis highlight")
|
9
|
-
link(:mobile_login, :class => "simple-button big-button")
|
10
|
-
link(:ignored_login, :class => "simple-button primary big-button")
|
11
|
-
end
|
12
|
-
|