test_data 0.2.1 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -1
- data/Gemfile.lock +42 -42
- data/LICENSE.txt +1 -1
- data/README.md +142 -48
- data/example/Gemfile.lock +144 -123
- data/example/test/integration/fixture_load_count_test.rb +82 -0
- data/lib/test_data/custom_loaders/rails_fixtures.rb +6 -3
- data/lib/test_data/detects_database_existence.rb +19 -0
- data/lib/test_data/determines_databases_associated_dump_time.rb +13 -0
- data/lib/test_data/determines_when_sql_dump_was_made.rb +24 -0
- data/lib/test_data/dumps_database.rb +3 -0
- data/lib/test_data/railtie.rb +4 -0
- data/lib/test_data/rake.rb +39 -9
- data/lib/test_data/records_dump_metadata.rb +9 -0
- data/lib/test_data/version.rb +1 -1
- data/lib/test_data/warns_if_database_is_newer_than_dump.rb +32 -0
- data/lib/test_data/warns_if_dump_is_newer_than_database.rb +36 -0
- data/lib/test_data.rb +12 -1
- data/script/test +35 -0
- data/test_data.gemspec +1 -1
- metadata +18 -5
data/example/Gemfile.lock
CHANGED
@@ -1,171 +1,196 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
test_data (0.
|
5
|
-
railties (
|
4
|
+
test_data (0.3.1)
|
5
|
+
railties (>= 6.0, < 8.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
actioncable (
|
11
|
-
actionpack (=
|
12
|
-
activesupport (=
|
10
|
+
actioncable (7.0.2.3)
|
11
|
+
actionpack (= 7.0.2.3)
|
12
|
+
activesupport (= 7.0.2.3)
|
13
13
|
nio4r (~> 2.0)
|
14
14
|
websocket-driver (>= 0.6.1)
|
15
|
-
actionmailbox (
|
16
|
-
actionpack (=
|
17
|
-
activejob (=
|
18
|
-
activerecord (=
|
19
|
-
activestorage (=
|
20
|
-
activesupport (=
|
15
|
+
actionmailbox (7.0.2.3)
|
16
|
+
actionpack (= 7.0.2.3)
|
17
|
+
activejob (= 7.0.2.3)
|
18
|
+
activerecord (= 7.0.2.3)
|
19
|
+
activestorage (= 7.0.2.3)
|
20
|
+
activesupport (= 7.0.2.3)
|
21
21
|
mail (>= 2.7.1)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
net-imap
|
23
|
+
net-pop
|
24
|
+
net-smtp
|
25
|
+
actionmailer (7.0.2.3)
|
26
|
+
actionpack (= 7.0.2.3)
|
27
|
+
actionview (= 7.0.2.3)
|
28
|
+
activejob (= 7.0.2.3)
|
29
|
+
activesupport (= 7.0.2.3)
|
27
30
|
mail (~> 2.5, >= 2.5.4)
|
31
|
+
net-imap
|
32
|
+
net-pop
|
33
|
+
net-smtp
|
28
34
|
rails-dom-testing (~> 2.0)
|
29
|
-
actionpack (
|
30
|
-
actionview (=
|
31
|
-
activesupport (=
|
32
|
-
rack (~> 2.0, >= 2.0
|
35
|
+
actionpack (7.0.2.3)
|
36
|
+
actionview (= 7.0.2.3)
|
37
|
+
activesupport (= 7.0.2.3)
|
38
|
+
rack (~> 2.0, >= 2.2.0)
|
33
39
|
rack-test (>= 0.6.3)
|
34
40
|
rails-dom-testing (~> 2.0)
|
35
41
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
36
|
-
actiontext (
|
37
|
-
actionpack (=
|
38
|
-
activerecord (=
|
39
|
-
activestorage (=
|
40
|
-
activesupport (=
|
42
|
+
actiontext (7.0.2.3)
|
43
|
+
actionpack (= 7.0.2.3)
|
44
|
+
activerecord (= 7.0.2.3)
|
45
|
+
activestorage (= 7.0.2.3)
|
46
|
+
activesupport (= 7.0.2.3)
|
47
|
+
globalid (>= 0.6.0)
|
41
48
|
nokogiri (>= 1.8.5)
|
42
|
-
actionview (
|
43
|
-
activesupport (=
|
49
|
+
actionview (7.0.2.3)
|
50
|
+
activesupport (= 7.0.2.3)
|
44
51
|
builder (~> 3.1)
|
45
52
|
erubi (~> 1.4)
|
46
53
|
rails-dom-testing (~> 2.0)
|
47
54
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
48
|
-
activejob (
|
49
|
-
activesupport (=
|
55
|
+
activejob (7.0.2.3)
|
56
|
+
activesupport (= 7.0.2.3)
|
50
57
|
globalid (>= 0.3.6)
|
51
|
-
activemodel (
|
52
|
-
activesupport (=
|
53
|
-
activerecord (
|
54
|
-
activemodel (=
|
55
|
-
activesupport (=
|
56
|
-
activestorage (
|
57
|
-
actionpack (=
|
58
|
-
activejob (=
|
59
|
-
activerecord (=
|
60
|
-
activesupport (=
|
61
|
-
marcel (~> 1.0
|
62
|
-
mini_mime (
|
63
|
-
activesupport (
|
58
|
+
activemodel (7.0.2.3)
|
59
|
+
activesupport (= 7.0.2.3)
|
60
|
+
activerecord (7.0.2.3)
|
61
|
+
activemodel (= 7.0.2.3)
|
62
|
+
activesupport (= 7.0.2.3)
|
63
|
+
activestorage (7.0.2.3)
|
64
|
+
actionpack (= 7.0.2.3)
|
65
|
+
activejob (= 7.0.2.3)
|
66
|
+
activerecord (= 7.0.2.3)
|
67
|
+
activesupport (= 7.0.2.3)
|
68
|
+
marcel (~> 1.0)
|
69
|
+
mini_mime (>= 1.1.0)
|
70
|
+
activesupport (7.0.2.3)
|
64
71
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
65
72
|
i18n (>= 1.6, < 2)
|
66
73
|
minitest (>= 5.1)
|
67
74
|
tzinfo (~> 2.0)
|
68
|
-
|
69
|
-
addressable (2.7.0)
|
75
|
+
addressable (2.8.0)
|
70
76
|
public_suffix (>= 2.0.2, < 5.0)
|
71
77
|
ast (2.4.2)
|
72
|
-
bootsnap (1.
|
73
|
-
msgpack (~> 1.
|
78
|
+
bootsnap (1.11.1)
|
79
|
+
msgpack (~> 1.2)
|
74
80
|
builder (3.2.4)
|
75
|
-
capybara (3.
|
81
|
+
capybara (3.36.0)
|
76
82
|
addressable
|
83
|
+
matrix
|
77
84
|
mini_mime (>= 0.1.3)
|
78
85
|
nokogiri (~> 1.8)
|
79
86
|
rack (>= 1.6.0)
|
80
87
|
rack-test (>= 0.6.3)
|
81
88
|
regexp_parser (>= 1.5, < 3.0)
|
82
89
|
xpath (~> 3.2)
|
83
|
-
childprocess (
|
90
|
+
childprocess (4.1.0)
|
84
91
|
coderay (1.1.3)
|
85
|
-
concurrent-ruby (1.1.
|
92
|
+
concurrent-ruby (1.1.10)
|
86
93
|
crass (1.0.6)
|
87
|
-
diff-lcs (1.
|
94
|
+
diff-lcs (1.5.0)
|
95
|
+
digest (3.1.0)
|
88
96
|
erubi (1.10.0)
|
89
|
-
factory_bot (6.2.
|
97
|
+
factory_bot (6.2.1)
|
90
98
|
activesupport (>= 5.0.0)
|
91
99
|
factory_bot_rails (6.2.0)
|
92
100
|
factory_bot (~> 6.2.0)
|
93
101
|
railties (>= 5.0.0)
|
94
|
-
globalid (0.
|
95
|
-
activesupport (>=
|
96
|
-
i18n (1.
|
102
|
+
globalid (1.0.0)
|
103
|
+
activesupport (>= 5.0)
|
104
|
+
i18n (1.10.0)
|
97
105
|
concurrent-ruby (~> 1.0)
|
98
|
-
|
106
|
+
io-wait (0.2.1)
|
107
|
+
loofah (2.15.0)
|
99
108
|
crass (~> 1.0.2)
|
100
109
|
nokogiri (>= 1.5.9)
|
101
110
|
mail (2.7.1)
|
102
111
|
mini_mime (>= 0.1.1)
|
103
|
-
marcel (1.0.
|
112
|
+
marcel (1.0.2)
|
113
|
+
matrix (0.4.2)
|
104
114
|
method_source (1.0.0)
|
105
|
-
mini_mime (1.
|
106
|
-
mini_portile2 (2.
|
107
|
-
minitest (5.
|
108
|
-
msgpack (1.4.
|
109
|
-
|
110
|
-
|
111
|
-
|
115
|
+
mini_mime (1.1.2)
|
116
|
+
mini_portile2 (2.8.0)
|
117
|
+
minitest (5.15.0)
|
118
|
+
msgpack (1.4.5)
|
119
|
+
net-imap (0.2.3)
|
120
|
+
digest
|
121
|
+
net-protocol
|
122
|
+
strscan
|
123
|
+
net-pop (0.1.1)
|
124
|
+
digest
|
125
|
+
net-protocol
|
126
|
+
timeout
|
127
|
+
net-protocol (0.1.2)
|
128
|
+
io-wait
|
129
|
+
timeout
|
130
|
+
net-smtp (0.3.1)
|
131
|
+
digest
|
132
|
+
net-protocol
|
133
|
+
timeout
|
134
|
+
nio4r (2.5.8)
|
135
|
+
nokogiri (1.13.3)
|
136
|
+
mini_portile2 (~> 2.8.0)
|
112
137
|
racc (~> 1.4)
|
113
138
|
noncommittal (0.2.0)
|
114
|
-
parallel (1.
|
115
|
-
parser (3.
|
139
|
+
parallel (1.22.1)
|
140
|
+
parser (3.1.1.0)
|
116
141
|
ast (~> 2.4.1)
|
117
|
-
pg (1.
|
142
|
+
pg (1.3.4)
|
118
143
|
pry (0.14.1)
|
119
144
|
coderay (~> 1.1)
|
120
145
|
method_source (~> 1.0)
|
121
146
|
pry-rails (0.3.9)
|
122
147
|
pry (>= 0.10.4)
|
123
148
|
public_suffix (4.0.6)
|
124
|
-
puma (5.
|
149
|
+
puma (5.6.2)
|
125
150
|
nio4r (~> 2.0)
|
126
|
-
racc (1.
|
151
|
+
racc (1.6.0)
|
127
152
|
rack (2.2.3)
|
128
153
|
rack-test (1.1.0)
|
129
154
|
rack (>= 1.0, < 3)
|
130
|
-
rails (
|
131
|
-
actioncable (=
|
132
|
-
actionmailbox (=
|
133
|
-
actionmailer (=
|
134
|
-
actionpack (=
|
135
|
-
actiontext (=
|
136
|
-
actionview (=
|
137
|
-
activejob (=
|
138
|
-
activemodel (=
|
139
|
-
activerecord (=
|
140
|
-
activestorage (=
|
141
|
-
activesupport (=
|
155
|
+
rails (7.0.2.3)
|
156
|
+
actioncable (= 7.0.2.3)
|
157
|
+
actionmailbox (= 7.0.2.3)
|
158
|
+
actionmailer (= 7.0.2.3)
|
159
|
+
actionpack (= 7.0.2.3)
|
160
|
+
actiontext (= 7.0.2.3)
|
161
|
+
actionview (= 7.0.2.3)
|
162
|
+
activejob (= 7.0.2.3)
|
163
|
+
activemodel (= 7.0.2.3)
|
164
|
+
activerecord (= 7.0.2.3)
|
165
|
+
activestorage (= 7.0.2.3)
|
166
|
+
activesupport (= 7.0.2.3)
|
142
167
|
bundler (>= 1.15.0)
|
143
|
-
railties (=
|
144
|
-
sprockets-rails (>= 2.0.0)
|
168
|
+
railties (= 7.0.2.3)
|
145
169
|
rails-dom-testing (2.0.3)
|
146
170
|
activesupport (>= 4.2.0)
|
147
171
|
nokogiri (>= 1.6)
|
148
|
-
rails-html-sanitizer (1.
|
172
|
+
rails-html-sanitizer (1.4.2)
|
149
173
|
loofah (~> 2.3)
|
150
|
-
railties (
|
151
|
-
actionpack (=
|
152
|
-
activesupport (=
|
174
|
+
railties (7.0.2.3)
|
175
|
+
actionpack (= 7.0.2.3)
|
176
|
+
activesupport (= 7.0.2.3)
|
153
177
|
method_source
|
154
|
-
rake (>=
|
178
|
+
rake (>= 12.2)
|
155
179
|
thor (~> 1.0)
|
156
|
-
|
157
|
-
|
158
|
-
|
180
|
+
zeitwerk (~> 2.5)
|
181
|
+
rainbow (3.1.1)
|
182
|
+
rake (13.0.6)
|
183
|
+
regexp_parser (2.2.1)
|
159
184
|
rexml (3.2.5)
|
160
|
-
rspec-core (3.
|
161
|
-
rspec-support (~> 3.
|
162
|
-
rspec-expectations (3.
|
185
|
+
rspec-core (3.11.0)
|
186
|
+
rspec-support (~> 3.11.0)
|
187
|
+
rspec-expectations (3.11.0)
|
163
188
|
diff-lcs (>= 1.2.0, < 2.0)
|
164
|
-
rspec-support (~> 3.
|
165
|
-
rspec-mocks (3.
|
189
|
+
rspec-support (~> 3.11.0)
|
190
|
+
rspec-mocks (3.11.0)
|
166
191
|
diff-lcs (>= 1.2.0, < 2.0)
|
167
|
-
rspec-support (~> 3.
|
168
|
-
rspec-rails (5.
|
192
|
+
rspec-support (~> 3.11.0)
|
193
|
+
rspec-rails (5.1.1)
|
169
194
|
actionpack (>= 5.2)
|
170
195
|
activesupport (>= 5.2)
|
171
196
|
railties (>= 5.2)
|
@@ -173,50 +198,46 @@ GEM
|
|
173
198
|
rspec-expectations (~> 3.10)
|
174
199
|
rspec-mocks (~> 3.10)
|
175
200
|
rspec-support (~> 3.10)
|
176
|
-
rspec-support (3.
|
177
|
-
rubocop (1.
|
201
|
+
rspec-support (3.11.0)
|
202
|
+
rubocop (1.26.0)
|
178
203
|
parallel (~> 1.10)
|
179
|
-
parser (>= 3.
|
204
|
+
parser (>= 3.1.0.0)
|
180
205
|
rainbow (>= 2.2.2, < 4.0)
|
181
206
|
regexp_parser (>= 1.8, < 3.0)
|
182
207
|
rexml
|
183
|
-
rubocop-ast (>= 1.
|
208
|
+
rubocop-ast (>= 1.16.0, < 2.0)
|
184
209
|
ruby-progressbar (~> 1.7)
|
185
210
|
unicode-display_width (>= 1.4.0, < 3.0)
|
186
|
-
rubocop-ast (1.
|
187
|
-
parser (>= 3.
|
188
|
-
rubocop-performance (1.
|
211
|
+
rubocop-ast (1.16.0)
|
212
|
+
parser (>= 3.1.1.0)
|
213
|
+
rubocop-performance (1.13.3)
|
189
214
|
rubocop (>= 1.7.0, < 2.0)
|
190
215
|
rubocop-ast (>= 0.4.0)
|
191
216
|
ruby-progressbar (1.11.0)
|
192
|
-
rubyzip (2.3.
|
193
|
-
selenium-webdriver (
|
194
|
-
childprocess (>= 0.5, <
|
217
|
+
rubyzip (2.3.2)
|
218
|
+
selenium-webdriver (4.1.0)
|
219
|
+
childprocess (>= 0.5, < 5.0)
|
220
|
+
rexml (~> 3.2, >= 3.2.5)
|
195
221
|
rubyzip (>= 1.2.2)
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
sprockets (>= 3.0.0)
|
203
|
-
standard (1.1.1)
|
204
|
-
rubocop (= 1.14.0)
|
205
|
-
rubocop-performance (= 1.11.2)
|
206
|
-
thor (1.1.0)
|
222
|
+
standard (1.9.0)
|
223
|
+
rubocop (= 1.26.0)
|
224
|
+
rubocop-performance (= 1.13.3)
|
225
|
+
strscan (3.0.1)
|
226
|
+
thor (1.2.1)
|
227
|
+
timeout (0.2.0)
|
207
228
|
tzinfo (2.0.4)
|
208
229
|
concurrent-ruby (~> 1.0)
|
209
|
-
unicode-display_width (2.
|
210
|
-
webdrivers (
|
230
|
+
unicode-display_width (2.1.0)
|
231
|
+
webdrivers (5.0.0)
|
211
232
|
nokogiri (~> 1.6)
|
212
233
|
rubyzip (>= 1.3.0)
|
213
|
-
selenium-webdriver (
|
234
|
+
selenium-webdriver (~> 4.0)
|
214
235
|
websocket-driver (0.7.5)
|
215
236
|
websocket-extensions (>= 0.1.0)
|
216
237
|
websocket-extensions (0.1.5)
|
217
238
|
xpath (3.2.0)
|
218
239
|
nokogiri (~> 1.8)
|
219
|
-
zeitwerk (2.4
|
240
|
+
zeitwerk (2.5.4)
|
220
241
|
|
221
242
|
PLATFORMS
|
222
243
|
ruby
|
@@ -237,4 +258,4 @@ DEPENDENCIES
|
|
237
258
|
webdrivers
|
238
259
|
|
239
260
|
BUNDLED WITH
|
240
|
-
2.
|
261
|
+
2.3.10
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# Regression test to make sure we don't load fixtures too many times
|
2
|
+
|
3
|
+
class HookCounter
|
4
|
+
def self.count
|
5
|
+
@call_count || 0
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.count!
|
9
|
+
@call_count ||= 0
|
10
|
+
@call_count += 1
|
11
|
+
end
|
12
|
+
end
|
13
|
+
at_exit do
|
14
|
+
if TestData.statistics.load_rails_fixtures_count > 2 # could be 1 if :all runs first, 2 if :boops only does
|
15
|
+
raise "Rails fixture load was called #{TestData.statistics.load_rails_fixtures_count} times, shouldn't be more than 2!"
|
16
|
+
end
|
17
|
+
if HookCounter.count > 2
|
18
|
+
raise "Rails fixture load hook was called #{HookCounter.count} times, shouldn't be more than 2!"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
require "test_helper"
|
23
|
+
|
24
|
+
TestData.prevent_rails_fixtures_from_loading_automatically!
|
25
|
+
|
26
|
+
TestData.config do |config|
|
27
|
+
config.after_rails_fixture_load {
|
28
|
+
HookCounter.count!
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
class PartialFixtureTest < ActiveSupport::TestCase
|
33
|
+
fixtures :boops
|
34
|
+
|
35
|
+
setup do
|
36
|
+
TestData.uses_rails_fixtures(self)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_has_only_boops
|
40
|
+
assert boops(:boop_1)
|
41
|
+
assert_raises(NameError) { method(:pants) }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class AllFixtureTest < ActiveSupport::TestCase
|
46
|
+
fixtures :all
|
47
|
+
|
48
|
+
setup do
|
49
|
+
TestData.uses_rails_fixtures(self)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_has_both
|
53
|
+
assert boops(:boop_1)
|
54
|
+
assert pants(:pant_1)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class AllFixtureTest2 < ActiveSupport::TestCase
|
59
|
+
fixtures :all
|
60
|
+
|
61
|
+
setup do
|
62
|
+
TestData.uses_rails_fixtures(self)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_has_both
|
66
|
+
assert boops(:boop_1)
|
67
|
+
assert pants(:pant_1)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class AllFixtureTest3 < ActiveSupport::TestCase
|
72
|
+
fixtures :all
|
73
|
+
|
74
|
+
setup do
|
75
|
+
TestData.uses_rails_fixtures(self)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_has_both
|
79
|
+
assert boops(:boop_1)
|
80
|
+
assert pants(:pant_1)
|
81
|
+
end
|
82
|
+
end
|
@@ -21,19 +21,22 @@ module TestData
|
|
21
21
|
|
22
22
|
def load_requested(test_instance:)
|
23
23
|
ActiveRecord::FixtureSet.reset_cache
|
24
|
-
test_instance.instance_variable_set(:@loaded_fixtures,
|
24
|
+
test_instance.instance_variable_set(:@loaded_fixtures,
|
25
|
+
@already_loaded_rails_fixtures.slice(*test_instance.class.fixture_table_names))
|
25
26
|
test_instance.instance_variable_set(:@fixture_cache, {})
|
26
27
|
end
|
27
28
|
|
28
29
|
def loaded?(test_instance:)
|
29
|
-
|
30
|
+
test_instance.class.fixture_table_names.all? { |table_name|
|
31
|
+
@already_loaded_rails_fixtures.key?(table_name)
|
32
|
+
}
|
30
33
|
end
|
31
34
|
|
32
35
|
def load(test_instance:)
|
33
36
|
test_instance.pre_loaded_fixtures = false
|
34
37
|
test_instance.use_transactional_tests = false
|
35
38
|
test_instance.__test_data_gem_setup_fixtures
|
36
|
-
@already_loaded_rails_fixtures
|
39
|
+
@already_loaded_rails_fixtures = test_instance.instance_variable_get(:@loaded_fixtures)
|
37
40
|
@statistics.count_load_rails_fixtures!
|
38
41
|
@config.after_rails_fixture_load_hook.call
|
39
42
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module TestData
|
2
|
+
class DetectsDatabaseExistence
|
3
|
+
def initialize
|
4
|
+
@config = TestData.config
|
5
|
+
end
|
6
|
+
|
7
|
+
def call
|
8
|
+
rows = ActiveRecord::Base.connection.execute <<~SQL
|
9
|
+
select datname database_name
|
10
|
+
from pg_catalog.pg_database
|
11
|
+
SQL
|
12
|
+
rows.any? { |row|
|
13
|
+
row["database_name"] == @config.database_name
|
14
|
+
}
|
15
|
+
rescue ActiveRecord::NoDatabaseError
|
16
|
+
false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module TestData
|
2
|
+
class DeterminesDatabasesAssociatedDumpTime
|
3
|
+
def call
|
4
|
+
if (last_dumped_at = ActiveRecord::InternalMetadata.find_by(key: "test_data:last_dumped_at")&.value)
|
5
|
+
Time.parse(last_dumped_at)
|
6
|
+
end
|
7
|
+
rescue ActiveRecord::StatementInvalid
|
8
|
+
# This will be raised if the DB exists but hasn't been migrated/schema-loaded
|
9
|
+
rescue ActiveRecord::NoDatabaseError
|
10
|
+
# This will be raised if the DB doesn't exist yet, which we don't need to warn about
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module TestData
|
2
|
+
class DeterminesWhenSqlDumpWasMade
|
3
|
+
def initialize
|
4
|
+
@config = TestData.config
|
5
|
+
end
|
6
|
+
|
7
|
+
def call
|
8
|
+
if (last_dumped_at = find_last_dumped_value)
|
9
|
+
Time.zone.parse(last_dumped_at)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def find_last_dumped_value
|
16
|
+
return unless File.exist?(@config.non_test_data_dump_path)
|
17
|
+
File.open(@config.non_test_data_dump_path, "r").each_line do |line|
|
18
|
+
if (match = line.match(/INSERT INTO public\.ar_internal_metadata VALUES \('test_data:last_dumped_at', '([^']*)'/))
|
19
|
+
return match[1]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -6,9 +6,12 @@ module TestData
|
|
6
6
|
class DumpsDatabase
|
7
7
|
def initialize
|
8
8
|
@config = TestData.config
|
9
|
+
@records_dump_metadata = RecordsDumpMetadata.new
|
9
10
|
end
|
10
11
|
|
11
12
|
def call
|
13
|
+
@records_dump_metadata.call
|
14
|
+
|
12
15
|
dump(
|
13
16
|
type: :schema,
|
14
17
|
database_name: @config.database_name,
|
data/lib/test_data/railtie.rb
CHANGED
data/lib/test_data/rake.rb
CHANGED
@@ -10,17 +10,18 @@ def run_in_test_data_env(task_name)
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def create_database_or_else_blow_up_if_its_not_empty!
|
13
|
+
raise unless Rails.env.test_data?
|
14
|
+
|
15
|
+
unless TestData::DetectsDatabaseExistence.new.call
|
16
|
+
Rake::Task["test_data:create_database"].invoke
|
17
|
+
end
|
18
|
+
|
13
19
|
unless TestData::DetectsDatabaseEmptiness.new.empty?
|
14
20
|
raise TestData::Error.new("Database '#{TestData.config.database_name}' already exists and is not empty. To re-initialize it, drop it first (e.g. `rake test_data:drop_database`)")
|
15
21
|
end
|
16
|
-
rescue TestData::Error => e
|
17
|
-
raise e
|
18
|
-
rescue
|
19
|
-
# Only (anticipated) cause for raise here is DB did not exist
|
20
|
-
Rake::Task["test_data:create_database"].invoke
|
21
22
|
end
|
22
23
|
|
23
|
-
desc "Verifies test_data environment looks good"
|
24
|
+
desc "Verifies that the test_data environment looks good"
|
24
25
|
task "test_data:verify_config" do
|
25
26
|
TestData.log.with_plain_writer do
|
26
27
|
config = TestData::VerifiesConfiguration.new.call
|
@@ -34,12 +35,12 @@ task "test_data:verify_config" do
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
37
|
-
desc "
|
38
|
+
desc "Installs default configuration files and snippets"
|
38
39
|
task "test_data:configure" do
|
39
40
|
TestData::InstallsConfiguration.new.call
|
40
41
|
end
|
41
42
|
|
42
|
-
desc "
|
43
|
+
desc "Initializes test_data's interactive database"
|
43
44
|
task "test_data:initialize" => ["test_data:verify_config", :environment] do
|
44
45
|
next run_in_test_data_env("test_data:initialize") if wrong_env?
|
45
46
|
|
@@ -59,7 +60,36 @@ task "test_data:initialize" => ["test_data:verify_config", :environment] do
|
|
59
60
|
MSG
|
60
61
|
end
|
61
62
|
|
62
|
-
desc "
|
63
|
+
desc "Re-initializes test_data's interactive database (by dropping and reloading it)"
|
64
|
+
task "test_data:reinitialize" => ["test_data:verify_config", :environment] do
|
65
|
+
next run_in_test_data_env("test_data:reinitialize") if wrong_env?
|
66
|
+
|
67
|
+
# Take caution only if the test_data database exists
|
68
|
+
if TestData::DetectsDatabaseExistence.new.call
|
69
|
+
TestData::WarnsIfDatabaseIsNewerThanDump.new.call
|
70
|
+
|
71
|
+
unless ENV["TEST_DATA_CONFIRM"].present?
|
72
|
+
confirmed = if $stdin.isatty
|
73
|
+
puts "This will DROP test_data database '#{TestData.config.database_name}'. Are you sure you want to re-initialize it? [yN]"
|
74
|
+
$stdin.gets.chomp.downcase.start_with?("y")
|
75
|
+
else
|
76
|
+
puts "'#{TestData.config.database_name}' exists. Set TEST_DATA_CONFIRM=true to drop the database and re-initialize it."
|
77
|
+
false
|
78
|
+
end
|
79
|
+
|
80
|
+
unless confirmed
|
81
|
+
puts "Exiting without making any changes"
|
82
|
+
exit 1
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
Rake::Task["test_data:drop_database"].invoke
|
87
|
+
end
|
88
|
+
|
89
|
+
Rake::Task["test_data:initialize"].invoke
|
90
|
+
end
|
91
|
+
|
92
|
+
desc "Initializes test_data Rails environment & configure database"
|
63
93
|
task "test_data:install" => ["test_data:configure", "test_data:initialize"]
|
64
94
|
|
65
95
|
desc "Dumps the interactive test_data database"
|
data/lib/test_data/version.rb
CHANGED