mongo-fixture 0.0.5 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -2,7 +2,7 @@ Mongo::Fixture
2
2
  ===============
3
3
  [![Build Status](https://secure.travis-ci.org/Fetcher/mongo-fixture.png)](http://travis-ci.org/Fetcher/mongo-fixture) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/Fetcher/mongo-fixture)
4
4
 
5
- Just like Rails 2 fixtures, but for [MongoDB][mongo-db] (using the standard [mongo connector Gem][mongo-gem] ).
5
+ Similar to Rails 2 fixtures, but for [MongoDB][mongo-db] (using the standard [mongo connector Gem][mongo-gem] ).
6
6
 
7
7
  [mongo-db]: http://www.mongodb.org/
8
8
  [mongo-gem]: http://rubygems.org/gems/mongo
@@ -10,6 +10,39 @@ Just like Rails 2 fixtures, but for [MongoDB][mongo-db] (using the standard [mon
10
10
  Show off
11
11
  ========
12
12
 
13
+ ### Single collection
14
+
15
+ Assuming you have a fixture for the collection `messages` with:
16
+ ```yaml
17
+ # test/fixtures/some_data/messages.yaml
18
+ yesterday_afternoon:
19
+ text: Honey, pizza tonight?
20
+ sent: 2012-09-11
21
+ today_morning:
22
+ text: Nice date yesterday, how about next week?
23
+ sent: 2012-09-12
24
+ ```
25
+
26
+ You can write a brief ruby script and insert the data into your mongo db:
27
+ ```ruby
28
+ require 'mongo'
29
+ require 'mongo-fixture'
30
+
31
+ DB = Mongo::Connection.new.db 'messages-db' # An example connetion setup
32
+
33
+ # Insert the fixture into the database
34
+ fixture_some_data = Mongo::Fixture.new :some_data, DB
35
+
36
+ # You can now query the fixture for the data that was sent into the DB
37
+ fixture_some_data.messages.yesterday_afternoon.text # => "Honey, pizza tonight?"
38
+ ```
39
+
40
+ The fixture is identified by the name of the folder containing the fixture YAML files. The default folder is `test/fixtures`.
41
+
42
+ As you can see, each record is preceded by a name, in this case `yesterday_afternoon` and `today_morning`. This names never get inserted into the database, they are just references for making it easier to access the fixture's information.
43
+
44
+ ### Associations
45
+
13
46
  Assuming you have a fixture for the collection users with:
14
47
  ```yaml
15
48
  # test/fixtures/simple/users.yaml
@@ -27,16 +60,31 @@ and for messages:
27
60
  ```yaml
28
61
  # test/fixtures/simple/messages.yaml
29
62
  greeting:
30
- sender_id: 1
31
- receiver_id: 2
63
+ sender:
64
+ users: john
65
+ receiver:
66
+ users: jane
32
67
  text: Hi Jane! Long time no see.
33
68
  long_time:
34
- sender_id: 2
35
- receiver_id: 1
69
+ sender:
70
+ users: jane
71
+ receiver:
72
+ users: john
36
73
  text: John! Long time indeed. How are you doing?
37
74
  ```
38
75
 
39
- and the ruby script
76
+ Mongo Fixture will automatically insert the object id (`_id` field in the database) for the referenced users. The Mongo Fixture syntax specifies that:
77
+
78
+ ```yaml
79
+ sender:
80
+ users: john
81
+ ```
82
+
83
+ is a reference to the record named `john` in the collection `users`.
84
+
85
+ > Currently Mongo Fixture does not support references from one collection to another _and back_ from that collection to the first one.
86
+
87
+ For example given the ruby script:
40
88
 
41
89
  ```ruby
42
90
  # script.rb
@@ -54,7 +102,7 @@ fixture.users.john.name # => "John"
54
102
  fixture.rollback # returns users and messages to pristine status (#drop)
55
103
 
56
104
 
57
- fixture = Mongo::Fixture.new :simple, DB, false # The `false` flag prevent the constructor to automatically push
105
+ fixture = Mongo::Fixture.new :simple, DB, false # The `false` flag prevent the constructor from automatically pushing
58
106
  # the fixture into the database
59
107
 
60
108
  fixture.check # Will fail if the user or messages collection
@@ -68,7 +116,29 @@ fixture.rollback # Don't forget to rollback
68
116
 
69
117
  ...naturally, `mongo-fixture` makes a lot more sense within some testing framework.
70
118
 
71
- > **Note**: As of version 0.0.1, the `test/fixtures` path for fixtures is not configurable. Will solve soon.
119
+ ### Many to many associations
120
+
121
+ As is custom in Mongo, a many-to-many association is implemented by passing an array of ids to a field in any of the records to associate. Mongo Fixture supports this. For example:
122
+
123
+ ```yaml
124
+ message:
125
+ sender:
126
+ users: john
127
+ receivers:
128
+ users: [mary, sue, harry, jack]
129
+ text: Meeting tonight guys?
130
+ ```
131
+
132
+ will insert into the `receivers` field an array with the `_id`s of the referenced users.
133
+
134
+ Changing fixtures directory
135
+ ---------------------------
136
+
137
+ ```ruby
138
+ require 'mongo-fixture'
139
+
140
+ Mongo::Fixture.path = 'fixtures' # Now fixtures will be required from `fixtures/`
141
+ ```
72
142
 
73
143
  Installation
74
144
  ------------
@@ -83,6 +153,10 @@ And then execute:
83
153
 
84
154
  bundle
85
155
 
156
+ Future
157
+ ------
158
+
159
+ - Dump from a database to fixtures! This would be awesome.
86
160
 
87
161
  ## License
88
162
 
@@ -0,0 +1,3 @@
1
+ When /^I set the fixtures path as "(.*?)"$/ do |path|
2
+ Mongo::Fixture.path = path
3
+ end
@@ -3,4 +3,5 @@ After do
3
3
  @DB[collection].drop
4
4
  end
5
5
  Fast.dir.remove! :test, :fixtures
6
- end
6
+ Mongo::Fixture.path = 'test/fixtures'
7
+ end
@@ -12,11 +12,16 @@ module Mongo
12
12
  class Fixture
13
13
  ## Class methods
14
14
 
15
- # Returns the current path to the fixtures folder
15
+ # @return [String] Returns the current path to the fixtures folder
16
16
  def self.path
17
17
  @@path ||= "test/fixtures"
18
18
  end
19
19
 
20
+ # Sets the current path to the fixtures folder
21
+ def self.path= the_path
22
+ @@path = the_path
23
+ end
24
+
20
25
  ## Instance methods
21
26
 
22
27
  # Initializes the fixture handler
@@ -1,5 +1,5 @@
1
1
  module Mongo
2
2
  class Fixture
3
- VERSION = "0.0.5"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -54,8 +54,7 @@ describe Mongo::Fixture::Inserter do
54
54
  fixture = double 'fixture', :data => {}, :rollback => nil
55
55
  ins = Mongo::Fixture::Inserter.new fixture
56
56
  expect { ins.simplify @base_hash
57
- }.to raise_error Mongo::Fixture::ReferencedRecordNotFoundError,
58
- "This fixture does not include data for the collections [raw,not_processed]"
57
+ }.to raise_error Mongo::Fixture::ReferencedRecordNotFoundError
59
58
  end
60
59
 
61
60
  it "should call #resolve_field_hash with the data hash" do
@@ -332,8 +331,7 @@ describe Mongo::Fixture::Inserter do
332
331
  fixture = stub 'fixture', :data => { :collection => "", :another_collection => ""}
333
332
  inserter = Mongo::Fixture::Inserter.new fixture
334
333
  expect { inserter.resolve_field_hash data
335
- }.to raise_error Mongo::Fixture::ReferencedRecordNotFoundError,
336
- "This fixture does not include data for the collections [users,comments]"
334
+ }.to raise_error Mongo::Fixture::ReferencedRecordNotFoundError
337
335
  end
338
336
  end
339
337
  end
@@ -7,6 +7,17 @@ describe Mongo::Fixture do
7
7
  end
8
8
  end
9
9
 
10
+ describe ".path=" do
11
+ it 'should set the path with the passed string' do
12
+ Mongo::Fixture.path = "fixtures"
13
+ Mongo::Fixture.path.should == "fixtures"
14
+ end
15
+
16
+ after do
17
+ Mongo::Fixture.path = 'test/fixtures'
18
+ end
19
+ end
20
+
10
21
  describe ".new" do
11
22
  context "a symbol is sent representing a fixture" do
12
23
  it "should call load" do
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.5
4
+ version: 0.1.0
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-27 00:00:00.000000000 Z
12
+ date: 2012-09-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mongo
@@ -91,6 +91,7 @@ files:
91
91
  - Rakefile
92
92
  - features/configurable_fixtures_folder.feature
93
93
  - features/play_around_with_fixtures.feature
94
+ - features/stepdefs/configurable_fixtures_folder/the_folder_is_now_just_fixtures.rb
94
95
  - features/stepdefs/play_around_with_fixtures/background.rb
95
96
  - features/stepdefs/play_around_with_fixtures/create_a_simple_fixture_push_it_and_rollback.rb
96
97
  - features/stepdefs/play_around_with_fixtures/misconfigured_password_field.rb
@@ -115,27 +116,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
116
  - - ! '>='
116
117
  - !ruby/object:Gem::Version
117
118
  version: '0'
118
- segments:
119
- - 0
120
- hash: -421222579
121
119
  required_rubygems_version: !ruby/object:Gem::Requirement
122
120
  none: false
123
121
  requirements:
124
122
  - - ! '>='
125
123
  - !ruby/object:Gem::Version
126
124
  version: '0'
127
- segments:
128
- - 0
129
- hash: -421222579
130
125
  requirements: []
131
126
  rubyforge_project:
132
- rubygems_version: 1.8.24
127
+ rubygems_version: 1.8.21
133
128
  signing_key:
134
129
  specification_version: 3
135
130
  summary: Flexible fixtures for the MongoDB Gem inspired in Rails 2 fixtures
136
131
  test_files:
137
132
  - features/configurable_fixtures_folder.feature
138
133
  - features/play_around_with_fixtures.feature
134
+ - features/stepdefs/configurable_fixtures_folder/the_folder_is_now_just_fixtures.rb
139
135
  - features/stepdefs/play_around_with_fixtures/background.rb
140
136
  - features/stepdefs/play_around_with_fixtures/create_a_simple_fixture_push_it_and_rollback.rb
141
137
  - features/stepdefs/play_around_with_fixtures/misconfigured_password_field.rb
@@ -144,3 +140,4 @@ test_files:
144
140
  - spec/mongo/fixture/inserter_spec.rb
145
141
  - spec/mongo/fixture_spec.rb
146
142
  - spec/spec_helper.rb
143
+ has_rdoc: