playwright-on-rails 0.7.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 +7 -0
- data/.github/workflows/main.yml +21 -0
- data/.gitignore +8 -0
- data/.standard.yml +5 -0
- data/.travis.yml +7 -0
- data/CHANGELOG.md +115 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +155 -0
- data/LICENSE.txt +25 -0
- data/README.md +241 -0
- data/Rakefile +11 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/playwright-on-rails +17 -0
- data/lib/playwright-on-rails/config.rb +41 -0
- data/lib/playwright-on-rails/env.rb +14 -0
- data/lib/playwright-on-rails/finds_bin.rb +16 -0
- data/lib/playwright-on-rails/init.rb +93 -0
- data/lib/playwright-on-rails/initializer_hooks.rb +53 -0
- data/lib/playwright-on-rails/launches_playwright.rb +63 -0
- data/lib/playwright-on-rails/manages_transactions.rb +78 -0
- data/lib/playwright-on-rails/open.rb +14 -0
- data/lib/playwright-on-rails/railtie.rb +12 -0
- data/lib/playwright-on-rails/rake.rb +18 -0
- data/lib/playwright-on-rails/resets_state.rb +20 -0
- data/lib/playwright-on-rails/run.rb +14 -0
- data/lib/playwright-on-rails/server/checker.rb +42 -0
- data/lib/playwright-on-rails/server/middleware.rb +67 -0
- data/lib/playwright-on-rails/server/puma.rb +31 -0
- data/lib/playwright-on-rails/server/timer.rb +24 -0
- data/lib/playwright-on-rails/server.rb +121 -0
- data/lib/playwright-on-rails/starts_rails_server.rb +34 -0
- data/lib/playwright-on-rails/tracks_resets.rb +26 -0
- data/lib/playwright-on-rails/version.rb +3 -0
- data/lib/playwright-on-rails.rb +11 -0
- data/playwright_rails.gemspec +32 -0
- data/script/test +21 -0
- data/script/test_example_app +21 -0
- metadata +166 -0
@@ -0,0 +1,121 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "uri"
|
4
|
+
require "net/http"
|
5
|
+
require "rack"
|
6
|
+
require_relative "initializer_hooks"
|
7
|
+
require_relative "server/middleware"
|
8
|
+
require_relative "server/checker"
|
9
|
+
require_relative "server/timer"
|
10
|
+
require_relative "server/puma"
|
11
|
+
|
12
|
+
module PlaywrightOnRails
|
13
|
+
class Server
|
14
|
+
class << self
|
15
|
+
def ports
|
16
|
+
@ports ||= {}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :app, :host, :port
|
21
|
+
|
22
|
+
def initialize(app,
|
23
|
+
host:,
|
24
|
+
port:,
|
25
|
+
reportable_errors: [Exception],
|
26
|
+
extra_middleware: [])
|
27
|
+
@app = app
|
28
|
+
@extra_middleware = extra_middleware
|
29
|
+
@server_thread = nil # suppress warnings
|
30
|
+
@host = host
|
31
|
+
@reportable_errors = reportable_errors
|
32
|
+
@port = port
|
33
|
+
@port ||= Server.ports[port_key]
|
34
|
+
@port ||= find_available_port(host)
|
35
|
+
@checker = Checker.new(@host, @port)
|
36
|
+
@initializer_hooks = InitializerHooks.instance
|
37
|
+
end
|
38
|
+
|
39
|
+
def reset_error!
|
40
|
+
middleware.clear_error
|
41
|
+
end
|
42
|
+
|
43
|
+
def error
|
44
|
+
middleware.error
|
45
|
+
end
|
46
|
+
|
47
|
+
def using_ssl?
|
48
|
+
@checker.ssl?
|
49
|
+
end
|
50
|
+
|
51
|
+
def responsive?
|
52
|
+
return false if @server_thread&.join(0)
|
53
|
+
|
54
|
+
res = @checker.request { |http| http.get("/__identify__") }
|
55
|
+
|
56
|
+
res.body == app.object_id.to_s if res.is_a?(Net::HTTPSuccess) || res.is_a?(Net::HTTPRedirection)
|
57
|
+
rescue SystemCallError, Net::ReadTimeout, OpenSSL::SSL::SSLError
|
58
|
+
false
|
59
|
+
end
|
60
|
+
|
61
|
+
def wait_for_pending_requests
|
62
|
+
timer = Timer.new(60)
|
63
|
+
while pending_requests?
|
64
|
+
raise "Requests did not finish in 60 seconds: #{middleware.pending_requests}" if timer.expired?
|
65
|
+
|
66
|
+
sleep 0.01
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def boot
|
71
|
+
unless responsive?
|
72
|
+
Server.ports[port_key] = port
|
73
|
+
|
74
|
+
@server_thread = Thread.new {
|
75
|
+
Puma.create(middleware, port, host)
|
76
|
+
}
|
77
|
+
|
78
|
+
timer = Timer.new(60)
|
79
|
+
until responsive?
|
80
|
+
raise "Rack application timed out during boot" if timer.expired?
|
81
|
+
|
82
|
+
@server_thread.join(0.1)
|
83
|
+
@initializer_hooks.run(:after_server_start)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def middleware
|
93
|
+
@middleware ||= Middleware.new(app, @reportable_errors, @extra_middleware)
|
94
|
+
end
|
95
|
+
|
96
|
+
def port_key
|
97
|
+
app.object_id # as opposed to middleware.object_id if multiple instances
|
98
|
+
end
|
99
|
+
|
100
|
+
def pending_requests?
|
101
|
+
middleware.pending_requests?
|
102
|
+
end
|
103
|
+
|
104
|
+
def find_available_port(host)
|
105
|
+
server = TCPServer.new(host, 0)
|
106
|
+
port = server.addr[1]
|
107
|
+
server.close
|
108
|
+
|
109
|
+
# Workaround issue where some platforms (mac, ???) when passed a host
|
110
|
+
# of '0.0.0.0' will return a port that is only available on one of the
|
111
|
+
# ip addresses that resolves to, but the next binding to that port requires
|
112
|
+
# that port to be available on all ips
|
113
|
+
server = TCPServer.new(host, port)
|
114
|
+
port
|
115
|
+
rescue Errno::EADDRINUSE
|
116
|
+
retry
|
117
|
+
ensure
|
118
|
+
server&.close
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative "tracks_resets"
|
2
|
+
require_relative "server"
|
3
|
+
|
4
|
+
module PlaywrightOnRails
|
5
|
+
class StartsRailsServer
|
6
|
+
def call(host:, port:, transactional_server:)
|
7
|
+
configure_rails_to_run_our_state_reset_on_every_request!(transactional_server)
|
8
|
+
app = create_rack_app
|
9
|
+
Server.new(app, host: host, port: port).tap do |server|
|
10
|
+
server.boot
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def configure_rails_to_run_our_state_reset_on_every_request!(transactional_server)
|
15
|
+
Rails.application.executor.to_run do
|
16
|
+
TracksResets.instance.reset_state_if_needed(transactional_server)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_rack_app
|
21
|
+
Rack::Builder.new do
|
22
|
+
map "/playwright-on-rails_reset_state" do
|
23
|
+
run lambda { |env|
|
24
|
+
TracksResets.instance.reset_needed!
|
25
|
+
[202, {"Content-Type" => "text/plain"}, ["Accepted"]]
|
26
|
+
}
|
27
|
+
end
|
28
|
+
map "/" do
|
29
|
+
run Rails.application
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative "resets_state"
|
2
|
+
|
3
|
+
module PlaywrightOnRails
|
4
|
+
class TracksResets
|
5
|
+
def self.instance
|
6
|
+
@instance ||= new
|
7
|
+
end
|
8
|
+
|
9
|
+
def reset_needed!
|
10
|
+
@reset_needed = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def reset_state_if_needed(transactional_server)
|
14
|
+
if @reset_needed
|
15
|
+
ResetsState.new.call(transactional_server: transactional_server)
|
16
|
+
@reset_needed = false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@reset_needed = false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "playwright-on-rails/version"
|
2
|
+
|
3
|
+
module PlaywrightOnRails
|
4
|
+
end
|
5
|
+
|
6
|
+
require "playwright-on-rails/init"
|
7
|
+
require "playwright-on-rails/open"
|
8
|
+
require "playwright-on-rails/run"
|
9
|
+
require "playwright-on-rails/resets_state"
|
10
|
+
require "playwright-on-rails/initializer_hooks"
|
11
|
+
require "playwright-on-rails/railtie" if defined?(Rails)
|
@@ -0,0 +1,32 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "playwright-on-rails/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "playwright-on-rails"
|
7
|
+
spec.version = PlaywrightOnRails::VERSION
|
8
|
+
spec.authors = ["Arthur Hess"]
|
9
|
+
spec.email = ["arthess@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = "Helps you write Playwright tests of your Rails app"
|
12
|
+
spec.homepage = "https://github.com/arthurhess/playwright-on-rails"
|
13
|
+
spec.license = "MIT"
|
14
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
15
|
+
|
16
|
+
# Specify which files should be added to the gem when it is released.
|
17
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
18
|
+
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
|
19
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|example)/}) }
|
20
|
+
end
|
21
|
+
spec.bindir = "exe"
|
22
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
+
spec.require_paths = ["lib"]
|
24
|
+
|
25
|
+
spec.add_dependency "railties", ">= 5.2.0"
|
26
|
+
spec.add_dependency "puma", ">= 3.8.0"
|
27
|
+
|
28
|
+
spec.add_development_dependency "bundler"
|
29
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
30
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
31
|
+
spec.add_development_dependency "standard", ">= 0.2.0"
|
32
|
+
end
|
data/script/test
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
PS4='[script/test:${LINENO}] $ '
|
4
|
+
set -euo pipefail
|
5
|
+
set -x
|
6
|
+
|
7
|
+
echo "---> Installing dependencies"
|
8
|
+
bundle
|
9
|
+
cd example
|
10
|
+
bundle
|
11
|
+
yarn
|
12
|
+
cd ..
|
13
|
+
|
14
|
+
echo "---> Running tests"
|
15
|
+
bundle exec rake
|
16
|
+
./script/test_example_app
|
17
|
+
|
18
|
+
bundle exec rake test
|
19
|
+
|
20
|
+
echo "---> Job's done!"
|
21
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
directory=$1
|
6
|
+
|
7
|
+
cd example
|
8
|
+
bundle
|
9
|
+
yarn install
|
10
|
+
|
11
|
+
# test a normal test run
|
12
|
+
bundle exec rake db:test:prepare
|
13
|
+
NODE_OPTIONS=--openssl-legacy-provider RAILS_ENV=test bundle exec rake assets:precompile
|
14
|
+
bundle exec rake playwright:run
|
15
|
+
|
16
|
+
# test that passing options works (by printing help)
|
17
|
+
if ! bundle exec rake playwright:run PLAYWRIGHT_RAILS_PLAYWRIGHT_OPTS="-h" | grep -q "Usage: playwright run \[options\]"; then
|
18
|
+
echo "Failed to pass options to playwright run"
|
19
|
+
exit 1
|
20
|
+
fi
|
21
|
+
|
metadata
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: playwright-on-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Arthur Hess
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-05-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: railties
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 5.2.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 5.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: puma
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 3.8.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 3.8.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '13.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '13.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: standard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.2.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.2.0
|
97
|
+
description:
|
98
|
+
email:
|
99
|
+
- arthess@gmail.com
|
100
|
+
executables:
|
101
|
+
- playwright-on-rails
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".github/workflows/main.yml"
|
106
|
+
- ".gitignore"
|
107
|
+
- ".standard.yml"
|
108
|
+
- ".travis.yml"
|
109
|
+
- CHANGELOG.md
|
110
|
+
- Gemfile
|
111
|
+
- Gemfile.lock
|
112
|
+
- LICENSE.txt
|
113
|
+
- README.md
|
114
|
+
- Rakefile
|
115
|
+
- bin/console
|
116
|
+
- bin/setup
|
117
|
+
- exe/playwright-on-rails
|
118
|
+
- lib/playwright-on-rails.rb
|
119
|
+
- lib/playwright-on-rails/config.rb
|
120
|
+
- lib/playwright-on-rails/env.rb
|
121
|
+
- lib/playwright-on-rails/finds_bin.rb
|
122
|
+
- lib/playwright-on-rails/init.rb
|
123
|
+
- lib/playwright-on-rails/initializer_hooks.rb
|
124
|
+
- lib/playwright-on-rails/launches_playwright.rb
|
125
|
+
- lib/playwright-on-rails/manages_transactions.rb
|
126
|
+
- lib/playwright-on-rails/open.rb
|
127
|
+
- lib/playwright-on-rails/railtie.rb
|
128
|
+
- lib/playwright-on-rails/rake.rb
|
129
|
+
- lib/playwright-on-rails/resets_state.rb
|
130
|
+
- lib/playwright-on-rails/run.rb
|
131
|
+
- lib/playwright-on-rails/server.rb
|
132
|
+
- lib/playwright-on-rails/server/checker.rb
|
133
|
+
- lib/playwright-on-rails/server/middleware.rb
|
134
|
+
- lib/playwright-on-rails/server/puma.rb
|
135
|
+
- lib/playwright-on-rails/server/timer.rb
|
136
|
+
- lib/playwright-on-rails/starts_rails_server.rb
|
137
|
+
- lib/playwright-on-rails/tracks_resets.rb
|
138
|
+
- lib/playwright-on-rails/version.rb
|
139
|
+
- playwright_rails.gemspec
|
140
|
+
- script/test
|
141
|
+
- script/test_example_app
|
142
|
+
homepage: https://github.com/arthurhess/playwright-on-rails
|
143
|
+
licenses:
|
144
|
+
- MIT
|
145
|
+
metadata:
|
146
|
+
rubygems_mfa_required: 'true'
|
147
|
+
post_install_message:
|
148
|
+
rdoc_options: []
|
149
|
+
require_paths:
|
150
|
+
- lib
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - ">="
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '0'
|
156
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
requirements: []
|
162
|
+
rubygems_version: 3.4.6
|
163
|
+
signing_key:
|
164
|
+
specification_version: 4
|
165
|
+
summary: Helps you write Playwright tests of your Rails app
|
166
|
+
test_files: []
|