calabash 2.0.0.pre6 → 2.0.0.pre9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b006a1fc1ac925dc22c77ac2ecdde56b3f58f01c
4
- data.tar.gz: e6c582fe3f8cf49392de98bd02187d8581776b63
3
+ metadata.gz: d018a4059fbc167401a00153fe9d5dd8a7660684
4
+ data.tar.gz: c7d01f02885927df13058ec9417dbdad8f254fc2
5
5
  SHA512:
6
- metadata.gz: 20965160fbceef2499276f4144ee2856e5d9c09a9df711f8abb23525745a4c12b278430b872500f476bb21a4d31e2f027257c20b0944520c1eaca13847093cb4
7
- data.tar.gz: 0b49e6a9229ea88449176a15fa5a2c242da38cec043f3038c223eb038bd11900c1b95296d0b93a98a0f3d3141c94f4c659bd7f859796fde2c2c2f679e15ebedb
6
+ metadata.gz: b776516069ecd91364f819286532ea841d4eb1b25ab4ed364033a7faf50f406546fd986ffbd2e64484efb9df4045911232b95c9f670a7be883c3e2cdc5633d5f
7
+ data.tar.gz: a973bee5a42a306303f4ac7c8304b961488e14a11f0348358fb006c6d0fb3c385c62fdbadd290a154157f202a59ae63f2e9352a6471958e8bb41708605d1648a
data/README.md CHANGED
@@ -6,18 +6,6 @@
6
6
 
7
7
  Automated Acceptance Testing for Mobile Apps
8
8
 
9
- ## Initial workflow
10
-
11
- **TL;DR**
12
-
13
- ```
14
- $ cd calabash
15
- $ ./copy_repos.sh
16
- $ ./changing_old_files.sh
17
- ```
18
-
19
- Before Calabash is ready to be released, the old gems will exist outside version control. To make a change run the script `copy_repos.sh`. This will copy the Android and iOS repositories and extract them as files in the directory `old`. Then execute `changing_old_files.sh`. This script will move old files into their new directories. To make changes to "old files" e.g. move them, add your steps to `changing_old_files.sh` and execute it. To make code changes to old files, change them locally first to ensure they work. Then copy the change to the branch `united` on either iOS or Android. Commit the changes and push them upstream. `copy_repos.sh` will always download the newest files.
20
-
21
9
  ## Rake
22
10
 
23
11
  **TODO** Release instructions for Android and iOS.
@@ -25,6 +25,7 @@ module Calabash
25
25
  require 'calabash/text'
26
26
  require 'calabash/interactions'
27
27
  require 'calabash/defaults'
28
+ require 'calabash/legacy'
28
29
  require 'calabash/console_helpers'
29
30
 
30
31
 
@@ -64,6 +64,8 @@ module Calabash
64
64
 
65
65
  file
66
66
  end
67
+
68
+ require 'calabash/android/legacy'
67
69
  end
68
70
  end
69
71
 
@@ -8,7 +8,7 @@ module Calabash
8
8
  application_path = Environment::APP_PATH
9
9
 
10
10
  if application_path.nil?
11
- raise 'No application path is set'
11
+ raise 'No application path is set. Specify application with environment variable CAL_APP'
12
12
  end
13
13
 
14
14
  unless File.exist?(application_path)
@@ -20,8 +20,12 @@ module Calabash
20
20
  end
21
21
 
22
22
  build_test_server = Build::TestServer.new(application_path)
23
- test_server_path = Environment::TEST_SERVER_PATH ||
24
- build_test_server.path
23
+ test_server_path = Environment::TEST_SERVER_PATH
24
+
25
+ unless test_server_path
26
+ test_server_path = build_test_server.path
27
+ Logger.info "No test-server specified. Defaulting to path '#{test_server_path}'"
28
+ end
25
29
 
26
30
  unless File.exist?(test_server_path)
27
31
  Logger.error "Test-server '#{test_server_path}' does not exist."
@@ -38,6 +42,13 @@ module Calabash
38
42
  @test_server = Application.new(test_server_path, nil, options) if test_server_path
39
43
  end
40
44
 
45
+ # Is this application an android application
46
+ #
47
+ # @return [Boolean] Always returns true
48
+ def android_application?
49
+ true
50
+ end
51
+
41
52
  def extract_identifier
42
53
  package_line = aapt_dump('package').first
43
54
  raise "'package' not found in aapt output" unless package_line
@@ -17,7 +17,7 @@ module Calabash
17
17
  end
18
18
 
19
19
  # @!visibility private
20
- def build
20
+ def build(out_file = nil)
21
21
  apk_fingerprint = fingerprint_from_apk
22
22
  @logger.log "#{@application_path} was signed with a certificate with fingerprint #{apk_fingerprint}", :debug
23
23
 
@@ -49,7 +49,7 @@ module Calabash
49
49
 
50
50
  application = Calabash::Application.from_path(@application_path)
51
51
 
52
- test_server_file_name = TestServer.new(@application_path).path
52
+ test_server_file_name = out_file || TestServer.new(@application_path).path
53
53
  FileUtils.mkdir_p File.dirname(test_server_file_name) unless File.exist? File.dirname(test_server_file_name)
54
54
 
55
55
  Dir.mktmpdir do |workspace_dir|
@@ -70,6 +70,17 @@ module Calabash
70
70
 
71
71
  Zip::File.new("dummy.apk").extract("AndroidManifest.xml","customAndroidManifest.xml")
72
72
  Zip::File.open("TestServer.apk") do |zip_file|
73
+ begin
74
+ check_file("AndroidManifest.xml")
75
+ manifest_exists = true
76
+ rescue
77
+ manifest_exists = false
78
+ end
79
+
80
+ if manifest_exists
81
+ zip_file.remove("AndroidManifest.xml")
82
+ end
83
+
73
84
  zip_file.add("AndroidManifest.xml", "customAndroidManifest.xml")
74
85
  end
75
86
  end
@@ -87,7 +87,7 @@ module Calabash
87
87
  # @!visibility private
88
88
  def test_server_responding?
89
89
  begin
90
- http_client.get(HTTP::Request.new('ping'), retries: 1).body == 'pong'
90
+ http_client.post(HTTP::Request.new('ping'), retries: 1).body == 'pong'
91
91
  rescue HTTP::Error => _
92
92
  false
93
93
  end
@@ -96,7 +96,7 @@ module Calabash
96
96
  # @!visibility private
97
97
  def test_server_ready?
98
98
  begin
99
- http_client.get(HTTP::Request.new('ready')).body == 'true'
99
+ http_client.post(HTTP::Request.new('ready')).body == 'true'
100
100
  rescue HTTP::Error => _
101
101
  false
102
102
  end
@@ -166,9 +166,9 @@ module Calabash
166
166
  request = HTTP::Request.new('map', params_for_request(parameters))
167
167
 
168
168
  http_result = if method_name == :flash
169
- http_client.get(request, timeout: 30)
169
+ http_client.post(request, timeout: 30)
170
170
  else
171
- http_client.get(request)
171
+ http_client.post(request)
172
172
  end
173
173
 
174
174
  result = JSON.parse(http_result.body)
@@ -185,9 +185,9 @@ module Calabash
185
185
  @logger.log "Action: #{action} - Arguments: #{arguments.join(', ')}"
186
186
 
187
187
  parameters = {command: action, arguments: arguments}
188
- request = HTTP::Request.new('/', params_for_request(parameters))
188
+ request = HTTP::Request.new('', params_for_request(parameters))
189
189
 
190
- result = JSON.parse(http_client.get(request).body)
190
+ result = JSON.parse(http_client.post(request).body)
191
191
 
192
192
  unless result['success']
193
193
  message = result['message'] || result['bonusInformation']
@@ -211,6 +211,17 @@ module Calabash
211
211
  perform_action('keyboard_enter_text', text)
212
212
  end
213
213
 
214
+ # @!visibility private
215
+ def md5_checksum_for_app_package(package)
216
+ app = installed_apps.find{|app| app[:package] == package}
217
+
218
+ unless app
219
+ raise "Application with package '#{app}' not installed"
220
+ end
221
+
222
+ md5_checksum(app[:path])
223
+ end
224
+
214
225
  # @!visibility private
215
226
  def md5_checksum(file_path)
216
227
  result = adb.shell("#{md5_binary} '#{file_path}'")
@@ -229,7 +240,7 @@ module Calabash
229
240
  json = parameters.to_json
230
241
  request = HTTP::Request.new('/backdoor', json: json)
231
242
 
232
- body = http_client.get(request).body
243
+ body = http_client.post(request).body
233
244
  result = JSON.parse(body)
234
245
 
235
246
  if result['outcome'] != 'SUCCESS'
@@ -245,6 +256,29 @@ module Calabash
245
256
  result['result']
246
257
  end
247
258
 
259
+
260
+ # @!visibility private
261
+ def keyboard_visible?
262
+ input_method = adb.shell("dumpsys input_method")
263
+ input_method.lines.each do |line|
264
+ match = line.match(/mInputShown\s*=\s*(.*)/)
265
+
266
+ if match && match.captures.length != 0
267
+ shown = match.captures.first.chomp
268
+
269
+ if shown == "true"
270
+ return true
271
+ elsif shown == "false"
272
+ return false
273
+ else
274
+ raise "Could not detect keyboard visibility. '#{shown}'"
275
+ end
276
+ end
277
+ end
278
+
279
+ raise "Could not detect keyboard visibility. Could not find 'mInputShown'"
280
+ end
281
+
248
282
  # @!visibility private
249
283
  def go_home
250
284
  adb.shell("input keyevent 3")
@@ -343,7 +377,7 @@ module Calabash
343
377
  json = parameters.to_json
344
378
  request = HTTP::Request.new('/map', json: json)
345
379
 
346
- body = http_client.get(request).body
380
+ body = http_client.post(request).body
347
381
  result = JSON.parse(body)
348
382
 
349
383
  if result['outcome'] != 'SUCCESS'
@@ -422,6 +456,8 @@ module Calabash
422
456
 
423
457
  if options[:activity]
424
458
  env_options[:main_activity] = options[:activity]
459
+ else
460
+ env_options[:main_activity] = 'null'
425
461
  end
426
462
 
427
463
  if application.test_server.nil?
@@ -436,15 +472,13 @@ module Calabash
436
472
  raise "The test-server '#{application.test_server.identifier}' is not installed"
437
473
  end
438
474
 
439
- installed_app = installed_apps.find{|app| app[:package] == application.identifier}
440
- installed_app_md5_checksum = md5_checksum(installed_app[:path])
475
+ installed_app_md5_checksum = md5_checksum_for_app_package(application.identifier)
441
476
 
442
477
  if application.md5_checksum != installed_app_md5_checksum
443
478
  raise "The specified app is not the same as the installed app (#{application.md5_checksum} != #{installed_app_md5_checksum})."
444
479
  end
445
480
 
446
- installed_test_server = installed_apps.find{|app| app[:package] == application.test_server.identifier}
447
- installed_test_server_md5_checksum = md5_checksum(installed_test_server[:path])
481
+ installed_test_server_md5_checksum = md5_checksum_for_app_package(application.test_server.identifier)
448
482
 
449
483
  if application.test_server.md5_checksum != installed_test_server_md5_checksum
450
484
  raise "The specified test-server is not the same as the installed test-server (#{application.test_server.md5_checksum} != #{installed_test_server_md5_checksum})."
@@ -477,7 +511,7 @@ module Calabash
477
511
  extras = ''
478
512
 
479
513
  env_options.each_pair do |key, val|
480
- extras = "#{extras} -e \"#{key.to_s}\" \"#{val.to_s}\""
514
+ extras = "#{extras} -e #{key.to_s} #{val.to_s}"
481
515
  end
482
516
 
483
517
  begin
@@ -527,7 +561,7 @@ module Calabash
527
561
  def _stop_app
528
562
  Retriable.retriable(tries: 5, interval: 1) do
529
563
  begin
530
- http_client.get(HTTP::Request.new('kill'), retries: 1, interval: 0)
564
+ http_client.post(HTTP::Request.new('kill'), retries: 1, interval: 0)
531
565
  rescue HTTP::Error => _
532
566
  # It's fine that we can't contact the test-server, as it might already have been shut down
533
567
  if test_server_responding?
@@ -719,11 +753,10 @@ module Calabash
719
753
  if installed_packages.include?(application.identifier)
720
754
  @logger.log 'Application is already installed. Ensuring right checksum'
721
755
 
722
- installed_app = installed_apps.find{|app| app[:package] == application.identifier}
723
- installed_app_md5_checksum = md5_checksum(installed_app[:path])
756
+ installed_app_md5_checksum = md5_checksum_for_app_package(application.identifier)
724
757
 
725
758
  if application.md5_checksum != installed_app_md5_checksum
726
- @logger.log("The md5 checksum has changed (#{application.md5_checksum} != #{installed_app_md5_checksum}.", :info)
759
+ @logger.log("The md5 checksum has changed (#{application.md5_checksum} != #{installed_app_md5_checksum}).", :info)
727
760
  _install_app(application)
728
761
  end
729
762
  else
@@ -965,9 +998,9 @@ module Calabash
965
998
 
966
999
  # @!visibility private
967
1000
  def execute_gesture(multi_touch_gesture)
968
- request = HTTP::Request.new('gesture', json: multi_touch_gesture.to_json)
1001
+ request = HTTP::Request.new('gesture', params_for_request(multi_touch_gesture))
969
1002
 
970
- body = http_client.get(request, timeout: multi_touch_gesture.timeout + 10).body
1003
+ body = http_client.post(request, timeout: multi_touch_gesture.timeout + 10).body
971
1004
  result = JSON.parse(body)
972
1005
 
973
1006
  if result['outcome'] != 'SUCCESS'
@@ -15,6 +15,16 @@ module Calabash
15
15
  # @!visibility private
16
16
  class InvalidJavaSDKHome < RuntimeError; end
17
17
 
18
+ # A URI that points to the embedded Calabash server in the app under test.
19
+ #
20
+ # The default value is 'http://localhost:34777'.
21
+ #
22
+ # You can control the value of this variable by setting the `CAL_ENDPOINT`
23
+ # variable.
24
+ #
25
+ # @todo Maybe rename this to CAL_SERVER_URL or CAL_SERVER?
26
+ DEVICE_ENDPOINT = URI.parse((variable('CAL_ENDPOINT') || 'http://127.0.0.1:34777'))
27
+
18
28
  private
19
29
 
20
30
  def self.set_android_dependencies(android_dependencies)
@@ -0,0 +1,6 @@
1
+ if Calabash::Environment.variable('DEVICE_ENDPOINT')
2
+ Calabash::Logger.warn("Deprecated use of old ENV variable 'DEVICE_ENDPOINT'")
3
+
4
+ Calabash::Android::Environment::DEVICE_ENDPOINT =
5
+ URI.parse(Calabash::Environment.variable('DEVICE_ENDPOINT'))
6
+ end
@@ -4,7 +4,8 @@ module Calabash
4
4
  class Server < ::Calabash::Server
5
5
  # The default Android test server.
6
6
  def self.default
7
- Server.new(URI.parse('http://127.0.0.1:33765'))
7
+ endpoint = Environment::DEVICE_ENDPOINT
8
+ Server.new(endpoint, 7102)
8
9
  end
9
10
  end
10
11
  end
@@ -42,6 +42,11 @@ module Calabash
42
42
  Device.default.perform_action('press_user_action_button', action_key.to_s)
43
43
  end
44
44
  end
45
+
46
+ # @!visibility private
47
+ def _keyboard_visible?
48
+ Device.default.keyboard_visible?
49
+ end
45
50
  end
46
51
  end
47
52
  end
@@ -21,6 +21,21 @@ module Calabash
21
21
 
22
22
  attr_reader :path
23
23
 
24
+ # Get the application from the default environment.
25
+ def self.default_from_environment
26
+ application_path = Environment::APP_PATH
27
+
28
+ if application_path.nil?
29
+ raise 'No application path is set. Specify application with environment variable CAL_APP'
30
+ end
31
+
32
+ unless File.exist?(application_path)
33
+ raise "Application '#{application_path}' does not exist"
34
+ end
35
+
36
+ Application.from_path(application_path)
37
+ end
38
+
24
39
  # Create an application from a path
25
40
  #
26
41
  # @return [Calabash::Android::Application, Calabash::IOS::Application] An
@@ -51,6 +66,20 @@ module Calabash
51
66
  ensure_application_path
52
67
  end
53
68
 
69
+ # Is this application an android application
70
+ #
71
+ # @return [Boolean] true if this application is an android application
72
+ def android_application?
73
+ false
74
+ end
75
+
76
+ # Is this application an iOS application
77
+ #
78
+ # @return [Boolean] true if this application is an iOS application
79
+ def ios_application?
80
+ false
81
+ end
82
+
54
83
  # @!visibility private
55
84
  def to_s
56
85
  "#<Application #{path}>"
@@ -7,6 +7,19 @@ module Calabash
7
7
  fail('Should only build test-server for Android') unless @platform.nil? || @platform == :android
8
8
 
9
9
  application = @arguments.shift
10
+ test_server_path = nil
11
+
12
+ arg = @arguments.shift
13
+
14
+ if arg != nil
15
+ if arg == '-o'
16
+ test_server_path = @arguments.shift
17
+
18
+ if test_server_path == nil
19
+ raise 'Expected an output path for the test-server'
20
+ end
21
+ end
22
+ end
10
23
 
11
24
  if application.nil?
12
25
  fail('Must supply application as first parameter to build', :build)
@@ -19,7 +32,7 @@ module Calabash
19
32
  case extension
20
33
  when '.apk'
21
34
  set_platform!(:android)
22
- Calabash::Android::Build::Builder.new(application_path).build
35
+ Calabash::Android::Build::Builder.new(application_path).build(test_server_path)
23
36
  when '.ipa', '.app'
24
37
  set_platform!(:ios)
25
38
  fail('Should only build test-server for Android')
@@ -23,12 +23,14 @@ module Calabash
23
23
  when '.apk'
24
24
  set_platform!(:android)
25
25
 
26
- # Create the test server if it does not exist
27
- test_server = Android::Build::TestServer.new(application_path)
28
-
29
- unless test_server.exists?
30
- Logger.info('Test server does not exist. Creating test server.')
31
- Calabash::Android::Build::Builder.new(application_path).build
26
+ unless Environment::TEST_SERVER_PATH
27
+ # Create the test server if it does not exist
28
+ test_server = Android::Build::TestServer.new(application_path)
29
+
30
+ unless test_server.exists?
31
+ Logger.info('Test server does not exist. Creating test server.')
32
+ Calabash::Android::Build::Builder.new(application_path).build
33
+ end
32
34
  end
33
35
 
34
36
  enter_console(application_path)
@@ -68,7 +68,7 @@ EOF
68
68
  #{HELP[:resign]}
69
69
  resigns the app with the currently configured keystore.
70
70
 
71
- #{HELP[:build]}
71
+ #{HELP[:build]} [-o <output_file>]
72
72
  builds the test server that will be used when testing the app.
73
73
 
74
74
  iOS specific commands
@@ -31,12 +31,14 @@ module Calabash
31
31
  when '.apk'
32
32
  set_platform!(:android)
33
33
 
34
- # Create the test server if it does not exist
35
- test_server = Android::Build::TestServer.new(application_path)
36
-
37
- unless test_server.exists?
38
- Logger.info('Test server does not exist. Creating test server.')
39
- Calabash::Android::Build::Builder.new(application_path).build
34
+ unless Environment::TEST_SERVER_PATH
35
+ # Create the test server if it does not exist
36
+ test_server = Android::Build::TestServer.new(application_path)
37
+
38
+ unless test_server.exists?
39
+ Logger.info('Test server does not exist. Creating test server.')
40
+ Calabash::Android::Build::Builder.new(application_path).build
41
+ end
40
42
  end
41
43
 
42
44
  run(application_path, @arguments)
@@ -90,7 +92,7 @@ module Calabash
90
92
  end
91
93
  end
92
94
 
93
- arguments = ['-S', 'cucumber', '-p', @platform.to_s, *cucumber_arguments]
95
+ arguments = ['-S', 'cucumber', *cucumber_arguments]
94
96
 
95
97
  Logger.debug("Starting Ruby with arguments: #{arguments.join(', ')} and environment #{cucumber_environment.to_s}")
96
98
 
@@ -253,6 +253,11 @@ module Calabash
253
253
  abstract_method!
254
254
  end
255
255
 
256
+ # @!visibility private
257
+ def keyboard_visible?
258
+ abstract_method!
259
+ end
260
+
256
261
  private
257
262
 
258
263
  # @!visibility private
@@ -131,8 +131,20 @@ module Calabash
131
131
  client.receive_timeout = [time_diff, client.receive_timeout].min
132
132
 
133
133
  begin
134
- return client.send(request_method, @server.endpoint + request.route,
135
- request.params, header)
134
+ if request_method == :get
135
+ return client.send(request_method, @server.endpoint + request.route,
136
+ request.params, header)
137
+ else
138
+ if request.params.is_a?(Hash)
139
+ if request.params.key?(:json)
140
+ return client.send(request_method, @server.endpoint + request.route,
141
+ {body: request.params[:json]}.merge(header: header))
142
+ end
143
+ end
144
+
145
+ return client.send(request_method, @server.endpoint + request.route,
146
+ {body: request.params}.merge(header: header))
147
+ end
136
148
  rescue *RETRY_ON => e
137
149
  @logger.log "Http error: #{e}"
138
150
 
@@ -44,5 +44,6 @@ module Calabash
44
44
  include Calabash::IOS::Slider
45
45
  include Calabash::IOS::DatePicker
46
46
 
47
+ require 'calabash/ios/legacy'
47
48
  end
48
49
  end
@@ -27,7 +27,7 @@ module Calabash
27
27
  application_path = Environment::APP_PATH
28
28
 
29
29
  if application_path.nil?
30
- raise 'No application path is set'
30
+ raise 'No application path is set. Specify application with environment variable CAL_APP'
31
31
  end
32
32
 
33
33
  Application.new(application_path)
@@ -67,6 +67,13 @@ module Calabash
67
67
  @device_binary
68
68
  end
69
69
 
70
+ # Is this application an iOS application
71
+ #
72
+ # @return [Boolean] Always returns true
73
+ def ios_application?
74
+ true
75
+ end
76
+
70
77
  # Returns the sha1 of the directory or binary of this app's path.
71
78
  # @return [String] A checksum.
72
79
  def sha1
@@ -0,0 +1,6 @@
1
+ if Calabash::Environment.variable('DEVICE_ENDPOINT')
2
+ Calabash::Logger.warn("Deprecated use of old ENV variable 'DEVICE_ENDPOINT'")
3
+
4
+ Calabash::IOS::Environment::DEVICE_ENDPOINT =
5
+ URI.parse(Calabash::Environment.variable('DEVICE_ENDPOINT'))
6
+ end
@@ -73,43 +73,6 @@ module Calabash
73
73
  Device.default.split_keyboard_visible?
74
74
  end
75
75
 
76
- # Returns true if there is a visible keyboard.
77
- #
78
- # @return [Boolean] Returns true if there is a visible keyboard.
79
- def keyboard_visible?
80
- docked_keyboard_visible? || undocked_keyboard_visible? || split_keyboard_visible?
81
- end
82
-
83
- # Waits for a keyboard to appear.
84
- #
85
- # @see Calabash::Wait.default_options
86
- #
87
- # @param [Number] timeout How long to wait for the keyboard.
88
- # @raise [Calabash::Wait::TimeoutError] Raises error if no keyboard
89
- # appears.
90
- def wait_for_keyboard(timeout=nil)
91
- keyboard_timeout = keyboard_wait_timeout(timeout)
92
- message = "Timed out after #{keyboard_timeout} seconds waiting for the keyboard to appear"
93
- wait_for(message, timeout: keyboard_timeout) do
94
- keyboard_visible?
95
- end
96
- end
97
-
98
- # Waits for the keyboard to disappear.
99
- #
100
- # @see Calabash::Wait.default_options
101
- #
102
- # @param [Number] timeout How log to wait for the keyboard to disappear.
103
- # @raise [Calabash::Wait::TimeoutError] Raises error if any keyboard is
104
- # visible after the `timeout`.
105
- def wait_for_no_keyboard(timeout=nil)
106
- keyboard_timeout = keyboard_wait_timeout(timeout)
107
- message = "Timed out after #{keyboard_timeout} seconds waiting for the keyboard to disappear"
108
- wait_for(message, timeout: keyboard_timeout) do
109
- !keyboard_visible?
110
- end
111
- end
112
-
113
76
  # Touches the keyboard action key.
114
77
  #
115
78
  # The action key depends on the keyboard. Some examples include:
@@ -137,6 +100,11 @@ module Calabash
137
100
  Device.default.uia_route("uia.keyboard().typeString('#{char_sequence}')")
138
101
  end
139
102
 
103
+ # @!visibility private
104
+ def _keyboard_visible?
105
+ docked_keyboard_visible? || undocked_keyboard_visible? || split_keyboard_visible?
106
+ end
107
+
140
108
  # Touches the keyboard delete key.
141
109
  #
142
110
  # The 'delete' key difficult to find and touch because its behavior
@@ -242,14 +210,6 @@ module Calabash
242
210
  #'International' => nil,
243
211
  #'More' => nil,
244
212
  }
245
-
246
- def keyboard_wait_timeout(timeout)
247
- if timeout.nil?
248
- Calabash::Gestures::DEFAULT_GESTURE_WAIT_TIMEOUT
249
- else
250
- timeout
251
- end
252
- end
253
213
  end
254
214
  end
255
215
  end
@@ -0,0 +1,10 @@
1
+ if Calabash::Environment.variable('TEST_APP_PATH')
2
+ Calabash::Logger.warn("Deprecated use of old ENV variable 'TEST_APP_PATH'")
3
+ Calabash::Environment::TEST_SERVER_PATH =
4
+ Calabash::Environment.variable('TEST_APP_PATH')
5
+ end
6
+
7
+ if Calabash::Environment.variable('APP_PATH')
8
+ Calabash::Logger.warn("Deprecated use of old ENV variable 'APP_PATH'")
9
+ Calabash::Environment::APP_PATH = Calabash::Environment.variable('APP_PATH')
10
+ end
@@ -1,6 +1,4 @@
1
1
  # config/cucumber.yml
2
2
  ##YAML Template
3
3
  ---
4
- # Platform
5
- android: PLATFORM=android -r features
6
- ios: PLATFORM=ios -r features
4
+ default: -r features
@@ -1,7 +1,21 @@
1
1
  require 'calabash'
2
+ require 'calabash/android/application'
3
+ require 'calabash/ios/application'
2
4
 
3
5
  platform = ENV['PLATFORM']
4
6
 
7
+ unless platform
8
+ application = Calabash::Application.default_from_environment
9
+
10
+ if application.android_application?
11
+ platform = 'android'
12
+ elsif application.ios_application?
13
+ platform = 'ios'
14
+ else
15
+ raise "Application '#{application}' is neither an Android app or an iOS app"
16
+ end
17
+ end
18
+
5
19
  case platform
6
20
  when 'android'
7
21
  require 'calabash/android'
@@ -26,7 +40,7 @@ case platform
26
40
  [
27
41
  'ERROR! Unable to start the cucumber test:',
28
42
  message,
29
- "Use the profile 'android' or 'ios', or run cucumber using $ calabash run"
43
+ "Run cucumber with the ENV variable 'CAL_APP', or run cucumber using $ calabash run"
30
44
  ]
31
45
 
32
46
  Calabash::Logger.error(failure_messages.join("\n"))
@@ -93,6 +93,45 @@ module Calabash
93
93
  Text.escape_single_quotes(string)
94
94
  end
95
95
 
96
+ # Returns true if there is a visible keyboard.
97
+ # On Android, if a physical keyboard is connected, this method will always
98
+ # return true.
99
+ #
100
+ # @return [Boolean] Returns true if there is a visible keyboard.
101
+ def keyboard_visible?
102
+ _keyboard_visible?
103
+ end
104
+
105
+ # Waits for a keyboard to appear.
106
+ #
107
+ # @see Calabash::Wait.default_options
108
+ #
109
+ # @param [Number] timeout How long to wait for the keyboard.
110
+ # @raise [Calabash::Wait::TimeoutError] Raises error if no keyboard
111
+ # appears.
112
+ def wait_for_keyboard(timeout=nil)
113
+ keyboard_timeout = keyboard_wait_timeout(timeout)
114
+ message = "Timed out after #{keyboard_timeout} seconds waiting for the keyboard to appear"
115
+ wait_for(message, timeout: keyboard_timeout) do
116
+ keyboard_visible?
117
+ end
118
+ end
119
+
120
+ # Waits for the keyboard to disappear.
121
+ #
122
+ # @see Calabash::Wait.default_options
123
+ #
124
+ # @param [Number] timeout How log to wait for the keyboard to disappear.
125
+ # @raise [Calabash::Wait::TimeoutError] Raises error if any keyboard is
126
+ # visible after the `timeout`.
127
+ def wait_for_no_keyboard(timeout=nil)
128
+ keyboard_timeout = keyboard_wait_timeout(timeout)
129
+ message = "Timed out after #{keyboard_timeout} seconds waiting for the keyboard to disappear"
130
+ wait_for(message, timeout: keyboard_timeout) do
131
+ !keyboard_visible?
132
+ end
133
+ end
134
+
96
135
  # @!visibility private
97
136
  def _enter_text(text)
98
137
  abstract_method!
@@ -118,9 +157,23 @@ module Calabash
118
157
  abstract_method!
119
158
  end
120
159
 
160
+ # @!visibility private
161
+ def _keyboard_visible?
162
+ abstract_method!
163
+ end
164
+
121
165
  # @!visibility private
122
166
  def self.escape_single_quotes(string)
123
167
  string.gsub("'", "\\\\'")
124
168
  end
169
+
170
+ # @!visibility private
171
+ def keyboard_wait_timeout(timeout)
172
+ if timeout.nil?
173
+ Calabash::Gestures::DEFAULT_GESTURE_WAIT_TIMEOUT
174
+ else
175
+ timeout
176
+ end
177
+ end
125
178
  end
126
179
  end
@@ -1,5 +1,5 @@
1
1
  module Calabash
2
2
 
3
3
  # @!visibility private
4
- VERSION = "2.0.0.pre6"
4
+ VERSION = "2.0.0.pre9"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calabash
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre6
4
+ version: 2.0.0.pre9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Maturana Larsen
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-12-21 00:00:00.000000000 Z
14
+ date: 2016-03-17 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: edn
@@ -389,6 +389,7 @@ files:
389
389
  - lib/calabash/android/environment.rb
390
390
  - lib/calabash/android/gestures.rb
391
391
  - lib/calabash/android/interactions.rb
392
+ - lib/calabash/android/legacy.rb
392
393
  - lib/calabash/android/lib/.irbrc
393
394
  - lib/calabash/android/lib/AndroidManifest.xml
394
395
  - lib/calabash/android/lib/TestServer.apk
@@ -463,6 +464,7 @@ files:
463
464
  - lib/calabash/ios/environment.rb
464
465
  - lib/calabash/ios/gestures.rb
465
466
  - lib/calabash/ios/interactions.rb
467
+ - lib/calabash/ios/legacy.rb
466
468
  - lib/calabash/ios/lib/.irbrc
467
469
  - lib/calabash/ios/lib/recordings/rotate_left_home_down_ipad.base64
468
470
  - lib/calabash/ios/lib/recordings/rotate_left_home_down_iphone.base64
@@ -487,6 +489,7 @@ files:
487
489
  - lib/calabash/ios/slider.rb
488
490
  - lib/calabash/ios/text.rb
489
491
  - lib/calabash/ios/uia.rb
492
+ - lib/calabash/legacy.rb
490
493
  - lib/calabash/lib/skeleton/.gitignore
491
494
  - lib/calabash/lib/skeleton/Gemfile
492
495
  - lib/calabash/lib/skeleton/config/cucumber.yml
@@ -530,7 +533,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
530
533
  version: 1.3.1
531
534
  requirements: []
532
535
  rubyforge_project:
533
- rubygems_version: 2.4.8
536
+ rubygems_version: 2.4.5.1
534
537
  signing_key:
535
538
  specification_version: 4
536
539
  summary: Automated Acceptance Testing for Mobile Apps