e2e 0.7.0 → 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.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- e2e (0.7.0)
4
+ e2e (0.7.1)
5
5
  playwright-ruby-client (>= 1.40.0)
6
6
  rack
7
7
  rackup
@@ -12,29 +12,29 @@ GEM
12
12
  specs:
13
13
  action_text-trix (2.1.19)
14
14
  railties
15
- actioncable (8.1.3)
16
- actionpack (= 8.1.3)
17
- activesupport (= 8.1.3)
15
+ actioncable (8.1.3.1)
16
+ actionpack (= 8.1.3.1)
17
+ activesupport (= 8.1.3.1)
18
18
  nio4r (~> 2.0)
19
19
  websocket-driver (>= 0.6.1)
20
20
  zeitwerk (~> 2.6)
21
- actionmailbox (8.1.3)
22
- actionpack (= 8.1.3)
23
- activejob (= 8.1.3)
24
- activerecord (= 8.1.3)
25
- activestorage (= 8.1.3)
26
- activesupport (= 8.1.3)
21
+ actionmailbox (8.1.3.1)
22
+ actionpack (= 8.1.3.1)
23
+ activejob (= 8.1.3.1)
24
+ activerecord (= 8.1.3.1)
25
+ activestorage (= 8.1.3.1)
26
+ activesupport (= 8.1.3.1)
27
27
  mail (>= 2.8.0)
28
- actionmailer (8.1.3)
29
- actionpack (= 8.1.3)
30
- actionview (= 8.1.3)
31
- activejob (= 8.1.3)
32
- activesupport (= 8.1.3)
28
+ actionmailer (8.1.3.1)
29
+ actionpack (= 8.1.3.1)
30
+ actionview (= 8.1.3.1)
31
+ activejob (= 8.1.3.1)
32
+ activesupport (= 8.1.3.1)
33
33
  mail (>= 2.8.0)
34
34
  rails-dom-testing (~> 2.2)
35
- actionpack (8.1.3)
36
- actionview (= 8.1.3)
37
- activesupport (= 8.1.3)
35
+ actionpack (8.1.3.1)
36
+ actionview (= 8.1.3.1)
37
+ activesupport (= 8.1.3.1)
38
38
  nokogiri (>= 1.8.5)
39
39
  rack (>= 2.2.4)
40
40
  rack-session (>= 1.0.1)
@@ -42,36 +42,36 @@ GEM
42
42
  rails-dom-testing (~> 2.2)
43
43
  rails-html-sanitizer (~> 1.6)
44
44
  useragent (~> 0.16)
45
- actiontext (8.1.3)
45
+ actiontext (8.1.3.1)
46
46
  action_text-trix (~> 2.1.15)
47
- actionpack (= 8.1.3)
48
- activerecord (= 8.1.3)
49
- activestorage (= 8.1.3)
50
- activesupport (= 8.1.3)
47
+ actionpack (= 8.1.3.1)
48
+ activerecord (= 8.1.3.1)
49
+ activestorage (= 8.1.3.1)
50
+ activesupport (= 8.1.3.1)
51
51
  globalid (>= 0.6.0)
52
52
  nokogiri (>= 1.8.5)
53
- actionview (8.1.3)
54
- activesupport (= 8.1.3)
53
+ actionview (8.1.3.1)
54
+ activesupport (= 8.1.3.1)
55
55
  builder (~> 3.1)
56
56
  erubi (~> 1.11)
57
57
  rails-dom-testing (~> 2.2)
58
58
  rails-html-sanitizer (~> 1.6)
59
- activejob (8.1.3)
60
- activesupport (= 8.1.3)
59
+ activejob (8.1.3.1)
60
+ activesupport (= 8.1.3.1)
61
61
  globalid (>= 0.3.6)
62
- activemodel (8.1.3)
63
- activesupport (= 8.1.3)
64
- activerecord (8.1.3)
65
- activemodel (= 8.1.3)
66
- activesupport (= 8.1.3)
62
+ activemodel (8.1.3.1)
63
+ activesupport (= 8.1.3.1)
64
+ activerecord (8.1.3.1)
65
+ activemodel (= 8.1.3.1)
66
+ activesupport (= 8.1.3.1)
67
67
  timeout (>= 0.4.0)
68
- activestorage (8.1.3)
69
- actionpack (= 8.1.3)
70
- activejob (= 8.1.3)
71
- activerecord (= 8.1.3)
72
- activesupport (= 8.1.3)
68
+ activestorage (8.1.3.1)
69
+ actionpack (= 8.1.3.1)
70
+ activejob (= 8.1.3.1)
71
+ activerecord (= 8.1.3.1)
72
+ activesupport (= 8.1.3.1)
73
73
  marcel (~> 1.0)
74
- activesupport (8.1.3)
74
+ activesupport (8.1.3.1)
75
75
  base64
76
76
  bigdecimal
77
77
  concurrent-ruby (~> 1.0, >= 1.3.1)
@@ -92,13 +92,13 @@ GEM
92
92
  base64 (0.3.0)
93
93
  bigdecimal (4.1.2)
94
94
  builder (3.3.0)
95
- concurrent-ruby (1.3.7)
95
+ concurrent-ruby (1.3.8)
96
96
  connection_pool (3.0.2)
97
97
  crass (1.0.7)
98
98
  date (3.5.1)
99
99
  diff-lcs (1.6.2)
100
100
  drb (2.2.3)
101
- erb (6.0.4)
101
+ erb (6.0.7)
102
102
  erubi (1.13.1)
103
103
  globalid (1.4.0)
104
104
  activesupport (>= 6.1)
@@ -110,12 +110,12 @@ GEM
110
110
  prism (>= 1.3.0)
111
111
  rdoc (>= 4.0.0)
112
112
  reline (>= 0.4.2)
113
- json (2.21.1)
113
+ json (2.21.2)
114
114
  language_server-protocol (3.17.0.6)
115
115
  lefthook (2.1.10)
116
116
  lint_roller (1.1.0)
117
117
  logger (1.7.0)
118
- loofah (2.25.1)
118
+ loofah (2.25.2)
119
119
  crass (~> 1.0.2)
120
120
  nokogiri (>= 1.12.0)
121
121
  mail (2.9.1)
@@ -133,7 +133,7 @@ GEM
133
133
  minitest (6.0.6)
134
134
  drb (~> 2.0)
135
135
  prism (~> 1.5)
136
- net-imap (0.6.4.1)
136
+ net-imap (0.6.6)
137
137
  date
138
138
  net-protocol
139
139
  net-pop (0.1.2)
@@ -160,10 +160,10 @@ GEM
160
160
  nokogiri (1.19.4-x86_64-linux-musl)
161
161
  racc (~> 1.4)
162
162
  parallel (2.1.0)
163
- parser (3.3.11.1)
163
+ parser (3.3.12.0)
164
164
  ast (~> 2.4.1)
165
165
  racc
166
- playwright-ruby-client (1.61.0)
166
+ playwright-ruby-client (1.62.0)
167
167
  base64
168
168
  concurrent-ruby (>= 1.1.6)
169
169
  mime-types (>= 3.0)
@@ -180,30 +180,30 @@ GEM
180
180
  rack (>= 1.3)
181
181
  rackup (2.3.1)
182
182
  rack (>= 3)
183
- rails (8.1.3)
184
- actioncable (= 8.1.3)
185
- actionmailbox (= 8.1.3)
186
- actionmailer (= 8.1.3)
187
- actionpack (= 8.1.3)
188
- actiontext (= 8.1.3)
189
- actionview (= 8.1.3)
190
- activejob (= 8.1.3)
191
- activemodel (= 8.1.3)
192
- activerecord (= 8.1.3)
193
- activestorage (= 8.1.3)
194
- activesupport (= 8.1.3)
183
+ rails (8.1.3.1)
184
+ actioncable (= 8.1.3.1)
185
+ actionmailbox (= 8.1.3.1)
186
+ actionmailer (= 8.1.3.1)
187
+ actionpack (= 8.1.3.1)
188
+ actiontext (= 8.1.3.1)
189
+ actionview (= 8.1.3.1)
190
+ activejob (= 8.1.3.1)
191
+ activemodel (= 8.1.3.1)
192
+ activerecord (= 8.1.3.1)
193
+ activestorage (= 8.1.3.1)
194
+ activesupport (= 8.1.3.1)
195
195
  bundler (>= 1.15.0)
196
- railties (= 8.1.3)
196
+ railties (= 8.1.3.1)
197
197
  rails-dom-testing (2.3.0)
198
198
  activesupport (>= 5.0.0)
199
199
  minitest
200
200
  nokogiri (>= 1.6)
201
- rails-html-sanitizer (1.7.0)
202
- loofah (~> 2.25)
201
+ rails-html-sanitizer (1.7.1)
202
+ loofah (~> 2.25, >= 2.25.2)
203
203
  nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
204
- railties (8.1.3)
205
- actionpack (= 8.1.3)
206
- activesupport (= 8.1.3)
204
+ railties (8.1.3.1)
205
+ actionpack (= 8.1.3.1)
206
+ activesupport (= 8.1.3.1)
207
207
  irb (~> 1.13)
208
208
  rackup (>= 1.0.0)
209
209
  rake (>= 12.2)
@@ -212,7 +212,7 @@ GEM
212
212
  zeitwerk (~> 2.6)
213
213
  rainbow (3.1.1)
214
214
  rake (13.4.2)
215
- rbs (4.0.3)
215
+ rbs (4.1.2)
216
216
  logger
217
217
  prism (>= 1.6.0)
218
218
  tsort
@@ -237,7 +237,7 @@ GEM
237
237
  diff-lcs (>= 1.2.0, < 2.0)
238
238
  rspec-support (~> 3.13.0)
239
239
  rspec-support (3.13.7)
240
- rubocop (1.87.0)
240
+ rubocop (1.88.2)
241
241
  json (~> 2.3)
242
242
  language_server-protocol (~> 3.17.0.2)
243
243
  lint_roller (~> 1.1.0)
@@ -261,11 +261,19 @@ GEM
261
261
  rubocop (~> 1.86, >= 1.86.2)
262
262
  ruby-progressbar (1.13.0)
263
263
  securerandom (0.4.1)
264
- simplecov (1.0.1)
265
- standard (1.55.0)
264
+ simplecov (1.0.3)
265
+ sqlite3 (2.9.5-aarch64-linux-gnu)
266
+ sqlite3 (2.9.5-aarch64-linux-musl)
267
+ sqlite3 (2.9.5-arm-linux-gnu)
268
+ sqlite3 (2.9.5-arm-linux-musl)
269
+ sqlite3 (2.9.5-arm64-darwin)
270
+ sqlite3 (2.9.5-x86_64-darwin)
271
+ sqlite3 (2.9.5-x86_64-linux-gnu)
272
+ sqlite3 (2.9.5-x86_64-linux-musl)
273
+ standard (1.56.0)
266
274
  language_server-protocol (~> 3.17.0.2)
267
275
  lint_roller (~> 1.0)
268
- rubocop (~> 1.87.0)
276
+ rubocop (~> 1.88.0)
269
277
  standard-custom (~> 1.0.0)
270
278
  standard-performance (~> 1.8)
271
279
  standard-custom (1.0.2)
@@ -289,7 +297,7 @@ GEM
289
297
  base64
290
298
  websocket-extensions (>= 0.1.0)
291
299
  websocket-extensions (0.1.5)
292
- zeitwerk (2.8.2)
300
+ zeitwerk (2.8.3)
293
301
 
294
302
  PLATFORMS
295
303
  aarch64-linux-gnu
@@ -302,6 +310,7 @@ PLATFORMS
302
310
  x86_64-linux-musl
303
311
 
304
312
  DEPENDENCIES
313
+ activerecord
305
314
  appraisal
306
315
  e2e!
307
316
  irb
@@ -313,52 +322,53 @@ DEPENDENCIES
313
322
  rubocop-performance
314
323
  rubocop-rspec
315
324
  simplecov
325
+ sqlite3
316
326
  standard
317
327
 
318
328
  CHECKSUMS
319
329
  action_text-trix (2.1.19) sha256=7012f59421009cf284aa651294896414d653a61a2417c9b8714c8476d2f74009
320
- actioncable (8.1.3) sha256=e5bc7f75e44e6a22de29c4f43176927c3a9ce4824464b74ed18d8226e75a80f0
321
- actionmailbox (8.1.3) sha256=df7da474eaa0e70df4ed5a6fef66eb3b3b0f2dbf7f14518deee8d77f1b4aae59
322
- actionmailer (8.1.3) sha256=831f724891bb70d0aaa4d76581a6321124b6a752cb655c9346aae5479318448d
323
- actionpack (8.1.3) sha256=af998cae4d47c5d581a2cc363b5c77eb718b7c4b45748d81b1887b25621c29a3
324
- actiontext (8.1.3) sha256=d291019c00e1ea9e6463011fa214f6081a56d7b9a1d224e7d3f6384c1dafc7d2
325
- actionview (8.1.3) sha256=1347c88c7f3edb38100c5ce0e9fb5e62d7755f3edc1b61cce2eb0b2c6ea2fd5d
326
- activejob (8.1.3) sha256=a149b1766aa8204c3c3da7309e4becd40fcd5529c348cffbf6c9b16b565fe8d3
327
- activemodel (8.1.3) sha256=90c05cbe4cef3649b8f79f13016191ea94c4525ce4a5c0fb7ef909c4b91c8219
328
- activerecord (8.1.3) sha256=8003be7b2466ba0a2a670e603eeb0a61dd66058fccecfc49901e775260ac70ab
329
- activestorage (8.1.3) sha256=0564ce9309143951a67615e1bb4e090ee54b8befed417133cae614479b46384d
330
- activesupport (8.1.3) sha256=21a5e0dfbd4c3ddd9e1317ec6a4d782fa226e7867dc70b0743acda81a1dca20e
330
+ actioncable (8.1.3.1) sha256=e318528295c878a3efdfe25f0f2267c80cb7a76eba41bb5f64d44aa380a3d91b
331
+ actionmailbox (8.1.3.1) sha256=5f704972097d843ade8e435e93694a1dac732b926df1717aceba1f3840082b1c
332
+ actionmailer (8.1.3.1) sha256=88ea441b28ff02a0c6c006468892642a3d9942affce9d294e81a74504aa5c43c
333
+ actionpack (8.1.3.1) sha256=974cb7154548e81f470b1b0f247b99cb38e87825899dca58610596e2817723d0
334
+ actiontext (8.1.3.1) sha256=5da729d833d1a29cddb1eee938878e55e503d2613e00e735f5daf58c2ba98af2
335
+ actionview (8.1.3.1) sha256=2da68b8414c47b43bfbed1ce69c5afe1c04f78c267aacb5660a4cab5ca12cfb6
336
+ activejob (8.1.3.1) sha256=1c8dd275df930df40deecffec63d913a550a33fd94bd298f69721dd96939954a
337
+ activemodel (8.1.3.1) sha256=99cc02ce2faec371d14440949d85787ebd23a907c9baef0a9d4bcd4d21888f88
338
+ activerecord (8.1.3.1) sha256=0a2fb6c28f4938f6b013a3a549bec0a7e37d535f3dc8990e804bcc3258c0403b
339
+ activestorage (8.1.3.1) sha256=f555254f387b1cffa499d2fd3115d12635eadc5b15206a8534316a67036163ef
340
+ activesupport (8.1.3.1) sha256=85458765f25ea48b9019c46b6bb3fa5683197bf4280d9f06710a6e8d7a831376
331
341
  appraisal (2.5.0) sha256=36989221be127913b0dba8d114da2001e6b2dceea7bd4951200eaba764eed3ce
332
342
  ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
333
343
  base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
334
344
  bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
335
345
  builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f
336
- concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
346
+ concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1
337
347
  connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
338
348
  crass (1.0.7) sha256=94868719948664c89ddcaf0a37c65048413dfcb1c869470a5f7a7ceb5390b295
339
349
  date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
340
350
  diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
341
351
  drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
342
- e2e (0.7.0)
343
- erb (6.0.4) sha256=38e3803694be357fe2bfe312487c74beaf9fb4e5beb3e22498952fe1645b95d9
352
+ e2e (0.7.1)
353
+ erb (6.0.7) sha256=c5ca6dc25b0ef974a44dc8f59fe847577122483b1968a38dec305c60bf91ee92
344
354
  erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
345
355
  globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427
346
356
  i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5
347
357
  io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
348
358
  irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
349
- json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
359
+ json (2.21.2) sha256=1f1d3b7cf2b3ba1a69beca0bb6db13d5438b80bff3cd54cdaaa620b9b07c1c6a
350
360
  language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
351
361
  lefthook (2.1.10) sha256=cc9c06bd8ea689e8b8016eab9769e54d696d07951860c1c6d28e8f6812e61b65
352
362
  lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
353
363
  logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
354
- loofah (2.25.1) sha256=d436c73dbd0c1147b16c4a41db097942d217303e1f7728704b37e4df9f6d2e04
364
+ loofah (2.25.2) sha256=2007f746959ac65552456e04b433e83deb22759ab38c838b4445c70e43425918
355
365
  mail (2.9.1) sha256=06574eca475253d6c18145dd70af80d0eb970182d55053497c5f4d797ea160e8
356
366
  marcel (1.2.1) sha256=1678e9360e32f9eafa917c80029e2f6d10b2715c66a4b87b6d0da9b9cd1f859f
357
367
  mime-types (3.7.0) sha256=dcebf61c246f08e15a4de34e386ebe8233791e868564a470c3fe77c00eed5e56
358
368
  mime-types-data (3.2026.0701) sha256=cd8811e1fb89d836499ba0582368a10ee74cef929ba956d1d5ddca045e6a730f
359
369
  mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
360
370
  minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1
361
- net-imap (0.6.4.1) sha256=29f0360d75a7efd3539f16ac1957dea5c0a51ddeceb348db4553c3120914ea0d
371
+ net-imap (0.6.6) sha256=96aa4ee50df3060203e649efc341f53480b791d49e150f2fdebf68beb141a8df
362
372
  net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3
363
373
  net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8
364
374
  net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736
@@ -372,8 +382,8 @@ CHECKSUMS
372
382
  nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a
373
383
  nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b
374
384
  parallel (2.1.0) sha256=b35258865c2e31134c5ecb708beaaf6772adf9d5efae28e93e99260877b09356
375
- parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54
376
- playwright-ruby-client (1.61.0) sha256=1f5c5f0307a2f6bd70b4fa797020a30eef5680caf8d5bd9ccc8d3937f6666e08
385
+ parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
386
+ playwright-ruby-client (1.62.0) sha256=44eb6051ab7987f68a1288a7db7892403e59680116739987729c5fecfdb55715
377
387
  pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
378
388
  prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
379
389
  prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
@@ -382,13 +392,13 @@ CHECKSUMS
382
392
  rack-session (2.1.2) sha256=595434f8c0c3473ae7d7ac56ecda6cc6dfd9d37c0b2b5255330aa1576967ffe8
383
393
  rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
384
394
  rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868
385
- rails (8.1.3) sha256=6d017ba5348c98fc909753a8169b21d44de14d2a0b92d140d1a966834c3c9cd3
395
+ rails (8.1.3.1) sha256=ccd11a36bfc171bf9c66d585d14c0ece91c0c9dde840aae60c0118d6f5c9c52a
386
396
  rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d
387
- rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89
388
- railties (8.1.3) sha256=913eb0e0cb520aac687ffd74916bd726d48fa21f47833c6292576ef6a286de22
397
+ rails-html-sanitizer (1.7.1) sha256=e797a7c9b01e567307e317c576b49ab4168017e63eea4dba9ce3cb587e2f22c2
398
+ railties (8.1.3.1) sha256=2388a232579a00cefea4487de66c8553c3408c1300abdc6cf1799d86ffb04487
389
399
  rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
390
400
  rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
391
- rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
401
+ rbs (4.1.2) sha256=050eb1d8b508f1233bed929c0f2c7052302f7adf295230d9cb314e9024078f48
392
402
  rdoc (8.0.0) sha256=03bf8c08a9639658855a0cfd77c0abca8325c227693f7f33f82957811348c469
393
403
  regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
394
404
  reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
@@ -397,14 +407,22 @@ CHECKSUMS
397
407
  rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836
398
408
  rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47
399
409
  rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
400
- rubocop (1.87.0) sha256=b9d9ddf55116a513f8ef2c7ae660662d8b49301f118d3f0df61865b33a5c188d
410
+ rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf
401
411
  rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db
402
412
  rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
403
413
  rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
404
414
  ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
405
415
  securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
406
- simplecov (1.0.1) sha256=419d93c40484159d20b40e26e9a83cdd4c3afa2f3fd443bb8946c301cd658d75
407
- standard (1.55.0) sha256=8a8f2c3e681a4db3aafde1b301561b0f3d7c5f06c160167cb744a4d7baf0426e
416
+ simplecov (1.0.3) sha256=38ef0514f16ae7562f0d0f4df02610071115103d301b6de7dacbcc000082e39b
417
+ sqlite3 (2.9.5-aarch64-linux-gnu) sha256=78075b6337d3d182c6d2b4691049ed45cd220826160c9ea18946bf6a1de200dc
418
+ sqlite3 (2.9.5-aarch64-linux-musl) sha256=18c801185deb4adc01ddb281e8f672a39e3d1729979ca91e39439cd3eac0402d
419
+ sqlite3 (2.9.5-arm-linux-gnu) sha256=1bdfca0c7d63998c60b0f4a8e3c8df2d33800ccc4abd2d612eddbbbc92a4c48b
420
+ sqlite3 (2.9.5-arm-linux-musl) sha256=bae1109d12b2e9f588455967729b008e1ff4feb7761749df695019c9079913c6
421
+ sqlite3 (2.9.5-arm64-darwin) sha256=d0cf444a70fc9395d513cfbcc1e6719e224aa645314e3824cb0474c721425aa2
422
+ sqlite3 (2.9.5-x86_64-darwin) sha256=8e9caae38bd7ebb29cbeee3e7ab1d12dc2327d9a1b92c7fcf0dda05589627a81
423
+ sqlite3 (2.9.5-x86_64-linux-gnu) sha256=233dbcb6714148dd23bc5aeb33e8efd6eac974969564ddd5794c23d5f52b231e
424
+ sqlite3 (2.9.5-x86_64-linux-musl) sha256=e7d3a7474e8af0f96150c21abc203fbab5437206bfcdf11deab7741c0ca516f2
425
+ standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
408
426
  standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
409
427
  standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
410
428
  thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
@@ -418,7 +436,7 @@ CHECKSUMS
418
436
  webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131
419
437
  websocket-driver (0.8.2) sha256=97c556b019bf3410b4961002ac501621e9322d3f8a7bc02161a09301cc4c4146
420
438
  websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241
421
- zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
439
+ zeitwerk (2.8.3) sha256=2c85125a8467ce069e20123d1e709a08955c9d29c118c25b46b7b7fafdbb92e5
422
440
 
423
441
  BUNDLED WITH
424
442
  4.0.5
@@ -19,11 +19,17 @@ module E2E
19
19
  # Enable debug console to allow page.pause (requires GUI, so only in headed mode)
20
20
  @context.enable_debug_console! unless @headless
21
21
 
22
- @page = @context.new_page
22
+ @page = build_page
23
23
  end
24
24
 
25
25
  def visit(url)
26
- @page.goto(url)
26
+ with_released_connection do
27
+ @page.goto(
28
+ url,
29
+ waitUntil: E2E.config.navigation_wait_until,
30
+ timeout: navigation_timeout_ms
31
+ )
32
+ end
27
33
  end
28
34
 
29
35
  def current_url
@@ -47,15 +53,15 @@ module E2E
47
53
  end
48
54
 
49
55
  def click(selector)
50
- @page.click(selector)
56
+ with_released_connection { @page.click(selector) }
51
57
  end
52
58
 
53
59
  def click_button(value, **options)
54
- @page.get_by_role("button", name: value, **options).click
60
+ with_released_connection { @page.get_by_role("button", name: value, **options).click }
55
61
  end
56
62
 
57
63
  def click_link(value, **options)
58
- @page.get_by_role("link", name: value, **options).click
64
+ with_released_connection { @page.get_by_role("link", name: value, **options).click }
59
65
  end
60
66
 
61
67
  def fill_in(selector, with:)
@@ -68,7 +74,7 @@ module E2E
68
74
  .or(@page.locator("[name='#{selector}']"))
69
75
  end
70
76
 
71
- begin
77
+ with_released_connection do
72
78
  chain.first.fill(with)
73
79
  rescue
74
80
  # Fallback to treating it as a direct CSS selector if the above failed
@@ -77,15 +83,15 @@ module E2E
77
83
  end
78
84
 
79
85
  def check(selector)
80
- @page.check(selector)
86
+ with_released_connection { @page.check(selector) }
81
87
  end
82
88
 
83
89
  def uncheck(selector)
84
- @page.uncheck(selector)
90
+ with_released_connection { @page.uncheck(selector) }
85
91
  end
86
92
 
87
93
  def attach_file(selector, path)
88
- @page.set_input_files(selector, path)
94
+ with_released_connection { @page.set_input_files(selector, path) }
89
95
  end
90
96
 
91
97
  def body
@@ -118,13 +124,31 @@ module E2E
118
124
  def reset!
119
125
  @context.close
120
126
  @context = @browser.new_context
121
- @page = @context.new_page
127
+ @context.enable_debug_console! unless @headless
128
+ @page = build_page
122
129
  end
123
130
 
124
131
  def quit
125
132
  @browser.close
126
133
  @playwright_execution.stop
127
134
  end
135
+
136
+ private
137
+
138
+ def build_page
139
+ page = @context.new_page
140
+ page.set_default_timeout((E2E.config.wait_timeout * 1000).to_i)
141
+ page.set_default_navigation_timeout(navigation_timeout_ms)
142
+ page
143
+ end
144
+
145
+ def navigation_timeout_ms
146
+ (E2E.config.navigation_timeout * 1000).to_i
147
+ end
148
+
149
+ def with_released_connection(&block)
150
+ E2E::Rails.with_released_connection(&block)
151
+ end
128
152
  end
129
153
  end
130
154
  end
data/lib/e2e/minitest.rb CHANGED
@@ -44,4 +44,5 @@ end
44
44
 
45
45
  Minitest.after_run do
46
46
  E2E.session.quit if E2E.instance_variable_get(:@session)
47
+ E2E.stop_server!
47
48
  end
data/lib/e2e/rails.rb CHANGED
@@ -2,25 +2,86 @@
2
2
 
3
3
  module E2E
4
4
  module Rails
5
- # This module allows the test thread and the server thread to share the same
6
- # ActiveRecord connection. This is crucial for running tests in transactions
7
- # which is much faster than using truncation.
5
+ class << self
6
+ attr_accessor :shared_connection
7
+ attr_reader :shared_connection_enabled
8
+
9
+ def shared_connection_enabled?
10
+ @shared_connection_enabled
11
+ end
12
+
13
+ def enable_shared_connection!
14
+ return unless defined?(ActiveRecord::Base)
15
+ return if @shared_connection_enabled
16
+
17
+ ActiveRecord::Base.singleton_class.prepend(ActiveRecordSharedConnection)
18
+ @shared_connection_enabled = true
19
+ # #connection (unlike #lease_connection/#with_connection, added in
20
+ # Rails 7.2) exists on every supported Rails version, so it's the only
21
+ # safe way to bootstrap the very first shared connection.
22
+ self.shared_connection = ActiveRecord::Base.connection
23
+ end
24
+
25
+ # Yields while the example thread is not holding a sticky AR lease.
26
+ # Needed when the pool has a single connection and the server thread
27
+ # must check it out during a blocking Playwright navigation/action.
28
+ def with_released_connection
29
+ return yield unless shared_connection_enabled?
30
+ return yield unless defined?(ActiveRecord::Base)
31
+
32
+ pool = ActiveRecord::Base.connection_pool
33
+ pool.release_connection if pool.active_connection?
34
+ yield
35
+ ensure
36
+ if shared_connection_enabled? && defined?(ActiveRecord::Base)
37
+ # Keep the shared handle pointing at a live leased connection for
38
+ # post-navigation assertions in the example thread.
39
+ self.shared_connection = ActiveRecord::Base.connection
40
+ end
41
+ end
42
+ end
43
+
44
+ # Shares one ActiveRecord connection between the example thread and the
45
+ # in-process server thread so transactional fixtures remain visible.
46
+ #
47
+ # Rails 7.2+/8 prefer +lease_connection+ / +with_connection+ over
48
+ # +connection+. Overriding only +connection+ (pre-0.7.1) left those
49
+ # APIs on the pool's thread-local lease and caused intermittent
50
+ # deadlocks: the example thread blocked in Playwright while holding
51
+ # the only connection, and the server sat idle in an open transaction.
8
52
  module ActiveRecordSharedConnection
9
53
  def connection
10
- @shared_connection || retrieve_connection
54
+ E2E::Rails.shared_connection || super
55
+ end
56
+
57
+ # lease_connection/with_connection don't exist before Rails 7.2, so
58
+ # `super` isn't always callable -- fall back to the always-available
59
+ # #connection instead of blowing up with a NoMethodError.
60
+ def lease_connection
61
+ E2E::Rails.shared_connection || (defined?(super) ? super : connection)
62
+ end
63
+
64
+ def with_connection(prevent_permanent_checkout: false)
65
+ if (conn = E2E::Rails.shared_connection)
66
+ yield conn
67
+ elsif defined?(super)
68
+ super
69
+ else
70
+ yield connection
71
+ end
11
72
  end
12
73
 
13
74
  def shared_connection=(connection)
14
- @shared_connection = connection
75
+ E2E::Rails.shared_connection = connection
76
+ end
77
+
78
+ def shared_connection
79
+ E2E::Rails.shared_connection
15
80
  end
16
81
  end
17
82
  end
18
83
  end
19
84
 
20
- # We only want to apply this when Rails is present and we want to enable it.
21
85
  def E2E.enable_shared_connection!
22
- return unless defined?(ActiveRecord::Base)
23
-
24
- ActiveRecord::Base.extend(E2E::Rails::ActiveRecordSharedConnection)
25
- ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
86
+ E2E::Rails.enable_shared_connection!
26
87
  end
data/lib/e2e/rspec.rb CHANGED
@@ -33,5 +33,6 @@ RSpec.configure do |config|
33
33
 
34
34
  config.after(:suite) do
35
35
  E2E.session.quit if E2E.instance_variable_get(:@session)
36
+ E2E.stop_server!
36
37
  end
37
38
  end
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