howitzer 1.1.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +32 -0
  4. data/.travis.yml +1 -4
  5. data/.yardopts +1 -2
  6. data/CHANGELOG.md +28 -1
  7. data/Gemfile +6 -0
  8. data/LICENSE +1 -1
  9. data/README.md +55 -85
  10. data/Rakefile +7 -7
  11. data/bin/howitzer +56 -31
  12. data/features/cli_new.feature +162 -79
  13. data/features/cli_update.feature +114 -21
  14. data/features/step_definitions/common_steps.rb +29 -9
  15. data/features/support/env.rb +1 -1
  16. data/features/support/transformers.rb +2 -2
  17. data/generators/base_generator.rb +121 -49
  18. data/generators/config/config_generator.rb +8 -5
  19. data/generators/config/templates/boot.rb +14 -0
  20. data/generators/config/templates/capybara.rb +156 -0
  21. data/generators/config/templates/custom.yml +2 -3
  22. data/generators/config/templates/default.yml +50 -82
  23. data/generators/cucumber/cucumber_generator.rb +9 -9
  24. data/generators/cucumber/templates/common_steps.rb +4 -4
  25. data/generators/cucumber/templates/cucumber.rake +63 -54
  26. data/generators/cucumber/templates/env.rb +24 -23
  27. data/generators/cucumber/templates/transformers.rb +23 -15
  28. data/generators/emails/emails_generator.rb +4 -2
  29. data/generators/emails/templates/example_email.rb +4 -4
  30. data/generators/prerequisites/prerequisites_generator.rb +24 -0
  31. data/generators/prerequisites/templates/base.rb +22 -0
  32. data/generators/prerequisites/templates/factory_girl.rb +30 -0
  33. data/generators/prerequisites/templates/user.rb +7 -0
  34. data/generators/prerequisites/templates/users.rb +12 -0
  35. data/generators/root/root_generator.rb +11 -7
  36. data/generators/root/templates/.rubocop.yml +32 -0
  37. data/generators/root/templates/Gemfile.erb +27 -0
  38. data/generators/root/templates/Rakefile +6 -8
  39. data/generators/rspec/rspec_generator.rb +7 -7
  40. data/generators/rspec/templates/example_spec.rb +1 -1
  41. data/generators/rspec/templates/rspec.rake +48 -29
  42. data/generators/rspec/templates/spec_helper.rb +33 -32
  43. data/generators/tasks/tasks_generator.rb +4 -2
  44. data/generators/tasks/templates/common.rake +1 -16
  45. data/generators/turnip/templates/.rspec +1 -0
  46. data/generators/turnip/templates/common_steps.rb +25 -0
  47. data/generators/turnip/templates/example.feature +8 -0
  48. data/generators/turnip/templates/spec_helper.rb +56 -0
  49. data/generators/turnip/templates/turnip.rake +61 -0
  50. data/generators/turnip/templates/turnip_helper.rb +6 -0
  51. data/generators/turnip/turnip_generator.rb +26 -0
  52. data/generators/web/templates/example_page.rb +15 -0
  53. data/generators/web/templates/menu_section.rb +13 -0
  54. data/generators/web/web_generator.rb +22 -0
  55. data/howitzer.gemspec +14 -21
  56. data/lib/howitzer.rb +47 -7
  57. data/lib/howitzer/cache.rb +70 -0
  58. data/lib/howitzer/capybara_helpers.rb +194 -0
  59. data/lib/howitzer/email.rb +96 -104
  60. data/lib/howitzer/exceptions.rb +10 -6
  61. data/lib/howitzer/log.rb +120 -0
  62. data/lib/howitzer/mail_adapters.rb +7 -0
  63. data/lib/howitzer/mail_adapters/abstract.rb +84 -0
  64. data/lib/howitzer/mail_adapters/mailgun.rb +115 -0
  65. data/lib/howitzer/mailgun_api.rb +9 -0
  66. data/lib/howitzer/mailgun_api/client.rb +79 -0
  67. data/lib/howitzer/mailgun_api/connector.rb +37 -0
  68. data/lib/howitzer/mailgun_api/response.rb +28 -0
  69. data/lib/howitzer/tasks/framework.rake +2 -2
  70. data/lib/howitzer/utils.rb +7 -1
  71. data/lib/howitzer/utils/string_extensions.rb +66 -0
  72. data/lib/howitzer/version.rb +2 -1
  73. data/lib/howitzer/web.rb +11 -0
  74. data/lib/howitzer/web/base_section.rb +27 -0
  75. data/lib/howitzer/web/blank_page.rb +12 -0
  76. data/lib/howitzer/web/capybara_methods_proxy.rb +29 -0
  77. data/lib/howitzer/web/element_dsl.rb +109 -0
  78. data/lib/howitzer/web/iframe_dsl.rb +93 -0
  79. data/lib/howitzer/web/page.rb +173 -0
  80. data/lib/howitzer/web/page_dsl.rb +64 -0
  81. data/lib/howitzer/web/page_validator.rb +118 -0
  82. data/lib/howitzer/web/section.rb +27 -0
  83. data/lib/howitzer/web/section_dsl.rb +154 -0
  84. data/spec/config/custom.yml +10 -1
  85. data/spec/spec_helper.rb +37 -19
  86. data/spec/support/generator_helper.rb +12 -11
  87. data/spec/support/logger_helper.rb +10 -9
  88. data/spec/support/mailgun_unit_client.rb +52 -44
  89. data/spec/support/shared_examples/capybara_context_holder.rb +33 -0
  90. data/spec/support/shared_examples/capybara_methods_proxy.rb +94 -0
  91. data/spec/support/shared_examples/dynamic_section_methods.rb +35 -0
  92. data/spec/support/shared_examples/element_dsl.rb +119 -0
  93. data/spec/unit/generators/base_generator_spec.rb +64 -33
  94. data/spec/unit/generators/config_generator_spec.rb +11 -7
  95. data/spec/unit/generators/cucumber_generator_spec.rb +26 -17
  96. data/spec/unit/generators/emails_generator_spec.rb +10 -6
  97. data/spec/unit/generators/prerequisites_generator_spec.rb +53 -0
  98. data/spec/unit/generators/root_generator_spec.rb +50 -13
  99. data/spec/unit/generators/rspec_generator_spec.rb +9 -9
  100. data/spec/unit/generators/tasks_generator_spec.rb +6 -6
  101. data/spec/unit/generators/turnip_generator_spec.rb +52 -0
  102. data/spec/unit/generators/web_generator_spec.rb +52 -0
  103. data/spec/unit/lib/cache_spec.rb +85 -0
  104. data/spec/unit/lib/capybara_helpers_spec.rb +696 -0
  105. data/spec/unit/lib/email_spec.rb +104 -91
  106. data/spec/unit/lib/howitzer.rb +31 -0
  107. data/spec/unit/lib/init_spec.rb +0 -1
  108. data/spec/unit/lib/log_spec.rb +122 -0
  109. data/spec/unit/lib/mail_adapters/abstract_spec.rb +62 -0
  110. data/spec/unit/lib/mail_adapters/mailgun_spec.rb +163 -0
  111. data/spec/unit/lib/mailgun_api/client_spec.rb +58 -0
  112. data/spec/unit/lib/mailgun_api/connector_spec.rb +54 -0
  113. data/spec/unit/lib/mailgun_api/response_spec.rb +28 -0
  114. data/spec/unit/lib/utils/string_extensions_spec.rb +77 -0
  115. data/spec/unit/lib/web/base_section_spec.rb +41 -0
  116. data/spec/unit/lib/web/element_dsl_spec.rb +17 -0
  117. data/spec/unit/lib/web/iframe_dsl_spec.rb +99 -0
  118. data/spec/unit/lib/web/page_dsl_spec.rb +52 -0
  119. data/spec/unit/lib/web/page_spec.rb +304 -0
  120. data/spec/unit/lib/web/page_validator_spec.rb +218 -0
  121. data/spec/unit/lib/web/section_dsl_spec.rb +165 -0
  122. data/spec/unit/lib/web/section_spec.rb +61 -0
  123. data/spec/unit/version_spec.rb +1 -1
  124. metadata +116 -203
  125. data/GETTING_STARTED.md +0 -774
  126. data/generators/cucumber/templates/cucumber.yml +0 -10
  127. data/generators/pages/pages_generator.rb +0 -21
  128. data/generators/pages/templates/example_menu.rb +0 -15
  129. data/generators/pages/templates/example_page.rb +0 -15
  130. data/generators/root/templates/Gemfile +0 -7
  131. data/generators/root/templates/boot.rb +0 -10
  132. data/lib/howitzer/blank_page.rb +0 -6
  133. data/lib/howitzer/capybara/dsl_ex.rb +0 -15
  134. data/lib/howitzer/capybara/settings.rb +0 -343
  135. data/lib/howitzer/helpers.rb +0 -230
  136. data/lib/howitzer/init.rb +0 -1
  137. data/lib/howitzer/mailgun/client.rb +0 -65
  138. data/lib/howitzer/mailgun/connector.rb +0 -34
  139. data/lib/howitzer/mailgun/response.rb +0 -28
  140. data/lib/howitzer/patches/rawler_patched.rb +0 -86
  141. data/lib/howitzer/settings.rb +0 -27
  142. data/lib/howitzer/utils/data_generator/data_storage.rb +0 -88
  143. data/lib/howitzer/utils/data_generator/gen.rb +0 -135
  144. data/lib/howitzer/utils/locator_store.rb +0 -217
  145. data/lib/howitzer/utils/log.rb +0 -139
  146. data/lib/howitzer/utils/page_validator.rb +0 -133
  147. data/lib/howitzer/vendor/firebug-1.12.1-fx.xpi +0 -0
  148. data/lib/howitzer/vendor/firepath-0.9.7-fx.xpi +0 -0
  149. data/lib/howitzer/web_page.rb +0 -253
  150. data/spec/active_resource.rb +0 -0
  151. data/spec/config/default.yml +0 -26
  152. data/spec/support/boot_helper.rb +0 -15
  153. data/spec/unit/generators/pages_generator_spec.rb +0 -33
  154. data/spec/unit/lib/capybara/dsl_ex_spec.rb +0 -60
  155. data/spec/unit/lib/capybara/settings_spec.rb +0 -441
  156. data/spec/unit/lib/helpers_spec.rb +0 -1129
  157. data/spec/unit/lib/mailgun/client_spec.rb +0 -36
  158. data/spec/unit/lib/mailgun/connector_spec.rb +0 -70
  159. data/spec/unit/lib/mailgun/response_spec.rb +0 -28
  160. data/spec/unit/lib/settings_spec.rb +0 -17
  161. data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +0 -80
  162. data/spec/unit/lib/utils/data_generator/gen_spec.rb +0 -90
  163. data/spec/unit/lib/utils/locator_store_spec.rb +0 -157
  164. data/spec/unit/lib/utils/log_spec.rb +0 -107
  165. data/spec/unit/lib/utils/page_validator_spec.rb +0 -265
  166. data/spec/unit/lib/web_page_spec.rb +0 -346
@@ -1,27 +0,0 @@
1
- require 'sexy_settings'
2
-
3
- SexySettings.configure do |config|
4
- config.path_to_default_settings = File.expand_path("config/default.yml", Dir.pwd)
5
- config.path_to_custom_settings = File.expand_path("config/custom.yml", Dir.pwd)
6
- end
7
-
8
- ##
9
- #
10
- # Returns settings as singleton object
11
- #
12
- # *Example:*
13
- #
14
- # +settings.app_host+
15
-
16
- def settings
17
- SexySettings::Base.instance
18
- end
19
-
20
- ##
21
- #
22
- # Returns logger as singleton object
23
- #
24
-
25
- def log
26
- Howitzer::Log.instance
27
- end
@@ -1,88 +0,0 @@
1
- module DataGenerator
2
-
3
- ##
4
- #
5
- # Data can be stored in memory using DataStorage
6
- #
7
-
8
- module DataStorage
9
- SPECIAL_NS_LIST = ['sauce']
10
- @data ||= {}
11
-
12
- class << self
13
- attr_reader :data
14
- ##
15
- #
16
- # Saves data into memory. Marking by namespace and key
17
- #
18
- # *Parameters:*
19
- # * +ns+ - Namespace
20
- # * +key+ - Key that should be uniq in namespace
21
- # * +value+ - Data value
22
- #
23
-
24
-
25
- def store(ns, key, value)
26
- check_ns(ns)
27
- @data[ns][key] = value
28
- end
29
-
30
- ##
31
- #
32
- # Gets data from memory. Can get all namespace or single data value in namespace using key
33
- #
34
- # *Parameters:*
35
- # * +ns+ - Namespace
36
- # * +key+ - Key that isn't necessary required (default to: nil)
37
- #
38
-
39
- def extract(ns, key=nil)
40
- check_ns(ns)
41
- key ? @data[ns][key] : @data[ns]
42
- end
43
-
44
- ##
45
- #
46
- # Deletes all records from namespace
47
- #
48
- # *Parameters:*
49
- # * +ns+ - Namespace
50
- #
51
-
52
- def clear_ns(ns)
53
- init_ns(ns)
54
- end
55
-
56
- ##
57
- #
58
- # Deletes all namespaces with data
59
- #
60
- # *Parameters:*
61
- # * +exception_list+ - Array of special namespaces for excluding
62
- #
63
-
64
- def clear_all_ns(exception_list=SPECIAL_NS_LIST)
65
- (@data.keys - exception_list).each {|ns| clear_ns(ns) }
66
- end
67
-
68
- private
69
-
70
- def check_ns(ns)
71
- if ns
72
- init_ns(ns) if ns_absent?(ns)
73
- else
74
- log.error 'Data storage namespace can not be empty'
75
- end
76
- end
77
-
78
- def ns_absent?(ns)
79
- !@data.key?(ns)
80
- end
81
-
82
- def init_ns(ns)
83
- @data[ns] = {}
84
- end
85
-
86
- end
87
- end
88
- end
@@ -1,135 +0,0 @@
1
- module DataGenerator
2
- module Gen
3
-
4
- ##
5
- #
6
- # This module generates uniq User object with uniq generated data.
7
- # Examples:
8
- # member = Gen::user #user.email: 'u<XXXX>@<settings.mail_pop3_domain>'
9
- # member = Gen::user('user@test.com') #user.email: 'member@test.com'
10
- # member = Gen::user(settings.def_test_user) #user.email: settings.def_test_user
11
-
12
- class << self
13
-
14
- ##
15
- #
16
- # Generates new User object with generated data.
17
- #
18
- # *Parameters:*
19
- # * +params+ - Custom parameters
20
- #
21
- # *Returns:*
22
- # * +user+ - New generated User object
23
- #
24
-
25
-
26
- def user(params={})
27
- prefix = serial
28
- default = {
29
- email: gen_user_email(prefix),
30
- login: nil,
31
- first_name: gen_first_name(prefix),
32
- last_name: gen_last_name(prefix),
33
- password: settings.def_test_pass
34
- }
35
- User.new(default.merge(params))
36
- end
37
-
38
- ##
39
- #
40
- # Gets User object by it's number
41
- #
42
- # *Parameters:*
43
- # * +num+ - User number
44
- #
45
- # *Returns:*
46
- # * +user+ - User object
47
- #
48
-
49
- def given_user_by_number(num)
50
- data = DataStorage.extract('user', num.to_i)
51
- unless data
52
- data = Gen::user
53
- DataStorage.store('user', num.to_i, data)
54
- end
55
- data
56
- end
57
-
58
- ##
59
- #
60
- # Generates uniq string
61
- # @return [String] Generated string
62
- #
63
- # *Returns:*
64
- # * +string+ - Generated string
65
- #
66
-
67
- def serial
68
- a = [('a'..'z').to_a, (0..9).to_a].flatten.shuffle
69
- "#{Time.now.utc.strftime("%j%H%M%S")}#{a[0..4].join}"
70
- end
71
-
72
- ##
73
- #
74
- # Deletes mailboxes for all users that were generated before
75
- #@deprecated
76
-
77
- #:nocov:
78
- def delete_all_mailboxes
79
- warn "[WARN] Method '#{__method__}' has not been using anymore. You have to remove usage from here #{caller.first}"
80
- end
81
- #:nocov:
82
-
83
- private
84
-
85
- def gen_user_email(serial=nil)
86
- "#{gen_user_name(serial)}@#{settings.mailgun_domain}"
87
- end
88
-
89
- def gen_user_name(serial=nil)
90
- gen_entity('u', serial)
91
- end
92
-
93
- def gen_first_name(serial=nil)
94
- gen_entity('FirstName', serial)
95
- end
96
-
97
- def gen_last_name(serial=nil)
98
- gen_entity('LastName', serial)
99
- end
100
-
101
- def gen_entity(prefix, serial)
102
- "#{prefix}#{serial.nil? ? self.serial : serial}"
103
- end
104
- end
105
-
106
- class User < Object
107
-
108
- attr_reader :login, :domain, :email, :password, :first_name, :last_name, :full_name
109
-
110
- def initialize(params={})
111
- @email = params.delete(:email)
112
- @email_name, @domain = @email.to_s.split('@')
113
- @login = params.delete(:login) || @email_name
114
- @password = params.delete(:password)
115
- @first_name = params.delete(:first_name)
116
- @last_name = params.delete(:last_name)
117
- @full_name = "#@first_name #@last_name"
118
- end
119
-
120
- #@deprecated
121
- #:nocov:
122
- def create_mailbox
123
- warn "[WARN] Method '#{__method__}' has not been using anymore. You have to remove usage from here #{caller.first}"
124
- end
125
- #:nocov:
126
-
127
- #@deprecated
128
- #:nocov:
129
- def delete_mailbox
130
- warn "[WARN] Method '#{__method__}' has not been using anymore. You have to remove usage from here #{caller.first}"
131
- end
132
- #:nocov:
133
- end
134
- end
135
- end
@@ -1,217 +0,0 @@
1
- require 'howitzer/exceptions'
2
-
3
- #The following are locator aliases:
4
- #
5
- #1) locator
6
- #Type: :css(by default), :xpath
7
- #Method example: find, all, first
8
- #
9
- #2) link_locator
10
- #Type: id, text
11
- #Method example: click_link, find_link
12
- #
13
- #3) button_locator
14
- #Type: id, name, value
15
- #Method example: click_button, find_button
16
- #
17
- #4) field_locator
18
- #Type: name, id, text
19
- #Method example: find_field, fill_in
20
-
21
-
22
- module LocatorStore
23
-
24
- def self.included(base)
25
- base.extend(ClassMethods)
26
- end
27
-
28
- module ClassMethods
29
- LOCATOR_TYPES = [:base, :link, :field, :button]
30
-
31
- ##
32
- #
33
- # Adds css or xpath locator into LocatorStore.
34
- # Also locator can be set by lambda expression. For example: lambda{|name|{xpath: ".//a[@id='#{name}']"}}
35
- #
36
- # *Parameters:*
37
- # * +name+ - Locator name
38
- # * +params+ - String for css locator or hash with :xpath key and string value for xpath locator
39
- #
40
-
41
- def add_locator(name, params)
42
- add_locator_by_type(:base, name, params)
43
- end
44
-
45
- ##
46
- #
47
- # Adds locator for link into LocatorStore. Link can be found by: id, text
48
- # Capybara methods that can work with this locator type are: click_link, find_link
49
- #
50
- # *Parameters:*
51
- # * +name+ - Locator name
52
- # * +params+ - ID or text of link
53
- #
54
-
55
- def add_link_locator(name, params)
56
- add_locator_by_type(:link, name, params)
57
- end
58
-
59
- ##
60
- #
61
- # Adds locator for field into LocatorStore. Field can be found by: name, id, text
62
- # Capybara methods that can work with this locator type are: find_field, fill_in
63
- #
64
- # *Parameters:*
65
- # * +name+ - Locator name
66
- # * +params+ - Name, ID or text of field
67
- #
68
-
69
- def add_field_locator(name, params)
70
- add_locator_by_type(:field, name, params)
71
- end
72
-
73
- ##
74
- #
75
- # Add locator for button into LocatorStore. Button can be found by: id, name, value
76
- # Capybara methods that can work with this locator type are: click_button, find_button
77
- #
78
- # *Parameters:*
79
- # * +name+ - Locator name
80
- # * +params+ - Name, ID or value
81
- #
82
-
83
- def add_button_locator(name, params)
84
- add_locator_by_type(:button, name, params)
85
- end
86
-
87
- ##
88
- #
89
- # Takes css or xpath locator from LocatorStore by name
90
- #
91
- # *Parameters:*
92
- # * +name+ - Locator name
93
- #
94
-
95
- def locator(name)
96
- locator_by_type(:base, name)
97
- end
98
-
99
- ##
100
- #
101
- # Take link locator from LocatorStore by name
102
- #
103
- # *Parameters:*
104
- # * +name+ - Locator name
105
- #
106
-
107
- def link_locator(name)
108
- locator_by_type(:link, name)
109
- end
110
-
111
- ##
112
- #
113
- # Take field locator from LocatorStore by name
114
- #
115
- # *Parameters:*
116
- # * +name+ - Locator name
117
- #
118
-
119
- def field_locator(name)
120
- locator_by_type(:field, name)
121
- end
122
-
123
- ##
124
- #
125
- # Take button locator from LocatorStore be name
126
- #
127
- # *Parameters:*
128
- # * +name+ - Locator name
129
- #
130
-
131
- def button_locator(name)
132
- locator_by_type(:button, name)
133
- end
134
-
135
- ##
136
- #
137
- # Get locator set by lambda.
138
- # For example: find(apply(locator(:locator_name), 'register')).click
139
- #
140
- # *Parameters:*
141
- # * +locator+ - Locator set with lambda expression
142
- # * +values+ - Arguments that should be matched lambda expression params
143
- #
144
-
145
- def apply(locator, *values)
146
- locator.call(*values).to_a.flatten
147
- end
148
-
149
- def find_element(name)
150
- type, locator = find_locator(name)
151
- if type == :base
152
- send :find, locator
153
- else
154
- send "find_#{type}", locator
155
- end
156
- end
157
-
158
- def first_element(name)
159
- type, locator = find_locator(name)
160
- if type == :base
161
- send :first, locator
162
- else
163
- send :first, type, locator
164
- end
165
- end
166
-
167
- protected
168
-
169
- def find_locator(name)
170
- name = name.to_s.to_sym
171
- LOCATOR_TYPES.each do|type|
172
- return [type, locator_by_type(type, name)] if (@locators || {}).fetch(self.name, {}).fetch(type, {})[name]
173
- end
174
- log.error(Howitzer::LocatorNotDefinedError, name)
175
- end
176
-
177
- # looks up locator in current and all super classes
178
- def parent_locator(type, name)
179
- if !@locators.nil? && @locators.key?(self.name) && @locators[self.name].key?(type) && @locators[self.name][type].key?(name)
180
- @locators[self.name][type][name]
181
- else
182
- self.superclass.parent_locator(type, name) unless self.superclass == Object
183
- end
184
- end
185
-
186
- private
187
-
188
- def locator_by_type(type, name)
189
- locator = parent_locator(type, name)
190
- log.error(Howitzer::LocatorNotDefinedError, name) if locator.nil?
191
- locator
192
- end
193
-
194
- def add_locator_by_type(type, name, params)
195
- @locators ||= {}
196
- @locators[self.name] ||= {}
197
- @locators[self.name][type] ||= {}
198
- log.error Howitzer::BadLocatorParamsError, args.inspect if params.nil? || (!params.is_a?(Proc) && params.empty?)
199
- case params.class.name
200
- when 'Hash'
201
- @locators[self.name][type][name] = [params.keys.first.to_s.to_sym, params.values.first.to_s]
202
- when 'Proc'
203
- @locators[self.name][type][name] = params
204
- else
205
- @locators[self.name][type][name] = params.to_s
206
- end
207
- end
208
- end
209
-
210
- #delegate class methods to instance
211
- ClassMethods.public_instance_methods.each do |name|
212
- define_method(name) do |*args|
213
- self.class.send(name, *args)
214
- end
215
- end
216
-
217
- end