eyes_core 3.18.4 → 4.0.3
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 +4 -4
- data/lib/applitools/appium/eyes.rb +3 -2
- data/lib/applitools/appium/target.rb +218 -193
- data/lib/applitools/calabash/calabash_screenshot_provider.rb +23 -23
- data/lib/applitools/calabash/full_page_capture_algorithm/base.rb +1 -1
- data/lib/applitools/connectivity/proxy.rb +11 -3
- data/lib/applitools/connectivity/server_connector.rb +2 -1
- data/lib/applitools/core/accessibility_level.rb +11 -0
- data/lib/applitools/core/batch_info.rb +24 -2
- data/lib/applitools/core/classic_runner.rb +9 -1
- data/lib/applitools/core/debug_screenshot_provider.rb +3 -3
- data/lib/applitools/core/eyes_base.rb +81 -28
- data/lib/applitools/core/eyes_base_configuration.rb +22 -1
- data/lib/applitools/core/eyes_runner.rb +12 -0
- data/lib/applitools/core/floating_region.rb +17 -8
- data/lib/applitools/core/image_match_settings.rb +54 -0
- data/lib/applitools/core/match_level.rb +3 -1
- data/lib/applitools/core/screenshot.rb +7 -7
- data/lib/applitools/core/test_result_summary.rb +17 -4
- data/lib/applitools/core/test_results.rb +2 -2
- data/lib/applitools/core/universal_eyes_checks.rb +66 -0
- data/lib/applitools/core/universal_eyes_open.rb +100 -0
- data/lib/applitools/core/universal_new_api.rb +43 -0
- data/lib/applitools/universal_sdk/universal_check_settings.rb +190 -0
- data/lib/applitools/universal_sdk/universal_client.rb +142 -0
- data/lib/applitools/universal_sdk/universal_client_socket.rb +110 -0
- data/lib/applitools/universal_sdk/universal_eyes.rb +45 -0
- data/lib/applitools/universal_sdk/universal_eyes_config.rb +205 -0
- data/lib/applitools/universal_sdk/universal_eyes_manager.rb +40 -0
- data/lib/applitools/universal_sdk/universal_eyes_manager_config.rb +62 -0
- data/lib/applitools/universal_sdk/universal_server.rb +81 -0
- data/lib/applitools/utils/image_utils.rb +7 -7
- data/lib/applitools/utils/utils.rb +13 -0
- data/lib/applitools/version.rb +2 -1
- data/lib/eyes_core.rb +4 -1
- metadata +55 -18
- data/lib/applitools/chunky_png/resampling.rb +0 -51
- data/lib/applitools/chunky_png_patch.rb +0 -11
@@ -6,6 +6,11 @@ require 'applitools/core/eyes_base_configuration'
|
|
6
6
|
require 'applitools/core/match_level'
|
7
7
|
require 'zlib'
|
8
8
|
|
9
|
+
require_relative 'universal_eyes_open'
|
10
|
+
require_relative 'universal_eyes_checks'
|
11
|
+
require_relative 'universal_new_api'
|
12
|
+
require_relative '../universal_sdk/universal_client'
|
13
|
+
|
9
14
|
require_relative 'match_level_setter'
|
10
15
|
|
11
16
|
module Applitools
|
@@ -19,6 +24,13 @@ module Applitools
|
|
19
24
|
}.freeze
|
20
25
|
|
21
26
|
class EyesBase
|
27
|
+
# new open, with eyes-manager
|
28
|
+
include Applitools::UniversalEyesOpen
|
29
|
+
# all checks here
|
30
|
+
include Applitools::UniversalEyesChecks
|
31
|
+
# add extract_text, extract_text_regions, locate
|
32
|
+
include Applitools::UniversalNewApi
|
33
|
+
|
22
34
|
include Applitools::MatchLevelSetter
|
23
35
|
extend Forwardable
|
24
36
|
extend Applitools::Helpers
|
@@ -28,6 +40,25 @@ module Applitools
|
|
28
40
|
SCREENSHOT_AS_IS = Applitools::EyesScreenshot::COORDINATE_TYPES[:screenshot_as_is].freeze
|
29
41
|
CONTEXT_RELATIVE = Applitools::EyesScreenshot::COORDINATE_TYPES[:context_relative].freeze
|
30
42
|
|
43
|
+
class << self
|
44
|
+
def set_viewport_size(driver, viewport_size)
|
45
|
+
Applitools::ArgumentGuard.not_nil(driver, 'Driver')
|
46
|
+
Applitools::ArgumentGuard.not_nil(viewport_size, 'viewport_size')
|
47
|
+
Applitools::ArgumentGuard.is_a?(viewport_size, 'viewport_size', Applitools::RectangleSize)
|
48
|
+
Applitools::EyesLogger.info "Set viewport size #{viewport_size}"
|
49
|
+
begin
|
50
|
+
driver_config_json = driver.universal_driver_config
|
51
|
+
required_size = Applitools::RectangleSize.from_any_argument viewport_size
|
52
|
+
@universal_client = Applitools::Connectivity::UniversalClient.new
|
53
|
+
@universal_client.core_set_viewport_size(driver_config_json, required_size.to_hash)
|
54
|
+
rescue => e
|
55
|
+
Applitools::EyesLogger.error e.class
|
56
|
+
Applitools::EyesLogger.error e.message
|
57
|
+
raise Applitools::EyesError.new 'Failed to set viewport size!'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
31
62
|
attr_accessor :config
|
32
63
|
private :config, :config=
|
33
64
|
|
@@ -60,6 +91,9 @@ module Applitools
|
|
60
91
|
|
61
92
|
def_delegators 'config', *Applitools::EyesBaseConfiguration.methods_to_delegate
|
62
93
|
|
94
|
+
# attr_accessor :universal_client, :universal_eyes_manager
|
95
|
+
attr_accessor :universal_eyes, :universal_driver
|
96
|
+
|
63
97
|
def initialize(*args)
|
64
98
|
options = Applitools::Utils.extract_options!(args)
|
65
99
|
self.runner = options[:runner]
|
@@ -100,6 +134,9 @@ module Applitools
|
|
100
134
|
self.server_scale = 0
|
101
135
|
self.server_remainder = 0
|
102
136
|
self.compare_with_parent_branch = false
|
137
|
+
|
138
|
+
self.universal_eyes = nil # eyes.open
|
139
|
+
self.universal_driver = nil # eyes.open
|
103
140
|
end
|
104
141
|
|
105
142
|
def ensure_config
|
@@ -158,15 +195,20 @@ module Applitools
|
|
158
195
|
self.last_screenshot = nil
|
159
196
|
clear_user_inputs
|
160
197
|
|
198
|
+
if !running_session && !universal_eyes
|
199
|
+
logger.info('Server session was not started')
|
200
|
+
logger.info('--- Empty test ended')
|
201
|
+
return Applitools::TestResults.new
|
202
|
+
end
|
203
|
+
|
204
|
+
|
161
205
|
if running_session.nil?
|
162
206
|
logger.info 'Closed'
|
163
207
|
return false
|
164
208
|
end
|
165
209
|
|
166
210
|
logger.info 'Aborting server session...'
|
167
|
-
|
168
|
-
logger.info '---Test aborted'
|
169
|
-
|
211
|
+
universal_sdk_abort
|
170
212
|
rescue Applitools::EyesError => e
|
171
213
|
logger.error e.message
|
172
214
|
|
@@ -207,18 +249,18 @@ module Applitools
|
|
207
249
|
raise e
|
208
250
|
end
|
209
251
|
|
210
|
-
def update_config_from_options(options)
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
end
|
252
|
+
# def update_config_from_options(options)
|
253
|
+
# # Applitools::ArgumentGuard.hash options, 'open_base parameter', [:test_name]
|
254
|
+
# default_options = { session_type: 'SEQUENTIAL' }
|
255
|
+
# options = default_options.merge options
|
256
|
+
#
|
257
|
+
# self.app_name = options[:app_name] if options[:app_name]
|
258
|
+
#
|
259
|
+
# # Applitools::ArgumentGuard.not_nil options[:test_name], 'options[:test_name]'
|
260
|
+
# self.test_name = options[:test_name] if options[:test_name]
|
261
|
+
# self.viewport_size = options[:viewport_size] if options[:viewport_size]
|
262
|
+
# self.session_type = options[:session_type] if options[:session_type]
|
263
|
+
# end
|
222
264
|
|
223
265
|
def merge_config(other_config)
|
224
266
|
config.merge(other_config)
|
@@ -393,40 +435,51 @@ module Applitools
|
|
393
435
|
|
394
436
|
clear_user_inputs
|
395
437
|
|
396
|
-
|
438
|
+
if !running_session && !universal_eyes
|
397
439
|
be_silent || logger.info('Server session was not started')
|
398
440
|
be_silent || logger.info('--- Empty test ended')
|
399
441
|
return Applitools::TestResults.new
|
400
442
|
end
|
401
443
|
|
402
|
-
is_new_session = running_session.new_session?
|
403
|
-
session_results_url = running_session.url
|
444
|
+
# is_new_session = running_session.new_session?
|
445
|
+
# session_results_url = running_session.url
|
404
446
|
|
405
447
|
logger.info 'Ending server session...'
|
406
448
|
|
407
|
-
save = is_new_session && save_new_tests || !is_new_session && failed && save_failed_tests
|
449
|
+
# save = is_new_session && save_new_tests || !is_new_session && failed && save_failed_tests
|
408
450
|
|
409
|
-
logger.info "Automatically save test? #{save}"
|
451
|
+
# logger.info "Automatically save test? #{save}"
|
410
452
|
|
411
|
-
|
453
|
+
# U-Notes : universal server returns Array ; keys as sym
|
454
|
+
universal_results = universal_eyes.close # Array even for one test
|
455
|
+
# require 'pry'
|
456
|
+
# binding.pry
|
457
|
+
key_transformed_results = Applitools::Utils.deep_stringify_keys(universal_results)
|
458
|
+
results = key_transformed_results.map {|result| Applitools::TestResults.new(result) }
|
459
|
+
results = results.first if results.size >= 1
|
460
|
+
|
461
|
+
session_results_url = results.url
|
462
|
+
# results = server_connector.stop_session running_session, false, save
|
412
463
|
runner.aggregate_result(results) if runner
|
413
464
|
|
414
|
-
results.is_new = is_new_session
|
415
|
-
results.url = session_results_url
|
465
|
+
# results.is_new = is_new_session
|
466
|
+
# results.url = session_results_url
|
467
|
+
save = results.new? && save_new_tests || !results.new? && failed && save_failed_tests
|
468
|
+
logger.info "Automatically save test? #{save}"
|
416
469
|
|
417
470
|
logger.info results.to_s(verbose_results)
|
418
471
|
|
419
472
|
if results.unresolved?
|
420
473
|
if results.new?
|
421
474
|
logger.error "--- New test ended. see details at #{session_results_url}"
|
422
|
-
error_message = "New test '#{
|
423
|
-
"of '#{
|
475
|
+
error_message = "New test '#{test_name}' " \
|
476
|
+
"of '#{app_name}' " \
|
424
477
|
"Please approve the baseline at #{session_results_url} "
|
425
478
|
raise Applitools::NewTestError.new error_message, results if throw_exception
|
426
479
|
else
|
427
480
|
logger.error "--- Differences are found. see details at #{session_results_url}"
|
428
|
-
error_message = "Test '#{
|
429
|
-
"of '#{
|
481
|
+
error_message = "Test '#{test_name}' " \
|
482
|
+
"of '#{app_name}' " \
|
430
483
|
"detected differences! See details at #{session_results_url}"
|
431
484
|
raise Applitools::DiffsFoundError.new error_message, results if throw_exception
|
432
485
|
end
|
@@ -435,7 +488,7 @@ module Applitools
|
|
435
488
|
|
436
489
|
if results.failed?
|
437
490
|
logger.error "--- Failed test ended. see details at #{session_results_url}"
|
438
|
-
error_message = "Test '#{
|
491
|
+
error_message = "Test '#{test_name}' of '#{app_name}' " \
|
439
492
|
"is failed! See details at #{session_results_url}"
|
440
493
|
raise Applitools::TestFailedError.new error_message, results if throw_exception
|
441
494
|
return results
|
@@ -11,7 +11,7 @@ require 'applitools/core/image_match_settings'
|
|
11
11
|
|
12
12
|
module Applitools
|
13
13
|
class EyesBaseConfiguration < AbstractConfiguration
|
14
|
-
DEFAULT_MATCH_TIMEOUT =
|
14
|
+
DEFAULT_MATCH_TIMEOUT = 0 # seconds
|
15
15
|
|
16
16
|
DEFAULT_CONFIG = {
|
17
17
|
branch_name: ENV['APPLITOOLS_BRANCH'],
|
@@ -200,5 +200,26 @@ module Applitools
|
|
200
200
|
|
201
201
|
methods_to_delegate.push(:set_proxy)
|
202
202
|
methods_to_delegate.push(:add_property)
|
203
|
+
|
204
|
+
# U-Notes : Universal Add
|
205
|
+
|
206
|
+
# layoutBreakpoints?: boolean | number[]
|
207
|
+
def layout_breakpoints=(value)
|
208
|
+
config_hash[:layout_breakpoints] = (value.is_a?(Array) && value.all? {|v| v.is_a?(Numeric)}) ? value : !!value
|
209
|
+
end
|
210
|
+
def layout_breakpoints
|
211
|
+
config_hash[:layout_breakpoints]
|
212
|
+
end
|
213
|
+
collect_method :layout_breakpoints
|
214
|
+
|
215
|
+
# scrollRootElement?: TElement | TSelector
|
216
|
+
def scroll_root_element=(value)
|
217
|
+
config_hash[:scroll_root_element] = value
|
218
|
+
end
|
219
|
+
def scroll_root_element
|
220
|
+
config_hash[:scroll_root_element]
|
221
|
+
end
|
222
|
+
collect_method :scroll_root_element
|
223
|
+
|
203
224
|
end
|
204
225
|
end
|
@@ -3,9 +3,12 @@
|
|
3
3
|
module Applitools
|
4
4
|
class EyesRunner
|
5
5
|
attr_accessor :batches_server_connectors_map
|
6
|
+
attr_accessor :universal_client, :universal_eyes_manager
|
6
7
|
|
7
8
|
def initialize
|
8
9
|
self.batches_server_connectors_map = {}
|
10
|
+
self.universal_client = Applitools::Connectivity::UniversalClient.new
|
11
|
+
self.universal_eyes_manager = nil # eyes.open
|
9
12
|
end
|
10
13
|
|
11
14
|
def add_batch(batch_id, &block)
|
@@ -15,5 +18,14 @@ module Applitools
|
|
15
18
|
def delete_all_batches
|
16
19
|
batches_server_connectors_map.each_value { |v| v.call if v.respond_to? :call }
|
17
20
|
end
|
21
|
+
|
22
|
+
def get_universal_eyes_manager
|
23
|
+
return universal_eyes_manager if universal_eyes_manager
|
24
|
+
self.universal_eyes_manager = universal_client.make_manager(universal_eyes_manager_config.to_hash)
|
25
|
+
end
|
26
|
+
|
27
|
+
def close_all_eyes
|
28
|
+
get_universal_eyes_manager.close_all_eyes
|
29
|
+
end
|
18
30
|
end
|
19
31
|
end
|
@@ -93,14 +93,14 @@ module Applitools
|
|
93
93
|
|
94
94
|
def to_hash
|
95
95
|
{
|
96
|
-
'
|
97
|
-
'
|
98
|
-
'
|
99
|
-
'
|
100
|
-
'
|
101
|
-
'
|
102
|
-
'
|
103
|
-
'
|
96
|
+
'top' => top,
|
97
|
+
'left' => left,
|
98
|
+
'width' => width,
|
99
|
+
'height' => height,
|
100
|
+
'maxUpOffset' => max_top_offset + padding_top,
|
101
|
+
'maxLeftOffset' => max_left_offset + padding_left,
|
102
|
+
'maxRightOffset' => max_right_offset + padding_right,
|
103
|
+
'maxDownOffset' => max_bottom_offset + padding_bottom
|
104
104
|
}
|
105
105
|
end
|
106
106
|
end
|
@@ -123,5 +123,14 @@ module Applitools
|
|
123
123
|
self.max_right_offset = max_right_offset
|
124
124
|
self.max_bottom_offset = max_bottom_offset
|
125
125
|
end
|
126
|
+
|
127
|
+
def to_hash
|
128
|
+
{
|
129
|
+
maxUpOffset: max_top_offset,
|
130
|
+
maxDownOffset: max_bottom_offset,
|
131
|
+
maxLeftOffset: max_left_offset,
|
132
|
+
maxRightOffset: max_right_offset
|
133
|
+
}
|
134
|
+
end
|
126
135
|
end
|
127
136
|
end
|
@@ -98,6 +98,60 @@ module Applitools
|
|
98
98
|
min_diff_height == other.min_diff_height &&
|
99
99
|
match_threshold == other.match_threshold
|
100
100
|
end
|
101
|
+
|
102
|
+
def to_hash
|
103
|
+
{
|
104
|
+
minDiffIntensity: min_diff_intensity,
|
105
|
+
minDiffWidth: min_diff_width,
|
106
|
+
minDiffHeight: min_diff_height,
|
107
|
+
matchThreshold: match_threshold
|
108
|
+
}
|
109
|
+
end
|
101
110
|
end
|
111
|
+
|
112
|
+
# export type MatchSettings<TRegion> = {
|
113
|
+
# exact?: {
|
114
|
+
# minDiffIntensity: number
|
115
|
+
# minDiffWidth: number
|
116
|
+
# minDiffHeight: number
|
117
|
+
# matchThreshold: number
|
118
|
+
# }
|
119
|
+
# matchLevel?: MatchLevel
|
120
|
+
# sendDom?: boolean
|
121
|
+
# useDom?: boolean
|
122
|
+
# enablePatterns?: boolean
|
123
|
+
# ignoreCaret?: boolean
|
124
|
+
# ignoreDisplacements?: boolean
|
125
|
+
# accessibilitySettings?: {
|
126
|
+
# level?: AccessibilityLevel
|
127
|
+
# guidelinesVersion?: AccessibilityGuidelinesVersion
|
128
|
+
# }
|
129
|
+
# ignoreRegions?: TRegion[]
|
130
|
+
# layoutRegions?: TRegion[]
|
131
|
+
# strictRegions?: TRegion[]
|
132
|
+
# contentRegions?: TRegion[]
|
133
|
+
# floatingRegions?: (TRegion | FloatingRegion<TRegion>)[]
|
134
|
+
# accessibilityRegions?: (TRegion | AccessibilityRegion<TRegion>)[]
|
135
|
+
# }
|
136
|
+
def to_hash
|
137
|
+
result = {}
|
138
|
+
result[:exact] = exact.to_hash unless exact == Exact.new # ...
|
139
|
+
result[:matchLevel] = match_level
|
140
|
+
# result[:sendDom] = nil # duplicate configuration ?
|
141
|
+
result[:useDom] = use_dom if use_dom
|
142
|
+
result[:enablePatterns] = enable_patterns if enable_patterns
|
143
|
+
result[:ignoreCaret] = ignore_caret if ignore_caret
|
144
|
+
result[:ignoreDisplacements] = ignore_displacements if ignore_displacements
|
145
|
+
result[:accessibilitySettings] = accessibility_settings.to_hash if accessibility_settings
|
146
|
+
result[:ignoreRegions] = ignore unless ignore.empty?
|
147
|
+
result[:layoutRegions] = layout unless layout.empty?
|
148
|
+
result[:strictRegions] = strict unless strict.empty?
|
149
|
+
result[:contentRegions] = content unless content.empty?
|
150
|
+
result[:floatingRegions] = floating unless floating.empty?
|
151
|
+
result[:accessibilityRegions] = accessibility unless accessibility.empty?
|
152
|
+
result.compact
|
153
|
+
# :SplitTopHeight, :SplitBottomHeight, :scale, :remainder - deprecated ?
|
154
|
+
end
|
155
|
+
|
102
156
|
end
|
103
157
|
end
|
@@ -5,13 +5,15 @@ module Applitools
|
|
5
5
|
extend self
|
6
6
|
NONE = 'None'.freeze
|
7
7
|
LAYOUT = 'Layout'.freeze
|
8
|
+
LAYOUT1 = 'Layout1'.freeze
|
8
9
|
LAYOUT2 = 'Layout2'.freeze
|
9
10
|
CONTENT = 'Content'.freeze
|
10
11
|
STRICT = 'Strict'.freeze
|
11
12
|
EXACT = 'Exact'.freeze
|
12
13
|
|
13
14
|
def enum_values
|
14
|
-
[NONE, LAYOUT, LAYOUT2, CONTENT, STRICT, EXACT]
|
15
|
+
[NONE, LAYOUT, LAYOUT1, LAYOUT2, CONTENT, STRICT, EXACT]
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
19
|
+
# U-Notes : Added Layout1 MatchLevel
|
@@ -5,7 +5,7 @@ module Applitools
|
|
5
5
|
class Screenshot < Delegator
|
6
6
|
class << self
|
7
7
|
def from_region(region)
|
8
|
-
self::Image.new(::ChunkyPNG::Image.new(region.width, region.height))
|
8
|
+
# self::Image.new(::ChunkyPNG::Image.new(region.width, region.height))
|
9
9
|
end
|
10
10
|
|
11
11
|
def from_datastream(datastream)
|
@@ -18,7 +18,7 @@ module Applitools
|
|
18
18
|
|
19
19
|
def from_any_image(image)
|
20
20
|
return from_region(image) if image.is_a? Applitools::Region
|
21
|
-
return from_image(image) if image.is_a? ::ChunkyPNG::Image
|
21
|
+
# return from_image(image) if image.is_a? ::ChunkyPNG::Image
|
22
22
|
return image if image.is_a?(Image) | image.is_a?(Datastream)
|
23
23
|
from_datastream(image)
|
24
24
|
end
|
@@ -60,12 +60,12 @@ module Applitools
|
|
60
60
|
"Expected image to be Datastream or String, but got #{image.class}"
|
61
61
|
)
|
62
62
|
end
|
63
|
-
@datastream = ::ChunkyPNG::Datastream.from_string image
|
63
|
+
# @datastream = ::ChunkyPNG::Datastream.from_string image
|
64
64
|
end
|
65
65
|
|
66
66
|
def update!(image)
|
67
67
|
Applitools::ArgumentGuard.not_nil(image, 'image')
|
68
|
-
Applitools::ArgumentGuard.is_a?(image, 'image', ::ChunkyPNG::Image)
|
68
|
+
# Applitools::ArgumentGuard.is_a?(image, 'image', ::ChunkyPNG::Image)
|
69
69
|
@datastream = image.to_datastream
|
70
70
|
self
|
71
71
|
end
|
@@ -90,7 +90,7 @@ module Applitools
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def restore
|
93
|
-
::ChunkyPNG::Image.from_datastream @datastream
|
93
|
+
# ::ChunkyPNG::Image.from_datastream @datastream
|
94
94
|
end
|
95
95
|
|
96
96
|
def sha256
|
@@ -103,13 +103,13 @@ module Applitools
|
|
103
103
|
|
104
104
|
def initialize(image)
|
105
105
|
Applitools::ArgumentGuard.not_nil(image, 'image')
|
106
|
-
Applitools::ArgumentGuard.is_a?(image, 'image', ::ChunkyPNG::Image)
|
106
|
+
# Applitools::ArgumentGuard.is_a?(image, 'image', ::ChunkyPNG::Image)
|
107
107
|
@image = image
|
108
108
|
end
|
109
109
|
|
110
110
|
def update!(image)
|
111
111
|
Applitools::ArgumentGuard.not_nil(image, 'image')
|
112
|
-
Applitools::ArgumentGuard.is_a?(image, 'image', ::ChunkyPNG::Image)
|
112
|
+
# Applitools::ArgumentGuard.is_a?(image, 'image', ::ChunkyPNG::Image)
|
113
113
|
@image = image
|
114
114
|
end
|
115
115
|
|
@@ -3,10 +3,23 @@
|
|
3
3
|
module Applitools
|
4
4
|
class TestResultSummary
|
5
5
|
attr_accessor :results, :passed, :unresolved, :failed, :exceptions, :mismatches, :missing, :matches
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
attr_accessor :original_test_results
|
7
|
+
def initialize(all_test_results)
|
8
|
+
@original_test_results = all_test_results
|
9
|
+
@results = all_test_results[:results]
|
10
|
+
@passed = all_test_results[:passed]
|
11
|
+
@unresolved = all_test_results[:unresolved]
|
12
|
+
@failed = all_test_results[:failed]
|
13
|
+
@exceptions = all_test_results[:exceptions]
|
14
|
+
@mismatches = all_test_results[:mismatches]
|
15
|
+
@missing = all_test_results[:missing]
|
16
|
+
@matches = all_test_results[:matches]
|
17
|
+
end
|
18
|
+
|
19
|
+
def old_style_results_array
|
20
|
+
Applitools::Utils.deep_stringify_keys(results).map do |e|
|
21
|
+
r = e['testResults'] ? e['testResults'] : {}
|
22
|
+
Applitools::TestResults.new(r)
|
10
23
|
end
|
11
24
|
end
|
12
25
|
end
|
@@ -26,8 +26,8 @@ module Applitools
|
|
26
26
|
@mismatches = results.fetch('mismatches', 0)
|
27
27
|
@missing = results.fetch('missing', 0)
|
28
28
|
@status = results.fetch('status', 0)
|
29
|
-
@is_new = nil
|
30
|
-
@url = nil
|
29
|
+
@is_new = results.fetch('isNew', nil)
|
30
|
+
@url = results.fetch('url', nil)
|
31
31
|
end
|
32
32
|
|
33
33
|
def passed?
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Applitools
|
4
|
+
module UniversalEyesChecks
|
5
|
+
|
6
|
+
# Takes a snapshot and matches it with the expected output.
|
7
|
+
#
|
8
|
+
# @param [String] name The name of the tag.
|
9
|
+
# @param [Applitools::Selenium::Target] target which area of the window to check.
|
10
|
+
# @return [Applitools::MatchResult] The match results.
|
11
|
+
def universal_check(name, target)
|
12
|
+
return disabled_result if respond_to?(:disabled?) && disabled?
|
13
|
+
|
14
|
+
raise Applitools::EyesNotOpenException.new('Eyes not open!') if @universal_eyes.nil?
|
15
|
+
Applitools::EyesLogger.logger.info "#{test_name} : check(#{name}) started ..."
|
16
|
+
# require 'pry'
|
17
|
+
# binding.pry
|
18
|
+
check_result = @universal_eyes.check(get_universal_check_settings(name, target))
|
19
|
+
if server_error?(check_result)
|
20
|
+
# require 'pry'
|
21
|
+
# binding.pry
|
22
|
+
raise Applitools::EyesError.new("Request failed: #{check_result[:message]}")
|
23
|
+
end
|
24
|
+
|
25
|
+
if check_result != {}
|
26
|
+
result = Applitools::MatchResult.new(Applitools::Utils.deep_stringify_keys(check_result))
|
27
|
+
|
28
|
+
check_fail_result_processing(name) unless result.as_expected?
|
29
|
+
end
|
30
|
+
|
31
|
+
logger.info 'Done!'
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def disabled_result
|
37
|
+
logger.info "#{__method__} Ignored"
|
38
|
+
result = Applitools::MatchResults.new
|
39
|
+
result.as_expected = true
|
40
|
+
result
|
41
|
+
end
|
42
|
+
|
43
|
+
def get_universal_check_settings(name, target)
|
44
|
+
universal_check_settings = Applitools::UniversalCheckSettings.new(name: name)
|
45
|
+
universal_check_settings.from_original_target(target, self)
|
46
|
+
# require 'pry'
|
47
|
+
# binding.pry
|
48
|
+
universal_check_settings.to_hash
|
49
|
+
end
|
50
|
+
|
51
|
+
def check_fail_result_processing(name)
|
52
|
+
self.failed = true
|
53
|
+
logger.info "Mistmatch! #{name}" #unless running_session.new_session?
|
54
|
+
|
55
|
+
if failure_reports == :immediate
|
56
|
+
raise Applitools::TestFailedException.new "Mistmatch found in #{test_name} of #{app_name}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def server_error?(universal_results)
|
61
|
+
universal_results.is_a?(Hash) && universal_results[:message] && universal_results[:stack]
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
# U-Notes : Added internal Applitools::UniversalEyesChecks
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Applitools
|
4
|
+
module UniversalEyesOpen
|
5
|
+
|
6
|
+
# Starts a test
|
7
|
+
#
|
8
|
+
# @param options [Hash] options
|
9
|
+
# @option options :driver The driver that controls the browser hosting the application
|
10
|
+
# under the test. (*Required* option)
|
11
|
+
# @option options [String] :app_name The name of the application under the test. (*Required* option)
|
12
|
+
# @option options [String] :test_name The test name (*Required* option)
|
13
|
+
# @option options [String | Hash] :viewport_size The required browser's viewport size
|
14
|
+
# (i.e., the visible part of the document's body) or +nil+ to use the current window's viewport.
|
15
|
+
# @option options :session_type The type of the test (e.g., standard test / visual performance test).
|
16
|
+
# Default value is 'SEQUENTAL'
|
17
|
+
# @return [Applitools::Selenium::Driver] A wrapped web driver which enables Eyes
|
18
|
+
# trigger recording and frame handling
|
19
|
+
def universal_open(options = {})
|
20
|
+
original_driver = options.delete(:driver)
|
21
|
+
Applitools::ArgumentGuard.not_nil original_driver, 'options[:driver]'
|
22
|
+
|
23
|
+
if respond_to?(:disabled?) && disabled?
|
24
|
+
logger.info('Ignored')
|
25
|
+
return original_driver
|
26
|
+
end
|
27
|
+
|
28
|
+
self.driver = Applitools::Selenium::SeleniumEyes.eyes_driver(original_driver, self)
|
29
|
+
|
30
|
+
update_config_from_options(options)
|
31
|
+
universal_driver_config = driver.universal_driver_config
|
32
|
+
universal_eyes_manager = runner.get_universal_eyes_manager
|
33
|
+
|
34
|
+
universal_eyes_config = Applitools::UniversalEyesConfig.new
|
35
|
+
universal_eyes_config.from_original_sdk(self)
|
36
|
+
|
37
|
+
# require('pry')
|
38
|
+
# binding.pry
|
39
|
+
|
40
|
+
@universal_eyes = universal_eyes_manager.open_eyes(universal_driver_config, universal_eyes_config.to_hash)
|
41
|
+
raise Applitools::EyesNotOpenException.new('Eyes not open!') if @universal_eyes.nil?
|
42
|
+
|
43
|
+
self.open = true if respond_to?(:open=, true)
|
44
|
+
self.running_session = true if respond_to?(:running_session=, true)
|
45
|
+
driver
|
46
|
+
rescue Applitools::EyesError => e
|
47
|
+
logger.error e.message
|
48
|
+
raise e
|
49
|
+
end
|
50
|
+
|
51
|
+
def universal_sdk_abort
|
52
|
+
if respond_to?(:disabled?) && disabled?
|
53
|
+
logger.info "#{__method__} Ignore disabled"
|
54
|
+
return false
|
55
|
+
end
|
56
|
+
# raise Applitools::EyesNotOpenException.new('Eyes not open!') if @eyes.nil?
|
57
|
+
return if @universal_eyes.nil?
|
58
|
+
result = @universal_eyes.abort
|
59
|
+
|
60
|
+
if result.is_a? Hash
|
61
|
+
logger.info "---Test aborted" if !result[:message] && !result[:stack]
|
62
|
+
else
|
63
|
+
# TestCheckFrameInFrame_Fully_Fluent_VG\
|
64
|
+
# require('pry')
|
65
|
+
# binding.pry
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def update_config_from_options(options)
|
72
|
+
default_options = { session_type: 'SEQUENTIAL' }
|
73
|
+
|
74
|
+
options = default_options.merge options
|
75
|
+
|
76
|
+
self.app_name = options[:app_name] if options[:app_name]
|
77
|
+
self.test_name = options[:test_name] if options[:test_name]
|
78
|
+
if (config.viewport_size.nil? || config.viewport_size&.empty?) && options[:viewport_size]
|
79
|
+
self.viewport_size = Applitools::RectangleSize.from_any_argument options[:viewport_size]
|
80
|
+
end
|
81
|
+
self.session_type = options[:session_type] if options[:session_type]
|
82
|
+
|
83
|
+
raise Applitools::EyesIllegalArgument, config.validation_errors.values.join('/n') unless config.valid?
|
84
|
+
|
85
|
+
logger.info "Agent = #{full_agent_id}"
|
86
|
+
logger.info "open(app_name: #{app_name}, test_name: #{test_name}," \
|
87
|
+
" viewport_size: #{viewport_size})"
|
88
|
+
|
89
|
+
raise Applitools::EyesError.new 'API key is missing! Please set it using api_key=' if
|
90
|
+
api_key.nil? || (api_key && api_key.empty?)
|
91
|
+
|
92
|
+
logger.info "Batch is #{@batch}" if @batch
|
93
|
+
app_env = app_environment if respond_to? :app_environment
|
94
|
+
logger.info "Application environment is #{app_env}"
|
95
|
+
test_info = "'#{test_name}' of '#{app_name}' #{app_env}"
|
96
|
+
logger.info "--- New test started - #{test_info}"
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|