mongo-fixture 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -25,6 +25,7 @@ module Mongo
25
25
  load fixture if fixture
26
26
 
27
27
  @connection = connection if connection
28
+ @inserted = []
28
29
  push if fixture && connection && option_push
29
30
  end
30
31
 
@@ -92,6 +93,8 @@ module Mongo
92
93
  matrix.each do |element, values|
93
94
  begin
94
95
  @connection[collection].insert simplify values.to_hash
96
+ @inserted ||= Array.new
97
+ @inserted << collection
95
98
  rescue MissingProcessedValueError => m
96
99
  rollback
97
100
  raise MissingProcessedValueError, "In record '#{element}' to be inserted into '#{collection}', the processed value of field '#{m.field}' is missing, aborting"
@@ -101,17 +104,32 @@ module Mongo
101
104
  end
102
105
 
103
106
  # Simplifies the hash in order to insert it into the database
104
- # (Note: I'm well aware that this functionality belongs in a dependency,
105
- # specially now that is repeated here and in Sequel::Fixture)
107
+ # Resolves external references and flattens the values that provide alternatives
106
108
  # @param [Hash] the hash to be processed
107
109
  def simplify the_hash
108
110
  the_returned_hash = {}
109
111
  the_hash.each do |key, value|
110
112
  if value.is_a? Hash
111
- unless value.has_key? :processed
112
- raise MissingProcessedValueError.new "The processed value to insert into the db is missing from the field '#{key}', aborting", key
113
+
114
+ # If no alternative matches the name of a collection, look for a :processed value
115
+ if (value.keys & @data.keys).empty?
116
+ unless value.has_key? :processed
117
+ raise MissingProcessedValueError.new "The processed value to insert into the db is missing from the field '#{key}', aborting", key
118
+ end
119
+ the_returned_hash[key] = value[:processed]
120
+ else
121
+
122
+ # Does any of the options hold a record named after the value of the option?
123
+ options = value.keys & @data.keys
124
+ actual_option = options.each do |option|
125
+ break option if @data[option].has_key? value[option].to_sym
126
+ end
127
+
128
+ unless data_was_inserted_in? actual_option
129
+ insert_data_for actual_option
130
+ end
131
+ the_returned_hash[key] = @connection[actual_option].find( @data[actual_option][value[actual_option].to_sym] ).first[:_id]
113
132
  end
114
- the_returned_hash[key] = value[:processed]
115
133
  else
116
134
  the_returned_hash[key] = value
117
135
  end
@@ -119,6 +137,14 @@ module Mongo
119
137
  return the_returned_hash
120
138
  end
121
139
 
140
+ # Inserts the collection data into the database
141
+ def insert_data_for collection
142
+ @data[collection].each do |key, record|
143
+ @connection[collection].insert record
144
+ end
145
+ @inserted << collection
146
+ end
147
+
122
148
  # Empties the collections, only if they were empty to begin with
123
149
  def rollback
124
150
  begin
@@ -144,6 +170,11 @@ module Mongo
144
170
  @field = field
145
171
  super message
146
172
  end
147
- end
173
+ end
174
+
175
+ private
176
+ def data_was_inserted_in? collection
177
+ @inserted.include? collection
178
+ end
148
179
  end
149
180
  end
@@ -1,5 +1,5 @@
1
1
  module Mongo
2
2
  class Fixture
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -1,4 +1,5 @@
1
1
  require "mongo-fixture"
2
+ require "pry"
2
3
 
3
4
  describe Mongo::Fixture do
4
5
  describe ".path" do
@@ -398,7 +399,7 @@ describe Mongo::Fixture do
398
399
  end
399
400
  end
400
401
 
401
- context "a fixture with a field with alternatives yet missing the <processed> one" do
402
+ context "a fixture with a field with alternatives missing the <processed> and the option doesn't match a collection" do
402
403
  before do
403
404
  Fast.file.write "test/fixtures/test/users.yaml", "hey: { pass: { raw: There } }"
404
405
  end
@@ -424,6 +425,110 @@ describe Mongo::Fixture do
424
425
  Fast.dir.remove! :test
425
426
  end
426
427
  end
428
+
429
+ context "a fixture with a field with one alternative name matches a collection name" do
430
+ context "the alternative value matches a record and in the collection" do
431
+ before do
432
+ Fast.file.write "test/fixtures/test/users.yaml", "pepe: { name: Jonah }"
433
+ Fast.file.write "test/fixtures/test/comments.yaml", "flamewar: { user: { users: pepe }, text: 'FLAME' }"
434
+ end
435
+
436
+ it "should insert the comment so that the comment user value matches the '_id' of the user" do
437
+ database = double 'database'
438
+ comm = double 'comments', :count => 0, :drop => nil
439
+ comm.should_receive( :insert ).with( :user => "un id", :text => "FLAME" )
440
+ record = stub 'record'
441
+ record.should_receive( :[] ).with( :_id ).and_return "un id"
442
+ usrs = double 'users', :count => 0, :find => stub( :first => record ), :drop => nil, :insert => nil
443
+ database.stub :[] do |coll|
444
+ case coll
445
+ when :users
446
+ usrs
447
+ when :comments
448
+ comm
449
+ end
450
+ end
451
+ fix = Mongo::Fixture.new :test, database
452
+ end
453
+
454
+ context "the collection is ordered so that the comment collection comes before the users one" do
455
+ it "should stop and process the users first" do
456
+ database = double 'database'
457
+ usrs = double 'users', :count => 0, :insert => nil, :find => stub( :first => stub( :[] => "un id" ) )
458
+ database.stub :[] do |argument|
459
+ case argument
460
+ when :comments
461
+ double 'comments', :count => 0, :insert => nil
462
+ when :users
463
+ usrs
464
+ end
465
+ end
466
+ fix = Mongo::Fixture.new :test, database, false
467
+ def fix.stub_data
468
+ @data = {
469
+ :comments => SymbolMatrix.new("test/fixtures/test/comments.yaml"),
470
+ :users => SymbolMatrix.new("test/fixtures/test/users.yaml") }
471
+ end
472
+ fix.stub_data
473
+
474
+ fix.push
475
+ end
476
+ end
477
+
478
+ after do
479
+ Fast.dir.remove! :test
480
+ end
481
+ end
482
+ end
483
+ end
484
+
485
+ describe "#data_was_inserted_in?" do
486
+ it "should be private" do
487
+ fix = Mongo::Fixture.new
488
+ fix.private_methods(false).should include :data_was_inserted_in?
489
+ end
490
+
491
+ context "there is a simple fixture and a collection has been inserted by this fixture" do
492
+ before do
493
+ Fast.file.write "test/fixtures/test/users.yaml", "pepe: { user: pepe }"
494
+ end
495
+
496
+ it "should return true" do
497
+ database = double 'database'
498
+ coll = double 'collection', :count => 0, :insert => nil
499
+ database.stub :[] => coll
500
+ fix = Mongo::Fixture.new :test, database
501
+ def fix.loot
502
+ data_was_inserted_in?(:users).should === true
503
+ end
504
+ fix.loot
505
+ end
506
+
507
+ after do
508
+ Fast.dir.remove! :test
509
+ end
510
+ end
511
+
512
+ context "there is a simple fixture and a collection was inserted but not this" do
513
+ before do
514
+ Fast.file.write "test/fixtures/test/users.yaml", "pepe: { user: pepe }"
515
+ end
516
+
517
+ it "should return false" do
518
+ database = double 'database'
519
+ coll = double 'collection', :count => 0, :insert => nil
520
+ database.stub :[] => coll
521
+ fix = Mongo::Fixture.new :test, database
522
+ def fix.loot
523
+ data_was_inserted_in?(:comment).should === false
524
+ end
525
+ fix.loot
526
+ end
527
+
528
+ after do
529
+ Fast.dir.remove! :test
530
+ end
531
+ end
427
532
  end
428
533
 
429
534
  # This should go in a dependency, pending refactoring TODO
@@ -444,6 +549,10 @@ describe Mongo::Fixture do
444
549
  }
445
550
 
446
551
  fix = Mongo::Fixture.new
552
+ def fix.stub_data
553
+ @data = {}
554
+ end
555
+ fix.stub_data
447
556
  simplified = fix.simplify base_hash
448
557
  simplified.should == {
449
558
  :name => "Jane",
@@ -469,6 +578,10 @@ describe Mongo::Fixture do
469
578
  }
470
579
 
471
580
  fix = Mongo::Fixture.new
581
+ def fix.stub_data
582
+ @data = {}
583
+ end
584
+ fix.stub_data
472
585
  expect { fix.simplify base_hash
473
586
  }.to raise_error Mongo::Fixture::MissingProcessedValueError,
474
587
  "The processed value to insert into the db is missing from the field 'pass', aborting"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo-fixture
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-09 00:00:00.000000000 Z
12
+ date: 2012-08-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mongo
@@ -114,7 +114,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
114
114
  version: '0'
115
115
  segments:
116
116
  - 0
117
- hash: 94604481
117
+ hash: 803460883
118
118
  required_rubygems_version: !ruby/object:Gem::Requirement
119
119
  none: false
120
120
  requirements:
@@ -123,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  version: '0'
124
124
  segments:
125
125
  - 0
126
- hash: 94604481
126
+ hash: 803460883
127
127
  requirements: []
128
128
  rubyforge_project:
129
129
  rubygems_version: 1.8.24