couchrest_model 2.2.0.beta1 → 2.2.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +7 -4
- data/Dockerfile +11 -0
- data/Gemfile +2 -0
- data/Guardfile +31 -0
- data/VERSION +1 -1
- data/couchrest_model.gemspec +2 -2
- data/docker-compose.yml +26 -0
- data/history.md +14 -1
- data/lib/couchrest/model/connection.rb +15 -20
- data/lib/couchrest/model/connection_config.rb +32 -0
- data/lib/couchrest/model/designs/migrations.rb +3 -0
- data/lib/couchrest/model/designs/view.rb +49 -34
- data/lib/couchrest/model/document_queries.rb +18 -5
- data/lib/couchrest/model/persistence.rb +3 -1
- data/lib/couchrest/model/proxyable.rb +12 -3
- data/lib/couchrest/model/server_pool.rb +22 -0
- data/lib/couchrest/model/support/couchrest_database.rb +1 -1
- data/lib/couchrest/model/utils/migrate.rb +8 -5
- data/lib/couchrest_model.rb +2 -0
- data/spec/spec_helper.rb +16 -1
- data/spec/unit/connection_config_spec.rb +41 -0
- data/spec/unit/connection_spec.rb +3 -8
- data/spec/unit/designs/migrations_spec.rb +1 -0
- data/spec/unit/designs/view_spec.rb +61 -43
- data/spec/unit/designs_spec.rb +0 -66
- data/spec/unit/persistence_spec.rb +7 -0
- data/spec/unit/proxyable_spec.rb +37 -2
- data/spec/unit/server_pool_spec.rb +31 -0
- data/spec/unit/support/couchrest_database_spec.rb +15 -0
- data/spec/unit/utils/migrate_spec.rb +136 -1
- metadata +22 -5
@@ -31,9 +31,8 @@ module CouchRest
|
|
31
31
|
#
|
32
32
|
# === Parameters
|
33
33
|
# id<String, Integer>:: Document ID
|
34
|
-
|
35
|
-
|
36
|
-
get!(id, db)
|
34
|
+
def get(id)
|
35
|
+
get!(id)
|
37
36
|
rescue CouchRest::Model::DocumentNotFound
|
38
37
|
nil
|
39
38
|
end
|
@@ -49,14 +48,28 @@ module CouchRest
|
|
49
48
|
#
|
50
49
|
# === Parameters
|
51
50
|
# id<String, Integer>:: Document ID
|
51
|
+
def get!(id)
|
52
|
+
fetch_and_build_from_database(id, database)
|
53
|
+
end
|
54
|
+
alias :find! :get!
|
55
|
+
|
56
|
+
|
57
|
+
# Load the document and build from the provided database.
|
58
|
+
#
|
59
|
+
# ==== Returns
|
60
|
+
# Object:: if the document was found
|
61
|
+
# or
|
62
|
+
# Exception
|
63
|
+
#
|
64
|
+
# === Parameters
|
65
|
+
# id<String, Integer>:: Document ID
|
52
66
|
# db<Database>:: optional option to pass a custom database to use
|
53
|
-
def
|
67
|
+
def fetch_and_build_from_database(id, db)
|
54
68
|
raise CouchRest::Model::DocumentNotFound if id.blank?
|
55
69
|
raise CouchRest::Model::DatabaseNotDefined if db.nil?
|
56
70
|
doc = db.get(id) or raise CouchRest::Model::DocumentNotFound
|
57
71
|
build_from_database(doc)
|
58
72
|
end
|
59
|
-
alias :find! :get!
|
60
73
|
|
61
74
|
end
|
62
75
|
|
@@ -93,9 +93,11 @@ module CouchRest
|
|
93
93
|
# Returns self.
|
94
94
|
def reload
|
95
95
|
write_attributes_for_initialization(
|
96
|
-
database.get(id), :write_all_attributes => true
|
96
|
+
database.get!(id), :write_all_attributes => true
|
97
97
|
)
|
98
98
|
self
|
99
|
+
rescue CouchRest::NotFound
|
100
|
+
raise CouchRest::Model::DocumentNotFound
|
99
101
|
end
|
100
102
|
|
101
103
|
protected
|
@@ -8,8 +8,10 @@ module CouchRest
|
|
8
8
|
raise StandardError, "Please set the #proxy_database_method" if self.class.proxy_database_method.nil?
|
9
9
|
db_name = self.send(self.class.proxy_database_method)
|
10
10
|
db_suffix = self.class.proxy_database_suffixes[assoc_name.to_sym]
|
11
|
-
@
|
12
|
-
@
|
11
|
+
@_proxy_databases ||= {}
|
12
|
+
@_proxy_databases[assoc_name.to_sym] ||= begin
|
13
|
+
self.class.prepare_database([db_name, db_suffix].compact.reject(&:blank?).join(self.class.connection[:join]))
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
module ClassMethods
|
@@ -118,10 +120,17 @@ module CouchRest
|
|
118
120
|
end
|
119
121
|
|
120
122
|
def get(id)
|
121
|
-
|
123
|
+
get!(id)
|
124
|
+
rescue CouchRest::Model::DocumentNotFound
|
125
|
+
nil
|
122
126
|
end
|
123
127
|
alias :find :get
|
124
128
|
|
129
|
+
def get!(id)
|
130
|
+
proxy_update(@model.fetch_and_build_from_database(id, @database))
|
131
|
+
end
|
132
|
+
alias :find! :get!
|
133
|
+
|
125
134
|
protected
|
126
135
|
|
127
136
|
def create_view_methods
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module CouchRest
|
2
|
+
module Model
|
3
|
+
|
4
|
+
# Simple Server Pool with thread safety so that a single server
|
5
|
+
# instance can be shared with multiple classes.
|
6
|
+
class ServerPool
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@servers = {}
|
11
|
+
@mutex = Mutex.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](url)
|
15
|
+
@mutex.synchronize do
|
16
|
+
@servers[url] ||= CouchRest::Server.new(url)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -59,7 +59,7 @@ module CouchRest
|
|
59
59
|
def all_models(opts = {})
|
60
60
|
opts.reverse_merge!(activate: true, with_proxies: false)
|
61
61
|
callbacks = migrate_each_model(find_models)
|
62
|
-
callbacks += migrate_each_proxying_model(
|
62
|
+
callbacks += migrate_each_proxying_model(find_proxying_base_models) if opts[:with_proxies]
|
63
63
|
activate_designs(callbacks) if opts[:activate]
|
64
64
|
end
|
65
65
|
|
@@ -74,8 +74,8 @@ module CouchRest
|
|
74
74
|
CouchRest::Model::Base.subclasses.reject{|m| m.proxy_owner_method.present?}
|
75
75
|
end
|
76
76
|
|
77
|
-
def
|
78
|
-
CouchRest::Model::Base.subclasses.reject{|m| m.proxy_method_names.empty?}
|
77
|
+
def find_proxying_base_models
|
78
|
+
CouchRest::Model::Base.subclasses.reject{|m| m.proxy_method_names.empty? || m.proxy_owner_method.present?}
|
79
79
|
end
|
80
80
|
|
81
81
|
def migrate_each_model(models, db = nil)
|
@@ -91,12 +91,15 @@ module CouchRest
|
|
91
91
|
def migrate_each_proxying_model(models)
|
92
92
|
callbacks = [ ]
|
93
93
|
models.each do |model|
|
94
|
-
|
94
|
+
model_class = model.is_a?(CouchRest::Model::Proxyable::ModelProxy) ? model.model : model
|
95
|
+
methods = model_class.proxy_method_names
|
95
96
|
methods.each do |method|
|
96
|
-
puts "Finding proxied models for #{
|
97
|
+
puts "Finding proxied models for #{model_class}##{method}"
|
98
|
+
model_class.design_doc.auto_update = false
|
97
99
|
model.all.each do |obj|
|
98
100
|
proxy = obj.send(method)
|
99
101
|
callbacks += migrate_each_model([proxy.model], proxy.database)
|
102
|
+
callbacks += migrate_each_proxying_model([proxy]) unless model_class.proxy_method_names.empty?
|
100
103
|
end
|
101
104
|
end
|
102
105
|
end
|
data/lib/couchrest_model.rb
CHANGED
@@ -26,6 +26,8 @@ require "couchrest"
|
|
26
26
|
|
27
27
|
require "couchrest/model"
|
28
28
|
require "couchrest/model/errors"
|
29
|
+
require "couchrest/model/server_pool"
|
30
|
+
require "couchrest/model/connection_config"
|
29
31
|
require "couchrest/model/configuration"
|
30
32
|
require "couchrest/model/translation"
|
31
33
|
require "couchrest/model/persistence"
|
data/spec/spec_helper.rb
CHANGED
@@ -15,7 +15,7 @@ unless defined?(FIXTURE_PATH)
|
|
15
15
|
FIXTURE_PATH = File.join(File.dirname(__FILE__), '/fixtures')
|
16
16
|
SCRATCH_PATH = File.join(File.dirname(__FILE__), '/tmp')
|
17
17
|
|
18
|
-
COUCHHOST = "http://127.0.0.1:5984"
|
18
|
+
COUCHHOST = ENV["COUCH_HOST"] || "http://127.0.0.1:5984"
|
19
19
|
TESTDB = 'couchrest-model-test'
|
20
20
|
TEST_SERVER = CouchRest.new COUCHHOST
|
21
21
|
# TEST_SERVER.default_database = TESTDB
|
@@ -23,6 +23,21 @@ unless defined?(FIXTURE_PATH)
|
|
23
23
|
end
|
24
24
|
|
25
25
|
RSpec.configure do |config|
|
26
|
+
config.before(:suite) do
|
27
|
+
couch_uri = URI.parse(ENV['COUCH_HOST'] || "http://127.0.0.1:5984")
|
28
|
+
CouchRest::Model::Base.configure do |config|
|
29
|
+
config.connection = {
|
30
|
+
:protocol => couch_uri.scheme,
|
31
|
+
:host => couch_uri.host,
|
32
|
+
:port => couch_uri.port,
|
33
|
+
:username => couch_uri.user,
|
34
|
+
:password => couch_uri.password,
|
35
|
+
:prefix => "couchrest",
|
36
|
+
:join => "_"
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
26
41
|
config.before(:all) { reset_test_db! }
|
27
42
|
|
28
43
|
config.after(:all) do
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe CouchRest::Model::ConnectionConfig do
|
5
|
+
|
6
|
+
subject { CouchRest::Model::ConnectionConfig }
|
7
|
+
|
8
|
+
describe ".instance" do
|
9
|
+
|
10
|
+
it "should provide a singleton" do
|
11
|
+
expect(subject.instance).to be_a(CouchRest::Model::ConnectionConfig)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#[file]" do
|
17
|
+
|
18
|
+
let :file do
|
19
|
+
File.join(FIXTURE_PATH, "config", "couchdb.yml")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should provide a config file hash" do
|
23
|
+
conf = subject.instance[file]
|
24
|
+
expect(conf).to be_a(Hash)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should provide a config file hash with symbolized keys" do
|
28
|
+
conf = subject.instance[file]
|
29
|
+
expect(conf[:development]).to be_a(Hash)
|
30
|
+
expect(conf[:development]['host']).to be_a(String)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should always provide same hash" do
|
34
|
+
f1 = subject.instance[file]
|
35
|
+
f2 = subject.instance[file]
|
36
|
+
expect(f1.object_id).to eql(f2.object_id)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -58,12 +58,6 @@ describe CouchRest::Model::Connection do
|
|
58
58
|
@class.use_database(db)
|
59
59
|
expect(@class.database).to eql(db)
|
60
60
|
end
|
61
|
-
it "should never prepare the database before it is needed" do
|
62
|
-
db = @class.server.database('test')
|
63
|
-
expect(@class).not_to receive(:prepare_database)
|
64
|
-
@class.use_database('test')
|
65
|
-
@class.use_database(db)
|
66
|
-
end
|
67
61
|
it "should use the database specified" do
|
68
62
|
@class.use_database(:test)
|
69
63
|
expect(@class.database.name).to eql('couchrest_test')
|
@@ -90,7 +84,7 @@ describe CouchRest::Model::Connection do
|
|
90
84
|
expect(@class.server).to be_a(CouchRest::Server)
|
91
85
|
end
|
92
86
|
it "should provide a server with default config" do
|
93
|
-
expect(@class.server.uri.to_s).to eql(
|
87
|
+
expect(@class.server.uri.to_s).to eql(CouchRest::Model::Base.server.uri.to_s)
|
94
88
|
end
|
95
89
|
it "should allow the configuration to be overwritten" do
|
96
90
|
@class.connection = {
|
@@ -131,9 +125,10 @@ describe CouchRest::Model::Connection do
|
|
131
125
|
|
132
126
|
it "should use the .use_database value" do
|
133
127
|
@class.use_database('testing')
|
134
|
-
db = @class.
|
128
|
+
db = @class.database
|
135
129
|
expect(db.name).to eql('couchrest_testing')
|
136
130
|
end
|
131
|
+
|
137
132
|
end
|
138
133
|
|
139
134
|
describe "protected methods" do
|
@@ -65,20 +65,23 @@ describe "Design View" do
|
|
65
65
|
end
|
66
66
|
|
67
67
|
describe "with proxy in query for first initialization" do
|
68
|
-
it "should set
|
68
|
+
it "should set owner to proxy object and remove from query" do
|
69
69
|
proxy = double("Proxy")
|
70
70
|
@obj = @klass.new(@mod.design_doc, @mod, {:proxy => proxy}, 'test_view')
|
71
|
-
expect(@obj.
|
71
|
+
expect(@obj.owner).to eql(proxy)
|
72
|
+
expect(@obj.model).to eql(@mod)
|
72
73
|
end
|
73
74
|
end
|
74
75
|
|
75
76
|
describe "with proxy in query for chained instance" do
|
76
|
-
it "should set the
|
77
|
+
it "should set the owner to proxy object instead of parents model" do
|
77
78
|
proxy = double("Proxy")
|
78
79
|
@obj = @klass.new(@mod.design_doc, @mod, {}, 'test_view')
|
80
|
+
expect(@obj.owner).to eql(@mod)
|
79
81
|
expect(@obj.model).to eql(@mod)
|
80
82
|
@obj = @obj.proxy(proxy)
|
81
|
-
expect(@obj.
|
83
|
+
expect(@obj.owner).to eql(proxy)
|
84
|
+
expect(@obj.model).to eql(@mod)
|
82
85
|
end
|
83
86
|
end
|
84
87
|
|
@@ -175,6 +178,31 @@ describe "Design View" do
|
|
175
178
|
str = @design_doc['views']['by_title']['map']
|
176
179
|
expect(str).to include("emit(doc['title'], [1, doc['name']]);")
|
177
180
|
end
|
181
|
+
|
182
|
+
it "should guard against nulls when emitting properties" do
|
183
|
+
@klass.define(@design_doc, 'by_title', :emit => :name)
|
184
|
+
str = @design_doc['views']['by_title']['map']
|
185
|
+
expect(str).to include("doc['name'] != null")
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should guard against nulls when emitting multiple properties" do
|
189
|
+
@klass.define(@design_doc, 'by_title', :emit => [:name, :another_property])
|
190
|
+
str = @design_doc['views']['by_title']['map']
|
191
|
+
expect(str).to include("doc['name'] != null")
|
192
|
+
expect(str).to include("doc['another_property'] != null")
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should not guard against nulls for non-symbol emits" do
|
196
|
+
@klass.define(@design_doc, 'by_title', :emit => [:name, 3])
|
197
|
+
str = @design_doc['views']['by_title']['map']
|
198
|
+
expect(str).not_to include("( != null)")
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should not provide a default reduce function the emit value is overridden" do
|
202
|
+
@klass.define(@design_doc, 'by_title', :emit => :name)
|
203
|
+
str = @design_doc['views']['by_title']['reduce']
|
204
|
+
expect(str).to be_nil
|
205
|
+
end
|
178
206
|
end
|
179
207
|
|
180
208
|
describe ".create_model_methods" do
|
@@ -239,7 +267,7 @@ describe "Design View" do
|
|
239
267
|
it "should wrap rows in ViewRow class" do
|
240
268
|
expect(@obj).to receive(:execute).and_return(true)
|
241
269
|
expect(@obj).to receive(:result).twice.and_return({'rows' => [{:foo => :bar}]})
|
242
|
-
expect(CouchRest::Model::Designs::ViewRow).to receive(:new).with({:foo => :bar}, @obj.
|
270
|
+
expect(CouchRest::Model::Designs::ViewRow).to receive(:new).with({:foo => :bar}, @obj.owner)
|
243
271
|
@obj.rows
|
244
272
|
end
|
245
273
|
|
@@ -447,13 +475,6 @@ describe "Design View" do
|
|
447
475
|
end
|
448
476
|
end
|
449
477
|
|
450
|
-
describe "#database" do
|
451
|
-
it "should update query with value" do
|
452
|
-
expect(@obj).to receive(:update_query).with({:database => 'foo'})
|
453
|
-
@obj.database('foo')
|
454
|
-
end
|
455
|
-
end
|
456
|
-
|
457
478
|
describe "#key" do
|
458
479
|
it "should update query with value" do
|
459
480
|
expect(@obj).to receive(:update_query).with({:key => 'foo'})
|
@@ -739,6 +760,12 @@ describe "Design View" do
|
|
739
760
|
end
|
740
761
|
end
|
741
762
|
|
763
|
+
describe "#database" do
|
764
|
+
it "should reference the owners database" do
|
765
|
+
expect(@obj.database).to eql(@mod.database)
|
766
|
+
end
|
767
|
+
end
|
768
|
+
|
742
769
|
describe "#execute" do
|
743
770
|
before :each do
|
744
771
|
# disable real execution!
|
@@ -754,10 +781,7 @@ describe "Design View" do
|
|
754
781
|
end
|
755
782
|
|
756
783
|
it "should raise issue if no database" do
|
757
|
-
expect(@obj).to receive(:
|
758
|
-
model = double("SomeModel")
|
759
|
-
expect(model).to receive(:database).and_return(nil)
|
760
|
-
expect(@obj).to receive(:model).and_return(model)
|
784
|
+
expect(@obj).to receive(:database).and_return(nil)
|
761
785
|
expect { @obj.send(:execute) }.to raise_error(CouchRest::Model::DatabaseNotDefined)
|
762
786
|
end
|
763
787
|
|
@@ -859,6 +883,14 @@ describe "Design View" do
|
|
859
883
|
end
|
860
884
|
end
|
861
885
|
end
|
886
|
+
|
887
|
+
describe "ActiveRecord compatibility methods" do
|
888
|
+
describe "#model_name" do
|
889
|
+
it "should use the #model class" do
|
890
|
+
expect(@obj.model_name.to_s).to eql DesignViewModel.to_s
|
891
|
+
end
|
892
|
+
end
|
893
|
+
end
|
862
894
|
end
|
863
895
|
end
|
864
896
|
|
@@ -868,19 +900,19 @@ describe "Design View" do
|
|
868
900
|
@klass = CouchRest::Model::Designs::ViewRow
|
869
901
|
end
|
870
902
|
|
871
|
-
let :
|
903
|
+
let :owner do
|
872
904
|
m = double()
|
873
905
|
allow(m).to receive(:database).and_return(DB)
|
874
906
|
m
|
875
907
|
end
|
876
908
|
|
877
909
|
describe "intialize" do
|
878
|
-
it "should store reference to
|
879
|
-
obj = @klass.new({},
|
880
|
-
expect(obj.
|
910
|
+
it "should store reference to owner" do
|
911
|
+
obj = @klass.new({}, owner)
|
912
|
+
expect(obj.owner).to eql(owner)
|
881
913
|
end
|
882
914
|
it "should copy details from hash" do
|
883
|
-
obj = @klass.new({:foo => :bar, :test => :example},
|
915
|
+
obj = @klass.new({:foo => :bar, :test => :example}, owner)
|
884
916
|
expect(obj[:foo]).to eql(:bar)
|
885
917
|
expect(obj[:test]).to eql(:example)
|
886
918
|
end
|
@@ -891,32 +923,22 @@ describe "Design View" do
|
|
891
923
|
end
|
892
924
|
|
893
925
|
it "should provide id" do
|
894
|
-
obj = @klass.new({'id' => '123456'},
|
926
|
+
obj = @klass.new({'id' => '123456'}, owner)
|
895
927
|
expect(obj.id).to eql('123456')
|
896
928
|
end
|
897
929
|
|
898
|
-
it "may be instantiated with a database" do
|
899
|
-
obj = @klass.new({'id' => '123456'}, model, 'foo')
|
900
|
-
expect(obj.db).to eql('foo')
|
901
|
-
end
|
902
|
-
|
903
|
-
it "may use model's database" do
|
904
|
-
obj = @klass.new({'id' => '123456'}, model)
|
905
|
-
expect(obj.db).to eql(DB)
|
906
|
-
end
|
907
|
-
|
908
930
|
it "should provide key" do
|
909
|
-
obj = @klass.new({'key' => 'thekey'},
|
931
|
+
obj = @klass.new({'key' => 'thekey'}, owner)
|
910
932
|
expect(obj.key).to eql('thekey')
|
911
933
|
end
|
912
934
|
|
913
935
|
it "should provide the value" do
|
914
|
-
obj = @klass.new({'value' => 'thevalue'},
|
936
|
+
obj = @klass.new({'value' => 'thevalue'}, owner)
|
915
937
|
expect(obj.value).to eql('thevalue')
|
916
938
|
end
|
917
939
|
|
918
940
|
it "should provide the raw document" do
|
919
|
-
obj = @klass.new({'doc' => 'thedoc'},
|
941
|
+
obj = @klass.new({'doc' => 'thedoc'}, owner)
|
920
942
|
expect(obj.raw_doc).to eql('thedoc')
|
921
943
|
end
|
922
944
|
|
@@ -924,8 +946,7 @@ describe "Design View" do
|
|
924
946
|
hash = {'doc' => {'_id' => '12345', 'name' => 'sam'}}
|
925
947
|
obj = @klass.new(hash, DesignViewModel)
|
926
948
|
doc = double('DesignViewDoc')
|
927
|
-
|
928
|
-
expect(obj.model).to receive(:build_from_database).with(hash['doc']).and_return(doc)
|
949
|
+
expect(obj.owner).to receive(:build_from_database).with(hash['doc']).and_return(doc)
|
929
950
|
expect(obj.doc).to eql(doc)
|
930
951
|
end
|
931
952
|
|
@@ -933,8 +954,7 @@ describe "Design View" do
|
|
933
954
|
hash = {'id' => '12345', 'value' => 5}
|
934
955
|
obj = @klass.new(hash, DesignViewModel)
|
935
956
|
doc = double('DesignViewModel')
|
936
|
-
|
937
|
-
expect(obj.model).to receive(:get).with('12345', DB).and_return(doc)
|
957
|
+
expect(obj.owner).to receive(:get).with('12345').and_return(doc)
|
938
958
|
expect(obj.doc).to eql(doc)
|
939
959
|
end
|
940
960
|
|
@@ -942,16 +962,14 @@ describe "Design View" do
|
|
942
962
|
hash = {'id' => '12345', 'value' => {'_id' => '54321'}}
|
943
963
|
obj = @klass.new(hash, DesignViewModel)
|
944
964
|
doc = double('DesignViewModel')
|
945
|
-
|
946
|
-
expect(obj.model).to receive(:get).with('54321', DB).and_return(doc)
|
965
|
+
expect(obj.owner).to receive(:get).with('54321').and_return(doc)
|
947
966
|
expect(obj.doc).to eql(doc)
|
948
967
|
end
|
949
968
|
|
950
969
|
it "should try to return nil for document if none available" do
|
951
970
|
hash = {'value' => 23} # simulate reduce
|
952
971
|
obj = @klass.new(hash, DesignViewModel)
|
953
|
-
|
954
|
-
expect(obj.model).not_to receive(:get)
|
972
|
+
expect(obj.owner).not_to receive(:get)
|
955
973
|
expect(obj.doc).to be_nil
|
956
974
|
end
|
957
975
|
|