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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/Appraisals +3 -0
- data/CHANGELOG.md +28 -0
- data/README.md +17 -0
- data/gemfiles/rails_7.0.gemfile +1 -0
- data/gemfiles/rails_7.0.gemfile.lock +43 -36
- data/gemfiles/rails_7.1.gemfile.lock +54 -36
- data/gemfiles/rails_7.2.gemfile.lock +54 -36
- data/gemfiles/rails_8.0.gemfile.lock +120 -102
- data/gemfiles/rails_8.1.gemfile.lock +120 -102
- data/lib/e2e/drivers/playwright.rb +34 -10
- data/lib/e2e/minitest.rb +6 -0
- data/lib/e2e/rails.rb +71 -10
- data/lib/e2e/rspec.rb +5 -0
- data/lib/e2e/server.rb +28 -3
- data/lib/e2e/version.rb +1 -1
- data/lib/e2e/vite_assets.rb +133 -0
- data/lib/e2e.rb +14 -1
- data/lib/generators/e2e/install_generator.rb +6 -0
- data/mise.toml +14 -0
- metadata +33 -2
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
|
-
|
|
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
|
@@ -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.
|
|
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.
|
|
289
|
+
rubygems_version: 4.0.18
|
|
259
290
|
specification_version: 4
|
|
260
291
|
summary: Unified E2E testing framework for Ruby.
|
|
261
292
|
test_files: []
|