couch_potato 1.4.0 → 1.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/.travis.yml +12 -8
  4. data/CHANGES.md +4 -0
  5. data/Gemfile +1 -1
  6. data/README.md +396 -276
  7. data/Rakefile +9 -9
  8. data/couch_potato-rspec.gemspec +20 -0
  9. data/couch_potato.gemspec +15 -16
  10. data/{active_support_4_0 → gemfiles/active_support_4_0} +3 -3
  11. data/{active_support_3_2 → gemfiles/active_support_4_1} +3 -2
  12. data/gemfiles/active_support_4_2 +11 -0
  13. data/lib/couch_potato-rspec.rb +3 -0
  14. data/lib/couch_potato.rb +3 -1
  15. data/lib/couch_potato/database.rb +42 -39
  16. data/lib/couch_potato/persistence/magic_timestamps.rb +5 -5
  17. data/lib/couch_potato/persistence/properties.rb +8 -2
  18. data/lib/couch_potato/persistence/simple_property.rb +11 -9
  19. data/lib/couch_potato/persistence/type_caster.rb +1 -1
  20. data/lib/couch_potato/railtie.rb +2 -0
  21. data/lib/couch_potato/version.rb +2 -1
  22. data/lib/couch_potato/view/base_view_spec.rb +18 -8
  23. data/lib/couch_potato/view/view_query.rb +2 -3
  24. data/spec/attachments_spec.rb +3 -3
  25. data/spec/callbacks_spec.rb +193 -113
  26. data/spec/conflict_handling_spec.rb +4 -4
  27. data/spec/create_spec.rb +5 -5
  28. data/spec/default_property_spec.rb +6 -6
  29. data/spec/destroy_spec.rb +5 -5
  30. data/spec/property_spec.rb +71 -61
  31. data/spec/rails_spec.rb +3 -3
  32. data/spec/railtie_spec.rb +12 -13
  33. data/spec/spec_helper.rb +3 -3
  34. data/spec/unit/active_model_compliance_spec.rb +16 -16
  35. data/spec/unit/attributes_spec.rb +36 -34
  36. data/spec/unit/base_view_spec_spec.rb +82 -35
  37. data/spec/unit/callbacks_spec.rb +2 -2
  38. data/spec/unit/couch_potato_spec.rb +3 -3
  39. data/spec/unit/create_spec.rb +12 -12
  40. data/spec/unit/custom_views_spec.rb +1 -1
  41. data/spec/unit/database_spec.rb +95 -95
  42. data/spec/unit/date_spec.rb +3 -3
  43. data/spec/unit/deep_dirty_attributes_spec.rb +104 -104
  44. data/spec/unit/dirty_attributes_spec.rb +19 -19
  45. data/spec/unit/forbidden_attributes_protection_spec.rb +4 -4
  46. data/spec/unit/initialize_spec.rb +37 -19
  47. data/spec/unit/json_spec.rb +4 -4
  48. data/spec/unit/lists_spec.rb +8 -8
  49. data/spec/unit/model_view_spec_spec.rb +14 -14
  50. data/spec/unit/persistence_spec.rb +6 -6
  51. data/spec/unit/properties_view_spec_spec.rb +4 -4
  52. data/spec/unit/rspec_matchers_spec.rb +73 -73
  53. data/spec/unit/rspec_stub_db_spec.rb +43 -42
  54. data/spec/unit/string_spec.rb +1 -1
  55. data/spec/unit/time_spec.rb +2 -2
  56. data/spec/unit/validation_spec.rb +1 -1
  57. data/spec/unit/view_query_spec.rb +54 -59
  58. data/spec/update_spec.rb +5 -5
  59. data/spec/view_updates_spec.rb +4 -4
  60. data/spec/views_spec.rb +43 -43
  61. metadata +18 -22
  62. data/lib/couch_potato/rspec.rb +0 -2
  63. data/lib/couch_potato/rspec/matchers.rb +0 -56
  64. data/lib/couch_potato/rspec/matchers/json2.js +0 -482
  65. data/lib/couch_potato/rspec/matchers/list_as_matcher.rb +0 -53
  66. data/lib/couch_potato/rspec/matchers/map_reduce_to_matcher.rb +0 -166
  67. data/lib/couch_potato/rspec/matchers/map_to_matcher.rb +0 -61
  68. data/lib/couch_potato/rspec/matchers/reduce_to_matcher.rb +0 -48
  69. data/lib/couch_potato/rspec/stub_db.rb +0 -57
@@ -1,66 +1,67 @@
1
1
  require 'spec_helper'
2
- require 'couch_potato/rspec'
2
+ require 'couch_potato-rspec'
3
3
 
4
4
  class WithStubbedView
5
5
  include CouchPotato::Persistence
6
-
7
- view :stubbed_view, :key => :x
6
+
7
+ view :stubbed_view, key: :x
8
8
  end
9
9
 
10
- describe "stubbing the db" do
11
- it "should replace CouchPotato.database with a stub" do
12
- stub_db
13
- CouchPotato.database.should be_a(RSpec::Mocks::Mock)
10
+ describe 'stubbing the db' do
11
+ it 'replaces CouchPotato.database with a double' do
12
+ CouchPotato.stub_db
13
+
14
+ expect(CouchPotato.database).to be_a(RSpec::Mocks::Double)
14
15
  end
15
-
16
- it "should return the stub" do
17
- db = stub_db
18
- CouchPotato.database.should == db
16
+
17
+ it 'returns the stub' do
18
+ db = CouchPotato.stub_db
19
+
20
+ expect(CouchPotato.database).to eq(db)
19
21
  end
20
22
  end
21
23
 
22
- describe "stubbing a view" do
24
+ describe 'stubbing a view' do
23
25
  before(:each) do
24
- @db = stub_db
26
+ @db = CouchPotato.stub_db
25
27
  @db.stub_view(WithStubbedView, :stubbed_view).with('123').and_return([:result])
26
28
  end
27
-
28
- it "should stub the view to return a stub" do
29
- WithStubbedView.stubbed_view('123').should be_a(RSpec::Mocks::Mock)
29
+
30
+ it 'stubs the view to return a double' do
31
+ expect(WithStubbedView.stubbed_view('123')).to be_a(RSpec::Mocks::Double)
30
32
  end
31
-
32
- it "should stub the database to return fake results when called with the stub" do
33
- @db.view(WithStubbedView.stubbed_view('123')).should == [:result]
33
+
34
+ it 'stubs the database to return fake results when called with the stub' do
35
+ expect(@db.view(WithStubbedView.stubbed_view('123'))).to eq([:result])
34
36
  end
35
-
36
- it "stubs the database to return the first fake result" do
37
- @db.first(WithStubbedView.stubbed_view('123')).should == :result
38
- @db.first!(WithStubbedView.stubbed_view('123')).should == :result
37
+
38
+ it 'stubs the database to return the first fake result' do
39
+ expect(@db.first(WithStubbedView.stubbed_view('123'))).to eq(:result)
40
+ expect(@db.first!(WithStubbedView.stubbed_view('123'))).to eq(:result)
39
41
  end
40
-
41
- it "raises an error if there is no first result" do
42
+
43
+ it 'raises an error if there is no first result' do
42
44
  @db.stub_view(WithStubbedView, :stubbed_view).and_return([])
43
- lambda {
45
+ expect do
44
46
  @db.first!(WithStubbedView.stubbed_view('123'))
45
- }.should raise_error(CouchPotato::NotFound)
47
+ end.to raise_error(CouchPotato::NotFound)
46
48
  end
47
-
49
+
48
50
  it "skips stubbing the first view (i.e. doesn't crash) if the fake result does not respond to first" do
49
51
  @db.stub_view(WithStubbedView, :stubbed_view).with('123').and_return(:results)
50
-
51
- @db.view(WithStubbedView.stubbed_view('123')).should == :results
52
+
53
+ expect(@db.view(WithStubbedView.stubbed_view('123'))).to eq(:results)
52
54
  end
53
-
54
- it "supports the block style return syntax with `with`" do
55
- @db.stub_view(WithStubbedView, :stubbed_view).with('123') {:results}
56
-
57
- @db.view(WithStubbedView.stubbed_view('123')).should == :results
55
+
56
+ it 'supports the block style return syntax with `with`' do
57
+ @db.stub_view(WithStubbedView, :stubbed_view).with('123') { :results }
58
+
59
+ expect(@db.view(WithStubbedView.stubbed_view('123'))).to eq(:results)
58
60
  end
59
-
60
- it "supports the block style return syntax without `with`" do
61
- @db.stub_view(WithStubbedView, :stubbed_view) {:results}
62
-
63
- @db.view(WithStubbedView.stubbed_view('123')).should == :results
61
+
62
+ it 'supports the block style return syntax without `with`' do
63
+ @db.stub_view(WithStubbedView, :stubbed_view) { :results }
64
+
65
+ expect(@db.view(WithStubbedView.stubbed_view('123'))).to eq(:results)
64
66
  end
65
-
66
- end
67
+ end
@@ -2,6 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe String, 'camelize' do
4
4
  it "should camelize a string" do
5
- 'my_string'.camelize.should == 'MyString'
5
+ expect('my_string'.camelize).to eq('MyString')
6
6
  end
7
7
  end
@@ -3,13 +3,13 @@ require 'spec_helper'
3
3
  describe Time, 'to_json' do
4
4
  it "should convert to utc and format the time in a way that i can use it for sorting in couchdb" do
5
5
  time = Time.parse('2009-01-01 11:12:23 +0200')
6
- time.to_json.should == "\"2009/01/01 09:12:23 +0000\""
6
+ expect(time.to_json).to eq("\"2009/01/01 09:12:23 +0000\"")
7
7
  end
8
8
  end
9
9
 
10
10
  describe Time, 'as_json' do
11
11
  it "should format it in the same way as to_json does so i can use this to do queries over time attributes" do
12
12
  time = Time.parse('2009-01-01 11:12:23 +0200')
13
- time.as_json.should == "2009/01/01 09:12:23 +0000"
13
+ expect(time.as_json).to eq("2009/01/01 09:12:23 +0000")
14
14
  end
15
15
  end
@@ -6,7 +6,7 @@ describe 'CouchPotato Validation' do
6
6
  it "should description" do
7
7
  model_class = Class.new
8
8
  model_class.send(:include, CouchPotato::Persistence)
9
- model_class.new.errors.should respond_to(:errors)
9
+ expect(model_class.new.errors).to respond_to(:errors)
10
10
  end
11
11
  end
12
12
 
@@ -1,21 +1,20 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe CouchPotato::View::ViewQuery, 'query_view!' do
4
+ let(:db) { double 'db', :get => nil, view: nil, :save_doc => nil,
5
+ connection: double.as_null_object, name: nil }
6
+
4
7
  before(:each) do
5
- CouchRest.stub(:get => nil)
6
8
  CouchPotato::View::ViewQuery.clear_cache
7
9
  end
8
10
 
9
- it "does not pass a key if conditions are empty" do
10
- db = mock 'db', :get => nil, :save_doc => nil
11
- db.should_receive(:view).with(anything, {})
11
+ it 'does not pass a key if conditions are empty' do
12
+ expect(db).to receive(:view).with(anything, {})
12
13
  CouchPotato::View::ViewQuery.new(db, '', {:view0 => {}}).query_view!
13
14
  end
14
15
 
15
16
  it 'updates a view if it does not exist' do
16
- db = mock 'db', :get => nil, :view => nil
17
-
18
- db.should_receive(:save_doc).with(
17
+ expect(db).to receive(:save_doc).with(
19
18
  'views' => {'view' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}, 'lib' => {'test' => '<lib_code>'}},
20
19
  'lists' => {},
21
20
  "_id" => "_design/design",
@@ -26,21 +25,19 @@ describe CouchPotato::View::ViewQuery, 'query_view!' do
26
25
  end
27
26
 
28
27
  it 'only updates a view once' do
29
- db = double :db, view: nil
30
- db.stub(:get).and_return({'views' => {}}, {'views' => {}, x: 1}) # return something different on the second call otherwise it would never try to update the views twice
28
+ allow(db).to receive(:get).and_return({'views' => {}}, {'views' => {}, x: 1}) # return something different on the second call otherwise it would never try to update the views twice
31
29
  query = CouchPotato::View::ViewQuery.new(db, 'design', {:view => {:map => '<map_code>', :reduce => '<reduce_code>'}})
32
30
 
33
- db.should_receive(:save_doc).once
31
+ expect(db).to receive(:save_doc).once
34
32
 
35
33
  2.times { query.query_view! }
36
34
  end
37
35
 
38
36
  it 'updates a view again after clearing the view cache' do
39
- db = double :db, view: nil
40
- db.stub(:get).and_return({'views' => {}}, {'views' => {}, x: 1}) # return something different on the second call otherwise it would never try to update the views twice
37
+ allow(db).to receive(:get).and_return({'views' => {}}, {'views' => {}, x: 1}) # return something different on the second call otherwise it would never try to update the views twice
41
38
  query = CouchPotato::View::ViewQuery.new(db, 'design', {:view => {:map => '<map_code>', :reduce => '<reduce_code>'}})
42
39
 
43
- db.should_receive(:save_doc).twice
40
+ expect(db).to receive(:save_doc).twice
44
41
 
45
42
  query.query_view!
46
43
  CouchPotato::View::ViewQuery.clear_cache
@@ -48,9 +45,7 @@ describe CouchPotato::View::ViewQuery, 'query_view!' do
48
45
  end
49
46
 
50
47
  it 'updates a view in erlang if it does not exist' do
51
- db = mock 'db', :get => nil, :view => nil
52
-
53
- db.should_receive(:save_doc).with(
48
+ expect(db).to receive(:save_doc).with(
54
49
  'views' => {'view' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}},
55
50
  'lists' => {}, "_id" => "_design/design", "language" => "erlang")
56
51
 
@@ -60,48 +55,48 @@ describe CouchPotato::View::ViewQuery, 'query_view!' do
60
55
  end
61
56
 
62
57
  it "does not update a view when the views object haven't changed" do
63
- db = mock 'db', :get => {'views' => {'view' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}}, :view => nil
64
- db.should_not_receive(:save_doc)
58
+ allow(db).to receive(:get).and_return({'views' => {'view' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}})
59
+ expect(db).not_to receive(:save_doc)
65
60
  CouchPotato::View::ViewQuery.new(db, 'design', {:view => {:map => '<map_code>', :reduce => '<reduce_code>'}}, nil, nil).query_view!
66
61
  end
67
62
 
68
63
  it "does not update a view when the list function hasn't changed" do
69
- db = mock 'db', :get => {'views' => {'view' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}, 'lists' => {'list0' => '<list_code>'}}, :view => nil
70
- db.should_not_receive(:save_doc)
64
+ allow(db).to receive(:get).and_return({'views' => {'view' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}, 'lists' => {'list0' => '<list_code>'}})
65
+ expect(db).not_to receive(:save_doc)
71
66
  CouchPotato::View::ViewQuery.new(db, 'design', {:view => {:map => '<map_code>', :reduce => '<reduce_code>'}}, :list0 => '<list_code>').query_view!
72
67
  end
73
68
 
74
69
  it "does not update a view when the lib function hasn't changed" do
75
- db = mock 'db', :get => {'views' => {'view' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}, 'lib' => {'test' => '<lib_code>'}}}, :view => nil
70
+ allow(db).to receive(:get).and_return({'views' => {'view' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}, 'lib' => {'test' => '<lib_code>'}}})
76
71
 
77
- db.should_not_receive(:save_doc)
72
+ expect(db).not_to receive(:save_doc)
78
73
 
79
74
  CouchPotato::View::ViewQuery.new(db, 'design', {:view => {:map => '<map_code>', :reduce => '<reduce_code>'}}, nil, {'test' => "<lib_code>"}).query_view!
80
75
  end
81
76
 
82
- it "updates a view when the map function has changed" do
83
- db = mock 'db', :get => {'views' => {'view2' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}}, :view => nil
84
- db.should_receive(:save_doc)
77
+ it 'updates a view when the map function has changed' do
78
+ allow(db).to receive(:get).and_return({'views' => {'view2' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}})
79
+ expect(db).to receive(:save_doc)
85
80
  CouchPotato::View::ViewQuery.new(db, 'design', :view2 => {:map => '<new map_code>', :reduce => '<reduce_code>'}).query_view!
86
81
  end
87
82
 
88
- it "updates a view when the map function has changed" do
89
- db = mock 'db', :get => {'views' => {'view3' => {'map' => '<map_code>'}}}, :view => nil
90
- db.should_receive(:save_doc)
83
+ it 'updates a view when the map function has changed' do
84
+ allow(db).to receive(:get).and_return({'views' => {'view3' => {'map' => '<map_code>'}}})
85
+ expect(db).to receive(:save_doc)
91
86
  CouchPotato::View::ViewQuery.new(db, 'design', :view3 => {:map => '<new map_code>'}).query_view!
92
87
  end
93
88
 
94
- it "updates a view when the lib hash has changed" do
95
- db = mock 'db', :get => {'views' => {'view4' => {'map' => '<map_code>'}}}, 'lib' => {'test' => "<test_lib>"}, :view => nil
89
+ it 'updates a view when the lib hash has changed' do
90
+ allow(db).to receive(:get).and_return({'views' => {'view4' => {'map' => '<map_code>'}}}, 'lib' => {'test' => "<test_lib>"})
96
91
 
97
- db.should_receive(:save_doc)
92
+ expect(db).to receive(:save_doc)
98
93
 
99
94
  CouchPotato::View::ViewQuery.new(db, 'design', {:view4 => {:map => '<map_code>'}}, nil, {:test => "<test_lib>"}).query_view!
100
95
  end
101
96
 
102
97
  it "doesn't override libs with different names" do
103
- db = mock 'db', :get => {'views' => {'view5' => {'map' => '<map_code>'}, 'lib' => {'test' => "<test_lib>"}}}, :view => nil
104
- db.should_receive(:save_doc).with({
98
+ allow(db).to receive(:get).and_return({'views' => {'view5' => {'map' => '<map_code>'}, 'lib' => {'test' => "<test_lib>"}}})
99
+ expect(db).to receive(:save_doc).with({
105
100
  'views' => {
106
101
  'view5' => {'map' => '<map_code>'},
107
102
  'lib' => {'test' => '<test_lib>', 'test1' => '<test1_lib>'}
@@ -110,10 +105,10 @@ describe CouchPotato::View::ViewQuery, 'query_view!' do
110
105
  CouchPotato::View::ViewQuery.new(db, 'design', {:view5 => {:map => '<map_code>'}}, nil, {'test1' => '<test1_lib>'}).query_view!
111
106
  end
112
107
 
113
- it "overrides libs with the same name" do
114
- db = mock 'db', :get => {'views' => {'view6' => {'map' => '<map_code>'}, 'lib' => {'test' => "<test_lib>"}}}, :view => nil
108
+ it 'overrides libs with the same name' do
109
+ allow(db).to receive(:get).and_return({'views' => {'view6' => {'map' => '<map_code>'}, 'lib' => {'test' => "<test_lib>"}}})
115
110
 
116
- db.should_receive(:save_doc).with({
111
+ expect(db).to receive(:save_doc).with({
117
112
  'views' => {
118
113
  'view6' => {'map' => '<map_code>'},
119
114
  'lib' => {'test' => '<test1_lib>'}
@@ -123,56 +118,56 @@ describe CouchPotato::View::ViewQuery, 'query_view!' do
123
118
  CouchPotato::View::ViewQuery.new(db, 'design', {:view6 => {:map => '<map_code>'}}, nil, {'test' => '<test1_lib>'}).query_view!
124
119
  end
125
120
 
126
- it "does not pass in reduce or lib keys if there is no lib or reduce object" do
127
- db = mock 'db', :get => {'views' => {}}, :view => nil
128
- db.should_receive(:save_doc).with('views' => {'view7' => {'map' => '<map code>'}})
121
+ it 'does not pass in reduce or lib keys if there is no lib or reduce object' do
122
+ allow(db).to receive(:get).and_return({'views' => {}})
123
+ expect(db).to receive(:save_doc).with('views' => {'view7' => {'map' => '<map code>'}})
129
124
  CouchPotato::View::ViewQuery.new(db, 'design', :view7 => {:map => '<map code>', :reduce => nil}).query_view!
130
125
  end
131
126
 
132
- it "updates a view when the reduce function has changed" do
133
- db = mock 'db', :get => {'views' => {'view8' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}}, :view => nil
134
- db.should_receive(:save_doc)
127
+ it 'updates a view when the reduce function has changed' do
128
+ allow(db).to receive(:get).and_return({'views' => {'view8' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}})
129
+ expect(db).to receive(:save_doc)
135
130
  CouchPotato::View::ViewQuery.new(db, 'design', :view8 => {:map => '<map_code>', :reduce => '<new reduce_code>'}).query_view!
136
131
  end
137
132
 
138
- it "updates a view when the list function has changed" do
139
- db = mock 'db', :get => {
133
+ it 'updates a view when the list function has changed' do
134
+ allow(db).to receive(:get).and_return({
140
135
  'views' => {'view9' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}},
141
136
  'lists' => {'list1' => '<list_code>'}
142
- }, :view => nil
143
- db.should_receive(:save_doc)
137
+ })
138
+ expect(db).to receive(:save_doc)
144
139
  CouchPotato::View::ViewQuery.new(db, 'design', {:view9 => {:map => '<map_code>', :reduce => '<reduce_code>'}}, :list1 => '<new_list_code>').query_view!
145
140
  end
146
141
 
147
142
  it "updates a view when there wasn't a list function but now there is one" do
148
- db = mock 'db', :get => {
143
+ allow(db).to receive(:get).and_return({
149
144
  'views' => {'view10' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}
150
- }, :view => nil
151
- db.should_receive(:save_doc)
145
+ })
146
+ expect(db).to receive(:save_doc)
152
147
  CouchPotato::View::ViewQuery.new(db, 'design', {:view10 => {:map => '<map_code>', :reduce => '<reduce_code>'}}, :list1 => '<new_list_code>').query_view!
153
148
  end
154
149
 
155
150
  it "does not update a view when there is a list function but no list function is passed" do
156
- db = mock 'db', :get => {
151
+ allow(db).to receive(:get).and_return({
157
152
  'views' => {'view11' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}},
158
153
  'lists' => {'list1' => '<list_code>'}
159
- }, :view => nil
160
- db.should_not_receive(:save_doc)
154
+ })
155
+ expect(db).not_to receive(:save_doc)
161
156
  CouchPotato::View::ViewQuery.new(db, 'design', {:view11 => {:map => '<map_code>', :reduce => '<reduce_code>'}}, {}).query_view!
162
157
  end
163
158
 
164
159
  it "does not update a view when there were no lists before and no list function is passed" do
165
- db = mock 'db', :get => {
160
+ allow(db).to receive(:get).and_return({
166
161
  'views' => {'view12' => {'map' => '<map_code>', 'reduce' => '<reduce_code>'}}
167
- }, :view => nil
168
- db.should_not_receive(:save_doc)
162
+ })
163
+ expect(db).not_to receive(:save_doc)
169
164
  CouchPotato::View::ViewQuery.new(db, 'design', {:view12 => {:map => '<map_code>', :reduce => '<reduce_code>'}}, {}).query_view!
170
165
  end
171
166
 
172
- it "queries CouchRest directly when querying a list" do
173
- db = stub('db').as_null_object
174
- CouchRest.should_receive(:get).with('http://127.0.0.1:5984/couch_potato_test/_design/my_design/_list/list1/view13?key=1')
167
+ it "queries the database directly when querying a list" do
168
+ allow(db).to receive(:name){'my_database'}
169
+
170
+ expect(db.connection).to receive(:get).with('/my_database/_design/my_design/_list/list1/view13?key=1')
175
171
  CouchPotato::View::ViewQuery.new(db, 'my_design', {:view13 => {:map => '<map_code>', :reduce => '<reduce_code>'}}, :list1 => '<new_list_code>').query_view!(:key => 1)
176
172
  end
177
-
178
173
  end
@@ -14,27 +14,27 @@ describe "create" do
14
14
  old_rev = @comment._rev
15
15
  @comment.title = 'xyz'
16
16
  CouchPotato.database.save_document! @comment
17
- @comment._rev.should_not == old_rev
18
- @comment._rev.should_not be_nil
17
+ expect(@comment._rev).not_to eq(old_rev)
18
+ expect(@comment._rev).not_to be_nil
19
19
  end
20
20
 
21
21
  it "should not update created at" do
22
22
  old_created_at = @comment.created_at
23
23
  @comment.title = 'xyz'
24
24
  CouchPotato.database.save_document! @comment
25
- @comment.created_at.should == old_created_at
25
+ expect(@comment.created_at).to eq(old_created_at)
26
26
  end
27
27
 
28
28
  it "should update updated at" do
29
29
  old_updated_at = @comment.updated_at
30
30
  @comment.title = 'xyz'
31
31
  CouchPotato.database.save_document! @comment
32
- @comment.updated_at.should > old_updated_at
32
+ expect(@comment.updated_at).to be > old_updated_at
33
33
  end
34
34
 
35
35
  it "should update the attributes" do
36
36
  @comment.title = 'new title'
37
37
  CouchPotato.database.save_document! @comment
38
- CouchPotato.couchrest_database.get("#{@comment.id}").title.should == 'new title'
38
+ expect(CouchPotato.couchrest_database.get("#{@comment.id}").title).to eq('new title')
39
39
  end
40
40
  end
@@ -9,20 +9,20 @@ describe "automatic view updates" do
9
9
  it "should update a view that doesn't match the given functions" do
10
10
  CouchPotato::View::ViewQuery.new(@db, 'test_design1', {'test_view' => {:map => 'function(doc) {}', :reduce => 'function() {}'}}, nil).query_view! # create view
11
11
  CouchPotato::View::ViewQuery.new(@db, 'test_design1', {'test_view' => {:map => 'function(doc) {emit(doc.id, null)}', :reduce => 'function(key, values) {return sum(values)}'}}, nil).query_view!
12
- CouchPotato.database.load('_design/test_design1')['views']['test_view'].should == {
12
+ expect(CouchPotato.database.load('_design/test_design1')['views']['test_view']).to eq({
13
13
  'map' => 'function(doc) {emit(doc.id, null)}',
14
14
  'reduce' => 'function(key, values) {return sum(values)}'
15
- }
15
+ })
16
16
  end
17
17
 
18
18
  it "should only update a view once to avoid writing the view for every request" do
19
19
  CouchPotato::View::ViewQuery.new(@db, 'test_design2', {'test_view' => {:map => 'function(doc) {}', :reduce => 'function() {}'}}, nil).query_view! # create view
20
20
  CouchPotato::View::ViewQuery.new(@db, 'test_design2', {'test_view' => {:map => 'function(doc) {emit(doc.id, null)}', :reduce => 'function(key, values) {return sum(values)}'}}, nil).query_view!
21
21
  CouchPotato::View::ViewQuery.new(@db, 'test_design2', {'test_view' => {:map => 'function(doc) {}', :reduce => 'function() {}'}}, nil).query_view!
22
- CouchPotato.database.load('_design/test_design2')['views']['test_view'].should == {
22
+ expect(CouchPotato.database.load('_design/test_design2')['views']['test_view']).to eq({
23
23
  'map' => 'function(doc) {emit(doc.id, null)}',
24
24
  'reduce' => 'function(key, values) {return sum(values)}'
25
- }
25
+ })
26
26
  end
27
27
 
28
28
  end
@@ -46,7 +46,7 @@ describe 'views' do
46
46
  @db.save_document build
47
47
 
48
48
  results = @db.view(ErlangBuild.by_name('erlang'))
49
- results.should == [build]
49
+ expect(results).to eq([build])
50
50
  end
51
51
 
52
52
  it 'does not crash couchdb when a document does not have the key' do
@@ -54,7 +54,7 @@ describe 'views' do
54
54
  @db.couchrest_database.save_doc build
55
55
 
56
56
  results = @db.view(ErlangBuild.by_name(:key => nil))
57
- results.size.should == 1
57
+ expect(results.size).to eq(1)
58
58
  end
59
59
 
60
60
  it 'builds views with composite keys' do
@@ -62,7 +62,7 @@ describe 'views' do
62
62
  @db.save_document build
63
63
 
64
64
  results = @db.view(ErlangBuild.by_name_and_code(['erlang', '123']))
65
- results.should == [build]
65
+ expect(results).to eq([build])
66
66
  end
67
67
 
68
68
  it 'can reduce over erlang views' do
@@ -70,72 +70,72 @@ describe 'views' do
70
70
  @db.save_document build
71
71
 
72
72
  results = @db.view(ErlangBuild.by_name(:reduce => true))
73
- results.should == 1
73
+ expect(results).to eq(1)
74
74
  end
75
75
  end
76
76
 
77
77
  it "should return instances of the class" do
78
78
  @db.save_document Build.new(:state => 'success', :time => '2008-01-01')
79
79
  results = @db.view(Build.timeline)
80
- results.map(&:class).should == [Build]
80
+ expect(results.map(&:class)).to eq([Build])
81
81
  end
82
82
 
83
83
  it "should return the ids if there document was not included" do
84
84
  build = Build.new(:state => 'success', :time => '2008-01-01')
85
85
  @db.save_document build
86
86
  results = @db.view(Build.timeline(:include_docs => false))
87
- results.should == [build.id]
87
+ expect(results).to eq([build.id])
88
88
  end
89
89
 
90
90
  it "should pass the view options to the view query" do
91
- query = mock 'query'
92
- CouchPotato::View::ViewQuery.stub!(:new).and_return(query)
93
- query.should_receive(:query_view!).with(hash_including(:key => 1)).and_return('rows' => [])
91
+ query = double 'query'
92
+ allow(CouchPotato::View::ViewQuery).to receive(:new).and_return(query)
93
+ expect(query).to receive(:query_view!).with(hash_including(:key => 1)).and_return('rows' => [])
94
94
  @db.view Build.timeline(:key => 1)
95
95
  end
96
96
 
97
97
  it "should not return documents that don't have a matching JSON.create_id" do
98
98
  CouchPotato.couchrest_database.save_doc({:time => 'x'})
99
- @db.view(Build.timeline).should == []
99
+ expect(@db.view(Build.timeline)).to eq([])
100
100
  end
101
101
 
102
102
  it "should count documents" do
103
103
  @db.save_document! Build.new(:state => 'success', :time => '2008-01-01')
104
- @db.view(Build.count(:reduce => true)).should == 1
104
+ expect(@db.view(Build.count(:reduce => true))).to eq(1)
105
105
  end
106
106
 
107
107
  it "should count zero documents" do
108
- @db.view(Build.count(:reduce => true)).should == 0
108
+ expect(@db.view(Build.count(:reduce => true))).to eq(0)
109
109
  end
110
110
 
111
111
  describe "with multiple keys" do
112
112
  it "should return the documents with matching keys" do
113
113
  build = Build.new(:state => 'success', :time => '2008-01-01')
114
114
  @db.save! build
115
- @db.view(Build.timeline(:keys => ['2008-01-01'])).should == [build]
115
+ expect(@db.view(Build.timeline(:keys => ['2008-01-01']))).to eq([build])
116
116
  end
117
117
 
118
118
  it "should not return documents with non-matching keys" do
119
119
  build = Build.new(:state => 'success', :time => '2008-01-01')
120
120
  @db.save! build
121
- @db.view(Build.timeline(:keys => ['2008-01-02'])).should be_empty
121
+ expect(@db.view(Build.timeline(:keys => ['2008-01-02']))).to be_empty
122
122
  end
123
123
  end
124
124
 
125
125
  describe "properties defined" do
126
126
  it "assigns the configured properties" do
127
127
  CouchPotato.couchrest_database.save_doc(:state => 'success', :time => '2008-01-01', JSON.create_id.to_sym => 'Build')
128
- @db.view(Build.minimal_timeline).first.state.should eql('success')
128
+ expect(@db.view(Build.minimal_timeline).first.state).to eql('success')
129
129
  end
130
130
 
131
131
  it "does not assign the properties not configured" do
132
132
  CouchPotato.couchrest_database.save_doc(:state => 'success', :time => '2008-01-01', JSON.create_id.to_sym => 'Build')
133
- @db.view(Build.minimal_timeline).first.time.should be_nil
133
+ expect(@db.view(Build.minimal_timeline).first.time).to be_nil
134
134
  end
135
135
 
136
136
  it "assigns the id even if it is not configured" do
137
137
  id = CouchPotato.couchrest_database.save_doc(:state => 'success', :time => '2008-01-01', JSON.create_id.to_sym => 'Build')['id']
138
- @db.view(Build.minimal_timeline).first._id.should eql(id)
138
+ expect(@db.view(Build.minimal_timeline).first._id).to eql(id)
139
139
  end
140
140
  end
141
141
 
@@ -143,49 +143,49 @@ describe 'views' do
143
143
  it "should assign all properties to the objects by default" do
144
144
  id = CouchPotato.couchrest_database.save_doc({:state => 'success', :time => '2008-01-01', JSON.create_id.to_sym => 'Build'})['id']
145
145
  result = @db.view(Build.timeline).first
146
- result.state.should == 'success'
147
- result.time.should == '2008-01-01'
148
- result._id.should == id
146
+ expect(result.state).to eq('success')
147
+ expect(result.time).to eq('2008-01-01')
148
+ expect(result._id).to eq(id)
149
149
  end
150
150
  end
151
151
 
152
152
  describe "map function given" do
153
153
  it "should still return instances of the class" do
154
154
  CouchPotato.couchrest_database.save_doc({:state => 'success', :time => '2008-01-01'})
155
- @db.view(Build.custom_timeline).map(&:class).should == [Build]
155
+ expect(@db.view(Build.custom_timeline).map(&:class)).to eq([Build])
156
156
  end
157
157
 
158
158
  it "should assign the properties from the value" do
159
159
  CouchPotato.couchrest_database.save_doc({:state => 'success', :time => '2008-01-01'})
160
- @db.view(Build.custom_timeline).map(&:state).should == ['custom_success']
160
+ expect(@db.view(Build.custom_timeline).map(&:state)).to eq(['custom_success'])
161
161
  end
162
162
 
163
163
  it "should assign the id" do
164
164
  doc = CouchPotato.couchrest_database.save_doc({:state => 'success', :time => '2008-01-01'})
165
- @db.view(Build.custom_timeline).map(&:_id).should == [doc['id']]
165
+ expect(@db.view(Build.custom_timeline).map(&:_id)).to eq([doc['id']])
166
166
  end
167
167
 
168
168
  it "should leave the other properties blank" do
169
169
  CouchPotato.couchrest_database.save_doc({:state => 'success', :time => '2008-01-01'})
170
- @db.view(Build.custom_timeline).map(&:time).should == [nil]
170
+ expect(@db.view(Build.custom_timeline).map(&:time)).to eq([nil])
171
171
  end
172
172
 
173
173
  describe "that returns null documents" do
174
174
  it "should return instances of the class" do
175
175
  CouchPotato.couchrest_database.save_doc({:state => 'success', :time => '2008-01-01'})
176
- @db.view(Build.custom_timeline_returns_docs).map(&:class).should == [Build]
176
+ expect(@db.view(Build.custom_timeline_returns_docs).map(&:class)).to eq([Build])
177
177
  end
178
178
 
179
179
  it "should assign the properties from the value" do
180
180
  CouchPotato.couchrest_database.save_doc({:state => 'success', :time => '2008-01-01'})
181
- @db.view(Build.custom_timeline_returns_docs).map(&:state).should == ['success']
181
+ expect(@db.view(Build.custom_timeline_returns_docs).map(&:state)).to eq(['success'])
182
182
  end
183
183
 
184
184
  it "should still return instance of class if document included JSON.create_id" do
185
185
  CouchPotato.couchrest_database.save_doc({:state => 'success', :time => '2008-01-01', JSON.create_id.to_sym => "Build"})
186
186
  view_data = @db.view(Build.custom_timeline_returns_docs)
187
- view_data.map(&:class).should == [Build]
188
- view_data.map(&:state).should == ['success']
187
+ expect(view_data.map(&:class)).to eq([Build])
188
+ expect(view_data.map(&:state)).to eq(['success'])
189
189
  end
190
190
  end
191
191
 
@@ -193,14 +193,14 @@ describe 'views' do
193
193
  it "should still assign the id" do
194
194
  doc = CouchPotato.couchrest_database.save_doc({})
195
195
  CouchPotato.couchrest_database.save_doc({:foreign_key => doc['id']})
196
- @db.view(Build.custom_with_reduce).map(&:_id).should == [doc['id']]
196
+ expect(@db.view(Build.custom_with_reduce).map(&:_id)).to eq([doc['id']])
197
197
  end
198
198
 
199
199
  describe "when the additional reduce function is a typical count" do
200
200
  it "should parse the reduce count" do
201
201
  doc = CouchPotato.couchrest_database.save_doc({})
202
202
  CouchPotato.couchrest_database.save_doc({:foreign_key => doc['id']})
203
- @db.view(Build.custom_count_with_reduce(:reduce => true)).should == 2
203
+ expect(@db.view(Build.custom_count_with_reduce(:reduce => true))).to eq(2)
204
204
  end
205
205
  end
206
206
  end
@@ -208,10 +208,10 @@ describe 'views' do
208
208
 
209
209
  describe "with array as key" do
210
210
  it "should create a map function with the composite key" do
211
- CouchPotato::View::ViewQuery.should_receive(:new) do |db, design_name, view, list|
212
- view['key_array_timeline'][:map].should match(/emit\(\[doc\['time'\], doc\['state'\]\]/)
211
+ expect(CouchPotato::View::ViewQuery).to receive(:new) do |db, design_name, view, list|
212
+ expect(view['key_array_timeline'][:map]).to match(/emit\(\[doc\['time'\], doc\['state'\]\]/)
213
213
 
214
- stub('view query', :query_view! => {'rows' => []})
214
+ double('view query', :query_view! => {'rows' => []})
215
215
  end
216
216
  @db.view Build.key_array_timeline
217
217
  end
@@ -220,18 +220,18 @@ describe 'views' do
220
220
  describe "raw view" do
221
221
  it "should return the raw data" do
222
222
  @db.save_document Build.new(:state => 'success', :time => '2008-01-01')
223
- @db.view(Build.raw)['rows'][0]['value'].should == 'success'
223
+ expect(@db.view(Build.raw)['rows'][0]['value']).to eq('success')
224
224
  end
225
225
 
226
226
  it "should return filtred raw data" do
227
227
  @db.save_document Build.new(:state => 'success', :time => '2008-01-01')
228
- @db.view(Build.filtered_raw).should == ['success']
228
+ expect(@db.view(Build.filtered_raw)).to eq(['success'])
229
229
  end
230
230
 
231
231
  it "should pass view options declared in the view declaration to the query" do
232
- view_query = mock 'view_query'
233
- CouchPotato::View::ViewQuery.stub!(:new).and_return(view_query)
234
- view_query.should_receive(:query_view!).with(hash_including(:group => true)).and_return({'rows' => []})
232
+ view_query = double 'view_query'
233
+ allow(CouchPotato::View::ViewQuery).to receive(:new).and_return(view_query)
234
+ expect(view_query).to receive(:query_view!).with(hash_including(:group => true)).and_return({'rows' => []})
235
235
  @db.view(Build.with_view_options)
236
236
  end
237
237
  end
@@ -239,15 +239,15 @@ describe 'views' do
239
239
  describe "inherited views" do
240
240
  it "should support parent views for objects of the subclass" do
241
241
  @db.save_document CustomBuild.new(:state => 'success', :time => '2008-01-01')
242
- @db.view(CustomBuild.timeline).size.should == 1
243
- @db.view(CustomBuild.timeline).first.should be_kind_of(CustomBuild)
242
+ expect(@db.view(CustomBuild.timeline).size).to eq(1)
243
+ expect(@db.view(CustomBuild.timeline).first).to be_kind_of(CustomBuild)
244
244
  end
245
245
 
246
246
  it "should return instances of subclasses as well if a special view exists" do
247
247
  @db.save_document Build.new(:state => 'success', :time => '2008-01-01')
248
248
  @db.save_document CustomBuild.new(:state => 'success', :time => '2008-01-01', :server => 'Jenkins')
249
249
  results = @db.view(Build.all)
250
- results.map(&:class).should == [CustomBuild, Build]
250
+ expect(results.map(&:class)).to eq([CustomBuild, Build])
251
251
  end
252
252
  end
253
253
 
@@ -275,12 +275,12 @@ describe 'views' do
275
275
 
276
276
  it "should use the list function declared at class level" do
277
277
  @db.save! Coworker.new(:name => 'joe')
278
- @db.view(Coworker.all_with_list).first.name.should == 'joe doe'
278
+ expect(@db.view(Coworker.all_with_list).first.name).to eq('joe doe')
279
279
  end
280
280
 
281
281
  it "should use the list function passed at runtime" do
282
282
  @db.save! Coworker.new(:name => 'joe')
283
- @db.view(Coworker.all(:list => :append_doe)).first.name.should == 'joe doe'
283
+ expect(@db.view(Coworker.all(:list => :append_doe)).first.name).to eq('joe doe')
284
284
  end
285
285
  end
286
286