howitzer 2.1.0 → 2.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 39ab334fafa5a0aa09e730c1e1d04cf190fae186
4
- data.tar.gz: 1533320ec072148e36f181a1eab235ae44c6cdc6
3
+ metadata.gz: 94940ab8c75aebb8875f48220c8019504db644bd
4
+ data.tar.gz: 1228bad1fea3a9b128e74d248c394c8a4ac1bcfb
5
5
  SHA512:
6
- metadata.gz: a80f2f50436fc008eec03015827aaa0eb8948d3b60e3c043501479abafa9642bc5621c461903ad70b962585396e23d3fbc8300c8e73a0a3e650ff0e4253eab74
7
- data.tar.gz: 65ba1c76f707b5d8854b211eaae7c1a6374204310659d79cc4270f2d610453283faa14740f7c00d5d2d43203b5dd417af8a2321783933ee42d6e58a58d84e032
6
+ metadata.gz: 87eefa4b47bfc459116c1ada0bd47b013f4ef7f519b8e88297adbe2b6526513a78bc401980b97a07fc50ce737505b2a95e13738ad21b42a9bf2cf22097f88cd9
7
+ data.tar.gz: 520dc413394cdc682f421477f0e6779fc403dd364172e5b83afbfd28d99c22d957fd5841852dfd427f0ce3b08f398921afa5a6dcb5fdb90a91e4d741a80ed99a
@@ -48,3 +48,4 @@ Style/MixinGrouping:
48
48
  EnforcedStyle: separated
49
49
  Exclude:
50
50
  - '**/*_steps.rb'
51
+ - 'tmp/**'
@@ -1,9 +1,22 @@
1
- ## [In git](https://github.com/strongqa/howitzer/compare/v2.1.0...master)
1
+ ## [In git](https://github.com/strongqa/howitzer/compare/v2.1.1...master)
2
2
 
3
3
  ### New Features
4
4
 
5
5
  ### Bug-fixes
6
6
 
7
+ ## [v2.1.1](https://github.com/strongqa/howitzer/compare/v2.1.0...v2.1.1)
8
+
9
+ ### New Features
10
+ - Cucumber rake tasks minor updates
11
+ - [#257](https://github.com/strongqa/howitzer/issues/257) Simplify working with multiple domains
12
+
13
+ ### Bug-fixes
14
+ - [#225](https://github.com/strongqa/howitzer/issues/225) Frames under namespace support
15
+ - [#254](https://github.com/strongqa/howitzer/issues/254) Screenshot driver now created for the active driver
16
+ - [#252](https://github.com/strongqa/howitzer/issues/252) Wrong location of log files fixed
17
+ - [#248](https://github.com/strongqa/howitzer/issues/248) FactoryGirl renamed to FactoryBot in cucumber transformation.
18
+ - [#246](https://github.com/strongqa/howitzer/issues/246) Options fixed for rspec rake tasks
19
+
7
20
  ## [v2.1.0](https://github.com/strongqa/howitzer/compare/v2.0.3...v2.1.0)
8
21
 
9
22
  ### New Features
@@ -39,6 +39,8 @@ end
39
39
 
40
40
  require_relative "drivers/#{Howitzer.driver}"
41
41
 
42
+ Capybara.save_path = Howitzer.log_dir
43
+
42
44
  Capybara::Screenshot.append_timestamp = false
43
45
  Capybara::Screenshot.register_filename_prefix_formatter(:default) do
44
46
  "capybara-screenshot-#{Gen.serial}"
@@ -17,3 +17,7 @@ Capybara.register_driver :browserstack do |app|
17
17
  url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.browserstack.com/wd/hub"
18
18
  CapybaraHelpers.cloud_driver(app, caps, url)
19
19
  end
20
+
21
+ Capybara::Screenshot.class_eval do
22
+ register_driver :browserstack, &registered_drivers[:selenium]
23
+ end
@@ -23,3 +23,7 @@ Capybara.register_driver :crossbrowsertesting do |app|
23
23
  '@hub.crossbrowsertesting.com/wd/hub'
24
24
  CapybaraHelpers.cloud_driver(app, caps, url)
25
25
  end
26
+
27
+ Capybara::Screenshot.class_eval do
28
+ register_driver :crossbrowsertesting, &registered_drivers[:selenium]
29
+ end
@@ -10,7 +10,6 @@ Capybara.register_driver :headless_chrome do |app|
10
10
  Capybara::Selenium::Driver.new app, params
11
11
  end
12
12
 
13
- Capybara.save_path = Howitzer.log_dir
14
- Capybara::Screenshot.register_driver(:headless_chrome) do |driver, path|
15
- driver.browser.save_screenshot path
13
+ Capybara::Screenshot.class_eval do
14
+ register_driver :headless_chrome, &registered_drivers[:selenium]
16
15
  end
@@ -14,7 +14,6 @@ Capybara.register_driver :phantomjs do |app|
14
14
  )
15
15
  end
16
16
 
17
- Capybara.save_path = Howitzer.log_dir
18
- Capybara::Screenshot.register_driver(:phantomjs) do |driver, path|
19
- driver.browser.save_screenshot path
17
+ Capybara::Screenshot.class_eval do
18
+ register_driver :phantomjs, &registered_drivers[:selenium]
20
19
  end
@@ -19,3 +19,7 @@ Capybara.register_driver :sauce do |app|
19
19
  url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@ondemand.saucelabs.com:80/wd/hub"
20
20
  CapybaraHelpers.cloud_driver(app, caps, url)
21
21
  end
22
+
23
+ Capybara::Screenshot.class_eval do
24
+ register_driver :sauce, &registered_drivers[:selenium]
25
+ end
@@ -25,3 +25,7 @@ Capybara.register_driver :selenium_grid do |app|
25
25
  end
26
26
  Capybara::Selenium::Driver.new(app, browser: :remote, url: Howitzer.selenium_hub_url, desired_capabilities: caps)
27
27
  end
28
+
29
+ Capybara::Screenshot.class_eval do
30
+ register_driver :selenium_grid, &registered_drivers[:selenium]
31
+ end
@@ -18,3 +18,7 @@ Capybara.register_driver :testingbot do |app|
18
18
  url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.testingbot.com/wd/hub"
19
19
  CapybaraHelpers.cloud_driver(app, caps, url)
20
20
  end
21
+
22
+ Capybara::Screenshot.class_eval do
23
+ register_driver :testingbot, &registered_drivers[:selenium]
24
+ end
@@ -2,7 +2,7 @@
2
2
  # PREREQUISITES #
3
3
  #############################################################
4
4
 
5
- Given /^I have entered (.*) into the calculator$/ do |_input|
5
+ Given 'I have entered {float} into the calculator' do |_input|
6
6
  pending
7
7
  end
8
8
 
@@ -10,7 +10,7 @@ end
10
10
  # ACTIONS #
11
11
  ####################################
12
12
 
13
- When /^I press (.*)$/ do |_button|
13
+ When 'I press {word}' do |_button|
14
14
  pending
15
15
  end
16
16
 
@@ -18,6 +18,6 @@ end
18
18
  # CHECKS #
19
19
  ####################################
20
20
 
21
- Then /^the result should be (.*) on the screen$/ do |_output|
21
+ Then 'the result should be {float} on the screen' do |_output|
22
22
  pending
23
23
  end
@@ -19,7 +19,7 @@ end
19
19
 
20
20
  Cucumber::Rake::Task.new(:features, 'Run all workable scenarios (without @wip and @bug tags)') do |t|
21
21
  Howitzer.current_rake_task = t.instance_variable_get :@task_name
22
- t.cucumber_opts = "#{opts.call(t.instance_variable_get(:@task_name))} --tags ~@wip --tags ~@bug"
22
+ t.cucumber_opts = "#{opts.call(t.instance_variable_get(:@task_name))} --tags 'not @wip and not @bug'"
23
23
  end
24
24
 
25
25
  namespace :features do
@@ -35,23 +35,23 @@ namespace :features do
35
35
 
36
36
  Cucumber::Rake::Task.new(:smoke, 'Run workable smoke scenarios (with @smoke tag)') do |t|
37
37
  Howitzer.current_rake_task = t.instance_variable_get :@task_name
38
- t.cucumber_opts = "#{opts.call(t.instance_variable_get(:@task_name))} --tags @smoke --tags ~@wip --tags ~@bug"
38
+ t.cucumber_opts = "#{opts.call(t.instance_variable_get(:@task_name))} --tags '@smoke and not @wip and not @bug'"
39
39
  end
40
40
 
41
41
  Cucumber::Rake::Task.new(:bvt, 'Run workable build verification test scenarios') do |t|
42
42
  Howitzer.current_rake_task = t.instance_variable_get :@task_name
43
43
  t.cucumber_opts = "#{opts.call(t.instance_variable_get(:@task_name))}
44
- --tags ~@wip --tags ~@bug --tags ~@smoke --tags ~@p1 --tags ~@p2"
44
+ --tags 'not @wip and not @bug and not @smoke and not @p1 and not @p2'"
45
45
  end
46
46
 
47
47
  Cucumber::Rake::Task.new(:p1, 'Run workable scenarios with normal priority (with @p1 tag)') do |t|
48
48
  Howitzer.current_rake_task = t.instance_variable_get :@task_name
49
- t.cucumber_opts = "#{opts.call(t.instance_variable_get(:@task_name))} --tags ~@wip --tags ~@bug --tags @p1"
49
+ t.cucumber_opts = "#{opts.call(t.instance_variable_get(:@task_name))} --tags 'not @wip and not @bug and @p1'"
50
50
  end
51
51
 
52
52
  Cucumber::Rake::Task.new(:p2, 'Run workable scenarios with low priority (with @p2 tag)') do |t|
53
53
  Howitzer.current_rake_task = t.instance_variable_get :@task_name
54
- t.cucumber_opts = "#{opts.call(t.instance_variable_get(:@task_name))} --tags ~@wip --tags ~@bug --tags @p2"
54
+ t.cucumber_opts = "#{opts.call(t.instance_variable_get(:@task_name))} --tags 'not @wip and not @bug and @p2'"
55
55
  end
56
56
  end
57
57
 
@@ -17,7 +17,7 @@ ParameterType(
17
17
  name: 'factory',
18
18
  regexp: /(?:factory|FACTORY)_([A-Za-z_]+)(\d*)(?:\[\:(.+)\])?/,
19
19
  transformer: lambda do |_, factory, num, property|
20
- res = FactoryGirl.given_by_number(factory.downcase, num)
20
+ res = FactoryBot.given_by_number(factory.downcase, num)
21
21
  res = res.send(property) if property
22
22
  res
23
23
  end
@@ -10,43 +10,43 @@ end
10
10
 
11
11
  RSpec::Core::RakeTask.new(:rspec, 'Run all rspec scenarios') do |t|
12
12
  Howitzer.current_rake_task = t.name
13
- t.opts = opts.call(t.name)
13
+ t.rspec_opts = opts.call(t.name)
14
14
  end
15
15
 
16
16
  RSpec::Core::RakeTask.new(:features, 'Run all workable scenarios (without @wip and @bug tags)') do |t|
17
17
  Howitzer.current_rake_task = t.name
18
- t.opts = "#{opts.call(t.name)} --tag ~wip --tag ~bug"
18
+ t.rspec_opts = "#{opts.call(t.name)} --tag ~wip --tag ~bug"
19
19
  end
20
20
 
21
21
  namespace :features do
22
22
  RSpec::Core::RakeTask.new(:wip, 'Run scenarios in progress (with @wip tag)') do |t|
23
23
  Howitzer.current_rake_task = t.name
24
- t.opts = "#{opts.call(t.name)} --tag wip"
24
+ t.rspec_opts = "#{opts.call(t.name)} --tag wip"
25
25
  end
26
26
 
27
27
  RSpec::Core::RakeTask.new(:bug, 'Run scenarios with known bugs (with @bug tag)') do |t|
28
28
  Howitzer.current_rake_task = t.name
29
- t.opts = "#{opts.call(t.name)} --tag bug"
29
+ t.rspec_opts = "#{opts.call(t.name)} --tag bug"
30
30
  end
31
31
 
32
32
  RSpec::Core::RakeTask.new(:smoke, 'Run workable smoke scenarios (with @smoke tag)') do |t|
33
33
  Howitzer.current_rake_task = t.name
34
- t.opts = "#{opts.call(t.name)} --tag smoke --tag ~wip --tag ~bug"
34
+ t.rspec_opts = "#{opts.call(t.name)} --tag smoke --tag ~wip --tag ~bug"
35
35
  end
36
36
 
37
37
  RSpec::Core::RakeTask.new(:bvt, 'Run workable build verification test scenarios') do |t|
38
38
  Howitzer.current_rake_task = t.name
39
- t.opts = "#{opts.call(t.name)} --tag ~wip --tag ~bug --tag ~p1 --tag ~p2 --tag ~smoke"
39
+ t.rspec_opts = "#{opts.call(t.name)} --tag ~wip --tag ~bug --tag ~p1 --tag ~p2 --tag ~smoke"
40
40
  end
41
41
 
42
42
  RSpec::Core::RakeTask.new(:p1, 'Run workable scenarios with normal priority (with @p1 tag)') do |t|
43
43
  Howitzer.current_rake_task = t.name
44
- t.opts = "#{opts.call(t.name)} --tag p1 --tag ~wip --tag ~bug"
44
+ t.rspec_opts = "#{opts.call(t.name)} --tag p1 --tag ~wip --tag ~bug"
45
45
  end
46
46
 
47
47
  RSpec::Core::RakeTask.new(:p2, 'Run workable scenarios with low priority (with @p2 tag)') do |t|
48
48
  Howitzer.current_rake_task = t.name
49
- t.opts = "#{opts.call(t.name)} --tag p2 --tag ~wip --tag ~bug"
49
+ t.rspec_opts = "#{opts.call(t.name)} --tag p2 --tag ~wip --tag ~bug"
50
50
  end
51
51
  end
52
52
 
@@ -2,6 +2,8 @@ require 'selenium-webdriver'
2
2
  require 'capybara'
3
3
  require 'sexy_settings'
4
4
  require 'rspec/wait'
5
+ require 'howitzer/version'
6
+ require 'howitzer/exceptions'
5
7
 
6
8
  SexySettings.configure do |config|
7
9
  config.path_to_default_settings = File.expand_path('config/default.yml', Dir.pwd)
@@ -30,25 +32,39 @@ module Howitzer
30
32
  attr_accessor :current_rake_task
31
33
  end
32
34
 
33
- # @return an application uri
35
+ # @return an application uri for particular application name
36
+ #
37
+ # @param name [Symbol, String] an application name from framework settings
34
38
  #
35
- # @example returns url with auth
39
+ # @example returns default application url with auth
36
40
  # app_uri.site
37
- # @example returns url without auth
41
+ # @example returns example application url with auth
42
+ # app_uri(:example).site
43
+ # @example returns default application url without auth
38
44
  # app_uri.origin
39
45
 
40
- def self.app_uri
46
+ def self.app_uri(name = nil)
47
+ prefix = "#{name}_" if name.present?
41
48
  ::Addressable::URI.new(
42
- user: Howitzer.app_base_auth_login,
43
- password: Howitzer.app_base_auth_pass,
44
- host: Howitzer.app_host,
45
- scheme: Howitzer.app_protocol || 'http'
49
+ user: Howitzer.sexy_setting!("#{prefix}app_base_auth_login"),
50
+ password: Howitzer.sexy_setting!("#{prefix}app_base_auth_pass"),
51
+ host: Howitzer.sexy_setting!("#{prefix}app_host"),
52
+ scheme: Howitzer.sexy_setting!("#{prefix}app_protocol") || 'http'
46
53
  )
47
54
  end
55
+
56
+ # @return an setting value or raise error
57
+ #
58
+ # @param name [Symbol, String] an setting name
59
+ # @raise [Howitzer::UndefinedSexySettingError] when the setting is not specified
60
+
61
+ def self.sexy_setting!(name)
62
+ return Howitzer.public_send(name) if Howitzer.respond_to?(name)
63
+ raise UndefinedSexySettingError,
64
+ "Undefined '#{name}' setting. Please add the setting to config/default.yml:\n #{name}: some_value\n"
65
+ end
48
66
  end
49
67
 
50
- require 'howitzer/version'
51
- require 'howitzer/exceptions'
52
68
  require 'howitzer/log'
53
69
  require 'howitzer/utils'
54
70
  require 'howitzer/cache'
@@ -20,4 +20,5 @@ module Howitzer
20
20
  NoEmailSubjectError = Class.new(StandardError) #:nodoc:
21
21
  NoDataError = Class.new(StandardError) #:nodoc:
22
22
  UndefinedElementError = Class.new(StandardError) #:nodoc:
23
+ UndefinedSexySettingError = Class.new(StandardError) #:nodoc:
23
24
  end
@@ -1,4 +1,4 @@
1
1
  # This module holds howitzer version
2
2
  module Howitzer
3
- VERSION = '2.1.0'.freeze #:nodoc:
3
+ VERSION = '2.1.1'.freeze #:nodoc:
4
4
  end
@@ -45,6 +45,7 @@ module Howitzer
45
45
  # <b>has_no_<em>frame_name</em>_iframe?</b> - equals capybara #has_no_selector(...) method
46
46
  # @param name [Symbol, String] an unique iframe name
47
47
  # @param args [Array] original Capybara arguments. For details, see `Capybara::Session#within_frame`.
48
+ # @raise [NameError] if page class can not be found
48
49
  # @example Using in a page class
49
50
  # class FbPage < Howitzer::Web::Page
50
51
  # element :like, :xpath, ".//*[text()='Like']"
@@ -57,8 +58,19 @@ module Howitzer
57
58
  # end
58
59
  # end
59
60
  #
61
+ # module Utils
62
+ # class GroupFbPage < Howitzer::Web::Page
63
+ # end
64
+ # end
65
+ #
60
66
  # class HomePage < Howitzer::Web::Page
61
67
  # iframe :fb, 1
68
+ #
69
+ # # frame with explicit class declaration
70
+ # # iframe :fb, FbPage, 1
71
+ #
72
+ # # frame with namespace
73
+ # iframe :utils_group_fb
62
74
  # end
63
75
  #
64
76
  # HomePage.on do
@@ -72,7 +84,8 @@ module Howitzer
72
84
 
73
85
  def iframe(name, *args)
74
86
  raise ArgumentError, 'iframe selector arguments must be specified' if args.blank?
75
- klass = "#{name}_page".classify.constantize
87
+ klass = args.first.is_a?(Class) ? args.shift : find_matching_class(name)
88
+ raise NameError, "class can not be found for #{name} iframe" if klass.blank?
76
89
  define_iframe(klass, name, args)
77
90
  define_has_iframe(name, args)
78
91
  define_has_no_iframe(name, args)
@@ -100,6 +113,11 @@ module Howitzer
100
113
  capybara_context.has_no_selector?(*iframe_element_selector(args, params))
101
114
  end
102
115
  end
116
+
117
+ def find_matching_class(name)
118
+ Howitzer::Web::Page.descendants.select { |el| el.name.underscore.tr('/', '_') == "#{name}_page" }
119
+ .max_by { |el| el.name.count('::') }
120
+ end
103
121
  end
104
122
  end
105
123
  end
@@ -20,15 +20,15 @@ RSpec.describe 'Generators' do
20
20
  { name: '/config/custom.yml', is_directory: false, size: template_file_size('config', 'custom.yml') },
21
21
  { name: '/config/default.yml', is_directory: false, size: template_file_size('config', 'default.yml') },
22
22
  { name: '/config/drivers', is_directory: true },
23
- { name: '/config/drivers/browserstack.rb', is_directory: false, size: 914 },
24
- { name: '/config/drivers/crossbrowsertesting.rb', is_directory: false, size: 1126 },
25
- { name: '/config/drivers/headless_chrome.rb', is_directory: false, size: 696 },
26
- { name: '/config/drivers/phantomjs.rb', is_directory: false, size: 636 },
23
+ { name: '/config/drivers/browserstack.rb', is_directory: false, size: 1018 },
24
+ { name: '/config/drivers/crossbrowsertesting.rb', is_directory: false, size: 1237 },
25
+ { name: '/config/drivers/headless_chrome.rb', is_directory: false, size: 649 },
26
+ { name: '/config/drivers/phantomjs.rb', is_directory: false, size: 589 },
27
27
  { name: '/config/drivers/poltergeist.rb', is_directory: false, size: 362 },
28
- { name: '/config/drivers/sauce.rb', is_directory: false, size: 871 },
28
+ { name: '/config/drivers/sauce.rb', is_directory: false, size: 968 },
29
29
  { name: '/config/drivers/selenium.rb', is_directory: false, size: 1097 },
30
- { name: '/config/drivers/selenium_grid.rb', is_directory: false, size: 1272 },
31
- { name: '/config/drivers/testingbot.rb', is_directory: false, size: 804 },
30
+ { name: '/config/drivers/selenium_grid.rb', is_directory: false, size: 1377 },
31
+ { name: '/config/drivers/testingbot.rb', is_directory: false, size: 906 },
32
32
  { name: '/config/drivers/webkit.rb', is_directory: false, size: 179 }
33
33
  ]
34
34
  end
@@ -27,6 +27,35 @@ RSpec.describe 'Howitzer' do
27
27
  let(:app_base_auth_pass_setting) { nil }
28
28
  it { expect(Howitzer.app_uri.site).to eq('http://redmine.strongqa.com') }
29
29
  end
30
+ context 'when custom host exist' do
31
+ before do
32
+ allow(Howitzer).to receive(:test_app_base_auth_login) { app_base_auth_login_setting }
33
+ allow(Howitzer).to receive(:test_app_base_auth_pass) { app_base_auth_pass_setting }
34
+ allow(Howitzer).to receive(:test_app_protocol) { app_protocol_setting }
35
+ allow(Howitzer).to receive(:test_app_host) { app_host_setting }
36
+ end
37
+ let(:app_host_setting) { 'test.strongqa.com' }
38
+ let(:app_protocol_setting) { nil }
39
+ context 'when login and password present' do
40
+ let(:app_base_auth_login_setting) { 'user' }
41
+ let(:app_base_auth_pass_setting) { 'password' }
42
+ it { expect(Howitzer.app_uri(:test).site).to eq('http://user:password@test.strongqa.com') }
43
+ end
44
+ context 'when login and password blank' do
45
+ let(:app_base_auth_login_setting) { nil }
46
+ let(:app_base_auth_pass_setting) { nil }
47
+ it { expect(Howitzer.app_uri(:test).site).to eq('http://test.strongqa.com') }
48
+ end
49
+ end
50
+ context 'when configuration settings are not specified for particular application' do
51
+ it do
52
+ expect { Howitzer.app_uri(:test).site }.to raise_error(
53
+ Howitzer::UndefinedSexySettingError,
54
+ "Undefined 'test_app_base_auth_login' setting. Please add the setting to config/default.yml:\n " \
55
+ "test_app_base_auth_login: some_value\n"
56
+ )
57
+ end
58
+ end
30
59
  end
31
60
  describe '.mailgun_idle_timeout' do
32
61
  subject { Howitzer.mailgun_idle_timeout }
@@ -9,6 +9,26 @@ RSpec.describe Howitzer::Web::IframeDsl do
9
9
  end
10
10
  end
11
11
  end
12
+ let(:nested_class) do
13
+ module Foo
14
+ Class.new(Howitzer::Web::Page) do
15
+ section :navbar, :xpath, './body' do
16
+ element :like_button, '#foo_id'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ let(:double_nested_class) do
22
+ module Foo
23
+ module Bar
24
+ Class.new(Howitzer::Web::Page) do
25
+ section :navbar, :xpath, './body' do
26
+ element :like_button, '#foo_id'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
12
32
 
13
33
  let(:web_page_class) do
14
34
  Class.new(Howitzer::Web::Page)
@@ -18,6 +38,9 @@ RSpec.describe Howitzer::Web::IframeDsl do
18
38
  allow_any_instance_of(fb_page_class).to receive(:check_validations_are_defined!)
19
39
  allow_any_instance_of(web_page_class).to receive(:check_validations_are_defined!)
20
40
  stub_const('FbPage', fb_page_class)
41
+ stub_const('Foo::FbPage', nested_class)
42
+ stub_const('Foo::Bar::FbHomePage', double_nested_class)
43
+ allow(Howitzer::Web::Page).to receive(:descendants) { [FbPage, Foo::FbPage, Foo::Bar::FbHomePage] }
21
44
  end
22
45
 
23
46
  describe '.iframe' do
@@ -56,6 +79,42 @@ RSpec.describe Howitzer::Web::IframeDsl do
56
79
  expect { subject }.to raise_error(ArgumentError, 'iframe selector arguments must be specified')
57
80
  end
58
81
  end
82
+
83
+ context 'when class defined explicity' do
84
+ subject do
85
+ web_page_class.class_eval do
86
+ iframe :fb, FbPage, 1
87
+ end
88
+ web_page_class
89
+ end
90
+ it 'should find page class specified' do
91
+ expect(subject).to eql(web_page_class)
92
+ end
93
+ end
94
+
95
+ context 'when frame nested in module' do
96
+ subject do
97
+ web_page_class.class_eval do
98
+ iframe :foo_fb, 1
99
+ end
100
+ web_page_class
101
+ end
102
+ it 'should find page class nested in module' do
103
+ expect(subject).to eql(web_page_class)
104
+ end
105
+ end
106
+
107
+ context 'when frame nested in module nested in module' do
108
+ subject do
109
+ web_page_class.class_eval do
110
+ iframe :foo_bar_fb_home, 1
111
+ end
112
+ web_page_class
113
+ end
114
+ it 'should find class nested in modules' do
115
+ expect(subject).to eql(web_page_class)
116
+ end
117
+ end
59
118
  end
60
119
 
61
120
  include_examples :capybara_context_holder
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: howitzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Parashchenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-18 00:00:00.000000000 Z
11
+ date: 2017-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -430,7 +430,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
430
430
  version: '0'
431
431
  requirements: []
432
432
  rubyforge_project:
433
- rubygems_version: 2.6.10
433
+ rubygems_version: 2.6.8
434
434
  signing_key:
435
435
  specification_version: 4
436
436
  summary: Ruby based framework for acceptance testing