1
# frozen_string_literal: true
2

3 11
require "spec_helper"
4

5 11
describe Sequel::Seeder do
6 11
  let!(:environment) { "#{Faker::Lorem.word}_#{Faker::Lorem.word}" }
7 11
  let!(:random_word) { Faker::Lorem.word }
8

9 11
  before do
10 11
    Sequel.extension :seed
11 11
    Sequel.extension :pg_array
12 11
    ArraySpecModel.dataset.delete
13 11
    Sequel::Seed::Base.descendants.clear
14
  end
15

16 11
  before(:all) do
17 9
    dsn = begin
18 11
      if RUBY_PLATFORM == "java"
19 0
        "jdbc:postgresql://localhost/sequel_seed_test"
20
      else
21 11
        "postgres://localhost/sequel_seed_test"
22
      end
23
    end
24 11
    @db = Sequel.connect(dsn)
25 11
    @db.extension(:pg_array)
26 11
    @db.drop_table?(:array_spec_models)
27 11
    @db.create_table(:array_spec_models) do
28 11
      primary_key :id, :serial
29 11
      column :selectors, "text[]"
30 11
      String :sentence
31
    end
32 11
    class ArraySpecModel < Sequel::Model(@db); end
33 11
    ArraySpecModel.dataset = @db[:array_spec_models]
34
    #Sequel::Model.db = @db
35
  end
36

37 11
  after(:each) do
38 11
    ArraySpecModel.dataset.delete
39 11
    Sequel::Seed::Base.descendants.clear
40
  end
41

42 11
  it "should raise an error when there is not any seed file to apply" do
43 11
    Sequel::Seed.setup environment
44

45 11
    expect(Sequel::Seed::Base.descendants.length).to be 0
46 11
    expect { Sequel::Seeder.apply(@db, "/") }.to raise_error("seeder not available for files; please check the configured seed directory \"/\". Also ensure seed files are in YYYYMMDD_seed_file.rb format.")
47 11
    expect(ArraySpecModel.dataset.all.length).to be 0
48
  end
49

50 11
  describe "Seeds defined using Ruby code (.rb extension)" do
51 11
    describe "environment references should be indistinguishable between Symbol and String" do
52 11
      context "when the environment is defined using a String" do
53 11
        it "should apply the Seed accordingly" do
54 11
          Sequel::Seed.setup environment
55

56 11
          File.open("#{seed_test_dir}/#{seed_file_name}.rb", "w+") do |f|
57 11
            f.puts "Sequel.seed(:#{environment}) do"
58 11
            f.puts "  def run"
59 11
            f.puts "    ArraySpecModel.create \\"
60 11
            f.puts "      :sentence => \"environment defined by String\","
61 11
            f.puts "      :selectors => [\".body\", \".header\", \".string\"]"
62 11
            f.puts "  end"
63 11
            f.puts "end"
64
          end
65

66 11
          expect(Sequel::Seed::Base.descendants.length).to be 0
67 11
          expect(Sequel::Seeder.seeder_class(seed_test_dir)).to be Sequel::TimestampSeeder
68 11
          expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
69 11
          expect(Sequel::Seed::Base.descendants.length).to be 1
70 11
          expect(ArraySpecModel.dataset.all.length).to be 1
71 11
          expect(ArraySpecModel.dataset.first.sentence).to eq "environment defined by String"
72 11
          expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".string")
73
        end
74
      end
75

76 11
      context "when the Seed is defined using a String" do
77 11
        it "should apply the Seed accordingly" do
78 11
          Sequel::Seed.setup environment.to_sym
79

80 11
          File.open("#{seed_test_dir}/#{seed_file_name}.rb", "w+") do |f|
81 11
            f.puts "Sequel.seed(\"#{environment}\") do"
82 11
            f.puts "  def run"
83 11
            f.puts "    ArraySpecModel.create \\"
84 11
            f.puts "      :sentence => \"Seed defined by String\","
85 11
            f.puts "      :selectors => [\".body\", \".header\", \".environment\"]"
86 11
            f.puts "  end"
87 11
            f.puts "end"
88
          end
89

90 11
          expect(Sequel::Seed::Base.descendants.length).to be 0
91 11
          expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
92 11
          expect(Sequel::Seed::Base.descendants.length).to be 1
93 11
          expect(ArraySpecModel.dataset.all.length).to be 1
94 11
          expect(ArraySpecModel.dataset.first.sentence).to eq "Seed defined by String"
95 11
          expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".environment")
96
        end
97
      end
98

99 11
      context "when both Seed and environment are defined using a String" do
100 11
        it "should apply the Seed accordingly" do
101 11
          Sequel::Seed.setup environment
102

103 11
          File.open("#{seed_test_dir}/#{seed_file_name}.rb", "w+") do |f|
104 11
            f.puts "Sequel.seed(\"#{environment}\") do"
105 11
            f.puts "  def run"
106 11
            f.puts "    ArraySpecModel.create \\"
107 11
            f.puts "      :sentence => \"Seed and environment defined by String\","
108 11
            f.puts "      :selectors => [\".body\", \".header\", \".string\", \".environment\"]"
109 11
            f.puts "  end"
110 11
            f.puts "end"
111
          end
112

113 11
          expect(Sequel::Seed::Base.descendants.length).to be 0
114 11
          expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
115 11
          expect(Sequel::Seed::Base.descendants.length).to be 1
116 11
          expect(ArraySpecModel.dataset.all.length).to be 1
117 11
          expect(ArraySpecModel.dataset.first.sentence).to eq "Seed and environment defined by String"
118 11
          expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".string", ".environment")
119
        end
120
      end
121

122 11
      context "when both Seed and environment are defined using a Symbol" do
123 11
        it "should apply the Seed accordingly" do
124 11
          Sequel::Seed.setup environment.to_sym
125

126 11
          File.open("#{seed_test_dir}/#{seed_file_name}.rb", "w+") do |f|
127 11
            f.puts "Sequel.seed(:#{environment}) do"
128 11
            f.puts "  def run"
129 11
            f.puts "    ArraySpecModel.create \\"
130 11
            f.puts "      :sentence => \"Seed and environment defined by Symbol\","
131 11
            f.puts "      :selectors => [\".body\", \".header\", \".string\", \".environment\", \".symbol\"]"
132 11
            f.puts "  end"
133 11
            f.puts "end"
134
          end
135

136 11
          expect(Sequel::Seed::Base.descendants.length).to be 0
137 11
          expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
138 11
          expect(Sequel::Seed::Base.descendants.length).to be 1
139 11
          expect(ArraySpecModel.dataset.all.length).to be 1
140 11
          expect(ArraySpecModel.dataset.first.sentence).to eq "Seed and environment defined by Symbol"
141 11
          expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".string", ".environment", ".symbol")
142
        end
143
      end
144

145 11
      context "when the environment is defined using a String and we have a wildcard Seed" do
146 11
        it "should apply the Seed accordingly" do
147 11
          Sequel::Seed.setup environment
148

149 11
          File.open("#{seed_test_dir}/#{seed_file_name}.rb", "w+") do |f|
150 11
            f.puts "Sequel.seed do"
151 11
            f.puts "  def run"
152 11
            f.puts "    ArraySpecModel.create \\"
153 11
            f.puts "      :sentence => \"Wildcard Seed and environment defined by String\","
154 11
            f.puts "      :selectors => [\".body\", \".header\", \".string\", \".wildcard\"]"
155 11
            f.puts "  end"
156 11
            f.puts "end"
157
          end
158

159 11
          expect(Sequel::Seed::Base.descendants.length).to be 0
160 11
          expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
161 11
          expect(Sequel::Seed::Base.descendants.length).to be 1
162 11
          expect(ArraySpecModel.dataset.all.length).to be 1
163 11
          expect(ArraySpecModel.dataset.first.sentence).to eq "Wildcard Seed and environment defined by String"
164 11
          expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".string", ".wildcard")
165
        end
166
      end
167
    end
168

169 11
    context "when there\"s a Seed created" do
170 11
      it "should change the database accordingly only once" do
171 11
        Sequel::Seed.setup environment
172

173 11
        File.open("#{seed_test_dir}/#{seed_file_name}.rb", "w+") do |f|
174 11
          f.puts "Sequel.seed do"
175 11
          f.puts "  def run"
176 11
          f.puts "    ArraySpecModel.create \\"
177 11
          f.puts "      :sentence => \"should have changed (from Ruby file)\","
178 11
          f.puts "      :selectors => [\".body\", \".header\", \".string\", \".ruby\"]"
179 11
          f.puts "  end"
180 11
          f.puts "end"
181
        end
182

183 11
        expect(Sequel::Seed::Base.descendants.length).to be 0
184 11
        expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
185 11
        expect(Sequel::Seed::Base.descendants.length).to be 1
186 11
        expect(ArraySpecModel.dataset.all.length).to be 1
187 11
        expect(ArraySpecModel.dataset.first.sentence).to eq "should have changed (from Ruby file)"
188 11
        expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".string", ".ruby")
189
        # Once again
190 11
        expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
191 11
        expect(Sequel::Seed::Base.descendants.length).to be 0
192 11
        expect(ArraySpecModel.dataset.all.length).to be 1
193 11
        expect(ArraySpecModel.dataset.first.sentence).to eq "should have changed (from Ruby file)"
194 11
        expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".string", ".ruby")
195
      end
196
    end
197

198 11
    context "when the specified Seed is not applicable to the given environment" do
199 11
      it "should not make any change to the database" do
200 11
        Sequel::Seed.setup environment
201

202 11
        File.open("#{seed_test_dir}/#{seed_file_name}.rb", "w+") do |f|
203 11
          f.puts "Sequel.seed(:another_#{Faker::Lorem.word}_word) do"
204 11
          f.puts "  def run"
205 11
          f.puts "    ArraySpecModel.create \\"
206 11
          f.puts "      :sentence => \"should not have changed (from Ruby file)\","
207 11
          f.puts "      :selectors => [\".body\", \".header\", \".unchanged\", \".ruby\"]"
208 11
          f.puts "  end"
209 11
          f.puts "end"
210
        end
211

212 11
        expect(Sequel::Seed::Base.descendants.length).to be 0
213 11
        expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
214 11
        expect(ArraySpecModel.dataset.all.length).to be 0
215
      end
216
    end
217
  end
218

219 11
  describe "Seeds defined using YAML code (.{yaml,yml} extension)" do
220 11
    it "should apply a basic YAML Seed if it was specified for the given environment" do
221 11
      Sequel::Seed.setup environment
222

223 11
      File.open("#{seed_test_dir}/#{seed_file_name}.yml", "w+") do |f|
224 11
        f.puts "environment: :#{environment}"
225 11
        f.puts "array_spec_model:"
226 11
        f.puts "  sentence: \"should have changed (from YAML file) #{random_word}\""
227 11
        f.puts "  selectors:"
228 11
        f.puts "    - \".body\""
229 11
        f.puts "    - \".header\""
230 11
        f.puts "    - \".yaml\""
231 11
        f.puts ""
232
      end
233

234 11
      expect(Sequel::Seed::Base.descendants.length).to be 0
235 11
      expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
236 11
      expect(Sequel::Seed::Base.descendants.length).to be 1
237 11
      expect(ArraySpecModel.dataset.all.length).to be 1
238 11
      expect(ArraySpecModel.dataset.first.sentence).to eq "should have changed (from YAML file) #{random_word}"
239 11
      expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".yaml")
240
    end
241

242 11
    it "should apply a YAML Seed if it was specified for the given environment" do
243 11
      Sequel::Seed.setup environment
244

245 11
      File.open("#{seed_test_dir}/#{seed_file_name}.yml", "w+") do |f|
246 11
        f.puts "environment: :#{environment}"
247 11
        f.puts "model:"
248 11
        f.puts "  class: \"ArraySpecModel\""
249 11
        f.puts "  entries:"
250 11
        f.puts "    -"
251 11
        f.puts "      sentence: \"should have changed (from YAML file) #{random_word}\""
252 11
        f.puts "      selectors:"
253 11
        f.puts "        - .body"
254 11
        f.puts "        - .header"
255 11
        f.puts "        - .yaml"
256 11
        f.puts ""
257
      end
258

259 11
      expect(Sequel::Seed::Base.descendants.length).to be 0
260 11
      expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
261 11
      expect(Sequel::Seed::Base.descendants.length).to be 1
262 11
      expect(ArraySpecModel.dataset.all.length).to be 1
263 11
      expect(ArraySpecModel.dataset.first.sentence).to eq "should have changed (from YAML file) #{random_word}"
264 11
      expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".yaml")
265
    end
266

267 11
    it "should apply a YAML file with multiple Seeds descriptors if they were specified for the given environment" do
268 11
      Sequel::Seed.setup environment
269

270 11
      File.open("#{seed_test_dir}/#{seed_file_name}.yml", "w+") do |f|
271 11
        f.puts "-"
272 11
        f.puts "  environment: :#{environment}"
273 11
        f.puts "  model:"
274 11
        f.puts "    class: \"ArraySpecModel\""
275 11
        f.puts "    entries:"
276 11
        f.puts "      -"
277 11
        f.puts "        sentence: \"should have changed (from YAML file) #{random_word}\""
278 11
        f.puts "        selectors:"
279 11
        f.puts "          - .body"
280 11
        f.puts "          - .header"
281 11
        f.puts "          - .yaml"
282 11
        f.puts "          - .environment"
283 11
        f.puts "-"
284 11
        f.puts "  environment: :another_#{environment}"
285 11
        f.puts "  array_spec_model:"
286 11
        f.puts "    sentence: \"should not have changed (from YAML file) #{random_word}\""
287 11
        f.puts "    selectors:"
288 11
        f.puts "      - .body"
289 11
        f.puts "      - .header"
290 11
        f.puts "      - .yaml"
291 11
        f.puts "      - .another_environment"
292 11
        f.puts ""
293
      end
294

295 11
      expect(Sequel::Seed::Base.descendants.length).to be 0
296 11
      expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
297 11
      expect(Sequel::Seed::Base.descendants.length).to be 1
298 11
      expect(ArraySpecModel.dataset.all.length).to be 1
299 11
      expect(ArraySpecModel.dataset.first.sentence).to eq "should have changed (from YAML file) #{random_word}"
300 11
      expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".yaml", ".environment")
301
    end
302

303 11
    it "should not apply a basic Seed if it was not specified for the given environment" do
304 11
      Sequel::Seed.setup environment
305

306 11
      File.open("#{seed_test_dir}/#{seed_file_name}.yml", "w+") do |f|
307 11
        f.puts "environment: :another_environment_#{Faker::Lorem.word}"
308 11
        f.puts "array_spec_model:"
309 11
        f.puts "  sentence: \"should not have changed (from YAML file)\""
310 11
        f.puts "  selectors:"
311 11
        f.puts "    - .body"
312 11
        f.puts "    - .header"
313 11
        f.puts "    - .yaml"
314 11
        f.puts ""
315
      end
316

317 11
      expect(Sequel::Seed::Base.descendants.length).to be 0
318 11
      expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
319 11
      expect(Sequel::Seed::Base.descendants.length).to be 1
320 11
      expect(ArraySpecModel.dataset.all.length).to be 0
321
    end
322
  end
323

324 11
  describe "Seeds defined using JSON code (.json extension)" do
325 11
    it "should apply a basic JSON Seed if it was specified for the given environment" do
326 11
      Sequel::Seed.setup environment
327

328 11
      File.open("#{seed_test_dir}/#{seed_file_name}.json", "w+") do |f|
329 11
        f.puts "{"
330 11
        f.puts "  \"environment\": \"#{environment}\","
331 11
        f.puts "  \"array_spec_model\": {"
332 11
        f.puts "    \"sentence\": \"should have changed (from JSON file) #{random_word}\","
333 11
        f.puts "    \"selectors\": [\".body\", \".header\", \".json\"]"
334 11
        f.puts "  }"
335 11
        f.puts "}"
336 11
        f.puts ""
337
      end
338

339 11
      expect(Sequel::Seed::Base.descendants.length).to be 0
340 11
      expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
341 11
      expect(Sequel::Seed::Base.descendants.length).to be 1
342 11
      expect(ArraySpecModel.dataset.all.length).to be 1
343 11
      expect(ArraySpecModel.dataset.first.sentence).to eq "should have changed (from JSON file) #{random_word}"
344 11
      expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".json")
345
    end
346

347 11
    it "should apply a JSON Seed if it was specified for the given environment" do
348 11
      Sequel::Seed.setup environment
349

350 11
      File.open("#{seed_test_dir}/#{seed_file_name}.json", "w+") do |f|
351 11
        f.puts "{"
352 11
        f.puts "  \"environment\": \"#{environment}\","
353 11
        f.puts "  \"model\": {"
354 11
        f.puts "    \"class\": \"ArraySpecModel\","
355 11
        f.puts "    \"entries\": ["
356 11
        f.puts "      {"
357 11
        f.puts "        \"sentence\": \"should have changed (from JSON file) #{random_word}\","
358 11
        f.puts "        \"selectors\": [\".body\", \".header\", \".json\"]"
359 11
        f.puts "      }"
360 11
        f.puts "    ]"
361 11
        f.puts "  }"
362 11
        f.puts "}"
363 11
        f.puts ""
364
      end
365

366 11
      expect(Sequel::Seed::Base.descendants.length).to be 0
367 11
      expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
368 11
      expect(Sequel::Seed::Base.descendants.length).to be 1
369 11
      expect(ArraySpecModel.dataset.all.length).to be 1
370 11
      expect(ArraySpecModel.dataset.first.sentence).to eq "should have changed (from JSON file) #{random_word}"
371 11
      expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".json")
372
    end
373

374 11
    it "should apply a JSON file with multiple Seeds descriptors if they were specified for the given environment" do
375 11
      Sequel::Seed.setup environment
376

377 11
      File.open("#{seed_test_dir}/#{seed_file_name}.json", "w+") do |f|
378 11
        f.puts "["
379 11
        f.puts "  {"
380 11
        f.puts "    \"environment\": \"#{environment}\","
381 11
        f.puts "    \"model\": {"
382 11
        f.puts "      \"class\": \"ArraySpecModel\","
383 11
        f.puts "      \"entries\": ["
384 11
        f.puts "        {"
385 11
        f.puts "          \"sentence\": \"should have changed (from JSON file) #{random_word}\","
386 11
        f.puts "          \"selectors\": [\".body\", \".header\", \".json\", \".environment\"]"
387 11
        f.puts "        }"
388 11
        f.puts "      ]"
389 11
        f.puts "    }"
390 11
        f.puts "  },"
391 11
        f.puts "  {"
392 11
        f.puts "    \"environment\": \"another_#{environment}\","
393 11
        f.puts "    \"model\": {"
394 11
        f.puts "      \"class\": \"ArraySpecModel\","
395 11
        f.puts "      \"entries\": ["
396 11
        f.puts "        {"
397 11
        f.puts "          \"sentence\": \"should have changed (from JSON file) #{random_word}\","
398 11
        f.puts "          \"selectors\": [\".body\", \".header\", \".json\", \".another_environment\"]"
399 11
        f.puts "        }"
400 11
        f.puts "      ]"
401 11
        f.puts "    }"
402 11
        f.puts "  }"
403 11
        f.puts "]"
404 11
        f.puts ""
405
      end
406

407 11
      expect(Sequel::Seed::Base.descendants.length).to be 0
408 11
      expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
409 11
      expect(Sequel::Seed::Base.descendants.length).to be 1
410 11
      expect(ArraySpecModel.dataset.all.length).to be 1
411 11
      expect(ArraySpecModel.dataset.first.sentence).to eq "should have changed (from JSON file) #{random_word}"
412 11
      expect(ArraySpecModel.dataset.first.selectors).to contain_exactly(".body", ".header", ".json", ".environment")
413
    end
414

415 11
    it "should not apply a basic Seed if it was not specified for the given environment" do
416 11
      Sequel::Seed.setup environment
417

418 11
      File.open("#{seed_test_dir}/#{seed_file_name}.json", "w+") do |f|
419 11
        f.puts "{"
420 11
        f.puts "  \"environment\": \"another_#{environment}\","
421 11
        f.puts "  \"array_spec_model\": {"
422 11
        f.puts "    \"sentence\": \"should not changed (from JSON file) #{random_word}\","
423 11
        f.puts "    \"selectors\": [\".body\", \".header\", \".json\"]"
424 11
        f.puts "  }"
425 11
        f.puts "}"
426 11
        f.puts ""
427
      end
428

429 11
      expect(Sequel::Seed::Base.descendants.length).to be 0
430 11
      expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
431 11
      expect(Sequel::Seed::Base.descendants.length).to be 1
432 11
      expect(ArraySpecModel.dataset.all.length).to be 0
433
    end
434
  end
435
end

Read our documentation on viewing source code .

Loading