1
# frozen_string_literal: true
2

3 15
require "spec_helper"
4

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

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

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

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

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

45 15
    expect(Sequel::Seed::Base.descendants.length).to be 0
46 15
    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 15
    expect(ArraySpecModel.dataset.all.length).to be 0
48
  end
49

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Read our documentation on viewing source code .

Loading