capybara-experience 0.1.2 → 0.3.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
  SHA256:
3
- metadata.gz: '01845d3b647bd5c05da6b2cf5dea1cd5683efc0e64c36d8cc92099a7dd2ac266'
4
- data.tar.gz: ea5f0e3925085dc98fdfe8bc92ca2a8880b6d630406b50d6bd724b102762f654
3
+ metadata.gz: 9e604603bfb1f0fde33216fc173bd1c4050a93251f8009054c68fc920996a6e6
4
+ data.tar.gz: 5672e3dd951dbbeb68513427e07c79607cadeb4b6812b7d8b431da06830d126f
5
5
  SHA512:
6
- metadata.gz: 2e3a38fcfcfa9400c33e14ec4d8717bdc72192f819282e1ec998ee15ced37bd3177a24f5a555a2bea33eb451dc4656fda63ea5837f0bebb250ac642c146ca864
7
- data.tar.gz: 472bdb5fedb119defde0e5c1337ce5cf6e30ee1e0cc5573244fbbeb4cde75dee9bcc586f42bf09b5b3e5b9fe9eca711762d20f0a29f492cd63fe943b54c8a24d
6
+ metadata.gz: 4e729f9c62eda4bb7d5d446d5215c199c3443419841a3c876a7378cdd8f2a6766e9c5589b2cc320c60d2577f0f9314bd9a3b43a3238562acf6a48283c66d4e97
7
+ data.tar.gz: 6d913cbe6e6bbde172f82175317d217ef0b1edd8a11a5fa2883e6cf41b13208dcf9cab603cb8c7a51b38997b14e984b0f84ab9cfc7cf272b731edecca19a483c
data/.gitignore CHANGED
@@ -9,3 +9,4 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+ Gemfile.lock
data/README.md CHANGED
@@ -36,6 +36,8 @@ This scenario is for your standard user/admin.
36
36
  ```ruby
37
37
  # spec/support/experiences/user_experience.rb
38
38
  class UserExperience < Capybara::Experience
39
+ include Rails.application.routes.url_helpers
40
+
39
41
  def login(user)
40
42
  @user = user
41
43
  login_as user, scope: :user
@@ -98,7 +100,7 @@ RSpec.describe "sign up flow", feature: true do
98
100
 
99
101
  it "works" do
100
102
  behavior "user can sign up" do # behaviors are an added DSL by capybara-experiences to group interactions & assertions
101
- guest_ux = GuestExpereince.new
103
+ guest_ux = GuestExperience.new
102
104
  guest_ux.navigate_to_sign_up
103
105
 
104
106
  guest_ux.sign_up(
@@ -28,4 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "bundler", "~> 2.0"
29
29
  spec.add_development_dependency "rake", "~> 10.0"
30
30
  spec.add_development_dependency "rspec", "~> 3.0"
31
+
32
+ spec.add_runtime_dependency "capybara", "~> 3.0"
31
33
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ require "singleton"
3
+
4
+ module Capybara
5
+ class Experience
6
+ class Pool < Hash
7
+ include Singleton
8
+
9
+ def [](key)
10
+ super(key) || begin
11
+ driver, _session_name, app_object_id = key.split(":")
12
+ take(driver: driver, app_object_id: app_object_id, key: key)
13
+ end
14
+ end
15
+
16
+ def take(driver: Capybara.current_driver, app_object_id: Capybara.app.object_id, key: nil)
17
+ session = idle.find { |s| s.mode == driver && s.app.object_id == app_object_id }
18
+ if session
19
+ idle.delete(session)
20
+ self[key] = delete(session_key(session)) if key
21
+ else
22
+ session = ::Capybara::Session.new(driver.to_sym, Capybara.app)
23
+ key ||= session_key(session)
24
+ self[key] = session
25
+ end
26
+
27
+ session
28
+ end
29
+
30
+ def idle
31
+ @idle ||= []
32
+ end
33
+
34
+ def taken
35
+ values - idle
36
+ end
37
+
38
+ def reset_idle!
39
+ each do |key, session|
40
+ self[session_key(session)] = delete(key)
41
+ end
42
+ @idle = values
43
+
44
+ nil
45
+ end
46
+
47
+ private
48
+
49
+ def session_key(session)
50
+ "#{session.mode}:#{session.object_id}:#{session.app.object_id}"
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,30 +1,37 @@
1
1
  # frozen_string_literal: true
2
- module BehaviorDSL
3
- def behavior(name, &block)
4
- metadata[:description_args].push(name)
5
- refresh_description unless in_continuous_integration_env?
6
- yield
7
- metadata[:description_args].pop
8
- refresh_description unless in_continuous_integration_env?
2
+
3
+ module Capybara
4
+ class Experience
5
+ module BehaviorDSL
6
+ def behavior(name)
7
+ metadata[:description_args].push(name)
8
+ refresh_description unless in_continuous_integration_env?
9
+ yield
10
+ metadata[:description_args].pop
11
+ refresh_description unless in_continuous_integration_env?
12
+ end
13
+
14
+ private
15
+
16
+ def refresh_description
17
+ metadata[:description] = metadata[:description_args].join(" ")
18
+ metadata[:full_description] = [metadata[:example_group][:full_description]].concat(metadata[:description_args]).join(" ")
19
+ end
20
+
21
+ def metadata
22
+ RSpec.current_example.metadata
23
+ end
24
+
25
+ def in_continuous_integration_env?
26
+ ENV["CI"].present?
27
+ end
9
28
  end
10
-
11
- private
12
-
13
- def refresh_description
14
- metadata[:description] = metadata[:description_args].join(" ")
15
- metadata[:full_description] = [metadata[:example_group][:full_description]].concat(metadata[:description_args]).join(" ")
29
+
30
+ RSpec.configure do |config|
31
+ config.include BehaviorDSL
32
+ config.prepend_after :each, type: :feature, js: true do
33
+ Capybara::Experience::Pool.instance.reset_idle!
34
+ end
16
35
  end
17
-
18
- def metadata
19
- RSpec.current_example.metadata
20
- end
21
-
22
- def in_continuous_integration_env?
23
- ENV["CI"].present?
24
- end
25
- end
26
-
27
- RSpec.configure do |config|
28
- config.include BehaviorDSL
29
36
  end
30
-
37
+ end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  class Experience
3
- VERSION = "0.1.2"
3
+ VERSION = "0.3.1"
4
4
  end
5
5
  end
@@ -1,13 +1,12 @@
1
1
  # frozen_string_literal: true
2
- require "capybara/experience/session"
2
+ require "capybara/dsl"
3
+ require "capybara/experience/pool"
3
4
 
4
5
  module Capybara
5
6
  class Experience
6
7
  include Capybara::DSL
7
- include Rails.application.routes.url_helpers
8
- include Warden::Test::Helpers
9
8
 
10
- delegate :t, to: I18n
9
+ delegate :t, to: I18n if defined?(I18n)
11
10
 
12
11
  def initialize(driver_name: nil)
13
12
  @driver_name = driver_name
@@ -24,36 +23,35 @@ module Capybara
24
23
  delegate :driver, to: :page
25
24
 
26
25
  def page
27
- @page ||= Experience::Session.next(driver: driver_name)
26
+ @page ||= Experience::Pool.instance.take(driver: driver_name)
27
+
28
+ Capybara::Screenshot.final_session_name = @page.object_id if defined?(Capybara::Screenshot)
29
+
30
+ @page
28
31
  end
29
32
 
30
33
  def self.wait_for_pending_requests
31
- Experience::Session.pool.taken.each do |session|
34
+ Experience::Pool.taken.each do |session|
32
35
  session.server.try(:wait_for_pending_requests)
33
36
  end
34
37
  end
35
38
 
36
- def save_and_open_screenshot_full(path = nil, options = {})
37
- save_and_open_screenshot(path, options.merge(full: true))
38
- end
39
+ class Error < StandardError; end
40
+
41
+ module UnifySessionPool
42
+ def page
43
+ Capybara::Screenshot.final_session_name = Capybara.session_name if defined?(Capybara::Screenshot)
39
44
 
40
- def current_driver_adapter
41
- adapter = ShowMeTheCookies.adapters[driver_name]
42
- if adapter.nil?
43
- raise(ShowMeTheCookies::UnknownDriverError, "Unsupported driver #{driver_name}, use one of #{ShowMeTheCookies.adapters.keys} or register your new driver with ShowMeTheCookies.register_adapter")
45
+ super
44
46
  end
45
- adapter.new(page.driver)
46
- end
47
47
 
48
- def click_with_js(element)
49
- xpath = element.path
50
- execute_script <<~JS
51
- document.evaluate('#{xpath}', document, null, XPathResult.ANY_TYPE, null)
52
- .iterateNext()
53
- .click()
54
- JS
55
- end
48
+ private
56
49
 
57
- class Error < StandardError; end
50
+ def session_pool
51
+ @session_pool ||= Experience::Pool.instance
52
+ end
53
+ end
58
54
  end
55
+
56
+ singleton_class.prepend Experience::UnifySessionPool
59
57
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-experience
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Ong
8
8
  - Britt Lewis
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-07-10 00:00:00.000000000 Z
12
+ date: 2022-09-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -53,6 +53,20 @@ dependencies:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '3.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: capybara
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '3.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
56
70
  description: Abstractions for Capybara to manage multiple user sessions, encapsulate
57
71
  shared test behavior, and semantically contextualize test code.
58
72
  email:
@@ -73,15 +87,15 @@ files:
73
87
  - capybara-experience.gemspec
74
88
  - lib/capybara-experience.rb
75
89
  - lib/capybara/experience.rb
90
+ - lib/capybara/experience/pool.rb
76
91
  - lib/capybara/experience/rspec.rb
77
- - lib/capybara/experience/session.rb
78
92
  - lib/capybara/experience/version.rb
79
93
  homepage: https://github.com/ryanong/capybara-experience
80
94
  licenses: []
81
95
  metadata:
82
96
  homepage_uri: https://github.com/ryanong/capybara-experience
83
97
  source_code_uri: https://github.com/ryanong/capybara-experience
84
- post_install_message:
98
+ post_install_message:
85
99
  rdoc_options: []
86
100
  require_paths:
87
101
  - lib
@@ -96,8 +110,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
110
  - !ruby/object:Gem::Version
97
111
  version: '0'
98
112
  requirements: []
99
- rubygems_version: 3.1.2
100
- signing_key:
113
+ rubygems_version: 3.3.17
114
+ signing_key:
101
115
  specification_version: 4
102
116
  summary: Simplify Capybara testing for larger applications
103
117
  test_files: []
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Capybara
4
- class Experience
5
- module Session
6
- class << self
7
- def next(driver:)
8
- pool.next(driver)
9
- end
10
-
11
- def create(driver)
12
- ::Capybara::Session.new(driver, Capybara.app)
13
- end
14
-
15
- def pool
16
- @pool ||= Pool.new
17
- end
18
- end
19
-
20
- class Pool
21
- attr_accessor :idle, :taken
22
-
23
- def initialize
24
- @idle = []
25
- @taken = []
26
- end
27
-
28
- def next(driver)
29
- take_idle(driver) || create(driver)
30
- end
31
-
32
- def release
33
- taken.each(&:reset!)
34
- idle.concat(taken)
35
- taken.clear
36
- end
37
-
38
- private
39
-
40
- def take_idle(driver)
41
- idle.find { |s| s.mode == driver }.tap do |session|
42
- if session
43
- idle.delete(session)
44
- taken.push(session)
45
- end
46
- end
47
- end
48
-
49
- def create(driver)
50
- ::Capybara::Experience::Session.create(driver).tap do |session|
51
- taken.push(session)
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end