1
# frozen_string_literal: true
2

3 2
require "spec_helper"
4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

183 2
        expect(Sequel::Seed::Base.descendants.length).to be 0
184 2
        expect { Sequel::Seeder.apply(@db, seed_test_dir) }.not_to raise_error
185 2
        expect(Sequel::Seed::Base.descendants.length).to be 1
186 2
        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 2
    context "when the specified Seed is not applicable to the given environment" do
199 2
      it "should not make any change to the database" do
200 2
        Sequel::Seed.setup environment
201

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Read our documentation on viewing source code .

Loading