1
# frozen_string_literal: true
2

3 4
require "spec_helper"
4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

259 4
      expect(Sequel::Seed::Base.descendants.length).to be 0
260 4
      expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
261 4
      expect(Sequel::Seed::Base.descendants.length).to be 1
262 4
      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 4
    it "should apply a YAML file with multiple Seeds descriptors if they were specified for the given environment" do
268 4
      Sequel::Seed.setup environment
269

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Read our documentation on viewing source code .

Loading