kameleon 0.0.9 → 0.2.0.alpha.2

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 (81) hide show
  1. data/LICENCE +1 -1
  2. data/README.textile +157 -0
  3. data/lib/kameleon.rb +3 -18
  4. data/lib/kameleon/dsl.rb +98 -0
  5. data/lib/kameleon/dsl/act/form.rb +106 -0
  6. data/lib/kameleon/dsl/act/mouse.rb +59 -0
  7. data/lib/kameleon/dsl/context/scope.rb +95 -0
  8. data/lib/kameleon/dsl/utils/debug.rb +10 -0
  9. data/lib/kameleon/dsl/verify/absence.rb +151 -0
  10. data/lib/kameleon/dsl/verify/presence.rb +327 -0
  11. data/lib/kameleon/ext/active_record/shared_single_connection.rb +42 -0
  12. data/lib/kameleon/ext/capybara/server.rb +21 -0
  13. data/lib/kameleon/ext/capybara/session_pool.rb +63 -0
  14. data/lib/kameleon/ext/rspec/all.rb +4 -0
  15. data/lib/kameleon/ext/rspec/dsl.rb +39 -0
  16. data/lib/kameleon/ext/rspec/garbage_collector.rb +11 -0
  17. data/lib/kameleon/ext/rspec/headless.rb +12 -0
  18. data/lib/kameleon/ext/rspec/pool.rb +7 -0
  19. data/lib/kameleon/ext/rspec/transactional_examples.rb +10 -0
  20. data/{spec/support/deferred_garbage_collection.rb → lib/kameleon/ext/ruby/deferred_garbage_collector.rb} +0 -0
  21. data/lib/kameleon/ext/session/devise.rb +28 -0
  22. data/lib/kameleon/session.rb +23 -0
  23. data/lib/kameleon/utils/configuration.rb +5 -5
  24. data/lib/kameleon/utils/debug_console.rb +31 -0
  25. metadata +73 -77
  26. data/lib/kameleon/dsl/act.rb +0 -107
  27. data/lib/kameleon/dsl/see.rb +0 -155
  28. data/lib/kameleon/session/capybara.rb +0 -33
  29. data/lib/kameleon/session/server.rb +0 -21
  30. data/lib/kameleon/session/session_pool.rb +0 -45
  31. data/lib/kameleon/user/abstract.rb +0 -142
  32. data/lib/kameleon/user/base.rb +0 -36
  33. data/lib/kameleon/user/guest.rb +0 -10
  34. data/lib/kameleon/utils/helpers.rb +0 -11
  35. data/lib/patch/capybara_selenium_driver.rb +0 -7
  36. data/spec/sample_rack_app/hey.rb +0 -24
  37. data/spec/spec_helper.rb +0 -41
  38. data/spec/unit/act/click_spec.rb +0 -52
  39. data/spec/unit/act/fill_in/attach_file_spec.rb +0 -36
  40. data/spec/unit/act/fill_in/checkbox_spec.rb +0 -87
  41. data/spec/unit/act/fill_in/date_ranges_spec.rb +0 -24
  42. data/spec/unit/act/fill_in/multiple_select_spec.rb +0 -42
  43. data/spec/unit/act/fill_in/radio_button_spec.rb +0 -35
  44. data/spec/unit/act/fill_in/select_spec.rb +0 -35
  45. data/spec/unit/act/fill_in/text_area_spec.rb +0 -52
  46. data/spec/unit/act/fill_in/text_input_spec.rb +0 -52
  47. data/spec/unit/act/on_hover_spec.rb +0 -34
  48. data/spec/unit/dsl/not_see/form_elements/fields/empty_spec.rb +0 -38
  49. data/spec/unit/dsl/not_see/form_elements/fields/readonly_spec.rb +0 -38
  50. data/spec/unit/dsl/not_see/form_elements/fields_spec.rb +0 -24
  51. data/spec/unit/dsl/not_see/form_elements/textareas_spec.rb +0 -25
  52. data/spec/unit/dsl/not_see/form_elements/texts_spec.rb +0 -26
  53. data/spec/unit/dsl/not_see/in_scopes_spec.rb +0 -63
  54. data/spec/unit/dsl/not_see/special_elements/buttons_spec.rb +0 -24
  55. data/spec/unit/dsl/not_see/special_elements/error_message_for_spec.rb +0 -24
  56. data/spec/unit/dsl/not_see/special_elements/images_spec.rb +0 -24
  57. data/spec/unit/dsl/not_see/special_elements/links_spec.rb +0 -46
  58. data/spec/unit/dsl/not_see/special_elements/ordered_texts_spec.rb +0 -21
  59. data/spec/unit/dsl/not_see/special_selectors_spec.rb +0 -39
  60. data/spec/unit/dsl/not_see/texts_spec.rb +0 -24
  61. data/spec/unit/dsl/see/counted_elements_spec.rb +0 -26
  62. data/spec/unit/dsl/see/form_elements/checkboxes_spec.rb +0 -45
  63. data/spec/unit/dsl/see/form_elements/fields/disabled_spec.rb +0 -30
  64. data/spec/unit/dsl/see/form_elements/fields/empty_spec.rb +0 -28
  65. data/spec/unit/dsl/see/form_elements/fields/readonly_spec.rb +0 -38
  66. data/spec/unit/dsl/see/form_elements/fields_spec.rb +0 -28
  67. data/spec/unit/dsl/see/form_elements/multiple_selects_spec.rb +0 -47
  68. data/spec/unit/dsl/see/form_elements/radio_buttons_spec.rb +0 -35
  69. data/spec/unit/dsl/see/form_elements/selects_spec.rb +0 -40
  70. data/spec/unit/dsl/see/form_elements/textareas_spec.rb +0 -29
  71. data/spec/unit/dsl/see/form_elements/texts_spec.rb +0 -29
  72. data/spec/unit/dsl/see/in_scopes_spec.rb +0 -85
  73. data/spec/unit/dsl/see/special_elements/buttons_spec.rb +0 -28
  74. data/spec/unit/dsl/see/special_elements/error_message_for_spec.rb +0 -24
  75. data/spec/unit/dsl/see/special_elements/images_spec.rb +0 -28
  76. data/spec/unit/dsl/see/special_elements/links_spec.rb +0 -55
  77. data/spec/unit/dsl/see/special_elements/ordered_texts_spec.rb +0 -21
  78. data/spec/unit/dsl/see/special_selectors_spec.rb +0 -57
  79. data/spec/unit/dsl/see/texts_spec.rb +0 -24
  80. data/spec/unit/guest_spec.rb +0 -46
  81. data/spec/unit/user_base_spec.rb +0 -13
@@ -1,107 +0,0 @@
1
- module Kameleon
2
- module Dsl
3
- module Act
4
- include Kameleon::Utils
5
-
6
- def click(*links)
7
- links.each do |link|
8
- case link.class.name
9
- when 'String'
10
- session.click_on(link)
11
- when 'Hash'
12
- link.each_pair do |what, locator|
13
- case what
14
- when :image
15
- session.find(:xpath, "//img[@alt=\"#{locator}\"").click
16
- when :and_accept
17
- if session.driver.is_a?(Capybara::Selenium::Driver)
18
- #! js hack - problem with selenium native alerts usage
19
- #! it switch to allert but no reaction on accept or dismiss
20
- session.evaluate_script("window.alert = function(msg) { return true; }")
21
- session.evaluate_script("window.confirm = function(msg) { return true; }")
22
- end
23
- click(locator)
24
- # session.driver.browser.switch_to.alert.accept if session.driver.is_a?(Capybara::Selenium::Driver)
25
- when :and_dismiss
26
- if session.driver.is_a?(Capybara::Selenium::Driver)
27
- session.evaluate_script("window.alert = function(msg) { return true; }")
28
- session.evaluate_script("window.confirm = function(msg) { return false; }")
29
- end
30
- click(locator)
31
- # session.driver.browser.switch_to.alert.dismiss if session.driver.is_a?(Capybara::Selenium::Driver)
32
- else
33
- raise("User do not know how to click #{what} - you need to teach him how")
34
- end
35
- end
36
- end
37
- end
38
- end
39
-
40
- def fill_in(locators)
41
- fill(locators) if can_fill?(locators)
42
- end
43
-
44
- private
45
-
46
- def fill(locators)
47
- locators.each_pair do |value, selector|
48
- case value
49
- when :check, :choose, :uncheck
50
- one_or_all(selector).each do |locator|
51
- session.send(value, locator)
52
- end
53
- when :select, :unselect
54
- selector.each_pair do |select_value, select_locator|
55
- one_or_all(select_locator).each do |locator|
56
- session.send(value, select_value, :from => locator)
57
- end
58
- end
59
- when :attach
60
- selector.each_pair do |file_path, locator|
61
- session.attach_file(locator, get_full_test_asset_path(file_path))
62
- end
63
- else
64
- one_or_all(selector).each do |locator|
65
- session.fill_in(locator, :with => value)
66
- end
67
- end
68
- end
69
- end
70
-
71
- def can_fill?(locators)
72
- locators.values.each do |loc|
73
- selectors = loc.respond_to?(:values) ? loc.values : loc
74
- one_or_all(selectors).each do |selector|
75
- return false if unmodifiable?(selector)
76
- end
77
- end
78
- end
79
-
80
- def unmodifiable?(locator)
81
- field = session.find_field(locator)
82
- case session.driver
83
- when Capybara::Selenium::Driver
84
- # In driver field attributes - disabled and readonly may be:
85
- # 1) string - false or true
86
- # 2) nil value
87
- return eval(field[:disabled].to_s) || eval(field[:readonly].to_s)
88
- when Capybara::RackTest::Driver
89
- # In rack field attributes - disabled and readonly may be:
90
- # 1) nil value
91
- # 2) string - disabled or readonly
92
- return field[:disabled] || field[:readonly]
93
- end
94
- end
95
-
96
- def get_full_test_asset_path(file_path)
97
- if File.file?(file_path)
98
- file_path
99
- elsif File.file?(Helpers.default_path_for_file(file_path))
100
- Helpers.default_path_for_file(file_path)
101
- else
102
- raise "Sorry but we didn't found that file in: #{file_path}, neither #{Helpers.default_path_for_file(file_path)}"
103
- end
104
- end
105
- end
106
- end
107
- end
@@ -1,155 +0,0 @@
1
- module Kameleon
2
- module Dsl
3
- module See
4
- def see(*content)
5
- options = extract_options(content)
6
-
7
- case options.class.name
8
- when 'String'
9
- session.should rspec_world.have_content(options)
10
- when 'Array'
11
- options.each do |content_part|
12
- see(content_part)
13
- end
14
- when 'Hash'
15
- options.each_pair do |value, locator|
16
- case value.class.name
17
- when 'Symbol'
18
- case value
19
- when :button, :buttons
20
- one_or_all(locator).each do |selector|
21
- session.should rspec_world.have_button(selector)
22
- end
23
- when :checked, :unchecked
24
- one_or_all(locator).each do |selector|
25
- session.should rspec_world.send("have_#{value.to_s}_field", selector)
26
- end
27
- when :disabled, :readonly
28
- one_or_all(locator).each do |selector|
29
- see :field => selector
30
- case session.driver
31
- when Capybara::Selenium::Driver
32
- session.find_field(selector)[value].should == 'true'
33
- when Capybara::RackTest::Driver
34
- session.find_field(selector)[value].should ==(value.to_s)
35
- end
36
- end
37
- when :empty
38
- one_or_all(locator).each do |selector|
39
- see :field => selector
40
- session.find_field(selector).value.to_s.should == ''
41
- end
42
- when :error_message_for, :error_messages_for
43
- one_or_all(locator).each do |selector|
44
- session.find(:xpath, '//div[@id="error_explanation"]').should rspec_world.have_content(selector.capitalize)
45
- end
46
- when :field, :fields
47
- one_or_all(locator).each do |selector|
48
- session.should rspec_world.have_field(selector)
49
- end
50
- when :image, :images
51
- one_or_all(locator).each do |selector|
52
- session.should rspec_world.have_xpath("//img[@alt=\"#{selector}\"] | //img[@src=\"#{selector}\"]")
53
- end
54
- when :selected
55
- locator.each_pair do |selected_value, selected_locator|
56
- session.should rspec_world.have_select(selected_locator, :selected => selected_value)
57
- end
58
- when :unselected
59
- locator.each_pair do |selected_value, selected_locator|
60
- session.should rspec_world.have_no_select(selected_locator, :selected => selected_value)
61
- end
62
- when :link, :links
63
- if locator.respond_to?(:each_pair)
64
- locator.each_pair do |link_text, url|
65
- session.should rspec_world.have_link(link_text, :href => url)
66
- end
67
- else
68
- one_or_all(locator).each { |text| session.should rspec_world.have_link(text) }
69
- end
70
- when :ordered
71
- #! we should extend this beyond simply text match (allow to pass full xpath)
72
- nodes = session.all(:xpath, locator.collect { |n| "//node()[text()= \"#{n}\"]" }.join(' | '))
73
- nodes.map(&:text).should == locator
74
- else
75
- raise("User can not see #{value} - you need to teach him how")
76
- end
77
- when 'Fixnum'
78
- session.should ::Capybara::RSpecMatchers::HaveMatcher.new(*(get_selector(locator) << {:count => value}))
79
- else
80
- session.should rspec_world.have_field(locator, :with => value)
81
- end
82
- end
83
- else
84
- raise "Not Implemented Structure #{options} :: #{options.class}"
85
- end
86
- end
87
-
88
- def not_see(*content)
89
- options = extract_options(content)
90
-
91
- case options.class.name
92
- when 'String'
93
- session.should_not rspec_world.have_content(options)
94
- when 'Array'
95
- options.each do |content_part|
96
- session.should_not rspec_world.have_content(content_part)
97
- end
98
- when 'Hash'
99
- options.each_pair do |value, locators|
100
- case value
101
- when :button, :buttons
102
- one_or_all(locators).each do |selector|
103
- session.should_not rspec_world.have_button(selector)
104
- end
105
- when :error_message_for, :error_messages_for
106
- one_or_all(locators).each do |selector|
107
- session.find(:xpath, '//div[@id="error_explanation"]').should_not rspec_world.have_content(selector.capitalize)
108
- end
109
- when :image, :images
110
- one_or_all(locators).each do |selector|
111
- session.should_not rspec_world.have_xpath("//img[@alt=\"#{selector}\"] | //img[@src=\"#{selector}\"]")
112
- end
113
- when :field, :fields
114
- one_or_all(locators).each do |locator|
115
- session.should_not rspec_world.have_field(locator)
116
- end
117
- when :link, :links
118
- if locators.respond_to?(:each_pair)
119
- locators.each_pair do |link_text, url|
120
- session.should_not rspec_world.have_link(link_text, :href => url)
121
- end
122
- else
123
- one_or_all(locators).each { |text| session.should_not rspec_world.have_link(text) }
124
- end
125
- when :ordered
126
- nodes = session.all(:xpath, locators.collect { |n| "//node()[text()= \"#{n}\"]" }.join(' | '))
127
- nodes.map(&:text).should_not == locators
128
- when :readonly
129
- one_or_all(locators).each do |selector|
130
- see :field => selector
131
- case session.driver
132
- when Capybara::Selenium::Driver
133
- session.find_field(selector)[value].should == 'false'
134
- when Capybara::RackTest::Driver
135
- session.find_field(selector)[value].should rspec_world.be_nil
136
- end
137
- end
138
- when :empty
139
- one_or_all(locators).each do |locator|
140
- see :field => locator
141
- session.find_field(locator).value.to_s.should_not == ''
142
- end
143
- else
144
- one_or_all(locators).each do |locator|
145
- session.should_not rspec_world.have_field(locator, :with => value)
146
- end
147
- end
148
- end
149
- else
150
- raise "Not Implemented Structure #{options} :: #{options.class}"
151
- end
152
- end
153
- end
154
- end
155
- end
@@ -1,33 +0,0 @@
1
- module Kameleon
2
- module Session
3
- module Capybara
4
- attr_accessor :driver_name
5
-
6
- def set_session
7
- @session = ::SessionPool.session(current_driver)
8
- end
9
-
10
- def refresh_page
11
- case session.driver.class.name
12
- when 'Capybara::Selenium::Driver', 'Capybara::RackTest::Driver'
13
- visit session.driver.browser.current_url
14
- when 'Capybara::Culerity::Driver'
15
- session.driver.browser.refresh
16
- else
17
- raise 'unsupported driver'
18
- end
19
- end
20
-
21
- private
22
-
23
- def current_session
24
- ::Capybara.current_session
25
- end
26
-
27
- def current_driver
28
- driver_name ||
29
- ::Capybara.current_driver
30
- end
31
- end
32
- end
33
- end
@@ -1,21 +0,0 @@
1
- require 'singleton'
2
- module Kameleon
3
- module Session
4
- class Server
5
- include ::Singleton
6
- class << self
7
- def server(app)
8
- @server ||= start_new_server(app)
9
- end
10
-
11
- private
12
-
13
- def start_new_server(app)
14
- rack_server = ::Capybara::Server.new(app)
15
- rack_server.boot
16
- rack_server
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,45 +0,0 @@
1
- require 'singleton'
2
- class SessionPool
3
- include Singleton
4
- class << self
5
- attr_writer :nice
6
- def session(driver)
7
- take_idle(driver) || create(driver)
8
- end
9
-
10
- def release_all
11
- idle.concat(busy)
12
- busy.clear
13
- end
14
-
15
- protected
16
-
17
- def idle
18
- @idle ||= []
19
- end
20
-
21
- def busy
22
- @busy ||= []
23
- end
24
-
25
- def take_idle(driver)
26
- if session = find_idle(driver)
27
- session.reset!
28
- session.tap do |s|
29
- idle.delete(s)
30
- busy.push(s)
31
- end
32
- end
33
- end
34
-
35
- def find_idle(driver)
36
- idle.detect { |session| session.mode == driver }
37
- end
38
-
39
- def create(driver)
40
- ::Capybara::Session.new(driver, ::Capybara.app).tap do |session|
41
- busy.push(session)
42
- end
43
- end
44
- end
45
- end
@@ -1,142 +0,0 @@
1
- module Kameleon
2
- module User
3
- class Abstract
4
- attr_accessor :options
5
- attr_accessor :rspec_world
6
-
7
- include Kameleon::Session::Capybara
8
- include Kameleon::Dsl::See
9
- include Kameleon::Dsl::Act
10
-
11
- def initialize(rspec_world, options={})
12
- @rspec_world = rspec_world
13
- @driver_name = options.delete(:driver)
14
- @session_name = options.delete(:session_name)
15
- @options = options
16
- set_session
17
- session.instance_eval do
18
- def within(*args)
19
- new_scope = if args.size == 1 && Capybara::Node::Base === args.first
20
- args.first
21
- elsif args.last == :select_multiple
22
- case driver
23
- when Capybara::Selenium::Driver
24
- raise "So far Unsupported in this driver"
25
- when Capybara::RackTest::Driver
26
- node = find(*args)
27
- native = Nokogiri::HTML.parse(html).xpath(args[1])
28
- base = Capybara::RackTest::Node.new(driver, native)
29
- ::Capybara::Node::Element.new(self,
30
- base,
31
- node.parent,
32
- node.instance_variable_get(:@selector))
33
- end
34
- else
35
- find(*args)
36
- end
37
- begin
38
- scopes.push(*new_scope)
39
- yield
40
- ensure
41
- scopes.pop
42
- end
43
- end
44
- end
45
- yield if block_given?
46
- after_initialization
47
- end
48
-
49
- def visit(page)
50
- session.visit(page)
51
- end
52
-
53
- def will(&block)
54
- default_selector ?
55
- within(*default_selector, &block) :
56
- instance_eval(&block)
57
- end
58
-
59
- def within(*selector, &block)
60
- session.within(*get_selector(selector)) do
61
- instance_eval(&block)
62
- end
63
- end
64
-
65
- def page_areas
66
- {}
67
- end
68
-
69
- def debug
70
- session
71
- end
72
-
73
- #! it should be package into raw module
74
- def page_element(selector)
75
- session.find(*get_selector(selector))
76
- end
77
-
78
- def page_elements(selector)
79
- session.all(*get_selector(selector))
80
- end
81
-
82
- private
83
-
84
- def load_homepage?
85
- !options[:skip_page_autoload]
86
- end
87
-
88
- def session
89
- @session
90
- end
91
-
92
- def extract_options(opts)
93
- if opts.size == 1
94
- opts.first
95
- else
96
- opts
97
- end
98
- end
99
-
100
- def after_initialization
101
- # stub, should be implemented in subclass
102
- end
103
-
104
- def get_selector(selector)
105
- if (selector.is_a?(Array) && selector.size == 1)
106
- selector = selector.first
107
- end
108
- case selector
109
- when Hash
110
- selector.each_pair do |key, value|
111
- case key
112
- when :row
113
- return [:xpath, "//tr[*='#{value}'][1]"]
114
- when :column
115
- position = session.all(:xpath, "//table//th").index { |n| n.text =~ /#{value}/ }
116
- return [:xpath, ".//table//th[#{position + 1}] | .//table//td[#{position + 1}]", :select_multiple]
117
- else
118
- raise "not supported selectors"
119
- end
120
- end
121
- when Symbol
122
- page_areas[selector].is_a?(Array) ?
123
- page_areas[selector] :
124
- [Capybara.default_selector, page_areas[selector]]
125
- when Array
126
- selector
127
- else
128
- [Capybara.default_selector, selector]
129
- end
130
- end
131
-
132
- def default_selector
133
- page_areas[:main]
134
- end
135
-
136
- def one_or_all(elements)
137
- elements.is_a?(Array) ? elements : [elements]
138
- end
139
-
140
- end
141
- end
142
- end