1
# frozen_string_literal: true
2

3 7
require "spec_helper"
4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Read our documentation on viewing source code .

Loading