ule_page 0.0.1 → 0.2.0
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 +5 -5
- data/.coveralls.yml +1 -0
- data/.travis.yml +12 -0
- data/Gemfile +4 -2
- data/Gemfile.lock +196 -132
- data/README.md +51 -14
- data/lib/ule_page.rb +8 -7
- data/lib/ule_page/helper.rb +7 -25
- data/lib/ule_page/model_match.rb +59 -34
- data/lib/ule_page/models/create.rb +2 -2
- data/lib/ule_page/models/index.rb +10 -7
- data/lib/ule_page/page.rb +86 -23
- data/lib/ule_page/page_map.rb +15 -0
- data/lib/ule_page/site_prism_extender.rb +15 -17
- data/lib/ule_page/version.rb +1 -1
- data/ule_page.gemspec +25 -32
- metadata +43 -77
data/lib/ule_page.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require 'ule_page/version'
|
2
2
|
require 'rails'
|
3
3
|
require 'active_record'
|
4
|
+
require 'ule_page/page_map'
|
4
5
|
require 'site_prism'
|
5
6
|
|
6
7
|
module UlePage
|
@@ -13,7 +14,6 @@ module UlePage
|
|
13
14
|
autoload :Detail, 'ule_page/models/detail'
|
14
15
|
autoload :Index, 'ule_page/models/index'
|
15
16
|
|
16
|
-
|
17
17
|
mattr_accessor :resource_models
|
18
18
|
@@resource_models = []
|
19
19
|
|
@@ -26,22 +26,23 @@ module UlePage
|
|
26
26
|
mattr_accessor :map_initialized
|
27
27
|
@@map_initialized = false
|
28
28
|
|
29
|
+
mattr_accessor :module_name
|
30
|
+
@@module_name = 'Page'
|
31
|
+
|
29
32
|
def self.setup
|
30
33
|
UlePage::Page.send(:include, Rails.application.routes.url_helpers) if defined? Rails
|
31
34
|
UlePage::Page.send(:include, ActionView::Helpers::NumberHelper) if defined? ActionView
|
32
35
|
|
33
|
-
|
36
|
+
add_models
|
34
37
|
|
35
38
|
yield self
|
36
39
|
end
|
37
40
|
|
38
41
|
def self.add_models
|
39
|
-
if
|
42
|
+
if defined? ActiveRecord::Base && defined? Rails
|
40
43
|
@@resource_models = Dir["#{Rails.root}/app/models/**/*.rb"].map do |m|
|
41
|
-
m.chomp('.rb').camelize.split(
|
44
|
+
m.chomp('.rb').camelize.split('::').last
|
42
45
|
end
|
43
46
|
end
|
44
47
|
end
|
45
48
|
end
|
46
|
-
|
47
|
-
|
data/lib/ule_page/helper.rb
CHANGED
@@ -2,12 +2,12 @@ require 'capybara'
|
|
2
2
|
|
3
3
|
module UlePage
|
4
4
|
module Helper
|
5
|
+
def pg
|
6
|
+
UlePage::ModelMatch.get_current_page_with_wait {}
|
7
|
+
end
|
5
8
|
|
6
9
|
def wait_for_ajax
|
7
10
|
page.has_css?('.pace-small .pace-inactive')
|
8
|
-
# Timeout.timeout(Capybara.default_wait_time) do
|
9
|
-
# loop until finished_all_ajax_requests?
|
10
|
-
# end
|
11
11
|
end
|
12
12
|
|
13
13
|
def finished_all_ajax_requests?
|
@@ -18,24 +18,6 @@ module UlePage
|
|
18
18
|
visit '/admin'
|
19
19
|
end
|
20
20
|
|
21
|
-
# def signin(user)
|
22
|
-
# token = User.new_remember_token
|
23
|
-
|
24
|
-
# if need_run_javascript
|
25
|
-
# if Capybara.current_driver == :selenium
|
26
|
-
# visit_admin_pages
|
27
|
-
# page.driver.browser.manage.delete_all_cookies
|
28
|
-
# Capybara.current_session.driver.browser.manage.add_cookie :name => 'remember_token', :value => token
|
29
|
-
# else
|
30
|
-
# page.driver.set_cookie("remember_token", token)
|
31
|
-
# end
|
32
|
-
# else
|
33
|
-
# Capybara.current_session.driver.browser.set_cookie("remember_token=#{token}")
|
34
|
-
# end
|
35
|
-
|
36
|
-
# user.update_attribute(:remember_token, User.encrypt(token))
|
37
|
-
# end
|
38
|
-
|
39
21
|
def signout
|
40
22
|
browser = Capybara.current_session.driver.browser
|
41
23
|
if need_run_javascript
|
@@ -43,20 +25,20 @@ module UlePage
|
|
43
25
|
visit_admin_pages
|
44
26
|
browser.manage.delete_all_cookies
|
45
27
|
else
|
46
|
-
page.driver.set_cookie(
|
28
|
+
page.driver.set_cookie('remember_token', '')
|
47
29
|
end
|
48
30
|
else
|
49
31
|
if browser.respond_to?(:clear_cookies)
|
50
32
|
# Rack::MockSession
|
51
33
|
browser.clear_cookies
|
52
34
|
else
|
53
|
-
Capybara.current_session.driver.browser.set_cookie(
|
35
|
+
Capybara.current_session.driver.browser.set_cookie('remember_token=')
|
54
36
|
end
|
55
37
|
end
|
56
38
|
end
|
57
39
|
|
58
40
|
def need_run_javascript
|
59
|
-
Capybara.current_driver == :selenium
|
41
|
+
(Capybara.current_driver == :selenium) || (Capybara.current_driver == Capybara.javascript_driver)
|
60
42
|
end
|
61
43
|
|
62
44
|
def confirm_alert
|
@@ -66,7 +48,7 @@ module UlePage
|
|
66
48
|
sleep 1 # prevent test from failing by waiting for popup
|
67
49
|
page.driver.browser.accept_js_confirms
|
68
50
|
else
|
69
|
-
p
|
51
|
+
p 'pressed ok'
|
70
52
|
end
|
71
53
|
end
|
72
54
|
|
data/lib/ule_page/model_match.rb
CHANGED
@@ -3,7 +3,6 @@ require 'site_prism'
|
|
3
3
|
|
4
4
|
module UlePage
|
5
5
|
module ModelMatch
|
6
|
-
|
7
6
|
class << self
|
8
7
|
include Capybara::DSL
|
9
8
|
def get_current_page_with_wait(special_maps = {})
|
@@ -12,7 +11,7 @@ module UlePage
|
|
12
11
|
current = get_current_page special_maps
|
13
12
|
|
14
13
|
if !current_path.nil? && current.nil?
|
15
|
-
p "current path is #{current_path}, we can not get the page model, please
|
14
|
+
p "current path is #{current_path}, we can not get the page model, please define the set_urls for the page model."
|
16
15
|
|
17
16
|
raise
|
18
17
|
end
|
@@ -21,44 +20,33 @@ module UlePage
|
|
21
20
|
end
|
22
21
|
|
23
22
|
def get_current_page(special_maps = {})
|
24
|
-
|
25
|
-
|
26
|
-
if !UlePage.map_initialized || UlePage.special_maps.empty?
|
27
|
-
UlePage.special_maps = special_maps
|
28
|
-
UlePage.map = UlePage.special_maps
|
23
|
+
map = prepare_maps special_maps
|
29
24
|
|
30
|
-
|
31
|
-
# '/customers' => Page::Customers::Index.new,
|
32
|
-
# '/customers/new' => Page::Customers::Create.new,
|
33
|
-
# '/customers/:id' => Page::Customers::Details.new,
|
34
|
-
# '/customers/:id/edit' => Page::Customers::Edit.new,
|
35
|
-
resources.each do |model|
|
25
|
+
return nil unless current_path
|
36
26
|
|
37
|
-
|
38
|
-
page_module_name = model.to_s.pluralize.camelize
|
27
|
+
current = get_model map, current_path
|
39
28
|
|
40
|
-
|
29
|
+
if current.nil? && current_path.include?('/admin/')
|
30
|
+
current = get_model map, current_path[6, current_path.length]
|
31
|
+
end
|
41
32
|
|
42
|
-
|
43
|
-
|
44
|
-
UlePage.map["/#{pluralized}/new"] = page_module.const_get("Create").new rescue false
|
45
|
-
UlePage.map["/#{pluralized}/:id"] = page_module.const_get("Details").new rescue false
|
46
|
-
UlePage.map["/#{pluralized}/:id/edit"] = page_module.const_get("Edit").new rescue false
|
47
|
-
end
|
33
|
+
current
|
34
|
+
end
|
48
35
|
|
49
|
-
|
50
|
-
|
36
|
+
def prepare_maps(special_maps)
|
37
|
+
if !UlePage.map_initialized || UlePage.special_maps.empty?
|
38
|
+
UlePage.special_maps = special_maps
|
39
|
+
UlePage.map = {}
|
51
40
|
|
52
|
-
|
53
|
-
return nil unless current_path
|
41
|
+
generate_map_by_convention UlePage.map, UlePage.resource_models
|
54
42
|
|
55
|
-
|
43
|
+
UlePage.map.merge! UlePage.special_maps if UlePage.special_maps.any?
|
44
|
+
UlePage.map.merge! UlePage::PageMap.instance.pages
|
56
45
|
|
57
|
-
|
58
|
-
current = get_model map, current_path[6, current_path.length]
|
46
|
+
UlePage.map_initialized = true
|
59
47
|
end
|
60
48
|
|
61
|
-
|
49
|
+
UlePage.map
|
62
50
|
end
|
63
51
|
|
64
52
|
def get_model(map, path)
|
@@ -71,13 +59,50 @@ module UlePage
|
|
71
59
|
pattern = k.gsub(/(:\w+)/, '\w+') if k.include?(':')
|
72
60
|
|
73
61
|
regex = Regexp.new "^#{pattern}$"
|
74
|
-
if regex.match(path)
|
75
|
-
return v
|
76
|
-
end
|
62
|
+
return v if regex.match(path)
|
77
63
|
end
|
78
64
|
|
79
65
|
nil
|
80
66
|
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def generate_map_by_convention(map, resources)
|
71
|
+
resources ||= []
|
72
|
+
# => to generate the following
|
73
|
+
# '/customers' => Page::Customers::Index.new,
|
74
|
+
# '/customers/new' => Page::Customers::Create.new,
|
75
|
+
# '/customers/:id' => Page::Customers::Details.new,
|
76
|
+
# '/customers/:id/edit' => Page::Customers::Edit.new,
|
77
|
+
resources.each do |model|
|
78
|
+
pluralized = model.to_s.underscore.pluralize
|
79
|
+
page_module_name = model.to_s.pluralize.camelize
|
80
|
+
|
81
|
+
next unless Object.const_defined?("#{UlePage.module_name}::#{page_module_name}")
|
82
|
+
|
83
|
+
page_module = Object.const_get(UlePage.module_name).const_get(page_module_name)
|
84
|
+
map["/#{pluralized}"] = begin
|
85
|
+
page_module.const_get('Index').try(:new)
|
86
|
+
rescue StandardError
|
87
|
+
false
|
88
|
+
end
|
89
|
+
map["/#{pluralized}/new"] = begin
|
90
|
+
page_module.const_get('Create').new
|
91
|
+
rescue StandardError
|
92
|
+
false
|
93
|
+
end
|
94
|
+
map["/#{pluralized}/:id"] = begin
|
95
|
+
page_module.const_get('Details').new
|
96
|
+
rescue StandardError
|
97
|
+
false
|
98
|
+
end
|
99
|
+
map["/#{pluralized}/:id/edit"] = begin
|
100
|
+
page_module.const_get('Edit').new
|
101
|
+
rescue StandardError
|
102
|
+
false
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
81
106
|
end
|
82
107
|
end
|
83
|
-
end
|
108
|
+
end
|
@@ -3,28 +3,31 @@ require 'ule_page/page'
|
|
3
3
|
module UlePage
|
4
4
|
class Index < Page
|
5
5
|
element_collection :rows, 'tbody tr'
|
6
|
+
element :table, 'table'
|
6
7
|
|
7
8
|
def goto_edit
|
8
9
|
click_link_or_button '编辑'
|
9
10
|
end
|
10
11
|
|
11
12
|
protected
|
13
|
+
|
12
14
|
def key_column
|
13
|
-
|
15
|
+
''
|
14
16
|
end
|
15
17
|
|
16
|
-
def get_row
|
17
|
-
find_row key,
|
18
|
+
def get_row(key)
|
19
|
+
find_row key, rows
|
18
20
|
end
|
19
21
|
|
20
|
-
def get_model_row
|
21
|
-
find_row(model[key_column],
|
22
|
+
def get_model_row(model)
|
23
|
+
find_row(model[key_column], rows)
|
22
24
|
end
|
23
25
|
|
24
|
-
def get_model_row_anchor
|
26
|
+
def get_model_row_anchor(model, link_text)
|
25
27
|
row = get_model_row(model)
|
26
28
|
raise 'can not find the row' if row.nil?
|
29
|
+
|
27
30
|
row.find(:link_or_button, link_text)
|
28
31
|
end
|
29
32
|
end
|
30
|
-
end
|
33
|
+
end
|
data/lib/ule_page/page.rb
CHANGED
@@ -4,7 +4,9 @@ require 'rspec/expectations'
|
|
4
4
|
require 'capybara'
|
5
5
|
require 'ule_page/site_prism_extender'
|
6
6
|
require 'ule_page/helper'
|
7
|
+
require 'ule_page/page_map'
|
7
8
|
require 'active_support/inflector'
|
9
|
+
require 'active_support/hash_with_indifferent_access'
|
8
10
|
|
9
11
|
module UlePage
|
10
12
|
class Page < SitePrism::Page
|
@@ -13,16 +15,27 @@ module UlePage
|
|
13
15
|
extend UlePage::SitePrismExtender
|
14
16
|
include RSpec::Matchers
|
15
17
|
|
18
|
+
@urls = []
|
19
|
+
def self.set_urls(*urls)
|
20
|
+
@urls = urls
|
21
|
+
add_to_page_map @urls
|
22
|
+
set_first_url
|
23
|
+
end
|
24
|
+
|
25
|
+
class << self
|
26
|
+
attr_reader :urls
|
27
|
+
end
|
28
|
+
|
16
29
|
# e.g. is_order_detail?
|
17
30
|
def self.inherited(subclass)
|
18
|
-
method_name = "is_#{subclass.
|
31
|
+
method_name = "is_#{subclass.module_parent_name.demodulize.singularize.underscore}_#{subclass.name.demodulize.singularize.underscore}?"
|
19
32
|
subclass.send(:define_method, method_name) do
|
20
33
|
true
|
21
34
|
end
|
22
35
|
end
|
23
36
|
|
24
37
|
def open(expansion = {})
|
25
|
-
|
38
|
+
load expansion
|
26
39
|
self
|
27
40
|
end
|
28
41
|
|
@@ -32,15 +45,27 @@ module UlePage
|
|
32
45
|
# fill_form hashtable
|
33
46
|
# if the fields is empty, it will use all the keys of the hashtable
|
34
47
|
def fill_form(hashtable, fields = [], map = {})
|
35
|
-
|
48
|
+
hashtable = wrapper_hash(hashtable)
|
49
|
+
map = wrapper_hash(map)
|
50
|
+
|
51
|
+
fields = hashtable.keys.map(&:to_sym) if fields.empty?
|
36
52
|
|
37
53
|
fields.each do |f|
|
38
54
|
key = f
|
39
|
-
key = map[f] if map.
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
55
|
+
key = map[f] if map.key?(f)
|
56
|
+
|
57
|
+
el = send(f)
|
58
|
+
val = hashtable[key]
|
59
|
+
tag = el.send(:tag_name)
|
60
|
+
it = el.send(:[], :type)
|
61
|
+
|
62
|
+
if tag == 'input' && it == 'checkbox' # checkbox
|
63
|
+
el.send(:set, val == 'true')
|
64
|
+
elsif tag == 'select' # select
|
65
|
+
el.send(:select, val)
|
66
|
+
else
|
67
|
+
el.send(:set, val)
|
68
|
+
end
|
44
69
|
end
|
45
70
|
end
|
46
71
|
|
@@ -53,44 +78,64 @@ module UlePage
|
|
53
78
|
# precondition:
|
54
79
|
# there are the elements mapped to the hashtable keys.
|
55
80
|
def check_form(hashtable, fields = [], map = {})
|
56
|
-
|
81
|
+
hashtable = wrapper_hash(hashtable)
|
82
|
+
map = wrapper_hash(map)
|
83
|
+
|
84
|
+
fields = hashtable.keys.map(&:to_sym) if fields.empty?
|
57
85
|
|
58
86
|
fields.each do |f|
|
59
87
|
key = f
|
60
|
-
key = map[f] if map.
|
88
|
+
key = map[f] if map.key?(f)
|
61
89
|
|
62
|
-
|
63
|
-
el_content = send(f).send(:value)
|
90
|
+
next unless respond_to? f.to_sym
|
64
91
|
|
65
|
-
|
66
|
-
end
|
92
|
+
el_content = send(f).send(:value)
|
67
93
|
|
94
|
+
expect(el_content).to eq hashtable[key.to_s]
|
68
95
|
end
|
69
96
|
end
|
70
97
|
|
71
|
-
def check_have_content(content)
|
72
|
-
|
98
|
+
def check_have_content(content, container = nil)
|
99
|
+
container ||= page
|
100
|
+
if container.respond_to?(:has_text?)
|
101
|
+
expect(container.has_text?(content)).to be_truthy
|
102
|
+
else
|
103
|
+
expect(container).to have_content(content)
|
104
|
+
end
|
73
105
|
end
|
74
106
|
|
75
|
-
def check_have_not_content(content)
|
76
|
-
|
107
|
+
def check_have_not_content(content, container = nil)
|
108
|
+
container ||= page
|
109
|
+
if container.respond_to?(:has_no_text?)
|
110
|
+
expect(container.has_no_text?(content)).to be_truthy
|
111
|
+
else
|
112
|
+
expect(container).not_to have_content(content)
|
113
|
+
end
|
77
114
|
end
|
78
115
|
|
79
116
|
# usage: check_have_hashtable_content hashtable
|
80
117
|
# usage: check_have_hashtable_content hashtable, [:id, :name]
|
81
|
-
def check_have_hashtable_content(hashtable, keys = [])
|
118
|
+
def check_have_hashtable_content(hashtable, keys = [], container = nil)
|
119
|
+
hashtable = wrapper_hash(hashtable)
|
82
120
|
keys = hashtable.keys if keys.empty?
|
83
121
|
|
84
122
|
keys.each do |k|
|
85
|
-
|
123
|
+
begin
|
124
|
+
check_have_content hashtable[k.to_s], container
|
125
|
+
rescue RSpec::Expectations::ExpectationNotMetError => e
|
126
|
+
puts "The key: '#{k}'' has no matched content!!"
|
127
|
+
raise
|
128
|
+
end
|
86
129
|
end
|
87
130
|
end
|
88
131
|
|
89
|
-
def check_have_no_hashtable_content(hashtable, keys = [])
|
132
|
+
def check_have_no_hashtable_content(hashtable, keys = [], container = nil)
|
133
|
+
hashtable = wrapper_hash(hashtable)
|
134
|
+
|
90
135
|
keys = hashtable.keys if keys.empty?
|
91
136
|
|
92
137
|
keys.each do |k|
|
93
|
-
check_have_not_content hashtable[k.to_s]
|
138
|
+
check_have_not_content hashtable[k.to_s], container
|
94
139
|
end
|
95
140
|
end
|
96
141
|
|
@@ -114,7 +159,25 @@ module UlePage
|
|
114
159
|
def go_back
|
115
160
|
click_link_or_button '返回'
|
116
161
|
end
|
117
|
-
end
|
118
162
|
|
163
|
+
private
|
164
|
+
|
165
|
+
def self.add_to_page_map(urls = [])
|
166
|
+
urls.each { |x| PageMap.instance.pages[x] = new } unless urls.nil?
|
167
|
+
end
|
168
|
+
|
169
|
+
def wrapper_hash(hash)
|
170
|
+
return hash unless hash.is_a?(Hash)
|
119
171
|
|
172
|
+
ActiveSupport::HashWithIndifferentAccess.new hash
|
173
|
+
end
|
174
|
+
|
175
|
+
def self.set_first_url
|
176
|
+
return unless @urls.any?
|
177
|
+
|
178
|
+
first_url = @urls.first
|
179
|
+
first_url = first_url.gsub(/:(\w+)/, '{\1}')
|
180
|
+
set_url first_url
|
181
|
+
end
|
182
|
+
end
|
120
183
|
end
|