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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/.travis.yml +12 -8
- data/CHANGES.md +4 -0
- data/Gemfile +1 -1
- data/README.md +396 -276
- data/Rakefile +9 -9
- data/couch_potato-rspec.gemspec +20 -0
- data/couch_potato.gemspec +15 -16
- data/{active_support_4_0 → gemfiles/active_support_4_0} +3 -3
- data/{active_support_3_2 → gemfiles/active_support_4_1} +3 -2
- data/gemfiles/active_support_4_2 +11 -0
- data/lib/couch_potato-rspec.rb +3 -0
- data/lib/couch_potato.rb +3 -1
- data/lib/couch_potato/database.rb +42 -39
- data/lib/couch_potato/persistence/magic_timestamps.rb +5 -5
- data/lib/couch_potato/persistence/properties.rb +8 -2
- data/lib/couch_potato/persistence/simple_property.rb +11 -9
- data/lib/couch_potato/persistence/type_caster.rb +1 -1
- data/lib/couch_potato/railtie.rb +2 -0
- data/lib/couch_potato/version.rb +2 -1
- data/lib/couch_potato/view/base_view_spec.rb +18 -8
- data/lib/couch_potato/view/view_query.rb +2 -3
- data/spec/attachments_spec.rb +3 -3
- data/spec/callbacks_spec.rb +193 -113
- data/spec/conflict_handling_spec.rb +4 -4
- data/spec/create_spec.rb +5 -5
- data/spec/default_property_spec.rb +6 -6
- data/spec/destroy_spec.rb +5 -5
- data/spec/property_spec.rb +71 -61
- data/spec/rails_spec.rb +3 -3
- data/spec/railtie_spec.rb +12 -13
- data/spec/spec_helper.rb +3 -3
- data/spec/unit/active_model_compliance_spec.rb +16 -16
- data/spec/unit/attributes_spec.rb +36 -34
- data/spec/unit/base_view_spec_spec.rb +82 -35
- data/spec/unit/callbacks_spec.rb +2 -2
- data/spec/unit/couch_potato_spec.rb +3 -3
- data/spec/unit/create_spec.rb +12 -12
- data/spec/unit/custom_views_spec.rb +1 -1
- data/spec/unit/database_spec.rb +95 -95
- data/spec/unit/date_spec.rb +3 -3
- data/spec/unit/deep_dirty_attributes_spec.rb +104 -104
- data/spec/unit/dirty_attributes_spec.rb +19 -19
- data/spec/unit/forbidden_attributes_protection_spec.rb +4 -4
- data/spec/unit/initialize_spec.rb +37 -19
- data/spec/unit/json_spec.rb +4 -4
- data/spec/unit/lists_spec.rb +8 -8
- data/spec/unit/model_view_spec_spec.rb +14 -14
- data/spec/unit/persistence_spec.rb +6 -6
- data/spec/unit/properties_view_spec_spec.rb +4 -4
- data/spec/unit/rspec_matchers_spec.rb +73 -73
- data/spec/unit/rspec_stub_db_spec.rb +43 -42
- data/spec/unit/string_spec.rb +1 -1
- data/spec/unit/time_spec.rb +2 -2
- data/spec/unit/validation_spec.rb +1 -1
- data/spec/unit/view_query_spec.rb +54 -59
- data/spec/update_spec.rb +5 -5
- data/spec/view_updates_spec.rb +4 -4
- data/spec/views_spec.rb +43 -43
- metadata +18 -22
- data/lib/couch_potato/rspec.rb +0 -2
- data/lib/couch_potato/rspec/matchers.rb +0 -56
- data/lib/couch_potato/rspec/matchers/json2.js +0 -482
- data/lib/couch_potato/rspec/matchers/list_as_matcher.rb +0 -53
- data/lib/couch_potato/rspec/matchers/map_reduce_to_matcher.rb +0 -166
- data/lib/couch_potato/rspec/matchers/map_to_matcher.rb +0 -61
- data/lib/couch_potato/rspec/matchers/reduce_to_matcher.rb +0 -48
- data/lib/couch_potato/rspec/stub_db.rb +0 -57
data/spec/rails_spec.rb
CHANGED
@@ -30,12 +30,12 @@ describe CouchPotato::Database, 'rails specific behavior' do
|
|
30
30
|
context 'load a document' do
|
31
31
|
it "should load models whose constants are currently uninitialized (like with rails in development mode)" do
|
32
32
|
CouchPotato.couchrest_database.save_doc(JSON.create_id => 'Autoloader::Uninitialized', '_id' => '1')
|
33
|
-
CouchPotato.database.load('1').class.name.
|
33
|
+
expect(CouchPotato.database.load('1').class.name).to eq('Autoloader::Uninitialized')
|
34
34
|
end
|
35
35
|
|
36
36
|
it "should load nested models" do
|
37
37
|
CouchPotato.couchrest_database.save_doc(JSON.create_id => 'Autoloader::Nested::Nested2', '_id' => '1')
|
38
|
-
CouchPotato.database.load('1').class.name.
|
38
|
+
expect(CouchPotato.database.load('1').class.name).to eq('Autoloader::Nested::Nested2')
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -43,7 +43,7 @@ describe CouchPotato::Database, 'rails specific behavior' do
|
|
43
43
|
it "should load models from a view whose constants are currently uninitialized" do
|
44
44
|
doc = {JSON.create_id => 'WithUnloadedEmbedded', '_id' => '1', 'embedded' => {JSON.create_id => 'WithUnloadedEmbedded::Uninitialized'}}
|
45
45
|
CouchPotato.couchrest_database.save_doc(doc)
|
46
|
-
CouchPotato.database.view(WithUnloadedEmbedded.all).first.embedded.class.name.
|
46
|
+
expect(CouchPotato.database.view(WithUnloadedEmbedded.all).first.embedded.class.name).to eq('WithUnloadedEmbedded::Uninitialized')
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
data/spec/railtie_spec.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'yaml'
|
3
|
-
require 'spec/mocks'
|
4
3
|
|
5
4
|
module Rails
|
6
5
|
def self.env
|
@@ -13,11 +12,11 @@ module Rails
|
|
13
12
|
end
|
14
13
|
|
15
14
|
def self.root
|
16
|
-
RSpec::Mocks::
|
15
|
+
RSpec::Mocks::Double.new join: ''
|
17
16
|
end
|
18
17
|
|
19
18
|
def self.logger
|
20
|
-
RSpec::Mocks::
|
19
|
+
RSpec::Mocks::Double.new warn: nil
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
@@ -35,16 +34,16 @@ describe "railtie" do
|
|
35
34
|
end
|
36
35
|
|
37
36
|
before(:each) do
|
38
|
-
File.
|
37
|
+
allow(File).to receive_messages(exist?: true)
|
39
38
|
end
|
40
39
|
|
41
40
|
context 'when the yml file does not exist' do
|
42
41
|
before(:each) do
|
43
|
-
File.
|
42
|
+
allow(File).to receive_messages(exist?: false)
|
44
43
|
end
|
45
44
|
|
46
45
|
it 'does not configure the database' do
|
47
|
-
CouchPotato::Config.
|
46
|
+
expect(CouchPotato::Config).not_to receive(:database_name=)
|
48
47
|
|
49
48
|
CouchPotato.rails_init
|
50
49
|
end
|
@@ -52,9 +51,9 @@ describe "railtie" do
|
|
52
51
|
|
53
52
|
context 'yaml file contains only database names' do
|
54
53
|
it "should set the database name from the yaml file" do
|
55
|
-
File.
|
54
|
+
allow(File).to receive_messages(:read => "test: test_db")
|
56
55
|
|
57
|
-
CouchPotato::Config.
|
56
|
+
expect(CouchPotato::Config).to receive(:database_name=).with('test_db')
|
58
57
|
|
59
58
|
CouchPotato.rails_init
|
60
59
|
end
|
@@ -62,26 +61,26 @@ describe "railtie" do
|
|
62
61
|
|
63
62
|
context 'yaml file contains more configuration' do
|
64
63
|
before(:each) do
|
65
|
-
File.
|
64
|
+
allow(File).to receive_messages(:read => "test: \n database: test_db\n default_language: :erlang")
|
66
65
|
end
|
67
66
|
|
68
67
|
it "set the database name from the yaml file" do
|
69
|
-
CouchPotato::Config.
|
68
|
+
expect(CouchPotato::Config).to receive(:database_name=).with('test_db')
|
70
69
|
|
71
70
|
CouchPotato.rails_init
|
72
71
|
end
|
73
72
|
|
74
73
|
it 'sets the default language from the yaml file' do
|
75
|
-
CouchPotato::Config.
|
74
|
+
expect(CouchPotato::Config).to receive(:default_language=).with(:erlang)
|
76
75
|
|
77
76
|
CouchPotato.rails_init
|
78
77
|
end
|
79
78
|
end
|
80
79
|
|
81
80
|
it "should process the yml file with erb" do
|
82
|
-
File.
|
81
|
+
allow(File).to receive_messages(:read => "test: \n database: <%= 'db' %>")
|
83
82
|
|
84
|
-
CouchPotato::Config.
|
83
|
+
expect(CouchPotato::Config).to receive(:database_name=).with('db')
|
85
84
|
|
86
85
|
CouchPotato.rails_init
|
87
86
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -34,7 +34,7 @@ end
|
|
34
34
|
class BigDecimalContainer
|
35
35
|
include CouchPotato::Persistence
|
36
36
|
|
37
|
-
property :number, :
|
37
|
+
property :number, type: BigDecimal
|
38
38
|
end
|
39
39
|
|
40
40
|
def recreate_db
|
@@ -53,11 +53,11 @@ RSpec::Matchers.define :eql_ignoring_indentation do |expected|
|
|
53
53
|
strip_indentation(string) == strip_indentation(expected)
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
failure_message do |actual|
|
57
57
|
"expected\n#{strip_indentation(actual).inspect} to == \n#{strip_indentation(expected).inspect} but wasn't."
|
58
58
|
end
|
59
59
|
|
60
|
-
|
60
|
+
failure_message_when_negated do |actual|
|
61
61
|
"expected\n#{strip_indentation(actual).inspect} to not == \n#{strip_indentation(expected).inspect} but wasn."
|
62
62
|
end
|
63
63
|
|
@@ -12,6 +12,10 @@ begin
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
def assert_equal(one, other)
|
16
|
+
expect(one).to equal(other)
|
17
|
+
end
|
18
|
+
|
15
19
|
class ActiveComment
|
16
20
|
include CouchPotato::Persistence
|
17
21
|
property :name
|
@@ -26,31 +30,31 @@ begin
|
|
26
30
|
|
27
31
|
describe '#to_partial_path' do
|
28
32
|
it 'returns a path based on the class name' do
|
29
|
-
@model.to_partial_path.
|
33
|
+
expect(@model.to_partial_path).to eq('active_comments/active_comment')
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
33
37
|
describe "#persisted?" do
|
34
38
|
it "should return false if it is a new document " do
|
35
|
-
@model.
|
39
|
+
expect(@model).not_to be_persisted
|
36
40
|
end
|
37
41
|
|
38
42
|
it "should be true if it was saved" do
|
39
43
|
@comment = ActiveComment.new(:name => 'Thilo', :email => 'test@local.host')
|
40
44
|
CouchPotato.database.save_document! @comment
|
41
|
-
@comment.
|
45
|
+
expect(@comment).to be_persisted
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
45
49
|
describe "#to_key" do
|
46
50
|
it "should return nil if the document was not persisted" do
|
47
|
-
@model.to_key.
|
51
|
+
expect(@model.to_key).to be_nil
|
48
52
|
end
|
49
53
|
|
50
54
|
it "should return the id of the document if it was persisted" do
|
51
55
|
@comment = ActiveComment.new(:name => 'Thilo', :email => 'test@local.host')
|
52
56
|
CouchPotato.database.save_document! @comment
|
53
|
-
@comment.to_key.
|
57
|
+
expect(@comment.to_key).to eq([@comment.id])
|
54
58
|
end
|
55
59
|
end
|
56
60
|
|
@@ -58,31 +62,31 @@ begin
|
|
58
62
|
describe "#errors" do
|
59
63
|
it "should return a single error as array" do
|
60
64
|
@model.valid?
|
61
|
-
@model.errors[:name].
|
65
|
+
expect(@model.errors[:name]).to be_kind_of(Array)
|
62
66
|
end
|
63
67
|
|
64
68
|
it "should return multiple errors as array" do
|
65
69
|
@model.valid?
|
66
|
-
@model.errors[:email].size.
|
70
|
+
expect(@model.errors[:email].size).to eq(2)
|
67
71
|
end
|
68
72
|
|
69
73
|
it "should return no error as an empty array" do
|
70
|
-
@model.errors[:name].
|
74
|
+
expect(@model.errors[:name]).to eq([])
|
71
75
|
end
|
72
76
|
|
73
77
|
it "should be able to be Marshal.dump'ed" do
|
74
|
-
|
78
|
+
expect { Marshal.dump(@model.errors) }.not_to raise_error
|
75
79
|
end
|
76
80
|
end
|
77
81
|
|
78
82
|
describe "#destroyed" do
|
79
83
|
it "should return destroyed if the object is deleted" do
|
80
84
|
@model._deleted = true
|
81
|
-
@model.
|
85
|
+
expect(@model).to be_destroyed
|
82
86
|
end
|
83
87
|
|
84
88
|
it "should not return destroyed if it's not deleted" do
|
85
|
-
@model.
|
89
|
+
expect(@model).not_to be_destroyed
|
86
90
|
end
|
87
91
|
end
|
88
92
|
|
@@ -91,14 +95,10 @@ begin
|
|
91
95
|
end
|
92
96
|
|
93
97
|
def assert_kind_of(klass, object)
|
94
|
-
object.
|
98
|
+
expect(object).to be_a(klass)
|
95
99
|
end
|
96
100
|
end
|
97
101
|
|
98
102
|
rescue LoadError
|
99
103
|
STDERR.puts "WARNING: active_model gem not installed. Not running ActiveModel specs."
|
100
104
|
end
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
@@ -21,40 +21,42 @@ describe "attributes" do
|
|
21
21
|
it "should assign the attributes" do
|
22
22
|
plant = Plant.new
|
23
23
|
plant.attributes = {:leaf_count => 1}
|
24
|
-
plant.leaf_count.
|
24
|
+
expect(plant.leaf_count).to eq(1)
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should assign the attributes via []=" do
|
28
28
|
plant = Plant.new
|
29
29
|
plant[:leaf_count] = 1
|
30
|
-
plant.leaf_count.
|
30
|
+
expect(plant.leaf_count).to eq(1)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
context "attributes" do
|
35
35
|
it "should return the attributes" do
|
36
36
|
plant = Plant.new(:leaf_count => 1)
|
37
|
-
plant.attributes.
|
38
|
-
'typed_leaf_count' => nil, 'typed_leaf_size' => nil, 'branch' => nil}
|
37
|
+
expect(plant.attributes).to eq({'leaf_count' => 1, 'created_at' => nil, 'updated_at' => nil,
|
38
|
+
'typed_leaf_count' => nil, 'typed_leaf_size' => nil, 'branch' => nil})
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should return the attributes via [symbol]" do
|
42
42
|
plant = Plant.new(:leaf_count => 1)
|
43
|
-
plant.attributes[:leaf_count].
|
44
|
-
plant.attributes[:leaf_count].
|
43
|
+
expect(plant.attributes[:leaf_count]).to eql(plant[:leaf_count])
|
44
|
+
expect(plant.attributes[:leaf_count]).to eql(1)
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should return the attributes via [string]" do
|
48
|
-
plant = Plant.new(:
|
49
|
-
|
50
|
-
plant.attributes["leaf_count"].
|
48
|
+
plant = Plant.new(leaf_count: 1)
|
49
|
+
|
50
|
+
expect(plant.attributes["leaf_count"]).to eql(plant[:leaf_count])
|
51
|
+
expect(plant.attributes["leaf_count"]).to eql(1)
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
54
55
|
context "has_key?" do
|
55
|
-
it
|
56
|
-
plant = Plant.new(:
|
57
|
-
|
56
|
+
it 'should respond to has_key?' do
|
57
|
+
plant = Plant.new(leaf_count: 1)
|
58
|
+
|
59
|
+
expect(plant.has_key?(:leaf_count)).to be_truthy
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
@@ -62,21 +64,21 @@ describe "attributes" do
|
|
62
64
|
context "accessing ghost attributes" do
|
63
65
|
it "should allow me to access attributes that are in the couchdb document but not defined as a property" do
|
64
66
|
plant = Plant.json_create({JSON.create_id => "Plant", "color" => "red", "leaf_count" => 1})
|
65
|
-
plant.color.
|
67
|
+
expect(plant.color).to eq('red')
|
66
68
|
end
|
67
69
|
|
68
70
|
it "should raise a no method error when trying to read attributes that are not in the document" do
|
69
71
|
plant = Plant.json_create({JSON.create_id => "Plant", "leaf_count" => 1})
|
70
|
-
|
72
|
+
expect do
|
71
73
|
plant.length
|
72
|
-
end.
|
74
|
+
end.to raise_error(NoMethodError)
|
73
75
|
end
|
74
76
|
|
75
77
|
it "should raise a no method error if the document hasn't been loaded from the database" do
|
76
78
|
plant = Plant.new
|
77
|
-
|
79
|
+
expect do
|
78
80
|
plant.length
|
79
|
-
end.
|
81
|
+
end.to raise_error(NoMethodError, /undefined method `length'/)
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
@@ -87,91 +89,91 @@ describe "attributes" do
|
|
87
89
|
|
88
90
|
context 'nested objects' do
|
89
91
|
it 'assigns the attributes of nested objects' do
|
90
|
-
Plant.new(:branch => {:leafs => 3}).branch.leafs.
|
92
|
+
expect(Plant.new(:branch => {:leafs => 3}).branch.leafs).to eq(3)
|
91
93
|
end
|
92
94
|
end
|
93
95
|
|
94
96
|
describe "fixnum" do
|
95
97
|
it 'rounds a float to a fixnum' do
|
96
98
|
@plant.typed_leaf_count = 4.5
|
97
|
-
@plant.typed_leaf_count.
|
99
|
+
expect(@plant.typed_leaf_count).to eq(5)
|
98
100
|
end
|
99
101
|
|
100
102
|
it "converts a string into a fixnum" do
|
101
103
|
@plant.typed_leaf_count = '4'
|
102
|
-
@plant.typed_leaf_count.
|
104
|
+
expect(@plant.typed_leaf_count).to eq(4)
|
103
105
|
end
|
104
106
|
|
105
107
|
it "converts a string into a negative fixnum" do
|
106
108
|
@plant.typed_leaf_count = '-4'
|
107
|
-
@plant.typed_leaf_count.
|
109
|
+
expect(@plant.typed_leaf_count).to eq(-4)
|
108
110
|
end
|
109
111
|
|
110
112
|
it "leaves a fixnum as is" do
|
111
113
|
@plant.typed_leaf_count = 4
|
112
|
-
@plant.typed_leaf_count.
|
114
|
+
expect(@plant.typed_leaf_count).to eq(4)
|
113
115
|
end
|
114
116
|
|
115
117
|
it "leaves nil as is" do
|
116
118
|
@plant.typed_leaf_count = nil
|
117
|
-
@plant.typed_leaf_count.
|
119
|
+
expect(@plant.typed_leaf_count).to be_nil
|
118
120
|
end
|
119
121
|
|
120
122
|
it "sets the attributes to zero if a string given" do
|
121
123
|
@plant.typed_leaf_count = 'x'
|
122
|
-
@plant.typed_leaf_count.
|
124
|
+
expect(@plant.typed_leaf_count).to eq(0)
|
123
125
|
end
|
124
126
|
|
125
127
|
it "parses numbers out of a string" do
|
126
128
|
@plant.typed_leaf_count = 'x123'
|
127
|
-
@plant.typed_leaf_count.
|
129
|
+
expect(@plant.typed_leaf_count).to eq(123)
|
128
130
|
end
|
129
131
|
|
130
132
|
it "set the attributes to nil if given a blank string" do
|
131
133
|
@plant.typed_leaf_count = ''
|
132
|
-
@plant.typed_leaf_count.
|
134
|
+
expect(@plant.typed_leaf_count).to be_nil
|
133
135
|
end
|
134
136
|
end
|
135
137
|
|
136
138
|
context "float" do
|
137
139
|
it "should convert a number in a string with a decimal place" do
|
138
140
|
@plant.typed_leaf_size = '0.5001'
|
139
|
-
@plant.typed_leaf_size.
|
141
|
+
expect(@plant.typed_leaf_size).to eq(0.5001)
|
140
142
|
end
|
141
143
|
|
142
144
|
it "should convert a number in a string without a decimal place" do
|
143
145
|
@plant.typed_leaf_size = '5'
|
144
|
-
@plant.typed_leaf_size.
|
146
|
+
expect(@plant.typed_leaf_size).to eq(5.0)
|
145
147
|
end
|
146
148
|
|
147
149
|
it "should convert a negative number in a string" do
|
148
150
|
@plant.typed_leaf_size = '-5.0'
|
149
|
-
@plant.typed_leaf_size.
|
151
|
+
expect(@plant.typed_leaf_size).to eq(-5.0)
|
150
152
|
end
|
151
153
|
|
152
154
|
it "should leave a float as it is" do
|
153
155
|
@plant.typed_leaf_size = 0.5
|
154
|
-
@plant.typed_leaf_size.
|
156
|
+
expect(@plant.typed_leaf_size).to eq(0.5)
|
155
157
|
end
|
156
158
|
|
157
159
|
it "should leave nil as is" do
|
158
160
|
@plant.typed_leaf_size = nil
|
159
|
-
@plant.typed_leaf_size.
|
161
|
+
expect(@plant.typed_leaf_size).to be_nil
|
160
162
|
end
|
161
163
|
|
162
164
|
it "should set the attributes to zero if a string given" do
|
163
165
|
@plant.typed_leaf_size = 'x'
|
164
|
-
@plant.typed_leaf_size.
|
166
|
+
expect(@plant.typed_leaf_size).to eq(0)
|
165
167
|
end
|
166
168
|
|
167
169
|
it "should parse numbers out of a string" do
|
168
170
|
@plant.typed_leaf_size = 'x00.123'
|
169
|
-
@plant.typed_leaf_size.
|
171
|
+
expect(@plant.typed_leaf_size).to eq(0.123)
|
170
172
|
end
|
171
173
|
|
172
174
|
it "should set the attributes to nil if given a blank string" do
|
173
175
|
@plant.typed_leaf_size = ''
|
174
|
-
@plant.typed_leaf_size.
|
176
|
+
expect(@plant.typed_leaf_size).to be_nil
|
175
177
|
end
|
176
178
|
end
|
177
179
|
end
|
@@ -11,14 +11,14 @@ describe CouchPotato::View::BaseViewSpec, 'initialize' do
|
|
11
11
|
CouchPotato::Config.default_language = @default_language
|
12
12
|
end
|
13
13
|
|
14
|
-
it
|
15
|
-
|
16
|
-
CouchPotato::View::BaseViewSpec.new Object, 'all', {}, {:
|
17
|
-
}.
|
14
|
+
it 'raises an error when passing invalid view parameters' do
|
15
|
+
expect {
|
16
|
+
CouchPotato::View::BaseViewSpec.new Object, 'all', {}, {start_key: '1'}
|
17
|
+
}.to raise_error(ArgumentError, "invalid view parameter: start_key")
|
18
18
|
end
|
19
19
|
|
20
|
-
it
|
21
|
-
|
20
|
+
it 'does not raise an error when passing valid view parameters' do
|
21
|
+
expect {
|
22
22
|
CouchPotato::View::BaseViewSpec.new Object, 'all', {}, {
|
23
23
|
:key => 'keyvalue',
|
24
24
|
:startkey => 'keyvalue',
|
@@ -33,95 +33,142 @@ describe CouchPotato::View::BaseViewSpec, 'initialize' do
|
|
33
33
|
:group_level => 1,
|
34
34
|
:reduce => false,
|
35
35
|
:include_docs => true,
|
36
|
-
:inclusive_end => true
|
36
|
+
:inclusive_end => true,
|
37
|
+
:list_params => {}
|
37
38
|
}
|
38
|
-
}.
|
39
|
+
}.not_to raise_error
|
39
40
|
end
|
40
41
|
|
41
42
|
it "removes stale when it's nil" do
|
42
43
|
spec = CouchPotato::View::BaseViewSpec.new Object, 'all', {}, {:stale => nil}
|
43
|
-
spec.view_parameters.
|
44
|
+
expect(spec.view_parameters).to eq({})
|
44
45
|
end
|
45
46
|
|
46
47
|
it "converts a range passed as key into startkey and endkey" do
|
47
48
|
spec = CouchPotato::View::BaseViewSpec.new Object, 'all', {}, {:key => '1'..'2'}
|
48
|
-
spec.view_parameters.
|
49
|
+
expect(spec.view_parameters).to eq({:startkey => '1', :endkey => '2'})
|
49
50
|
end
|
50
51
|
|
51
52
|
it "converts a plain value to a hash with a key" do
|
52
53
|
spec = CouchPotato::View::BaseViewSpec.new Object, 'all', {}, '2'
|
53
|
-
spec.view_parameters.
|
54
|
+
expect(spec.view_parameters).to eq({:key => '2'})
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'merges the list params' do
|
58
|
+
spec = CouchPotato::View::BaseViewSpec.new Object, 'all', {}, key: '2', list_params: {:x => 'y'}
|
59
|
+
expect(spec.view_parameters).to eq({:key => '2', :x => 'y'})
|
54
60
|
end
|
55
61
|
|
56
62
|
it "generates the design document path by snake_casing the class name but keeping double colons" do
|
57
63
|
spec = CouchPotato::View::BaseViewSpec.new 'Foo::BarBaz', '', {}, ''
|
58
|
-
spec.design_document.
|
64
|
+
expect(spec.design_document).to eq('foo::bar_baz')
|
59
65
|
end
|
60
66
|
|
61
67
|
it "generates the design document independent of the view name by default" do
|
62
68
|
CouchPotato::Config.split_design_documents_per_view = false
|
63
69
|
spec = CouchPotato::View::BaseViewSpec.new 'User', 'by_login_and_email', {}, ''
|
64
|
-
spec.design_document.
|
70
|
+
expect(spec.design_document).to eq('user')
|
65
71
|
end
|
66
72
|
|
67
73
|
it "generates the design document per view if configured to" do
|
68
74
|
CouchPotato::Config.split_design_documents_per_view = true
|
69
75
|
spec = CouchPotato::View::BaseViewSpec.new 'User', 'by_login_and_email', {}, ''
|
70
|
-
spec.design_document.
|
76
|
+
expect(spec.design_document).to eq('user_view_by_login_and_email')
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'adds the view name digest to the design doc name' do
|
80
|
+
CouchPotato::Config.split_design_documents_per_view = true
|
81
|
+
spec = CouchPotato::View::RawViewSpec.new 'User', 'by_login_and_email',
|
82
|
+
{digest_view_name: true, map: 'function(doc) {}'}, ''
|
83
|
+
|
84
|
+
expect(spec.design_document).to eq('user_view_by_login_and_email-375c815fcb4f977f330a2edfadc7f74d')
|
71
85
|
end
|
72
86
|
|
87
|
+
it 'builds the name digest by hashing the map and reduce function if there is one' do
|
88
|
+
CouchPotato::Config.split_design_documents_per_view = true
|
89
|
+
spec = CouchPotato::View::RawViewSpec.new 'User', 'by_login_and_email',
|
90
|
+
{digest_view_name: true, map: 'function(doc) {}', reduce: 'function(key, values) {}'}, ''
|
91
|
+
|
92
|
+
expect(spec.design_document).to eq('user_view_by_login_and_email-c9f83cec3dab954a8ca56330006f187e')
|
93
|
+
end
|
94
|
+
|
95
|
+
|
73
96
|
it "generates the design document independent of the list name by default" do
|
74
97
|
CouchPotato::Config.split_design_documents_per_view = false
|
75
|
-
spec = CouchPotato::View::BaseViewSpec.new
|
76
|
-
spec.design_document.
|
98
|
+
spec = CouchPotato::View::BaseViewSpec.new double(lists: nil, :to_s => 'User'), '', {list: 'test_list'}, {}
|
99
|
+
expect(spec.design_document).to eq('user')
|
77
100
|
end
|
78
101
|
|
79
102
|
it "generates the design document per view if configured to" do
|
80
103
|
CouchPotato::Config.split_design_documents_per_view = true
|
81
|
-
spec = CouchPotato::View::BaseViewSpec.new
|
82
|
-
spec.design_document.
|
104
|
+
spec = CouchPotato::View::BaseViewSpec.new double(lists: nil, :to_s => 'User'), '', {list: :test_list}, {}
|
105
|
+
expect(spec.design_document).to eq('user_list_test_list')
|
83
106
|
end
|
84
107
|
|
85
108
|
it "extracts the list name from the options" do
|
86
|
-
spec = CouchPotato::View::BaseViewSpec.new
|
87
|
-
spec.list_name.
|
109
|
+
spec = CouchPotato::View::BaseViewSpec.new double(lists: nil), 'all', {list: :test_list}, {}
|
110
|
+
expect(spec.list_name).to eq(:test_list)
|
88
111
|
end
|
89
112
|
|
90
113
|
it "extracts the list from the view parameters" do
|
91
|
-
spec = CouchPotato::View::BaseViewSpec.new
|
92
|
-
spec.list_name.
|
114
|
+
spec = CouchPotato::View::BaseViewSpec.new double(lists: nil), 'all', {}, {list: :test_list}
|
115
|
+
expect(spec.list_name).to eq(:test_list)
|
93
116
|
end
|
94
117
|
|
95
118
|
it "prefers the list name from the view parameters over the one from the options" do
|
96
|
-
spec = CouchPotato::View::BaseViewSpec.new
|
97
|
-
spec.list_name.
|
119
|
+
spec = CouchPotato::View::BaseViewSpec.new double(lists: nil), 'all', {list: 'my_list'}, list: :test_list
|
120
|
+
expect(spec.list_name).to eq(:test_list)
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'returns the view name' do
|
124
|
+
spec = CouchPotato::View::BaseViewSpec.new Object, 'by_id', {}, {}
|
125
|
+
expect(spec.view_name).to eq('by_id')
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'adds a digest to the view name based on the map function content when passing digest_view_name' do
|
129
|
+
# need to use RawViewSpec here so we can pass a map function
|
130
|
+
spec = CouchPotato::View::RawViewSpec.new Object, 'by_id',
|
131
|
+
{digest_view_name: true, map: 'function() {}'}, {}
|
132
|
+
|
133
|
+
expect(spec.view_name).to eq('by_id-4644e3a3ef266d4e6b513dc79bad5ab7')
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'adds a digest to the view name if configure to' do
|
137
|
+
begin
|
138
|
+
CouchPotato::Config.digest_view_names = true
|
139
|
+
# need to use RawViewSpec here so we can pass a map function
|
140
|
+
spec = CouchPotato::View::RawViewSpec.new Object, 'by_id',
|
141
|
+
{map: 'function() {}'}, {}
|
142
|
+
|
143
|
+
expect(spec.view_name).to eq('by_id-4644e3a3ef266d4e6b513dc79bad5ab7')
|
144
|
+
ensure
|
145
|
+
CouchPotato::Config.digest_view_names = false
|
146
|
+
end
|
98
147
|
end
|
99
148
|
|
100
149
|
it "returns the list function" do
|
101
|
-
klass =
|
102
|
-
klass.
|
103
|
-
spec = CouchPotato::View::BaseViewSpec.new klass, 'all', {:
|
104
|
-
spec.list_function.
|
150
|
+
klass = double 'class'
|
151
|
+
allow(klass).to receive(:lists).with('test_list').and_return('<list_code>')
|
152
|
+
spec = CouchPotato::View::BaseViewSpec.new klass, 'all', {list: 'test_list'}, {}
|
153
|
+
expect(spec.list_function).to eq('<list_code>')
|
105
154
|
end
|
106
155
|
|
107
156
|
it 'reads the language from the couch potato config by default' do
|
108
157
|
CouchPotato::Config.default_language = :ruby
|
109
158
|
spec = CouchPotato::View::BaseViewSpec.new Object, 'all', {}, {}
|
110
|
-
spec.language.
|
159
|
+
expect(spec.language).to eq(:ruby)
|
111
160
|
end
|
112
161
|
|
113
162
|
it 'sets the language to the given language' do
|
114
|
-
spec = CouchPotato::View::BaseViewSpec.new Object, 'all', {:
|
115
|
-
spec.language.
|
163
|
+
spec = CouchPotato::View::BaseViewSpec.new Object, 'all', {language: :erlang}, {}
|
164
|
+
expect(spec.language).to eq(:erlang)
|
116
165
|
end
|
117
166
|
|
118
167
|
it 'post-processes the results' do
|
119
|
-
filter =
|
120
|
-
spec = CouchPotato::View::BaseViewSpec.new Object, 'all', {:
|
168
|
+
filter = -> (results) { results.map(&:to_i) }
|
169
|
+
spec = CouchPotato::View::BaseViewSpec.new Object, 'all', {results_filter: filter}, {}
|
121
170
|
|
122
171
|
expect(spec.process_results(['1'])).to eql([1])
|
123
172
|
end
|
124
173
|
end
|
125
174
|
end
|
126
|
-
|
127
|
-
|