openlogic-couchrest_model 1.0.0

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.
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