waterpig 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/waterpig/request-wait-middleware.rb +70 -0
- data/lib/waterpig/template-refresh.rb +122 -0
- data/spec/embarrassing.rb +22 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 318ff8fa9afe73198a7e40f033a80df4a7f6e756
|
4
|
+
data.tar.gz: e0497a4ce25ea9f435bfcdcd51c368e1c49af4be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce3aa8b7b4369f071f1a70d91fdcfe07f844c5788940072ad68fdf51891795e213bcfd1e5e162e302588c420748d5cce813d7bb3fa051eeb600be3ff6385697b
|
7
|
+
data.tar.gz: 275f405d9b585bbae00e209a0cece55684435d6c243d78220525efdee52d058d615c577c7cc2c660cbe27b2a9501d817b78d1fdcb428db979c19476fb5898ef6
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
3
|
+
module Waterpig
|
4
|
+
|
5
|
+
# This Rack middleware is designed to resolve common timing problems with
|
6
|
+
# end-to-end tests. Without it, specs will often finish and :after hooks will
|
7
|
+
# get executed while a request is still "in flight". The result can be, for
|
8
|
+
# example, specs failing because the database has been wiped before a request
|
9
|
+
# truly finishes.
|
10
|
+
#
|
11
|
+
# This middleware counts requests and allows other processes (e.g. testing
|
12
|
+
# processes) to block via RequestWaitMiddle.wait_for_idle() so that they do
|
13
|
+
# not proceed until all requests have completed.
|
14
|
+
class RequestWaitMiddleware
|
15
|
+
@@idle_mutex = Mutex.new
|
16
|
+
|
17
|
+
@@waiting_requests = {}
|
18
|
+
@@block_requests = false
|
19
|
+
|
20
|
+
# This is the only method one would normally call: wrap calls that e.g. drop
|
21
|
+
# the test database in wait_for_idle{ <code> } in order to be sure that
|
22
|
+
# outstanding requests are complete
|
23
|
+
def self.wait_for_idle
|
24
|
+
@@block_requests = true
|
25
|
+
|
26
|
+
@@idle_mutex.synchronize do
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
|
30
|
+
@@block_requests = false
|
31
|
+
end
|
32
|
+
|
33
|
+
def block_requests?
|
34
|
+
@@block_requests
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize(app)
|
38
|
+
@app = app
|
39
|
+
end
|
40
|
+
|
41
|
+
def call(env)
|
42
|
+
increment_active_requests(env)
|
43
|
+
if block_requests?
|
44
|
+
block_request
|
45
|
+
else
|
46
|
+
@app.call(env)
|
47
|
+
end
|
48
|
+
ensure
|
49
|
+
decrement_active_requests(env)
|
50
|
+
end
|
51
|
+
|
52
|
+
BLOCKED = [503, {}, ["Test is over - server no longer available"]].freeze
|
53
|
+
|
54
|
+
def block_request
|
55
|
+
BLOCKED
|
56
|
+
end
|
57
|
+
|
58
|
+
def increment_active_requests(env)
|
59
|
+
@@idle_mutex.lock unless @@idle_mutex.owned?
|
60
|
+
@@waiting_requests[env.object_id] = true
|
61
|
+
end
|
62
|
+
|
63
|
+
def decrement_active_requests(env)
|
64
|
+
@@waiting_requests.delete(env.object_id)
|
65
|
+
if @@waiting_requests.empty?
|
66
|
+
@@idle_mutex.unlock
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module Waterpig
|
2
|
+
|
3
|
+
|
4
|
+
# Tool to handle migrations and rebuilds on a test template database. For
|
5
|
+
# explanation of what the test templated DB is and how it's used, see the
|
6
|
+
# README.
|
7
|
+
#
|
8
|
+
# This should auto detect any needed migrations in that database. However, it
|
9
|
+
# does not detect changes to db/seeds.rb, so if you have changed seeds
|
10
|
+
# without adding a DB migration, you will need to drop and rebuild the
|
11
|
+
# test_template.
|
12
|
+
module TemplateRefresh
|
13
|
+
Base = ActiveRecord::Base
|
14
|
+
Migrator = ActiveRecord::Migrator
|
15
|
+
DatabaseTasks = ActiveRecord::Tasks::DatabaseTasks
|
16
|
+
|
17
|
+
extend self
|
18
|
+
|
19
|
+
def load_config
|
20
|
+
Base.configurations = DatabaseTasks.database_configuration || {}
|
21
|
+
Migrator.migrations_paths = DatabaseTasks.migrations_paths
|
22
|
+
end
|
23
|
+
|
24
|
+
def purge_env(env)
|
25
|
+
DatabaseTasks.purge(config_for(env))
|
26
|
+
end
|
27
|
+
|
28
|
+
def with_temporary_connection(env)
|
29
|
+
begin
|
30
|
+
should_reconnect = Base.connection_pool.active_connection?
|
31
|
+
|
32
|
+
yield
|
33
|
+
ensure
|
34
|
+
if should_reconnect
|
35
|
+
Base.establish_connection(config_for(DatabaseTasks.env))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
#Assumes schema_format == ruby
|
41
|
+
def load_schema(env)
|
42
|
+
ActiveRecord::Schema.verbose = false
|
43
|
+
DatabaseTasks.load_schema_for config_for(env), :ruby, ENV['SCHEMA']
|
44
|
+
end
|
45
|
+
|
46
|
+
def load_seed
|
47
|
+
DatabaseTasks.load_seed
|
48
|
+
# load('spec/test_seeds.rb')
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def config_for(env)
|
53
|
+
Base.configurations.fetch(env.to_s)
|
54
|
+
end
|
55
|
+
|
56
|
+
def connection_for(env)
|
57
|
+
Base.establish_connection(env).connection
|
58
|
+
end
|
59
|
+
|
60
|
+
def if_needs_migration(env)
|
61
|
+
if Migrator.needs_migration?(connection_for(env))
|
62
|
+
begin
|
63
|
+
current_config = Base.connection_config
|
64
|
+
Base.clear_all_connections!
|
65
|
+
|
66
|
+
yield
|
67
|
+
|
68
|
+
ensure
|
69
|
+
Base.establish_connection(current_config)
|
70
|
+
|
71
|
+
ActiveRecord::Migration.check_pending!
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def ensure_created(env)
|
77
|
+
Base.establish_connection(env).connection
|
78
|
+
rescue ActiveRecord::NoDatabaseError
|
79
|
+
DatabaseTasks.create(config_for(env))
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def load_if_pending!(env)
|
84
|
+
ensure_created(env)
|
85
|
+
if_needs_migration(env) do
|
86
|
+
puts "Refreshing unmigrated test env: #{env}"
|
87
|
+
purge_env(env)
|
88
|
+
with_temporary_connection(env) do
|
89
|
+
load_schema(env)
|
90
|
+
load_seed
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def commandeer_database(env)
|
96
|
+
config = config_for(env)
|
97
|
+
connection_for(env).select_all(
|
98
|
+
"select pid, pg_terminate_backend(pid) " +
|
99
|
+
"from pg_stat_activity where datname='#{config['database']}' AND state='idle';")
|
100
|
+
end
|
101
|
+
|
102
|
+
def refresh_database(env)
|
103
|
+
Rails.logger.fatal("Resetting test DB...")
|
104
|
+
config = config_for(env)
|
105
|
+
|
106
|
+
tasks = ActiveRecord::Tasks::PostgreSQLDatabaseTasks.new(config)
|
107
|
+
|
108
|
+
start = Time.now
|
109
|
+
Rails.logger.fatal("Dropping")
|
110
|
+
begin
|
111
|
+
tasks.drop
|
112
|
+
end
|
113
|
+
Rails.logger.fatal("Creating")
|
114
|
+
begin
|
115
|
+
tasks.create
|
116
|
+
end
|
117
|
+
message = "Test database recopied in #{Time.now - start}s"
|
118
|
+
#puts message
|
119
|
+
Rails.logger.fatal(message)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/spec/embarrassing.rb
CHANGED
@@ -3,6 +3,28 @@ Sequel.sqlite
|
|
3
3
|
|
4
4
|
require 'waterpig'
|
5
5
|
require 'waterpig/deadbeat-connections'
|
6
|
+
module ActiveRecord
|
7
|
+
class Base
|
8
|
+
end
|
9
|
+
|
10
|
+
module Tasks
|
11
|
+
class DatabaseTasks
|
12
|
+
end
|
13
|
+
class PostgresDatabaseTasks
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Migration
|
18
|
+
end
|
19
|
+
|
20
|
+
class Migrator
|
21
|
+
end
|
22
|
+
|
23
|
+
class Schema
|
24
|
+
end
|
25
|
+
end
|
26
|
+
require 'waterpig/request-wait-middleware'
|
27
|
+
require 'waterpig/template-refresh'
|
6
28
|
|
7
29
|
describe "Nothing" do
|
8
30
|
it "should do more" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: waterpig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Judson Lester
|
@@ -82,6 +82,8 @@ files:
|
|
82
82
|
- lib/waterpig/selenium_chrome.rb
|
83
83
|
- lib/waterpig/database-cleaner.rb
|
84
84
|
- lib/waterpig/deadbeat-connections.rb
|
85
|
+
- lib/waterpig/template-refresh.rb
|
86
|
+
- lib/waterpig/request-wait-middleware.rb
|
85
87
|
- lib/waterpig/tinymce-tools.rb
|
86
88
|
- lib/waterpig/browser-integration.rb
|
87
89
|
- lib/waterpig/browser-console-logger.rb
|
@@ -103,7 +105,7 @@ rdoc_options:
|
|
103
105
|
- --main
|
104
106
|
- doc/README
|
105
107
|
- --title
|
106
|
-
- waterpig-0.8.
|
108
|
+
- waterpig-0.8.1 Documentation
|
107
109
|
require_paths:
|
108
110
|
- lib/
|
109
111
|
required_ruby_version: !ruby/object:Gem::Requirement
|