1
# frozen_string_literal: true
2

3 3
require "spec_helper"
4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Read our documentation on viewing source code .

Loading