testcentricity_apps 4.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -0
  3. data/CHANGELOG.md +193 -0
  4. data/LICENSE.md +27 -0
  5. data/README.md +2297 -0
  6. data/lib/testcentricity_apps/app_core/appium_connect_helper.rb +667 -0
  7. data/lib/testcentricity_apps/app_core/screen_object.rb +494 -0
  8. data/lib/testcentricity_apps/app_core/screen_objects_helper.rb +211 -0
  9. data/lib/testcentricity_apps/app_core/screen_section.rb +669 -0
  10. data/lib/testcentricity_apps/app_elements/alert.rb +152 -0
  11. data/lib/testcentricity_apps/app_elements/app_element.rb +728 -0
  12. data/lib/testcentricity_apps/app_elements/button.rb +10 -0
  13. data/lib/testcentricity_apps/app_elements/checkbox.rb +61 -0
  14. data/lib/testcentricity_apps/app_elements/image.rb +10 -0
  15. data/lib/testcentricity_apps/app_elements/label.rb +10 -0
  16. data/lib/testcentricity_apps/app_elements/list.rb +188 -0
  17. data/lib/testcentricity_apps/app_elements/menu.rb +159 -0
  18. data/lib/testcentricity_apps/app_elements/menubar.rb +78 -0
  19. data/lib/testcentricity_apps/app_elements/radio.rb +61 -0
  20. data/lib/testcentricity_apps/app_elements/selectlist.rb +126 -0
  21. data/lib/testcentricity_apps/app_elements/switch.rb +66 -0
  22. data/lib/testcentricity_apps/app_elements/textfield.rb +51 -0
  23. data/lib/testcentricity_apps/appium_server.rb +76 -0
  24. data/lib/testcentricity_apps/data_objects/data_objects_helper.rb +100 -0
  25. data/lib/testcentricity_apps/data_objects/environment.rb +423 -0
  26. data/lib/testcentricity_apps/exception_queue_helper.rb +160 -0
  27. data/lib/testcentricity_apps/utility_helpers.rb +48 -0
  28. data/lib/testcentricity_apps/version.rb +3 -0
  29. data/lib/testcentricity_apps/world_extensions.rb +61 -0
  30. data/lib/testcentricity_apps.rb +103 -0
  31. metadata +322 -0
@@ -0,0 +1,160 @@
1
+ module TestCentricity
2
+ class ExceptionQueue
3
+ attr_accessor :error_queue
4
+ attr_accessor :active_ui_element
5
+
6
+ def self.enqueue_assert_equal(expected, actual, error_message)
7
+ is_equal = if expected.is_a?(String) && actual.is_a?(String)
8
+ expected.downcase.strip == actual.downcase.strip
9
+ else
10
+ expected == actual
11
+ end
12
+ unless is_equal
13
+ enqueue("#{error_message} to be\n '#{expected}'\nbut found\n '#{actual}'")
14
+ enqueue_screenshot
15
+ end
16
+ end
17
+
18
+ def self.enqueue_assert_not_equal(expected, actual, error_message)
19
+ unless expected != actual
20
+ enqueue("#{error_message} to not be equal to '#{expected}'")
21
+ enqueue_screenshot
22
+ end
23
+ end
24
+
25
+ def self.enqueue_exception(error_message)
26
+ enqueue(error_message)
27
+ end
28
+
29
+ def self.post_exceptions(preample_message = nil)
30
+ unless @error_queue.nil?
31
+ unless preample_message.nil?
32
+ @error_queue = "#{preample_message} - The following errors were found:\n_____________________________\n#{@error_queue}"
33
+ end
34
+ raise @error_queue
35
+ end
36
+ ensure
37
+ @error_queue = nil
38
+ @active_ui_element = nil
39
+ end
40
+
41
+ def self.enqueue_comparison(ui_object, state, actual, error_msg)
42
+ @active_ui_element = ui_object
43
+ if state.is_a?(Hash) && state.length == 1
44
+ state.each do |key, value|
45
+ case key
46
+ when :lt, :less_than
47
+ enqueue_exception("#{error_msg} be less than #{value} but found '#{actual}'") unless actual < value
48
+ when :lt_eq, :less_than_or_equal
49
+ enqueue_exception("#{error_msg} be less than or equal to #{value} but found '#{actual}'") unless actual <= value
50
+ when :gt, :greater_than
51
+ enqueue_exception("#{error_msg} be greater than #{value} but found '#{actual}'") unless actual > value
52
+ when :gt_eq, :greater_than_or_equal
53
+ enqueue_exception("#{error_msg} be greater than or equal to #{value} but found '#{actual}'") unless actual >= value
54
+ when :starts_with
55
+ enqueue_exception("#{error_msg} start with '#{value}' but found '#{actual}'") unless actual.start_with?(value)
56
+ when :ends_with
57
+ enqueue_exception("#{error_msg} end with '#{value}' but found '#{actual}'") unless actual.end_with?(value)
58
+ when :contains
59
+ enqueue_exception("#{error_msg} contain '#{value}' but found '#{actual}'") unless actual.include?(value)
60
+ when :not_contains, :does_not_contain
61
+ enqueue_exception("#{error_msg} not contain '#{value}' but found '#{actual}'") if actual.include?(value)
62
+ when :not_equal
63
+ enqueue_exception("#{error_msg} not equal '#{value}' but found '#{actual}'") if actual == value
64
+ when :like, :is_like
65
+ actual_like = actual.delete("\n")
66
+ actual_like = actual_like.delete("\r")
67
+ actual_like = actual_like.delete("\t")
68
+ actual_like = actual_like.delete(' ')
69
+ actual_like = actual_like.downcase
70
+ expected = value.delete("\n")
71
+ expected = expected.delete("\r")
72
+ expected = expected.delete("\t")
73
+ expected = expected.delete(' ')
74
+ expected = expected.downcase
75
+ enqueue_exception("#{error_msg} be like '#{value}' but found '#{actual}'") unless actual_like.include?(expected)
76
+ when :translate
77
+ expected = translate(value)
78
+ enqueue_assert_equal(expected, actual, error_msg)
79
+ when :translate_upcase
80
+ expected = translate(value)
81
+ expected = expected.is_a?(Array) ? expected.map(&:upcase) : expected.upcase
82
+ enqueue_assert_equal(expected, actual, error_msg)
83
+ when :translate_downcase
84
+ expected = translate(value)
85
+ expected = expected.is_a?(Array) ? expected.map(&:downcase) : expected.downcase
86
+ enqueue_assert_equal(expected, actual, error_msg)
87
+ when :translate_capitalize
88
+ expected = translate(value)
89
+ expected = expected.is_a?(Array) ? expected.map(&:capitalize) : expected.capitalize
90
+ enqueue_assert_equal(expected, actual, error_msg)
91
+ when :translate_titlecase
92
+ expected = translate(value)
93
+ expected = if expected.is_a?(Array)
94
+ result = []
95
+ expected.each do |item|
96
+ result.push("#{item.split.each{ |item| item.capitalize! }.join(' ')}")
97
+ end
98
+ result
99
+ else
100
+ "#{expected.split.each{ |expected| expected.capitalize! }.join(' ')}"
101
+ end
102
+ enqueue_assert_equal(expected, actual, error_msg)
103
+ else
104
+ raise "#{key} is not a valid comparison key"
105
+ end
106
+ end
107
+ else
108
+ enqueue_assert_equal(state, actual, error_msg)
109
+ end
110
+ end
111
+
112
+ private
113
+
114
+ def self.enqueue(message)
115
+ @error_queue = "#{@error_queue}#{message}\n\n"
116
+ end
117
+
118
+ def self.enqueue_screenshot
119
+ timestamp = Time.now.strftime('%Y%m%d%H%M%S%L')
120
+ filename = "Screenshot-#{timestamp}.png"
121
+ path = File.join Dir.pwd, 'reports/screenshots/', filename
122
+ # take screenshot
123
+ AppiumConnect.take_screenshot(path)
124
+ # add screenshot to queue
125
+ puts "Screenshot saved at #{path}"
126
+ screen_shot = {path: path, filename: filename}
127
+ Environ.save_screen_shot(screen_shot)
128
+ end
129
+
130
+ def self.translate(*args, **opts)
131
+ opts[:locale] ||= I18n.locale
132
+ opts[:raise] = true
133
+ I18n.translate(*args, **opts)
134
+ rescue I18n::MissingTranslationData => err
135
+ puts err
136
+ opts[:locale] = :en
137
+
138
+ # fallback to en if the translation is missing. If the translation isn't
139
+ # in en, then raise again.
140
+ disable_enforce_available_locales do
141
+ I18n.translate(*args, **opts)
142
+ end
143
+ end
144
+
145
+ def self.disable_enforce_available_locales
146
+ saved_enforce_available_locales = I18n.enforce_available_locales
147
+ I18n.enforce_available_locales = false
148
+ yield
149
+ ensure
150
+ I18n.enforce_available_locales = saved_enforce_available_locales
151
+ end
152
+ end
153
+
154
+
155
+ class ObjectNotFoundError < StandardError
156
+ def initialize(message)
157
+ super(message)
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,48 @@
1
+ class Object
2
+ def blank?
3
+ respond_to?(:empty?) ? empty? : !self
4
+ end
5
+
6
+ def present?
7
+ !blank?
8
+ end
9
+
10
+ def boolean?
11
+ [true, false].include? self
12
+ end
13
+ end
14
+
15
+
16
+ class String
17
+ def to_bool
18
+ return true if self == true || self =~ (/(true|t|yes|y|x|1)$/i)
19
+ return false if self == false || self.blank? || self =~ (/(false|f|no|n|0)$/i)
20
+ raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
21
+ end
22
+
23
+ def string_between(marker1, marker2)
24
+ self[/#{Regexp.escape(marker1)}(.*?)#{Regexp.escape(marker2)}/m, 1]
25
+ end
26
+
27
+ def format_date_time(date_time_format)
28
+ return if self.blank?
29
+ new_date = DateTime.parse(self)
30
+ if ENV['LOCALE'] && date_time_format.is_a?(Symbol)
31
+ I18n.l(new_date, format: date_time_format)
32
+ else
33
+ new_date.strftime(date_time_format)
34
+ end
35
+ end
36
+
37
+ def titlecase
38
+ "#{self.split.each{ |text| text.capitalize! }.join(' ')}"
39
+ end
40
+
41
+ def is_int?
42
+ Integer(self) && true rescue false
43
+ end
44
+
45
+ def is_float?
46
+ Float(self) && true rescue false
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module TestCentricityApps
2
+ VERSION = '4.0.10'
3
+ end
@@ -0,0 +1,61 @@
1
+ module WorldData
2
+ def environs
3
+ @environs ||= TestCentricity::EnvironData
4
+ end
5
+
6
+ # instantiate and register all data objects specified in data_objects method
7
+ #
8
+ def instantiate_data_objects
9
+ # return if data objects have already been instantiated and registered
10
+ return if TestCentricity::DataManager.loaded?
11
+
12
+ # instantiate all data objects
13
+ @data = {}
14
+ data_objects.each do |data_type, data_class|
15
+ @data[data_type] = data_class.new unless @data.has_key?(data_type)
16
+ # define data object accessor method
17
+ define_method(data_type) do
18
+ if instance_variable_defined?(:"@#{data_type}")
19
+ instance_variable_get(:"@#{data_type}")
20
+ else
21
+ instance_variable_set(:"@#{data_type}", TestCentricity::DataManager.find_data_object(data_type))
22
+ end
23
+ end
24
+ end
25
+ # register all data objects with DataManager
26
+ TestCentricity::DataManager.register_data_objects(@data)
27
+ end
28
+ end
29
+
30
+
31
+ module WorldScreens
32
+ # instantiate and register all screen objects specified in screen_objects method
33
+ #
34
+ def instantiate_screen_objects
35
+ # return if screen objects have already been instantiated and registered
36
+ return if TestCentricity::ScreenManager.loaded?
37
+
38
+ # instantiate all screen objects
39
+ @screens = {}
40
+ screen_objects.each do |screen_object, screen_class|
41
+ obj = screen_class.new
42
+ @screens[screen_object] = obj unless @screens.has_key?(screen_object)
43
+ screen_names = obj.screen_name
44
+ screen_names = Array(screen_names) if screen_names.is_a? String
45
+ screen_names.each do |name|
46
+ screen_key = name.gsub(/\s+/, '').downcase.to_sym
47
+ @screens[screen_key] = obj unless @screens.has_key?(screen_key)
48
+ end
49
+ # define screen object accessor method
50
+ define_method(screen_object) do
51
+ if instance_variable_defined?(:"@#{screen_object}")
52
+ instance_variable_get(:"@#{screen_object}")
53
+ else
54
+ instance_variable_set(:"@#{screen_object}", TestCentricity::ScreenManager.find_screen(screen_object))
55
+ end
56
+ end
57
+ end
58
+ # register all screen objects with ScreenManager
59
+ TestCentricity::ScreenManager.register_screen_objects(@screens)
60
+ end
61
+ end
@@ -0,0 +1,103 @@
1
+ require 'test/unit'
2
+ require 'appium_lib'
3
+
4
+ require 'testcentricity_apps/version'
5
+ require 'testcentricity_apps/world_extensions'
6
+ require 'testcentricity_apps/exception_queue_helper'
7
+ require 'testcentricity_apps/utility_helpers'
8
+ require 'testcentricity_apps/appium_server'
9
+
10
+ require 'testcentricity_apps/data_objects/data_objects_helper'
11
+ require 'testcentricity_apps/data_objects/environment'
12
+
13
+ require 'testcentricity_apps/app_core/appium_connect_helper'
14
+ require 'testcentricity_apps/app_core/screen_objects_helper'
15
+ require 'testcentricity_apps/app_core/screen_object'
16
+ require 'testcentricity_apps/app_core/screen_section'
17
+
18
+ require 'testcentricity_apps/app_elements/app_element'
19
+ require 'testcentricity_apps/app_elements/alert'
20
+ require 'testcentricity_apps/app_elements/button'
21
+ require 'testcentricity_apps/app_elements/checkbox'
22
+ require 'testcentricity_apps/app_elements/image'
23
+ require 'testcentricity_apps/app_elements/label'
24
+ require 'testcentricity_apps/app_elements/list'
25
+ require 'testcentricity_apps/app_elements/menu'
26
+ require 'testcentricity_apps/app_elements/menubar'
27
+ require 'testcentricity_apps/app_elements/radio'
28
+ require 'testcentricity_apps/app_elements/selectlist'
29
+ require 'testcentricity_apps/app_elements/switch'
30
+ require 'testcentricity_apps/app_elements/textfield'
31
+
32
+
33
+ module TestCentricity
34
+ class ScreenManager
35
+ attr_accessor :current_screen
36
+
37
+ @screen_objects = {}
38
+
39
+ def self.register_screen_objects(screens)
40
+ @screen_objects = screens
41
+ end
42
+
43
+ # Have all ScreenObjects been registered?
44
+ #
45
+ # @return [Boolean] true if all ScreenObjects have been registered
46
+ # @example
47
+ # TestCentricity::ScreenManager.loaded?
48
+ #
49
+ def self.loaded?
50
+ !@screen_objects.empty?
51
+ end
52
+
53
+ def self.find_screen(screen_name)
54
+ screen_id = (screen_name.is_a? String) ? screen_name.gsub(/\s+/, '').downcase.to_sym : screen_name
55
+ screen = @screen_objects[screen_id]
56
+ raise "No screen object defined for screen named '#{screen_name}'" unless screen
57
+ screen
58
+ end
59
+
60
+ # Get the currently active ScreenObject
61
+ #
62
+ # @return [ScreenObject]
63
+ # @example
64
+ # active_screen = TestCentricity::ScreenManager.current_screen
65
+ #
66
+ def self.current_screen
67
+ @current_screen
68
+ end
69
+
70
+ # Sets the currently active ScreenObject
71
+ #
72
+ # @param screen [ScreenObject] Reference to the active ScreenObject
73
+ # @example
74
+ # TestCentricity::ScreenManager.current_screen = product_search_screen
75
+ #
76
+ def self.current_screen=(screen)
77
+ @current_screen = screen
78
+ end
79
+ end
80
+
81
+
82
+ class DataManager
83
+ @data_objects = {}
84
+
85
+ def self.register_data_objects(data)
86
+ @data_objects = data
87
+ end
88
+
89
+ def self.find_data_object(data_object)
90
+ @data_objects[data_object]
91
+ end
92
+
93
+ # Have all DataObjects been registered?
94
+ #
95
+ # @return [Boolean] true if all DataObjects have been registered
96
+ # @example
97
+ # TestCentricity::DataManager.loaded?
98
+ #
99
+ def self.loaded?
100
+ !@data_objects.empty?
101
+ end
102
+ end
103
+ end
metadata ADDED
@@ -0,0 +1,322 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: testcentricity_apps
3
+ version: !ruby/object:Gem::Version
4
+ version: 4.0.10
5
+ platform: ruby
6
+ authors:
7
+ - A.J. Mrozinski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-06-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
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: cucumber
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 9.2.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 9.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: parallel_tests
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
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: require_all
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.5.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.5.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 3.13.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 3.13.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.18'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.18'
111
+ - !ruby/object:Gem::Dependency
112
+ name: yard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 0.9.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.9.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: appium_lib
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 15.1.0
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 15.1.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: childprocess
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: chronic
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '='
158
+ - !ruby/object:Gem::Version
159
+ version: 0.10.2
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '='
165
+ - !ruby/object:Gem::Version
166
+ version: 0.10.2
167
+ - !ruby/object:Gem::Dependency
168
+ name: faker
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: i18n
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: json
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: selenium-webdriver
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '='
214
+ - !ruby/object:Gem::Version
215
+ version: 4.22.0
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '='
221
+ - !ruby/object:Gem::Version
222
+ version: 4.22.0
223
+ - !ruby/object:Gem::Dependency
224
+ name: test-unit
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: virtus
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :runtime
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ description: |2-
252
+
253
+ The TestCentricityâ„¢ For Apps core framework for MacOS desktop app and iOS and Android mobile app testing implements a
254
+ Screen Object Model DSL for use with Cucumber or RSpec and Appium 2.x. The gem also facilitates the configuration of
255
+ the appropriate Appium capabilities required to establish a connection with locally hosted MacOS apps or locally or
256
+ cloud hosted iOS or Android devices or simulators (using BrowserStack, Sauce Labs, or TestingBot services).
257
+ email:
258
+ - testcentricity@gmail.com
259
+ executables: []
260
+ extensions: []
261
+ extra_rdoc_files: []
262
+ files:
263
+ - ".yardopts"
264
+ - CHANGELOG.md
265
+ - LICENSE.md
266
+ - README.md
267
+ - lib/testcentricity_apps.rb
268
+ - lib/testcentricity_apps/app_core/appium_connect_helper.rb
269
+ - lib/testcentricity_apps/app_core/screen_object.rb
270
+ - lib/testcentricity_apps/app_core/screen_objects_helper.rb
271
+ - lib/testcentricity_apps/app_core/screen_section.rb
272
+ - lib/testcentricity_apps/app_elements/alert.rb
273
+ - lib/testcentricity_apps/app_elements/app_element.rb
274
+ - lib/testcentricity_apps/app_elements/button.rb
275
+ - lib/testcentricity_apps/app_elements/checkbox.rb
276
+ - lib/testcentricity_apps/app_elements/image.rb
277
+ - lib/testcentricity_apps/app_elements/label.rb
278
+ - lib/testcentricity_apps/app_elements/list.rb
279
+ - lib/testcentricity_apps/app_elements/menu.rb
280
+ - lib/testcentricity_apps/app_elements/menubar.rb
281
+ - lib/testcentricity_apps/app_elements/radio.rb
282
+ - lib/testcentricity_apps/app_elements/selectlist.rb
283
+ - lib/testcentricity_apps/app_elements/switch.rb
284
+ - lib/testcentricity_apps/app_elements/textfield.rb
285
+ - lib/testcentricity_apps/appium_server.rb
286
+ - lib/testcentricity_apps/data_objects/data_objects_helper.rb
287
+ - lib/testcentricity_apps/data_objects/environment.rb
288
+ - lib/testcentricity_apps/exception_queue_helper.rb
289
+ - lib/testcentricity_apps/utility_helpers.rb
290
+ - lib/testcentricity_apps/version.rb
291
+ - lib/testcentricity_apps/world_extensions.rb
292
+ homepage: https://github.com/TestCentricity/testcentricity_apps
293
+ licenses:
294
+ - BSD-3-Clause
295
+ metadata:
296
+ changelog_uri: https://github.com/TestCentricity/testcentricity_apps/blob/master/CHANGELOG.md
297
+ bug_tracker_uri: https://github.com/TestCentricity/testcentricity_apps/issues
298
+ wiki_uri: https://github.com/TestCentricity/testcentricity_apps/wiki
299
+ documentation_uri: https://www.rubydoc.info/gems/testcentricity_apps
300
+ homepage_uri: https://github.com/TestCentricity/testcentricity_apps
301
+ post_install_message:
302
+ rdoc_options: []
303
+ require_paths:
304
+ - lib
305
+ required_ruby_version: !ruby/object:Gem::Requirement
306
+ requirements:
307
+ - - ">="
308
+ - !ruby/object:Gem::Version
309
+ version: 3.0.0
310
+ required_rubygems_version: !ruby/object:Gem::Requirement
311
+ requirements:
312
+ - - ">="
313
+ - !ruby/object:Gem::Version
314
+ version: '0'
315
+ requirements:
316
+ - Appium
317
+ rubygems_version: 3.3.26
318
+ signing_key:
319
+ specification_version: 4
320
+ summary: A Screen Object Model Framework for MacOS desktop app and iOS and/or Android
321
+ mobile app testing
322
+ test_files: []