openlogic-couchrest_model 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. data/.gitignore +11 -0
  2. data/.rspec +4 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +176 -0
  5. data/README.md +137 -0
  6. data/Rakefile +38 -0
  7. data/THANKS.md +21 -0
  8. data/VERSION +1 -0
  9. data/benchmarks/dirty.rb +118 -0
  10. data/couchrest_model.gemspec +36 -0
  11. data/history.md +309 -0
  12. data/init.rb +1 -0
  13. data/lib/couchrest/model.rb +10 -0
  14. data/lib/couchrest/model/associations.rb +231 -0
  15. data/lib/couchrest/model/base.rb +129 -0
  16. data/lib/couchrest/model/callbacks.rb +28 -0
  17. data/lib/couchrest/model/casted_array.rb +83 -0
  18. data/lib/couchrest/model/casted_by.rb +33 -0
  19. data/lib/couchrest/model/casted_hash.rb +84 -0
  20. data/lib/couchrest/model/class_proxy.rb +135 -0
  21. data/lib/couchrest/model/collection.rb +273 -0
  22. data/lib/couchrest/model/configuration.rb +67 -0
  23. data/lib/couchrest/model/connection.rb +70 -0
  24. data/lib/couchrest/model/core_extensions/hash.rb +9 -0
  25. data/lib/couchrest/model/core_extensions/time_parsing.rb +66 -0
  26. data/lib/couchrest/model/design_doc.rb +128 -0
  27. data/lib/couchrest/model/designs.rb +91 -0
  28. data/lib/couchrest/model/designs/view.rb +513 -0
  29. data/lib/couchrest/model/dirty.rb +39 -0
  30. data/lib/couchrest/model/document_queries.rb +99 -0
  31. data/lib/couchrest/model/embeddable.rb +78 -0
  32. data/lib/couchrest/model/errors.rb +25 -0
  33. data/lib/couchrest/model/extended_attachments.rb +83 -0
  34. data/lib/couchrest/model/persistence.rb +178 -0
  35. data/lib/couchrest/model/properties.rb +228 -0
  36. data/lib/couchrest/model/property.rb +114 -0
  37. data/lib/couchrest/model/property_protection.rb +71 -0
  38. data/lib/couchrest/model/proxyable.rb +183 -0
  39. data/lib/couchrest/model/support/couchrest_database.rb +13 -0
  40. data/lib/couchrest/model/support/couchrest_design.rb +33 -0
  41. data/lib/couchrest/model/typecast.rb +154 -0
  42. data/lib/couchrest/model/validations.rb +80 -0
  43. data/lib/couchrest/model/validations/casted_model.rb +16 -0
  44. data/lib/couchrest/model/validations/locale/en.yml +5 -0
  45. data/lib/couchrest/model/validations/uniqueness.rb +69 -0
  46. data/lib/couchrest/model/views.rb +151 -0
  47. data/lib/couchrest/railtie.rb +24 -0
  48. data/lib/couchrest_model.rb +66 -0
  49. data/lib/rails/generators/couchrest_model.rb +16 -0
  50. data/lib/rails/generators/couchrest_model/config/config_generator.rb +18 -0
  51. data/lib/rails/generators/couchrest_model/config/templates/couchdb.yml +21 -0
  52. data/lib/rails/generators/couchrest_model/model/model_generator.rb +27 -0
  53. data/lib/rails/generators/couchrest_model/model/templates/model.rb +2 -0
  54. data/spec/.gitignore +1 -0
  55. data/spec/fixtures/attachments/README +3 -0
  56. data/spec/fixtures/attachments/couchdb.png +0 -0
  57. data/spec/fixtures/attachments/test.html +11 -0
  58. data/spec/fixtures/config/couchdb.yml +10 -0
  59. data/spec/fixtures/models/article.rb +36 -0
  60. data/spec/fixtures/models/base.rb +164 -0
  61. data/spec/fixtures/models/card.rb +19 -0
  62. data/spec/fixtures/models/cat.rb +23 -0
  63. data/spec/fixtures/models/client.rb +6 -0
  64. data/spec/fixtures/models/course.rb +27 -0
  65. data/spec/fixtures/models/event.rb +8 -0
  66. data/spec/fixtures/models/invoice.rb +14 -0
  67. data/spec/fixtures/models/key_chain.rb +5 -0
  68. data/spec/fixtures/models/membership.rb +4 -0
  69. data/spec/fixtures/models/person.rb +11 -0
  70. data/spec/fixtures/models/project.rb +6 -0
  71. data/spec/fixtures/models/question.rb +7 -0
  72. data/spec/fixtures/models/sale_entry.rb +9 -0
  73. data/spec/fixtures/models/sale_invoice.rb +14 -0
  74. data/spec/fixtures/models/service.rb +10 -0
  75. data/spec/fixtures/models/user.rb +22 -0
  76. data/spec/fixtures/views/lib.js +3 -0
  77. data/spec/fixtures/views/test_view/lib.js +3 -0
  78. data/spec/fixtures/views/test_view/only-map.js +4 -0
  79. data/spec/fixtures/views/test_view/test-map.js +3 -0
  80. data/spec/fixtures/views/test_view/test-reduce.js +3 -0
  81. data/spec/functional/validations_spec.rb +8 -0
  82. data/spec/spec_helper.rb +60 -0
  83. data/spec/unit/active_model_lint_spec.rb +30 -0
  84. data/spec/unit/assocations_spec.rb +242 -0
  85. data/spec/unit/attachment_spec.rb +176 -0
  86. data/spec/unit/base_spec.rb +537 -0
  87. data/spec/unit/casted_spec.rb +72 -0
  88. data/spec/unit/class_proxy_spec.rb +167 -0
  89. data/spec/unit/collection_spec.rb +86 -0
  90. data/spec/unit/configuration_spec.rb +77 -0
  91. data/spec/unit/connection_spec.rb +148 -0
  92. data/spec/unit/core_extensions/time_parsing.rb +77 -0
  93. data/spec/unit/design_doc_spec.rb +241 -0
  94. data/spec/unit/designs/view_spec.rb +831 -0
  95. data/spec/unit/designs_spec.rb +134 -0
  96. data/spec/unit/dirty_spec.rb +436 -0
  97. data/spec/unit/embeddable_spec.rb +498 -0
  98. data/spec/unit/inherited_spec.rb +33 -0
  99. data/spec/unit/persistence_spec.rb +481 -0
  100. data/spec/unit/property_protection_spec.rb +192 -0
  101. data/spec/unit/property_spec.rb +481 -0
  102. data/spec/unit/proxyable_spec.rb +376 -0
  103. data/spec/unit/subclass_spec.rb +85 -0
  104. data/spec/unit/typecast_spec.rb +521 -0
  105. data/spec/unit/validations_spec.rb +140 -0
  106. data/spec/unit/view_spec.rb +367 -0
  107. metadata +301 -0
@@ -0,0 +1,72 @@
1
+ require "spec_helper"
2
+
3
+ class Driver < CouchRest::Model::Base
4
+ use_database TEST_SERVER.default_database
5
+ # You have to add a casted_by accessor if you want to reach a casted extended doc parent
6
+ attr_accessor :casted_by
7
+
8
+ property :name
9
+ end
10
+
11
+ class Car < CouchRest::Model::Base
12
+ use_database TEST_SERVER.default_database
13
+
14
+ property :name
15
+ property :driver, Driver
16
+ end
17
+
18
+ describe "casting an extended document" do
19
+
20
+ before(:each) do
21
+ @driver = Driver.new(:name => 'Matt')
22
+ @car = Car.new(:name => 'Renault 306', :driver => @driver)
23
+ end
24
+
25
+ it "should retain all properties of the casted attribute" do
26
+ @car.driver.should == @driver
27
+ end
28
+
29
+ it "should let the casted document know who casted it" do
30
+ @car.driver.casted_by.should == @car
31
+ end
32
+ end
33
+
34
+ describe "assigning a value to casted attribute after initializing an object" do
35
+
36
+ before(:each) do
37
+ @car = Car.new(:name => 'Renault 306')
38
+ @driver = Driver.new(:name => 'Matt')
39
+ end
40
+
41
+ it "should not create an empty casted object" do
42
+ @car.driver.should be_nil
43
+ end
44
+
45
+ it "should let you assign the value" do
46
+ @car.driver = @driver
47
+ @car.driver.name.should == 'Matt'
48
+ end
49
+
50
+ it "should cast attribute" do
51
+ @car.driver = JSON.parse(@driver.to_json)
52
+ @car.driver.should be_instance_of(Driver)
53
+ end
54
+
55
+ end
56
+
57
+ describe "casting a model from parsed JSON" do
58
+
59
+ before(:each) do
60
+ @driver = Driver.new(:name => 'Matt')
61
+ @car = Car.new(:name => 'Renault 306', :driver => @driver)
62
+ @new_car = Car.new(JSON.parse(@car.to_json))
63
+ end
64
+
65
+ it "should cast casted attribute" do
66
+ @new_car.driver.should be_instance_of(Driver)
67
+ end
68
+
69
+ it "should retain all properties of the casted attribute" do
70
+ @new_car.driver.should == @driver
71
+ end
72
+ end
@@ -0,0 +1,167 @@
1
+ require "spec_helper"
2
+
3
+ class UnattachedDoc < CouchRest::Model::Base
4
+ # Note: no use_database here
5
+ property :title
6
+ property :questions
7
+ property :professor
8
+ view_by :title
9
+ end
10
+
11
+
12
+ describe "Proxy Class" do
13
+
14
+ before(:all) do
15
+ reset_test_db!
16
+ # setup the class default doc to save the design doc
17
+ UnattachedDoc.use_database nil # just to be sure it is really unattached
18
+ @us = UnattachedDoc.on(DB)
19
+ %w{aaa bbb ddd eee}.each do |title|
20
+ u = @us.new(:title => title)
21
+ u.save
22
+ @first_id ||= u.id
23
+ end
24
+ end
25
+
26
+ it "should query all" do
27
+ rs = @us.all
28
+ rs.length.should == 4
29
+ end
30
+ it "should count" do
31
+ @us.count.should == 4
32
+ end
33
+ it "should make the design doc upon first query" do
34
+ @us.by_title
35
+ doc = @us.design_doc
36
+ doc['views']['all']['map'].should include('UnattachedDoc')
37
+ end
38
+ it "should merge query params" do
39
+ rs = @us.by_title :startkey=>"bbb", :endkey=>"eee"
40
+ rs.length.should == 3
41
+ end
42
+ it "should query via view" do
43
+ view = @us.view :by_title
44
+ designed = @us.by_title
45
+ view.should == designed
46
+ end
47
+
48
+ it "should query via first_from_view" do
49
+ UnattachedDoc.should_receive(:first_from_view).with('by_title', 'bbb', {:database => DB})
50
+ @us.first_from_view('by_title', 'bbb')
51
+ end
52
+
53
+ it "should query via first_from_view with complex options" do
54
+ UnattachedDoc.should_receive(:first_from_view).with('by_title', {:key => 'bbb', :database => DB})
55
+ @us.first_from_view('by_title', :key => 'bbb')
56
+ end
57
+
58
+ it "should query via first_from_view with complex extra options" do
59
+ UnattachedDoc.should_receive(:first_from_view).with('by_title', 'bbb', {:limit => 1, :database => DB})
60
+ @us.first_from_view('by_title', 'bbb', :limit => 1)
61
+ end
62
+
63
+ it "should allow dynamic view matching for single elements" do
64
+ @us.should_receive(:first_from_view).with('by_title', 'bbb')
65
+ @us.find_by_title('bbb')
66
+ end
67
+
68
+ it "should yield" do
69
+ things = []
70
+ @us.view(:by_title) do |thing|
71
+ things << thing
72
+ end
73
+ things[0]["doc"]["title"].should =='aaa'
74
+ end
75
+ it "should yield with by_key method" do
76
+ things = []
77
+ @us.by_title do |thing|
78
+ things << thing
79
+ end
80
+ things[0]["doc"]["title"].should =='aaa'
81
+ end
82
+ it "should get from specific database" do
83
+ u = @us.get(@first_id)
84
+ u.title.should == "aaa"
85
+ end
86
+ it "should get first" do
87
+ u = @us.first
88
+ u.should == @us.all.first
89
+ end
90
+
91
+ it "should get last" do
92
+ u = @us.last
93
+ u.should == @us.all.last
94
+ end
95
+
96
+ it "should set database on first retreived document" do
97
+ u = @us.first
98
+ u.database.should === DB
99
+ end
100
+ it "should set database on all retreived documents" do
101
+ @us.all.each do |u|
102
+ u.database.should === DB
103
+ end
104
+ end
105
+ it "should set database on each retreived document" do
106
+ rs = @us.by_title :startkey=>"bbb", :endkey=>"eee"
107
+ rs.length.should == 3
108
+ rs.each do |u|
109
+ u.database.should === DB
110
+ end
111
+ end
112
+ it "should set database on document retreived by id" do
113
+ u = @us.get(@first_id)
114
+ u.database.should === DB
115
+ end
116
+ it "should not attempt to set database on raw results using :all" do
117
+ @us.all(:raw => true).each do |u|
118
+ u.respond_to?(:database).should be_false
119
+ end
120
+ end
121
+ it "should not attempt to set database on raw results using view" do
122
+ @us.by_title(:raw => true).each do |u|
123
+ u.respond_to?(:database).should be_false
124
+ end
125
+ end
126
+
127
+ describe "#get!" do
128
+ it "raises exception when passed a nil" do
129
+ expect { @us.get!(nil)}.to raise_error(CouchRest::Model::DocumentNotFound)
130
+ end
131
+
132
+ it "raises exception when passed an empty string " do
133
+ expect { @us.get!("")}.to raise_error(CouchRest::Model::DocumentNotFound)
134
+ end
135
+
136
+ it "raises exception when document with provided id does not exist" do
137
+ expect { @us.get!("thisisnotreallyadocumentid")}.to raise_error(CouchRest::Model::DocumentNotFound)
138
+ end
139
+ end
140
+
141
+ describe "#find!" do
142
+ it "raises exception when passed a nil" do
143
+ expect { @us.find!(nil)}.to raise_error(CouchRest::Model::DocumentNotFound)
144
+ end
145
+
146
+ it "raises exception when passed an empty string " do
147
+ expect { @us.find!("")}.to raise_error(CouchRest::Model::DocumentNotFound)
148
+ end
149
+
150
+ it "raises exception when document with provided id does not exist" do
151
+ expect { @us.find!("thisisnotreallyadocumentid")}.to raise_error(CouchRest::Model::DocumentNotFound)
152
+ end
153
+ end
154
+
155
+ # Sam Lown 2010-04-07
156
+ # Removed as unclear why this should happen as before my changes
157
+ # this happend by accident, not explicitly.
158
+ # If requested, this feature should be added as a specific method.
159
+ #
160
+ #it "should clean up design docs left around on specific database" do
161
+ # @us.by_title
162
+ # original_id = @us.model_design_doc['_rev']
163
+ # Unattached.view_by :professor
164
+ # @us.by_professor
165
+ # @us.model_design_doc['_rev'].should_not == original_id
166
+ #end
167
+ end
@@ -0,0 +1,86 @@
1
+ require "spec_helper"
2
+
3
+ describe "Collections" do
4
+
5
+ before(:all) do
6
+ reset_test_db!
7
+ titles = ["very uniq one", "really interesting", "some fun",
8
+ "really awesome", "crazy bob", "this rocks", "super rad"]
9
+ titles.each_with_index do |title,i|
10
+ a = Article.new(:title => title, :date => Date.today)
11
+ a.save
12
+ end
13
+
14
+ titles = ["yesterday very uniq one", "yesterday really interesting", "yesterday some fun",
15
+ "yesterday really awesome", "yesterday crazy bob", "yesterday this rocks"]
16
+ titles.each_with_index do |title,i|
17
+ a = Article.new(:title => title, :date => Date.today - 1)
18
+ a.save
19
+ end
20
+ end
21
+ it "should return a proxy that looks like an array of 7 Article objects" do
22
+ articles = Article.collection_proxy_for('Article', 'by_date', :descending => true,
23
+ :key => Date.today, :include_docs => true)
24
+ articles.class.should == Array
25
+ articles.size.should == 7
26
+ end
27
+ it "should provide a class method for paginate" do
28
+ articles = Article.paginate(:design_doc => 'Article', :view_name => 'by_date',
29
+ :per_page => 3, :descending => true, :key => Date.today)
30
+ articles.size.should == 3
31
+
32
+ articles = Article.paginate(:design_doc => 'Article', :view_name => 'by_date',
33
+ :per_page => 3, :page => 2, :descending => true, :key => Date.today)
34
+ articles.size.should == 3
35
+
36
+ articles = Article.paginate(:design_doc => 'Article', :view_name => 'by_date',
37
+ :per_page => 3, :page => 3, :descending => true, :key => Date.today)
38
+ articles.size.should == 1
39
+ end
40
+ it "should provide a class method for paginated_each" do
41
+ options = { :design_doc => 'Article', :view_name => 'by_date',
42
+ :per_page => 3, :page => 1, :descending => true, :key => Date.today }
43
+ Article.paginated_each(options) do |a|
44
+ a.should_not be_nil
45
+ end
46
+ end
47
+ it "should provide a class method to get a collection for a view" do
48
+ articles = Article.find_all_article_details(:key => Date.today)
49
+ articles.class.should == Array
50
+ articles.size.should == 7
51
+ end
52
+ it "should get a subset of articles using paginate" do
53
+ articles = Article.collection_proxy_for('Article', 'by_date', :key => Date.today, :include_docs => true)
54
+ articles.paginate(:page => 1, :per_page => 3).size.should == 3
55
+ articles.paginate(:page => 2, :per_page => 3).size.should == 3
56
+ articles.paginate(:page => 3, :per_page => 3).size.should == 1
57
+ end
58
+ it "should get all articles, a few at a time, using paginated each" do
59
+ articles = Article.collection_proxy_for('Article', 'by_date', :key => Date.today, :include_docs => true)
60
+ articles.paginated_each(:per_page => 3) do |a|
61
+ a.should_not be_nil
62
+ end
63
+ end
64
+
65
+ it "should raise an exception if design_doc is not provided" do
66
+ lambda{Article.collection_proxy_for(nil, 'by_date')}.should raise_error
67
+ lambda{Article.paginate(:view_name => 'by_date')}.should raise_error
68
+ end
69
+ it "should raise an exception if view_name is not provided" do
70
+ lambda{Article.collection_proxy_for('Article', nil)}.should raise_error
71
+ lambda{Article.paginate(:design_doc => 'Article')}.should raise_error
72
+ end
73
+ it "should be able to span multiple keys" do
74
+ articles = Article.collection_proxy_for('Article', 'by_date', :startkey => Date.today - 1, :endkey => Date.today, :include_docs => true)
75
+ articles.paginate(:page => 1, :per_page => 3).size.should == 3
76
+ articles.paginate(:page => 3, :per_page => 3).size.should == 3
77
+ articles.paginate(:page => 5, :per_page => 3).size.should == 1
78
+ end
79
+ it "should pass database parameter to pager" do
80
+ proxy = mock(:proxy)
81
+ proxy.stub!(:paginate)
82
+ ::CouchRest::Model::Collection::CollectionProxy.should_receive(:new).with('database', anything(), anything(), anything(), anything()).and_return(proxy)
83
+ Article.paginate(:design_doc => 'Article', :view_name => 'by_date', :database => 'database')
84
+ end
85
+
86
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe CouchRest::Model::Configuration do
5
+
6
+ before do
7
+ @class = Class.new(CouchRest::Model::Base)
8
+ end
9
+
10
+ describe '.configure' do
11
+ it "should set a configuration parameter" do
12
+ @class.add_config :foo_bar
13
+ @class.configure do |config|
14
+ config.foo_bar = 'monkey'
15
+ end
16
+ @class.foo_bar.should == 'monkey'
17
+ end
18
+ end
19
+
20
+ describe '.add_config' do
21
+
22
+ it "should add a class level accessor" do
23
+ @class.add_config :foo_bar
24
+ @class.foo_bar = 'foo'
25
+ @class.foo_bar.should == 'foo'
26
+ end
27
+
28
+ ['foo', :foo, 45, ['foo', :bar]].each do |val|
29
+ it "should be inheritable for a #{val.class}" do
30
+ @class.add_config :foo_bar
31
+ @child_class = Class.new(@class)
32
+
33
+ @class.foo_bar = val
34
+ @class.foo_bar.should == val
35
+ @child_class.foo_bar.should == val
36
+
37
+ @child_class.foo_bar = "bar"
38
+ @child_class.foo_bar.should == "bar"
39
+
40
+ @class.foo_bar.should == val
41
+ end
42
+ end
43
+
44
+
45
+ it "should add an instance level accessor" do
46
+ @class.add_config :foo_bar
47
+ @class.foo_bar = 'foo'
48
+ @class.new.foo_bar.should == 'foo'
49
+ end
50
+
51
+ it "should add a convenient in-class setter" do
52
+ @class.add_config :foo_bar
53
+ @class.foo_bar "monkey"
54
+ @class.foo_bar.should == "monkey"
55
+ end
56
+ end
57
+
58
+ describe "General examples" do
59
+
60
+ before(:all) do
61
+ @default_model_key = 'model-type'
62
+ end
63
+
64
+
65
+ it "should be possible to override on class using configure method" do
66
+ default_model_key = Cat.model_type_key
67
+ Cat.instance_eval do
68
+ model_type_key 'cat-type'
69
+ end
70
+ CouchRest::Model::Base.model_type_key.should eql(default_model_key)
71
+ Cat.model_type_key.should eql('cat-type')
72
+ cat = Cat.new
73
+ cat.model_type_key.should eql('cat-type')
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,148 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe CouchRest::Model::Connection do
5
+
6
+ before do
7
+ @class = Class.new(CouchRest::Model::Base)
8
+ end
9
+
10
+ describe "instance methods" do
11
+ before :each do
12
+ @obj = @class.new
13
+ end
14
+
15
+ describe "#database" do
16
+ it "should respond to" do
17
+ @obj.should respond_to(:database)
18
+ end
19
+ it "should provided class's database" do
20
+ @obj.class.should_receive :database
21
+ @obj.database
22
+ end
23
+ end
24
+
25
+ describe "#server" do
26
+ it "should respond to method" do
27
+ @obj.should respond_to(:server)
28
+ end
29
+ it "should return class's server" do
30
+ @obj.class.should_receive :server
31
+ @obj.server
32
+ end
33
+ end
34
+ end
35
+
36
+ describe "default configuration" do
37
+
38
+ it "should provide environment" do
39
+ @class.environment.should eql(:development)
40
+ end
41
+ it "should provide connection config file" do
42
+ @class.connection_config_file.should eql(File.join(Dir.pwd, 'config', 'couchdb.yml'))
43
+ end
44
+ it "should provided simple connection details" do
45
+ @class.connection[:prefix].should eql('couchrest')
46
+ end
47
+
48
+ end
49
+
50
+ describe "class methods" do
51
+
52
+ describe ".use_database" do
53
+ it "should respond to" do
54
+ @class.should respond_to(:use_database)
55
+ end
56
+ end
57
+
58
+ describe ".database" do
59
+ it "should respond to" do
60
+ @class.should respond_to(:database)
61
+ end
62
+ it "should provide a database object" do
63
+ @class.database.should be_a(CouchRest::Database)
64
+ end
65
+ it "should provide a database with default name" do
66
+
67
+ end
68
+
69
+ end
70
+
71
+ describe ".server" do
72
+ it "should respond to" do
73
+ @class.should respond_to(:server)
74
+ end
75
+ it "should provide a server object" do
76
+ @class.server.should be_a(CouchRest::Server)
77
+ end
78
+ it "should provide a server with default config" do
79
+ @class.server.uri.should eql("http://localhost:5984")
80
+ end
81
+ it "should allow the configuration to be overwritten" do
82
+ @class.connection = {
83
+ :protocol => "https",
84
+ :host => "127.0.0.1",
85
+ :port => '5985',
86
+ :prefix => 'sample',
87
+ :suffix => 'test',
88
+ :username => 'foo',
89
+ :password => 'bar'
90
+ }
91
+ @class.server.uri.should eql("https://foo:bar@127.0.0.1:5985")
92
+ end
93
+
94
+ end
95
+
96
+ describe ".prepare_database" do
97
+
98
+ it "should respond to" do
99
+ @class.should respond_to(:prepare_database)
100
+ end
101
+
102
+ it "should join the database name correctly" do
103
+ @class.connection[:suffix] = 'db'
104
+ db = @class.prepare_database('test')
105
+ db.name.should eql('couchrest_test_db')
106
+ end
107
+
108
+ it "should ignore nil values in database name" do
109
+ @class.connection[:suffix] = nil
110
+ db = @class.prepare_database('test')
111
+ db.name.should eql('couchrest_test')
112
+ end
113
+ end
114
+
115
+ describe "protected methods" do
116
+
117
+ describe ".connection_configuration" do
118
+ it "should provide main config by default" do
119
+ @class.send(:connection_configuration).should eql(@class.connection)
120
+ end
121
+ it "should load file if available" do
122
+ @class.connection_config_file = File.join(FIXTURE_PATH, 'config', 'couchdb.yml')
123
+ hash = @class.send(:connection_configuration)
124
+ hash[:protocol].should eql('https')
125
+ hash[:host].should eql('sample.cloudant.com')
126
+ hash[:join].should eql('_')
127
+ end
128
+ end
129
+
130
+ describe ".load_connection_config_file" do
131
+ it "should provide an empty hash if config not found" do
132
+ @class.send(:load_connection_config_file).should eql({})
133
+ end
134
+ it "should load file if available" do
135
+ @class.connection_config_file = File.join(FIXTURE_PATH, 'config', 'couchdb.yml')
136
+ hash = @class.send(:load_connection_config_file)
137
+ hash[:development].should_not be_nil
138
+ @class.server.uri.should eql("https://test:user@sample.cloudant.com:443")
139
+ end
140
+
141
+ end
142
+
143
+ end
144
+
145
+ end
146
+
147
+
148
+ end