cs-bdd 0.1.4 → 0.1.5

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: c75093ffe2bf4ae13702d257de216ab921eba9fd
4
- data.tar.gz: 7530e6d6a895dd9d0d7ae5a21e9e4ecf51be39fb
3
+ metadata.gz: 083aada0c6d56dc360cb8d8edc5e4b22051ce66d
4
+ data.tar.gz: e1dae588adee75ca80bbe0561dfb97cf5c9996ef
5
5
  SHA512:
6
- metadata.gz: 7987646f23fe6bf2fd9eac39e87afe05c50f334e0234d5fec842014126b80518dc00dfc2500ebaabcf6c3a61dcd6cf33eccdb17df4f28e8e1c351291575ae339
7
- data.tar.gz: 0c1baa47ccf26ffae4c10cc178d624e3c8e1ef316d27ed8af3dcf1d09916b1b085d976d80c70b1e81ecdf0c89c7906dd9162622dc3e52d9ae453f47442c2bfcb
6
+ metadata.gz: 00cd5a0d3823e74a8e608bf0640d54bfc318a23113e6b2e182984800d1e54afe1c63921c010bb0cee1e6ecc46c10c15cc7ddc18e07597b29ad3ad7fa1d0abf8e
7
+ data.tar.gz: 3a9c49162395cd0cc3519022aa07cdfa6f56e549e778e908010df6bbc66230d0434f5e0997c25c8c1fe996e71af58ad9b38d79e25a0b1b3a08635942e27ab226
data/.gitignore CHANGED
@@ -12,3 +12,5 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ .irb-history
16
+ .DS_Store
data/Rakefile CHANGED
@@ -1,2 +1 @@
1
- require "bundler/gem_tasks"
2
-
1
+ require 'bundler/gem_tasks'
data/bin/cs-bdd CHANGED
@@ -17,7 +17,9 @@ module CS
17
17
  include Thor::Actions
18
18
 
19
19
  desc 'feature [RESOURCE_NAME]', 'Generates an OS independent feature'
20
- option :lang, banner: 'any of the gherkin supported languages', default: :en
20
+ option :lang,
21
+ banner: 'any of the gherkin supported languages',
22
+ default: :en
21
23
  def feature(name)
22
24
  I18n.config.default_locale = options[:lang]
23
25
  in_root_project_folder?
@@ -29,7 +31,9 @@ module CS
29
31
  end
30
32
 
31
33
  desc 'aFeature [RESOURCE_NAME]', 'Generates an Android dependent feature'
32
- option :lang, banner: 'any of the gherkin supported languages', default: :en
34
+ option :lang,
35
+ banner: 'any of the gherkin supported languages',
36
+ default: :en
33
37
  def aFeature(name)
34
38
  I18n.config.default_locale = options[:lang]
35
39
  in_root_project_folder?
@@ -40,7 +44,9 @@ module CS
40
44
  end
41
45
 
42
46
  desc 'iFeature [RESOURCE_NAME]', 'Generates an iOS dependent feature'
43
- option :lang, banner: 'any of the gherkin supported languages', default: :en
47
+ option :lang,
48
+ banner: 'any of the gherkin supported languages',
49
+ default: :en
44
50
  def iFeature(name)
45
51
  I18n.config.default_locale = options[:lang]
46
52
  in_root_project_folder?
@@ -51,7 +57,9 @@ module CS
51
57
  end
52
58
 
53
59
  desc 'step [RESOURCE_NAME]', 'Generates an OS independent step'
54
- option :lang, banner: 'any of the gherkin supported languages', default: :en
60
+ option :lang,
61
+ banner: 'any of the gherkin supported languages',
62
+ default: :en
55
63
  def step(name)
56
64
  I18n.config.default_locale = options[:lang]
57
65
  in_root_project_folder?
@@ -59,7 +67,9 @@ module CS
59
67
  end
60
68
 
61
69
  desc 'aStep [RESOURCE_NAME]', 'Generates an Android dependent step'
62
- option :lang, banner: 'any of the gherkin supported languages', default: :en
70
+ option :lang,
71
+ banner: 'any of the gherkin supported languages',
72
+ default: :en
63
73
  def aStep(name)
64
74
  I18n.config.default_locale = options[:lang]
65
75
  in_root_project_folder?
@@ -67,15 +77,20 @@ module CS
67
77
  end
68
78
 
69
79
  desc 'iStep [RESOURCE_NAME]', 'Generates an iOS dependent step'
70
- option :lang, banner: 'any of the gherkin supported languages', default: :en
80
+ option :lang,
81
+ banner: 'any of the gherkin supported languages',
82
+ default: :en
71
83
  def iStep(name)
72
84
  I18n.config.default_locale = options[:lang]
73
85
  in_root_project_folder?
74
86
  create_steps_file name, 'IOS'
75
87
  end
76
88
 
77
- desc 'screen [RESOURCE_NAME]', 'Generates the Android and iOS dependent screens'
78
- option :lang, banner: 'any of the gherkin supported languages', default: :en
89
+ desc 'screen [RESOURCE_NAME]',
90
+ 'Generates the Android and iOS dependent screens'
91
+ option :lang,
92
+ banner: 'any of the gherkin supported languages',
93
+ default: :en
79
94
  def screen(name)
80
95
  I18n.config.default_locale = options[:lang]
81
96
  in_root_project_folder?
@@ -84,7 +99,9 @@ module CS
84
99
  end
85
100
 
86
101
  desc 'aScreen [RESOURCE_NAME]', 'Generates an Android dependent screen'
87
- option :lang, banner: 'any of the gherkin supported languages', default: :en
102
+ option :lang,
103
+ banner: 'any of the gherkin supported languages',
104
+ default: :en
88
105
  def aScreen(name)
89
106
  I18n.config.default_locale = options[:lang]
90
107
  in_root_project_folder?
@@ -92,7 +109,9 @@ module CS
92
109
  end
93
110
 
94
111
  desc 'iScreen [RESOURCE_NAME]', 'Generates an iOS dependent screen'
95
- option :lang, banner: 'any of the gherkin supported languages', default: :en
112
+ option :lang,
113
+ banner: 'any of the gherkin supported languages',
114
+ default: :en
96
115
  def iScreen(name)
97
116
  I18n.config.default_locale = options[:lang]
98
117
  in_root_project_folder?
@@ -117,12 +136,20 @@ module CS
117
136
 
118
137
  default_task :help
119
138
 
120
- register CS::BDD::Generate, 'generate', 'generate [GENERATOR] [RESOURCE_NAME]', 'Generates various resources'
121
- register CS::BDD::Generate, 'g', 'g [GENERATOR] [RESOURCE_NAME]', 'Generates various resources'
122
-
123
- desc 'new PROJECT_NAME', 'Generates the structure of a new project that uses Calabash in both Android and iOS apps'
124
- option :lang, banner: 'any of the gherkin supported languages', default: :en
125
- def new name
139
+ register CS::BDD::Generate, 'generate',
140
+ 'generate [GENERATOR] [RESOURCE_NAME]',
141
+ 'Generates various resources'
142
+ register CS::BDD::Generate, 'g',
143
+ 'g [GENERATOR] [RESOURCE_NAME]',
144
+ 'Generates various resources'
145
+
146
+ desc 'new PROJECT_NAME',
147
+ 'Generates the structure of a new project that uses '\
148
+ 'Calabash in both Android and iOS apps'
149
+ option :lang,
150
+ banner: 'any of the gherkin supported languages',
151
+ default: :en
152
+ def new(name)
126
153
  I18n.config.default_locale = options[:lang]
127
154
  # Thor will be responsible to look for identical
128
155
  # files and possibles conflicts
@@ -156,18 +183,32 @@ module CS
156
183
  def initialize(*args)
157
184
  super
158
185
  # Loading gherkin accepted translations
159
- translations_file_path = File.join(Gem.loaded_specs['gherkin'].full_gem_path, 'lib', 'gherkin', 'i18n.json')
186
+ translations_file_path = File.join(
187
+ Gem.loaded_specs['gherkin'].full_gem_path,
188
+ 'lib',
189
+ 'gherkin',
190
+ 'i18n.json'
191
+ )
160
192
  # Parsing the JSON file
161
193
  # Removing the sequence *| and all the alternative
162
194
  # options for the gherkin translations
163
- translations_json = JSON.parse(File.read(translations_file_path).gsub(/\*\|/, '').gsub(/\|.*\"/, '"'))
195
+ translations_json = JSON.parse(
196
+ File.read(translations_file_path)
197
+ .gsub(/\*\|/, '')
198
+ .gsub(/\|.*\"/, '"'))
164
199
  # Converting the translations to YAML and storing in a temp file
165
200
  translations_temp_file = Tempfile.new(['translations', '.yml'])
166
201
  File.write(translations_temp_file, translations_json.to_yaml)
167
202
  # Loading the translations from gherkin and from the
168
203
  # locales folder of this gem
169
- locales_folder_path = File.join(File.dirname(__FILE__),'..', 'lib', 'cs', 'bdd', 'locales')
170
- I18n.load_path = Dir[translations_temp_file, File.join(locales_folder_path, '*.yml')]
204
+ locales_folder_path = File.join(
205
+ File.dirname(__FILE__),
206
+ '..', 'lib', 'cs', 'bdd', 'locales'
207
+ )
208
+ I18n.load_path = Dir[
209
+ translations_temp_file,
210
+ File.join(locales_folder_path, '*.yml')
211
+ ]
171
212
  I18n.backend.load_translations
172
213
  I18n.config.enforce_available_locales = true
173
214
  end
@@ -1,68 +1,77 @@
1
- def create_feature_file name, platform = nil
2
-
1
+ def create_feature_file(name, platform = nil)
3
2
  # options used to generate the file in the template function
4
- opts = {:name => camelize(name)}
3
+ opts = { name: camelize(name) }
5
4
 
6
5
  # If platform is not nil than the feature is OS dependent
7
- file_path = ""
6
+ file_path = ''
8
7
  if platform.nil?
9
- file_path = File.join( FileUtils.pwd, "features", "#{name.downcase}.feature" )
10
- opts[:platform] = ""
8
+ file_path = File.join(FileUtils.pwd, 'features', "#{name.downcase}.feature")
9
+ opts[:platform] = ''
11
10
  else
12
- file_path = File.join( FileUtils.pwd, "features", platform.downcase, "features", "#{name.downcase}.feature" )
11
+ file_path = File.join(
12
+ FileUtils.pwd, 'features', platform.downcase, 'features',
13
+ "#{name.downcase}.feature"
14
+ )
13
15
  opts[:platform] = platform
14
16
  end
15
17
 
16
18
  # Thor creates a file based on the templates/feature.tt template
17
- template( "feature", file_path, opts )
19
+ template('feature', file_path, opts)
18
20
  end
19
21
 
20
- def create_steps_file name, platform = nil
21
-
22
+ def create_steps_file(name, platform = nil)
22
23
  # options used to generate the file in the template function
23
- opts = {:name => camelize(name)}
24
+ opts = { name: camelize(name) }
24
25
 
25
26
  # If platform is not nil than the step is OS dependent
26
27
  file_path = nil
27
28
  if platform.nil?
28
- file_path = File.join( FileUtils.pwd, "features", "step_definitions", "#{name.downcase}_steps.rb" )
29
- opts[:platform] = ""
29
+ file_path = File.join(
30
+ FileUtils.pwd, 'features', 'step_definitions',
31
+ "#{name.downcase}_steps.rb"
32
+ )
33
+ opts[:platform] = ''
30
34
  else
31
- file_path = File.join( FileUtils.pwd, "features", platform.downcase, "step_definitions", "#{name.downcase}_steps.rb" )
35
+ file_path = File.join(
36
+ FileUtils.pwd, 'features', platform.downcase, 'step_definitions',
37
+ "#{name.downcase}_steps.rb"
38
+ )
32
39
  opts[:platform] = platform
33
40
  end
34
41
 
35
42
  # Thor creates a file based on the templates/steps.tt template
36
- template( "steps", file_path, opts )
43
+ template('steps', file_path, opts)
37
44
  end
38
45
 
39
- def create_screen_file name, platform
40
-
46
+ def create_screen_file(name, platform)
41
47
  # options used to generate the file in the template function
42
- opts = {:name => camelize(name), :platform => platform}
48
+ opts = { name: camelize(name), platform: platform }
43
49
 
44
50
  # Thor creates a file based on the templates/screen.tt template
45
- template( "screen", File.join( FileUtils.pwd, "features", platform.downcase, "screens", "#{name.downcase}_screen.rb"), opts )
51
+ template('screen',
52
+ File.join(
53
+ FileUtils.pwd, 'features', platform.downcase, 'screens',
54
+ "#{name.downcase}_screen.rb"),
55
+ opts)
46
56
  end
47
57
 
48
- def camelize string
58
+ def camelize(string)
59
+ camelized = ''
49
60
 
50
- camelized = ""
51
-
52
- string.split("_").each do |s|
53
- camelized = camelized + s.capitalize
61
+ string.split('_').each do |s|
62
+ camelized += s.capitalize
54
63
  end
55
64
 
56
- return camelized
65
+ camelized
57
66
  end
58
67
 
59
68
  def in_root_project_folder?
60
69
  # Looks if the user is in the root folder of the project
61
- if !Dir.exists? File.join(FileUtils.pwd, "features", "android", "features") or
62
- !Dir.exists? File.join(FileUtils.pwd, "features", "ios", "features")
63
- puts "Please run this command on the root folder of the project"
70
+ if !Dir.exist?(File.join(FileUtils.pwd, 'features', 'android', 'features')) ||
71
+ !Dir.exist?(File.join(FileUtils.pwd, 'features', 'ios', 'features'))
72
+ puts 'Please run this command on the root folder of the project'
64
73
  exit 1
65
74
  end
66
75
 
67
- return true
68
- end
76
+ true
77
+ end
@@ -4,24 +4,23 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'cs/bdd/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "cs-bdd"
7
+ spec.name = 'cs-bdd'
8
8
  spec.version = CS::BDD::VERSION
9
- spec.authors = ["Oscar Tanner"]
10
- spec.email = ["oscar.tanner@concretesolutions.com.br"]
11
- spec.summary = %q{Generates an android and iOS calabash project.}
9
+ spec.authors = ['Oscar Tanner']
10
+ spec.email = ['oscar.tanner@concretesolutions.com.br']
11
+ spec.summary = 'Generates an android and iOS calabash project.'
12
12
  spec.description = %q{A simple gem to generate all files needed in a project that will support Calabash for both Android and iOS.}
13
- spec.homepage = "https://github.com/CSOscarTanner/cs-bdd"
14
- spec.license = "MIT"
13
+ spec.homepage = 'https://github.com/CSOscarTanner/cs-bdd'
14
+ spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = ["cs-bdd"]
17
+ spec.executables = ['cs-bdd']
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
-
21
- spec.add_runtime_dependency "bundler", "~> 1.7"
22
- spec.add_runtime_dependency "rake", "~> 10.0"
23
- spec.add_runtime_dependency "thor", "~> 0.19.1"
24
- spec.add_runtime_dependency "i18n", "~> 0.6.11"
25
- spec.add_runtime_dependency "gherkin", "~> 2.12.2"
19
+ spec.require_paths = ['lib']
26
20
 
21
+ spec.add_runtime_dependency 'bundler', '~> 1.7'
22
+ spec.add_runtime_dependency 'rake', '~> 10.0'
23
+ spec.add_runtime_dependency 'thor', '~> 0.19.1'
24
+ spec.add_runtime_dependency 'i18n', '~> 0.6.11'
25
+ spec.add_runtime_dependency 'gherkin', '~> 2.12.2'
27
26
  end
@@ -1,6 +1,7 @@
1
- require "cs/bdd/version"
1
+ require 'cs/bdd/version'
2
2
 
3
3
  module CS
4
+ # Your docs goes here...
4
5
  module BDD
5
6
  # Your code goes here...
6
7
  end
@@ -6,7 +6,7 @@ pt:
6
6
  trait: "Identificador da tela"
7
7
  insert_steps: "Insira os passos"
8
8
  elements: "Declare todos os elementos da tela"
9
- actions: "Declare todas as ações da tela"
9
+ actions: "Declare todas as acoes da tela"
10
10
  steps:
11
11
  drag_until: 'que Eu (?:arrastei|arrasto) a tela para (baixo|cima|esquerda|direita) até ver o elemento "(.*?)"'
12
12
  page_contains: "que Eu estou em uma página que contem '(.*?)'"
@@ -1,5 +1,5 @@
1
1
  module CS
2
2
  module BDD
3
- VERSION = '0.1.4'
3
+ VERSION = '0.1.5'
4
4
  end
5
5
  end
@@ -2,3 +2,4 @@
2
2
  reports/*
3
3
  test_servers/*
4
4
  .DS_Store
5
+ screenshot*.png
@@ -1,15 +1,14 @@
1
1
  # Gemfile to help setting up the initial development environment
2
- source "https://rubygems.org"
2
+ source 'https://rubygems.org'
3
3
 
4
4
  gem 'calabash-common', '~> 0.0.1'
5
- gem 'calabash-android', '~> 0.5.5'
5
+ gem 'calabash-android', '~> 0.5.14'
6
6
 
7
7
  # Gems that will only be used with the computer is a Mac
8
8
  group :mac_os do
9
- # Rementer to fix a calabash-cucumber version. The update of this gem is a proccess
10
- # that you need to update de Calabash Server on your iOS application code. So I suggest
11
- # doing the update manually
12
- gem 'calabash-cucumber', '~> 0.12.2'
9
+ # Remenber to fix the calabash-cucumber version. The update of this gem is
10
+ # a proccess that you need to update the Calabash Server on your iOS
11
+ # application code. So I suggest doing the update manually
12
+ gem 'calabash-cucumber', '~> 0.16.4'
13
13
  gem 'cocoapods', '~> 0.35.0'
14
14
  end
15
-
@@ -0,0 +1,19 @@
1
+ # Choosing the platform using the current context LOAD PATH
2
+ # and looking for the gems of calabash
3
+ platform = ''
4
+ $LOAD_PATH.each do |path|
5
+ platform = 'android' if path.include? 'calabash-android'
6
+ platform = 'ios' if path.include? 'calabash-cucumber'
7
+ end
8
+
9
+ platform_path = File.join(File.expand_path('.', Dir.pwd), 'features', platform)
10
+
11
+ # Loading all ruby files in the base screen path
12
+ Dir[File.join(platform_path, '*.rb')].each do |file|
13
+ load file
14
+ end
15
+
16
+ # Loading all screens files
17
+ Dir[File.join(platform_path, 'screens', '*.rb')].each do |screen|
18
+ load screen
19
+ end
@@ -1,13 +1,11 @@
1
1
  # Looking for errors on the report files and returns an error
2
2
  cd "$WORKSPACE/reports-cal"
3
- export TESTS_RESULT=""
3
+
4
+ export TESTS_RESULT="Ok"
4
5
  for folder in *
5
6
  do
6
- if egrep '\([0-9]+ passed\)' "$folder/reports.html"
7
+ if egrep '[0-9]+ failed' "$folder/reports.html"
7
8
  then
8
- [ "$TESTS_RESULT" == "Failed" ] && continue
9
- export TESTS_RESULT="Ok"
10
- else
11
9
  export TESTS_RESULT="Failed"
12
10
  fi
13
11
  done
@@ -7,7 +7,7 @@
7
7
  # $2 -> parameter with the path of the .app bundle for devices
8
8
 
9
9
  ## CODE BEGIN #############################################################
10
-
10
+ export LC_ALL="en_US.UTF-8"
11
11
  echo Start: $(date)
12
12
 
13
13
  # Exits if the app path was not informed
@@ -1,33 +1,32 @@
1
1
  require 'calabash-android/management/app_installation'
2
2
 
3
- AfterConfiguration do |config|
3
+ AfterConfiguration do
4
4
  FeatureNameMemory.feature_name = nil
5
5
  end
6
6
 
7
- Before('@reinstall') do |scenario|
7
+ Before('@reinstall') do
8
8
  uninstall_apps
9
- install_app(ENV["TEST_APP_PATH"])
10
- install_app(ENV["APP_PATH"])
9
+ install_app(ENV['TEST_APP_PATH'])
10
+ install_app(ENV['APP_PATH'])
11
11
  end
12
12
 
13
13
  Before do |scenario|
14
- @scenario_is_outline = (scenario.class == Cucumber::Ast::OutlineTable::ExampleRow)
15
- if @scenario_is_outline
16
- scenario = scenario.scenario_outline
17
- end
14
+ @scenario_is_outline =
15
+ (scenario.class == Cucumber::Ast::OutlineTable::ExampleRow)
16
+ scenario = scenario.scenario_outline if @scenario_is_outline
18
17
 
19
18
  feature_name = scenario.feature.title
20
- if FeatureNameMemory.feature_name != feature_name \
21
- or ENV["RESET_BETWEEN_SCENARIOS"] == "1"
22
- if ENV["RESET_BETWEEN_SCENARIOS"] == "1"
23
- log "New scenario - reinstalling apps"
19
+ if FeatureNameMemory.feature_name != feature_name ||
20
+ ENV['RESET_BETWEEN_SCENARIOS'] == '1'
21
+ if ENV['RESET_BETWEEN_SCENARIOS'] == '1'
22
+ log 'New scenario - reinstalling apps'
24
23
  else
25
- log "First scenario in feature - reinstalling apps"
24
+ log 'First scenario in feature - reinstalling apps'
26
25
  end
27
-
26
+
28
27
  uninstall_apps
29
- install_app(ENV["TEST_APP_PATH"])
30
- install_app(ENV["APP_PATH"])
28
+ install_app(ENV['TEST_APP_PATH'])
29
+ install_app(ENV['APP_PATH'])
31
30
 
32
31
  FeatureNameMemory.feature_name = feature_name
33
32
  FeatureNameMemory.invocation = 1
@@ -40,4 +39,4 @@ FeatureNameMemory = Class.new
40
39
  class << FeatureNameMemory
41
40
  @feature_name = nil
42
41
  attr_accessor :feature_name, :invocation
43
- end
42
+ end
@@ -1,13 +1,11 @@
1
1
  require 'calabash-android/management/adb'
2
2
  require 'calabash-android/operations'
3
3
 
4
- Before do |scenario|
4
+ Before do
5
5
  start_test_server_in_background
6
6
  end
7
7
 
8
8
  After do |scenario|
9
- if scenario.failed?
10
- screenshot_embed
11
- end
9
+ screenshot_embed if scenario.failed?
12
10
  shutdown_test_server
13
- end
11
+ end
@@ -14,43 +14,34 @@
14
14
 
15
15
  require 'calabash-cucumber/launcher'
16
16
 
17
- # APP_BUNDLE_PATH = "~/Library/Developer/Xcode/DerivedData/??/Build/Products/Calabash-iphonesimulator/??.app"
18
- # You may uncomment the above to overwrite the APP_BUNDLE_PATH
19
- # However the recommended approach is to let Calabash find the app itself
20
- # or set the environment variable APP_BUNDLE_PATH
17
+ Before do |scenario|
18
+ @calabash_launcher = Calabash::Cucumber::Launcher.new
21
19
 
22
- Before('@reinstall') do |scenario|
23
- reinstall_app
24
- end
20
+ @scenario_is_outline =
21
+ (scenario.class == Cucumber::Ast::OutlineTable::ExampleRow)
22
+ scenario = scenario.scenario_outline if @scenario_is_outline
25
23
 
26
- Before do |scenario|
27
-
28
- # If the scenario is outline, to get the feature title we have to access a different attribute of the variable scenario,
29
- # so this function changes the value of the scenario variable so we don't have to do this on the verification step below
30
- @scenario_is_outline = (scenario.class == Cucumber::Ast::OutlineTable::ExampleRow)
31
- if @scenario_is_outline
32
- scenario = scenario.scenario_outline
33
- end
34
- # Looks if is a new feature that will be executed
35
- if ENV['FEATURE_NAME'] != scenario.feature.title # ENV['FEATURE_NAME'] is just an aux created to store the feature name
36
- reinstall_app # always reinstall the app before a the execution of a new feature
24
+ scenario_tags = scenario.source_tag_names
25
+ # Resetting the app between scenarios
26
+ # ENV['FEATURE_NAME'] is just an aux created to store the feature name
27
+ if ENV['FEATURE_NAME'] != scenario.feature.title ||
28
+ ENV['RESET_BETWEEN_SCENARIOS'] == '1' ||
29
+ scenario_tags.include?('@reinstall')
30
+
31
+ @calabash_launcher.reset_app_jail
37
32
  ENV['FEATURE_NAME'] = scenario.feature.title
38
- end
33
+ end
39
34
 
40
- @calabash_launcher = Calabash::Cucumber::Launcher.new
41
35
  unless @calabash_launcher.calabash_no_launch?
42
- @calabash_launcher.relaunch({:timeout => 300})
36
+ @calabash_launcher.relaunch
43
37
  @calabash_launcher.calabash_notify(self)
44
38
  end
45
-
46
39
  end
47
40
 
48
- After do |scenario|
41
+ After do
49
42
  unless @calabash_launcher.calabash_no_stop?
50
43
  calabash_exit
51
- if @calabash_launcher.active?
52
- @calabash_launcher.stop
53
- end
44
+ @calabash_launcher.stop if @calabash_launcher.active?
54
45
  end
55
46
  end
56
47
 
@@ -60,81 +51,3 @@ at_exit do
60
51
  launcher.simulator_launcher.stop unless launcher.calabash_no_stop?
61
52
  end
62
53
  end
63
-
64
- # Install or reinstall the app on the device
65
- def reinstall_app
66
-
67
- if !is_simulator? ENV['DEVICE_TARGET']
68
-
69
- system "echo 'Installing the app...'"
70
-
71
- # Trying to reinstall the app
72
- success = system "ios-deploy -r -b #{ENV['APP_BUNDLE_PATH']} -i #{ENV['DEVICE_TARGET']} -t 5 > /dev/null"
73
-
74
- # If the app is not installed the above command will throw an error
75
- # So we just install the app
76
- if !success
77
- success = system "ios-deploy -b #{ENV['APP_BUNDLE_PATH']} -i #{ENV['DEVICE_TARGET']} -t 5 > /dev/null"
78
- if !success # If there is any error raises an exception
79
- raise 'Error. Could not install the app.'
80
- end
81
- end
82
-
83
- system "echo 'Installed.'"
84
-
85
- sleep(3) # Gives to the iphone a time to finish the installation of the app
86
- else # If test is in a simulator
87
-
88
- # Shutdown all the booted simulators to avoid problems with the switch of simulatores
89
- # on the automated tests (like when on jenkins)
90
- shutdown_booted_simulators
91
-
92
- # APP_BUNDLE_ID must be set in order to uninstall the app from the simulator
93
- # You can either pass it as a parameter in the cucumber command or set it here
94
- #ENV["APP_BUNDLE_ID"] = "bundle_id"
95
-
96
- # Booting the device to avoid problems with the app installation
97
- %x(open -a 'iOS Simulator' --args -CurrentDeviceUDID #{ENV['DEVICE_TARGET']} > /dev/null)
98
- sleep(7)
99
-
100
- # Reinstalling the app using terminal commands
101
- system "echo 'Installing the app...'"
102
-
103
- # Removing the app
104
- %x(xcrun simctl uninstall #{ENV['DEVICE_TARGET']} #{ENV['APP_BUNDLE_ID']} > /dev/null)
105
-
106
- # Installing the app
107
- %x(xcrun simctl install #{ENV['DEVICE_TARGET']} #{ENV['APP_BUNDLE_PATH']} > /dev/null)
108
-
109
- system "echo 'Installed.'"
110
-
111
- end
112
-
113
- end
114
-
115
- # Checks if the UUID belongs to a Device or a Simulator
116
- def is_simulator? uuid
117
- # Check if UUID is from a device or a simulator
118
- # Getting all the simulator's UUID
119
- uuids = `xcrun simctl list`
120
- return true if uuids.include? uuid
121
- return false
122
- end
123
-
124
- # Kill all simulators process, lists all the booted simulators and shut them down
125
- def shutdown_booted_simulators
126
-
127
- # Closing all Simulators running
128
- %x(killall "iOS Simulator")
129
-
130
- # Listing all the booted devices
131
- booted_simulators = `xcrun simctl list | grep 'Booted'`
132
-
133
- # Getting the UUIDs
134
- booted_simulators.split("\n").each do |simulator|
135
- uuid = simulator.split("(")[1].gsub(")", "").gsub(" ","")
136
- # Shuting the simulator down
137
- %x(xcrun simctl shutdown #{uuid})
138
- end
139
-
140
- end
@@ -1,5 +1,5 @@
1
1
  if ENV['PLATFORM'] == 'ios'
2
- require 'calabash-cucumber/cucumber'
2
+ require 'calabash-cucumber/cucumber'
3
3
  elsif ENV['PLATFORM'] == 'android'
4
4
  require 'calabash-android/cucumber'
5
- end
5
+ end
@@ -1,27 +1,27 @@
1
1
  require 'calabash-android/abase'
2
2
 
3
3
  class AndroidScreenBase < Calabash::ABase
4
-
5
4
  def self.element(element_name, &block)
6
5
  define_method(element_name.to_s, *block)
7
6
  end
8
7
 
9
8
  class << self
10
- alias :value :element
11
- alias :action :element
12
- alias :trait :element
9
+ alias_method :value, :element
10
+ alias_method :action, :element
11
+ alias_method :trait, :element
13
12
  end
14
13
 
15
- element(:loading_screen) {"insert_loading_view_id"}
14
+ element(:loading_screen) { 'insert_loading_view_id' }
16
15
 
17
16
  # The progress bar of the application is a custom view
18
17
  def wait_for_progress
19
- wait_for_element_does_not_exist("* id:'#{loading_screen}'", { :timeout => 10 } )
18
+ sleep(2)
19
+ wait_for_element_does_not_exist("* id:'#{loading_screen}'",
20
+ timeout: 10)
20
21
  end
21
22
 
22
- def drag_to direction
23
-
24
- positions = [0,0,0,0] # [ 'from_x', 'to_x', 'from_y', 'to_y' ]
23
+ def drag_to(direction)
24
+ positions = [0, 0, 0, 0] # [ 'from_x', 'to_x', 'from_y', 'to_y' ]
25
25
 
26
26
  case(direction)
27
27
  when :<%= (I18n.translate "directions.down").to_sym %>
@@ -34,20 +34,22 @@ class AndroidScreenBase < Calabash::ABase
34
34
  positions = [20,90,80,80]
35
35
  end
36
36
 
37
- # perform_action( 'action', 'from_x', 'to_x', 'from_y', 'to_y', 'number of steps (in this case, velocity of drag' )
38
- perform_action('drag', positions[0], positions[1], positions[2], positions[3], 15)
39
-
37
+ # perform_action( 'action', 'from_x', 'to_x', 'from_y', 'to_y',
38
+ # 'number of steps (in this case, velocity of drag' )
39
+ perform_action('drag', positions[0], positions[1],
40
+ positions[2], positions[3], 15)
40
41
  sleep(1)
41
42
  end
42
43
 
43
- def drag_until_element_is_visible_with_special_query direction, element
44
- drag_until_element_is_visible direction, element, "* {text CONTAINS[c] '#{element}'}"
44
+ def drag_until_element_is_visible_with_special_query(direction, element)
45
+ drag_until_element_is_visible direction, element,
46
+ "* {text CONTAINS[c] '#{element}'}"
45
47
  end
46
48
 
47
- def drag_until_element_is_visible direction, element, query = nil, limit = 15
49
+ def drag_until_element_is_visible(direction, element, query = nil, limit = 15)
48
50
  i = 0
49
51
 
50
- element_query = ""
52
+ element_query = ''
51
53
  if query.nil?
52
54
  element_query = "* marked:'#{element}'"
53
55
  else
@@ -55,62 +57,73 @@ class AndroidScreenBase < Calabash::ABase
55
57
  end
56
58
 
57
59
  sleep(2)
58
- while( !element_exists(element_query) and i < limit) do
60
+ while !element_exists(element_query) && i < limit
59
61
  drag_to direction
60
- i = i + 1
62
+ i += 1
61
63
  end
62
64
 
63
- raise ("Executed #{limit} moviments #{direction.to_s} and the element '#{element}' was not found on this view!") unless i < limit
65
+ fail "Executed #{limit} moviments #{direction} and "\
66
+ "the element '#{element}' was not found on this view!" unless
67
+ i < limit
64
68
  end
65
69
 
66
- def drag_for_specified_number_of_times direction, times
70
+ def drag_for_specified_number_of_times(direction, times)
67
71
  times.times do
68
72
  drag_to direction
69
73
  end
70
74
  end
71
75
 
72
- # Negation indicates that we want a page that doesn't has the message passed as parameter
73
- def is_on_page? page_text, negation = ''
76
+ # Negation indicates that we want a page that doesn't
77
+ # has the message passed as parameter
78
+ def is_on_page?(page_text, negation = '')
74
79
  should_not_have_exception = false
75
80
  should_have_exception = false
76
81
  begin
77
82
  wait_for(timeout: 5) { has_text? page_text }
78
- # If negation is not nil, we should raise an error if this message was found on the view
83
+ # If negation is not nil, we should raise an error
84
+ # if this message was found on the view
79
85
  should_not_have_exception = true unless negation == ''
80
86
  rescue
81
- # only raise exception if negation is nil, otherwise this is the expected behaviour
87
+ # only raise exception if negation is nil,
88
+ # otherwise this is the expected behaviour
82
89
  should_have_exception = true if negation == ''
83
90
  end
84
91
 
85
- raise "Unexpected Page. The page should not have: '#{page_text}'" if should_not_have_exception
92
+ fail "Unexpected Page. The page should not have: '#{page_text}'" if
93
+ should_not_have_exception
86
94
 
87
- raise "Unexpected Page. Expected was: '#{page_text}'" if should_have_exception
95
+ fail "Unexpected Page. Expected was: '#{page_text}'" if
96
+ should_have_exception
88
97
  end
89
98
 
90
- def enter text, element, query = nil
99
+ def enter(text, element, query = nil)
91
100
  if query.nil?
92
- query( "* marked:'#{element}'", {:setText => text} )
101
+ query("* marked:'#{element}'", setText: text)
93
102
  else
94
- query( query, {:setText => text} )
103
+ query(query, setText: text)
95
104
  end
96
105
  end
97
106
 
98
- def touch_screen_element element, query = nil
107
+ def touch_screen_element(element, query = nil)
99
108
  query = "* id:'#{element}'" if query.nil?
100
- wait_for(timeout: 5) { element_exists(query) }
101
- touch(query)
102
- end
109
+ begin
110
+ wait_for(timeout: 5) { element_exists(query) }
111
+ touch(query)
112
+ rescue => e
113
+ raise "Problem in touch screen element: '#{element}'\nError Message: #{e.message}"
114
+ end
115
+ end
103
116
 
104
- def touch_element_by_index id, index
105
- wait_for(:timeout => 5) { element_exists("* id:'#{id}' index:#{index}") }
117
+ def touch_element_by_index(id, index)
118
+ wait_for(timeout: 5) { element_exists("* id:'#{id}' index:#{index}") }
106
119
  touch("* id:'#{id}' index:#{index}")
107
120
  end
108
121
 
109
- def clear_text_field field
122
+ def clear_text_field(field)
110
123
  clear_text_in("android.widget.EditText id:'#{field}'}")
111
124
  end
112
125
 
113
- def select_date_on_date_picker date, date_picker_field_id
126
+ def select_date_on_date_picker(date, date_picker_field_id)
114
127
  # Touch the date picker field
115
128
  touch "* id:'#{date_picker_field_id}'"
116
129
 
@@ -120,5 +133,4 @@ class AndroidScreenBase < Calabash::ABase
120
133
  # Clicking in the Done button
121
134
  touch "* id:'button1'"
122
135
  end
123
-
124
136
  end
@@ -1,53 +1,32 @@
1
1
  require 'calabash-cucumber/ibase'
2
2
 
3
3
  class IOSScreenBase < Calabash::IBase
4
-
5
4
  def self.element(element_name, &block)
6
5
  define_method(element_name.to_s, *block)
7
6
  end
8
7
 
9
8
  class << self
10
- alias :value :element
11
- alias :action :element
12
- alias :trait :element
9
+ alias_method :value, :element
10
+ alias_method :action, :element
11
+ alias_method :trait, :element
13
12
  end
14
13
 
15
14
  element(:loading_screen) { 'LOADING' }
16
15
 
17
16
  # The progress bar of the application is a custom view
18
17
  def wait_for_progress
19
- wait_for(:timeout => 10) { element_does_not_exist "* marked:'#{loading_screen}'" }
18
+ sleep(2)
19
+ wait_for(timeout: 10) { element_does_not_exist "* marked:'#{loading_screen}'" }
20
20
  end
21
21
 
22
22
  def has_text?(text)
23
- !query("* {text CONTAINS[c] '#{text}'}").empty? or !query("* {accessibilityLabel CONTAINS[c] '#{text}'}").empty?
24
- end
25
-
26
- def drag_to direction
27
-
28
- # iOS swipe command doesn't work.
29
- # For a workaround we need to use the scroll function, but it only work after a swipe command
30
-
31
- # iOS swipe :up and :down are the opposite of the Android directions
32
- # Setting swipe_opt that will define the swipe 'force'
33
- swipe_opt = nil
34
- case direction
35
- when :<%= (I18n.translate "directions.left").to_sym %>
36
- direction = :left
37
- swipe_opt = {:'swipe-delta' => {:horizontal=>{:dx => 280} }, :offset => { :x => 300, :y => 300 } }
38
- when :<%= (I18n.translate "directions.right").to_sym %>
39
- direction = :right
40
- swipe_opt = {:'swipe-delta' => {:horizontal=>{:dx => 250} }, :offset => { :x => 50, :y => 300 } }
41
- when :<%= (I18n.translate "directions.up").to_sym %>
42
- direction = :down
43
- swipe_opt = {:'swipe-delta' => {:vertical=>{:dy => 200} }, :offset => { :x => 160, :y => 100 } }
44
- when :<%= (I18n.translate "directions.down").to_sym %>
45
- direction = :up
46
- swipe_opt = {:'swipe-delta' => {:vertical=>{:dy => 200} }, :offset => { :x => 160, :y => 400 } }
47
- end
48
-
49
- swipe(direction, swipe_opt)
23
+ !query("* {text CONTAINS[c] '#{text}'}").empty? ||
24
+ !query("* {accessibilityLabel CONTAINS[c] '#{text}'}").empty?
25
+ end
50
26
 
27
+ def drag_to(direction, element = nil)
28
+ element = 'tableView' if element.nil?
29
+ scroll(element, direction)
51
30
  sleep(1)
52
31
  end
53
32
 
@@ -55,79 +34,79 @@ class IOSScreenBase < Calabash::IBase
55
34
  # so this function looks for these two properties on the screen. When the query
56
35
  # looks for just a part of the text (CONTAINS[c]) then we need to specify if
57
36
  # we will look in accessibilityLabel or in any other propertie (marked)
58
- def ios_element_exists? query
37
+ def ios_element_exists?(query)
59
38
  second_query = nil
60
39
 
61
- if query.include? "CONTAINS[c]"
62
- if query.include? "marked"
63
- second_query = query.gsub( 'marked', 'accessibilityLabel' )
40
+ if query.include? 'CONTAINS[c]'
41
+ if query.include? 'marked'
42
+ second_query = query.gsub('marked', 'accessibilityLabel')
64
43
  end
65
- if query.include? "accessibilityLabel"
66
- second_query = query.gsub( 'accessibilityLabel', 'marked' )
44
+ if query.include? 'accessibilityLabel'
45
+ second_query = query.gsub('accessibilityLabel', 'marked')
67
46
  end
68
47
  end
69
48
 
70
49
  if second_query.nil?
71
50
  return element_exists(query)
72
51
  else
73
- element_exists(query) or element_exists(second_query)
52
+ element_exists(query) || element_exists(second_query)
74
53
  end
75
54
  end
76
55
 
77
- def drag_until_element_is_visible_with_special_query direction, element
78
- drag_until_element_is_visible direction, element, "* {accessibilityLabel CONTAINS[c] '#{element}'}"
56
+ def drag_until_element_is_visible_with_special_query(direction, element)
57
+ drag_until_element_is_visible direction, element,
58
+ "* {accessibilityLabel CONTAINS[c] '#{element}'}"
79
59
  end
80
60
 
81
- def drag_until_element_is_visible direction, element, query = nil, limit = 15
61
+ def drag_until_element_is_visible(direction, element, query = nil, limit = 15)
82
62
  i = 0
83
63
 
84
- element_query = ""
85
- if query.nil?
86
- element_query = "* marked:'#{element}'"
87
- else
88
- element_query = query
89
- end
64
+ query = "* marked:'#{element}'" if query.nil?
90
65
 
91
66
  sleep(1)
92
- while( !ios_element_exists?(element_query) and i < limit) do
67
+ while !ios_element_exists?(query) && i < limit
93
68
  drag_to direction
94
- i = i + 1
69
+ i += 1
95
70
  end
96
71
 
97
- raise ("Executed #{limit} moviments #{direction.to_s} and the element '#{element}' was not found on this view!") unless i < limit
72
+ fail "Executed #{limit} moviments #{direction} and the "\
73
+ "element '#{element}' was not found on this view!" unless i < limit
98
74
  end
99
75
 
100
- def drag_for_specified_number_of_times direction, times
76
+ def drag_for_specified_number_of_times(direction, times)
101
77
  times.times do
102
78
  drag_to direction
103
79
  end
104
80
  end
105
81
 
106
- # Negation indicates that we want a page that doesn't has the message passed as parameter
82
+ # Negation indicates that we want a page that doesn't has
83
+ # the message passed as parameter
107
84
  def is_on_page?(page_text, negation = '')
108
85
  should_not_have_exception = false
109
86
  should_have_exception = false
110
87
  begin
111
88
  wait_for(timeout: 5) { has_text? page_text }
112
- # If negation is not nil, we should raise an error if this message was found on the view
89
+ # If negation is not nil, we should raise an error
90
+ # if this message was found on the view
113
91
  should_not_have_exception = true unless negation == ''
114
92
  rescue
115
- # only raise exception if negation is nil, otherwise this is the expected behaviour
93
+ # only raise exception if negation is nil,
94
+ # otherwise this is the expected behaviour
116
95
  should_have_exception = true if negation == ''
117
96
  end
118
97
 
119
- raise "Unexpected Page. The page should not have: '#{page_text}'" if should_not_have_exception
98
+ fail "Unexpected Page. The page should not have: '#{page_text}'" if
99
+ should_not_have_exception
120
100
 
121
- raise "Unexpected Page. Expected was: '#{page_text}'" if should_have_exception
101
+ fail "Unexpected Page. Expected was: '#{page_text}'" if
102
+ should_have_exception
122
103
  end
123
104
 
124
- def enter text, element, query = nil
125
- if query.nil?
126
- query = "* marked:'#{element}'"
127
- end
105
+ def enter(text, element, query = nil)
106
+ query = "* marked:'#{element}'" if query.nil?
128
107
 
129
108
  begin
130
- wait_for(:timeout => 5) { element_exists query }
109
+ wait_for(timeout: 5) { element_exists query }
131
110
  rescue
132
111
  # Just a better exception message
133
112
  raise "Element '#{element}' not found on view!"
@@ -136,50 +115,69 @@ class IOSScreenBase < Calabash::IBase
136
115
  touch query
137
116
  # Waits up to 20 seconds for the keyboard to show up
138
117
  begin
139
- wait_for(:timeout => 10) { element_exists("view:'UIKeyboardAutomatic'") }
118
+ wait_for(timeout: 10) { element_exists("view:'UIKeyboardAutomatic'") }
140
119
  rescue
141
- # If the keyboard didn't show up, tries another time before rainsing the error message
120
+ # If the keyboard didn't show up, tries another time
121
+ # before rainsing the error message
142
122
  touch query
143
- wait_for(:timeout => 5) { element_exists("view:'UIKeyboardAutomatic'") }
123
+ wait_for(timeout: 5) { element_exists("view:'UIKeyboardAutomatic'") }
144
124
  end
145
125
 
146
126
  keyboard_enter_text text
147
- done
148
127
  end
149
128
 
150
- def touch_screen_element element
129
+ def touch_screen_element(element, query = nil)
130
+ query = "* marked:'#{element}'" if query.nil?
151
131
  begin
152
- wait_for(:timeout => 5) { element_exists("* marked:'#{element}'") }
153
- touch "* marked:'#{element}'"
154
- rescue
155
- raise "Element #{element} not found on the view"
132
+ wait_for(timeout: 5) { element_exists(query) }
133
+ touch query
134
+ rescue => e
135
+ raise "Problem in touch screen element: '#{element}'\nError Message: #{e.message}"
156
136
  end
157
137
  end
158
138
 
159
- def touch_element_by_index id, index
160
- wait_for(:timeout => 5) { element_exists("* marked:'#{id}' index:#{index}") }
161
- touch("* marked:'#{id}' index:#{index}")
139
+ def touch_element_by_index(id, index)
140
+ query = "* marked:'#{id}' index:#{index}"
141
+ wait_for(timeout: 5) { element_exists(query) }
142
+ touch(query)
162
143
  end
163
144
 
164
- def clear_text_field field
145
+ def clear_text_field(field)
165
146
  clear_text("textField marked:'#{field}'")
166
147
  end
167
148
 
168
- def select_date_on_date_picker date, date_picker_field_id
149
+ def select_date_on_date_picker(date, date_picker_field_id)
169
150
  # Touch the date picker element
170
151
  touch_screen_element date_picker_field_id
171
152
  # Waiting for the date picker to show up
172
153
  wait_for(timeout: 5) { element_exists("view:'UIDatePicker'") }
173
154
 
174
155
  # If date is today, then we have nothing to do
175
- if date.year != DateTime.now.year || date.month != DateTime.now.month || date.day != DateTime.now.day
156
+ if date.year != DateTime.now.year ||
157
+ date.month != DateTime.now.month ||
158
+ date.day != DateTime.now.day
176
159
  # Selecting 'date' on the date picker
177
160
  picker_set_date_time date
178
161
  end
179
162
 
180
163
  # Touch the OK button
181
- touch_screen_element 'Ok'
182
-
164
+ touch_screen_element 'Ok'
183
165
  end
184
166
 
167
+ def touch_picker_item_by_index(index)
168
+ label = query('pickerView', :delegate,
169
+ [{ pickerView: nil }, { titleForRow: index },
170
+ { forComponent: 0 }])
171
+
172
+ # Exception if element no found
173
+ fail "Picker item index #{index} not found." if label.nil?
174
+ # Label is an array of 1 element. Just picking the first.
175
+ label = label.first
176
+
177
+ # Touching the first item using it's text and Javascript function
178
+ uia(%[uia.selectPickerValues('{0 "#{label}"}')])
179
+
180
+ # Touching the OK button to close the Picker
181
+ touch "* marked:'OK'"
182
+ end
185
183
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cs-bdd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Tanner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-26 00:00:00.000000000 Z
11
+ date: 2015-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -106,6 +106,7 @@ files:
106
106
  - lib/skeleton/README.md
107
107
  - lib/skeleton/config/cucumber.yml
108
108
  - lib/skeleton/config/email/template.html
109
+ - lib/skeleton/config/load_classes.rb
109
110
  - lib/skeleton/config/scripts/android/run_tests_all_devices.sh
110
111
  - lib/skeleton/config/scripts/android/start_emulators.sh
111
112
  - lib/skeleton/config/scripts/android/stop_emulators.sh