e2e 0.7.0 → 0.7.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.
data/lib/e2e/server.rb CHANGED
@@ -17,24 +17,44 @@ module E2E
17
17
 
18
18
  def start
19
19
  @thread = Thread.new do
20
- # Use Rackup handler for Rack 3 compatibility
21
- Rackup::Handler::WEBrick.run(
20
+ webrick_handler.run(
22
21
  @app,
23
22
  Host: @host,
24
23
  Port: @port,
25
24
  AccessLog: [],
26
25
  Logger: WEBrick::Log.new(nil, 0) # Silence logs
27
- )
26
+ ) do |server|
27
+ @webrick = server
28
+ end
28
29
  end
29
30
  wait_for_boot
30
31
  end
31
32
 
33
+ def stop
34
+ @webrick&.shutdown
35
+ @thread&.join(5)
36
+ @thread = nil
37
+ @webrick = nil
38
+ end
39
+
32
40
  def base_url
33
41
  "http://#{@host}:#{@port}"
34
42
  end
35
43
 
36
44
  private
37
45
 
46
+ # rackup 2.x (the version paired with Rack 3) exposes Rackup::Handler.
47
+ # Older stacks that pin Rack 2.x (e.g. Rails 7.0/7.1 via this gem's own
48
+ # Appraisal matrix) resolve `rackup` down to its 1.x line, which has no
49
+ # Handler module at all -- there, the handler lives on Rack::Handler.
50
+ def webrick_handler
51
+ if defined?(Rackup::Handler)
52
+ Rackup::Handler.get(:webrick)
53
+ else
54
+ Rack::Handler.get(:webrick)
55
+ end
56
+ end
57
+
38
58
  def find_available_port
39
59
  server = TCPServer.new("127.0.0.1", 0)
40
60
  port = server.addr[1]
@@ -45,6 +65,11 @@ module E2E
45
65
  def wait_for_boot
46
66
  start_time = Time.now
47
67
  loop do
68
+ if @thread && !@thread.alive?
69
+ @thread.join # re-raises whatever exception killed the server thread
70
+ raise "Server thread exited before boot completed"
71
+ end
72
+
48
73
  socket = TCPSocket.new("127.0.0.1", @port)
49
74
  socket.close
50
75
  break
data/lib/e2e/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module E2E
4
- VERSION = "0.7.0"
4
+ VERSION = "0.7.2"
5
5
  end
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "pathname"
5
+
6
+ module E2E
7
+ # Ensures ViteRuby test assets are built before the e2e suite runs.
8
+ #
9
+ # ViteRuby::Builder skips compile when the watched-files digest is unchanged,
10
+ # so calling this on every suite start is cheap when assets are fresh.
11
+ #
12
+ # A flock serializes builders across processes (e.g. accidental parallel e2e).
13
+ module ViteAssets
14
+ LOCK_NAME = "e2e-vite-test-build.lock"
15
+ SKIP_ENV = "SKIP_VITE_TEST_BUILD"
16
+
17
+ class << self
18
+ def ensure_built!
19
+ return if ENV[SKIP_ENV] == "1"
20
+ return if done?
21
+
22
+ mode = normalize_mode(E2E.config.ensure_vite_assets)
23
+ return mark_done! if mode == :skip
24
+
25
+ with_lock do
26
+ return if done?
27
+
28
+ case mode
29
+ when :auto
30
+ ensure_auto!
31
+ when :build
32
+ ensure_required!
33
+ when :warn
34
+ ensure_warn!
35
+ end
36
+
37
+ mark_done!
38
+ end
39
+ end
40
+
41
+ def reset!
42
+ @done = false
43
+ end
44
+
45
+ def project_root
46
+ if defined?(Rails) && Rails.respond_to?(:root) && Rails.root
47
+ Pathname(Rails.root)
48
+ else
49
+ Pathname.pwd
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def done?
56
+ @done
57
+ end
58
+
59
+ def mark_done!
60
+ @done = true
61
+ end
62
+
63
+ def normalize_mode(value)
64
+ case value
65
+ when :auto, :build, :warn, :skip then value
66
+ when true then :build
67
+ when false, nil then :skip
68
+ else
69
+ raise E2E::Error, "Unknown ensure_vite_assets=#{value.inspect} (expected :auto, :build, :warn, :skip)"
70
+ end
71
+ end
72
+
73
+ def vite_ruby_loaded?
74
+ defined?(ViteRuby)
75
+ end
76
+
77
+ def ensure_auto!
78
+ return unless vite_ruby_loaded?
79
+
80
+ build_or_raise!
81
+ end
82
+
83
+ def ensure_required!
84
+ unless vite_ruby_loaded?
85
+ raise E2E::Error, <<~MSG.chomp
86
+ ViteRuby is not loaded, but E2E.config.ensure_vite_assets = :build.
87
+ Add vite_rails / vite_ruby, or set ensure_vite_assets to :skip / :auto.
88
+ MSG
89
+ end
90
+
91
+ build_or_raise!
92
+ end
93
+
94
+ def ensure_warn!
95
+ return warn_missing_vite_ruby unless vite_ruby_loaded?
96
+
97
+ return if ViteRuby.commands.build
98
+
99
+ warn <<~MSG
100
+ [E2E] Vite test asset build failed.
101
+ Run: bin/vite build --mode=test
102
+ Or set #{SKIP_ENV}=1 / E2E.config.ensure_vite_assets = :skip
103
+ MSG
104
+ end
105
+
106
+ def warn_missing_vite_ruby
107
+ warn "[E2E] ensure_vite_assets=:warn but ViteRuby is not loaded; skipping."
108
+ end
109
+
110
+ def build_or_raise!
111
+ return if ViteRuby.commands.build
112
+
113
+ raise E2E::Error, <<~MSG.chomp
114
+ Vite test asset build failed.
115
+ Run: bin/vite build --mode=test
116
+ Or set #{SKIP_ENV}=1 to skip (not recommended for Inertia/Vite apps).
117
+ MSG
118
+ end
119
+
120
+ def with_lock
121
+ lock_path = project_root.join("tmp", LOCK_NAME)
122
+ FileUtils.mkdir_p(lock_path.dirname)
123
+
124
+ File.open(lock_path, File::RDWR | File::CREAT, 0o644) do |lock|
125
+ lock.flock(File::LOCK_EX)
126
+ yield
127
+ ensure
128
+ lock.flock(File::LOCK_UN)
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
data/lib/e2e.rb CHANGED
@@ -7,6 +7,7 @@ require_relative "e2e/session"
7
7
  require_relative "e2e/dsl"
8
8
  require_relative "e2e/element"
9
9
  require_relative "e2e/rails"
10
+ require_relative "e2e/vite_assets"
10
11
  require_relative "e2e/drivers/playwright"
11
12
 
12
13
  module E2E
@@ -37,6 +38,11 @@ module E2E
37
38
  srv
38
39
  end
39
40
  end
41
+
42
+ def stop_server!
43
+ @server&.stop
44
+ @server = nil
45
+ end
40
46
  end
41
47
 
42
48
  # Retry a block until it returns truthy or timeout is reached
@@ -61,7 +67,8 @@ module E2E
61
67
  alert: "[role='alert'], [data-flash-type='alert'], [data-flash='alert'], .flash.alert, .flash-error, .alert"
62
68
  }.freeze
63
69
 
64
- attr_accessor :driver, :headless, :app, :browser_type, :wait_timeout, :flash_selectors
70
+ attr_accessor :driver, :headless, :app, :browser_type, :wait_timeout, :flash_selectors,
71
+ :navigation_timeout, :navigation_wait_until, :ensure_vite_assets
65
72
 
66
73
  def initialize
67
74
  @driver = :playwright
@@ -69,7 +76,13 @@ module E2E
69
76
  @headless = ENV.fetch("HEADLESS", "true") == "true"
70
77
  @app = nil
71
78
  @wait_timeout = 5
79
+ # Full "load" waits for every subframe (YouTube/Vimeo/etc.) and can hang
80
+ # navigations indefinitely when those resources never settle.
81
+ @navigation_wait_until = "domcontentloaded"
82
+ @navigation_timeout = 30
72
83
  @flash_selectors = DEFAULT_FLASH_SELECTORS.dup
84
+ # :auto builds when ViteRuby is loaded; :build requires it; :warn / :skip
85
+ @ensure_vite_assets = :auto
73
86
  end
74
87
  end
75
88
  end
@@ -68,6 +68,9 @@ module E2e
68
68
  E2E.configure do |config|
69
69
  config.app = Rails.application
70
70
  config.headless = ENV.fetch("HEADLESS", "true") == "true"
71
+ # :auto builds Vite test assets when ViteRuby is loaded (Inertia/Vite apps).
72
+ # Options: :auto, :build, :warn, :skip — or SKIP_VITE_TEST_BUILD=1
73
+ config.ensure_vite_assets = :auto
71
74
  end
72
75
 
73
76
  # If you want to use transactional tests (faster), enable shared connection:
@@ -89,6 +92,9 @@ module E2e
89
92
  E2E.configure do |config|
90
93
  config.app = Rails.application
91
94
  config.headless = ENV.fetch("HEADLESS", "true") == "true"
95
+ # :auto builds Vite test assets when ViteRuby is loaded (Inertia/Vite apps).
96
+ # Options: :auto, :build, :warn, :skip — or SKIP_VITE_TEST_BUILD=1
97
+ config.ensure_vite_assets = :auto
92
98
  end
93
99
 
94
100
  # If you want to use transactional tests (faster), enable shared connection:
data/mise.toml ADDED
@@ -0,0 +1,14 @@
1
+ [tools]
2
+ ruby = "4.0.6"
3
+
4
+ [tasks.test]
5
+ description = "Run RSpec and Minitest suites"
6
+ run = "bundle exec rake spec test"
7
+
8
+ [tasks.lint]
9
+ description = "Run RuboCop"
10
+ run = "bundle exec rubocop"
11
+
12
+ [tasks.release]
13
+ description = "Build and publish the gem (rake release)"
14
+ run = "bundle exec rake release"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: e2e
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Poimtsev
@@ -65,6 +65,20 @@ dependencies:
65
65
  - - ">="
66
66
  - !ruby/object:Gem::Version
67
67
  version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: activerecord
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
68
82
  - !ruby/object:Gem::Dependency
69
83
  name: appraisal
70
84
  requirement: !ruby/object:Gem::Requirement
@@ -177,6 +191,20 @@ dependencies:
177
191
  - - ">="
178
192
  - !ruby/object:Gem::Version
179
193
  version: '0'
194
+ - !ruby/object:Gem::Dependency
195
+ name: sqlite3
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
180
208
  - !ruby/object:Gem::Dependency
181
209
  name: standard
182
210
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +227,7 @@ executables: []
199
227
  extensions: []
200
228
  extra_rdoc_files: []
201
229
  files:
230
+ - ".ruby-version"
202
231
  - Appraisals
203
232
  - CHANGELOG.md
204
233
  - LICENSE.txt
@@ -229,10 +258,12 @@ files:
229
258
  - lib/e2e/server.rb
230
259
  - lib/e2e/session.rb
231
260
  - lib/e2e/version.rb
261
+ - lib/e2e/vite_assets.rb
232
262
  - lib/generators/e2e/install_generator.rb
233
263
  - lib/generators/e2e/templates/minitest_test.rb.erb
234
264
  - lib/generators/e2e/templates/rspec_test.rb.erb
235
265
  - lib/generators/e2e/test_generator.rb
266
+ - mise.toml
236
267
  - sig/e2e.rbs
237
268
  homepage: https://github.com/alec-c4/e2e
238
269
  licenses:
@@ -255,7 +286,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
255
286
  - !ruby/object:Gem::Version
256
287
  version: '0'
257
288
  requirements: []
258
- rubygems_version: 4.0.16
289
+ rubygems_version: 4.0.18
259
290
  specification_version: 4
260
291
  summary: Unified E2E testing framework for Ruby.
261
292
  test_files: []