couch_potato 1.4.0 → 1.6.3
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.
- 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
|
-
|