couchrest 1.2.1 → 2.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +2 -0
- data/.travis.yml +1 -0
- data/README.md +11 -7
- data/VERSION +1 -1
- data/couchrest.gemspec +7 -6
- data/history.txt +8 -0
- data/lib/couchrest.rb +26 -31
- data/lib/couchrest/connection.rb +251 -0
- data/lib/couchrest/database.rb +75 -79
- data/lib/couchrest/design.rb +1 -1
- data/lib/couchrest/exceptions.rb +108 -0
- data/lib/couchrest/helper/pager.rb +3 -1
- data/lib/couchrest/helper/stream_row_parser.rb +93 -0
- data/lib/couchrest/rest_api.rb +33 -134
- data/lib/couchrest/server.rb +34 -47
- data/spec/couchrest/connection_spec.rb +415 -0
- data/spec/couchrest/couchrest_spec.rb +61 -67
- data/spec/couchrest/database_spec.rb +151 -147
- data/spec/couchrest/design_spec.rb +28 -28
- data/spec/couchrest/document_spec.rb +72 -70
- data/spec/couchrest/exceptions_spec.rb +74 -0
- data/spec/couchrest/helpers/pager_spec.rb +22 -22
- data/spec/couchrest/helpers/stream_row_parser_spec.rb +154 -0
- data/spec/couchrest/rest_api_spec.rb +44 -208
- data/spec/couchrest/server_spec.rb +0 -29
- data/spec/spec_helper.rb +11 -6
- metadata +31 -17
- data/lib/couchrest/helper/streamer.rb +0 -63
- data/lib/couchrest/monkeypatches.rb +0 -25
- data/spec/couchrest/helpers/streamer_spec.rb +0 -134
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe CouchRest::Exception do
|
4
|
+
it "returns a 'message' equal to the class name if the message is not set, because 'message' should not be nil" do
|
5
|
+
e = CouchRest::Exception.new
|
6
|
+
expect(e.message).to eq "CouchRest::Exception"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns the 'message' that was set" do
|
10
|
+
e = CouchRest::Exception.new
|
11
|
+
message = "An explicitly set message"
|
12
|
+
e.message = message
|
13
|
+
expect(e.message).to eq message
|
14
|
+
end
|
15
|
+
|
16
|
+
it "sets the exception message to ErrorMessage" do
|
17
|
+
expect(CouchRest::NotFound.new.message).to eq 'Not Found'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "contains exceptions in CouchRest" do
|
21
|
+
expect(CouchRest::Unauthorized.new).to be_a_kind_of(CouchRest::Exception)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe CouchRest::RequestFailed do
|
26
|
+
before do
|
27
|
+
@response = double('HTTP Response', :status => 500)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "stores the http response on the exception" do
|
31
|
+
response = "response"
|
32
|
+
begin
|
33
|
+
raise CouchRest::RequestFailed, response
|
34
|
+
rescue CouchRest::RequestFailed => e
|
35
|
+
expect(e.response).to eq response
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "http_code convenience method for fetching the code as an integer" do
|
40
|
+
expect(CouchRest::RequestFailed.new(@response).http_code).to eq 500
|
41
|
+
end
|
42
|
+
|
43
|
+
it "http_body convenience method for fetching the body (decoding when necessary)" do
|
44
|
+
expect(CouchRest::RequestFailed.new(@response).http_code).to eq 500
|
45
|
+
expect(CouchRest::RequestFailed.new(@response).message).to eq 'HTTP status code 500'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "shows the status code in the message" do
|
49
|
+
expect(CouchRest::RequestFailed.new(@response).to_s).to match(/500/)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe CouchRest::NotFound do
|
54
|
+
it "also has the http response attached" do
|
55
|
+
response = "response"
|
56
|
+
begin
|
57
|
+
raise CouchRest::NotFound, response
|
58
|
+
rescue CouchRest::NotFound => e
|
59
|
+
expect(e.response).to eq response
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'stores the body on the response of the exception' do
|
64
|
+
body = "body"
|
65
|
+
stub_request(:get, "http://www.example.com").to_return(:body => body, :status => 404)
|
66
|
+
begin
|
67
|
+
CouchRest.get "http://www.example.com"
|
68
|
+
raise
|
69
|
+
rescue CouchRest::NotFound => e
|
70
|
+
expect(e.response.body).to eq body
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
@@ -22,7 +22,7 @@ describe CouchRest::Pager do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should store the db" do
|
25
|
-
@pager.db.
|
25
|
+
expect(@pager.db).to eql @db
|
26
26
|
end
|
27
27
|
|
28
28
|
describe "paging all docs" do
|
@@ -31,22 +31,22 @@ describe CouchRest::Pager do
|
|
31
31
|
@pager.all_docs(10) do |doc|
|
32
32
|
n += 1
|
33
33
|
end
|
34
|
-
n.
|
34
|
+
expect(n).to eql 10
|
35
35
|
end
|
36
36
|
it "should yield each docrow group without duplicate docs" do
|
37
37
|
docids = {}
|
38
38
|
@pager.all_docs(10) do |docrows|
|
39
39
|
docrows.each do |row|
|
40
|
-
docids[row['id']].
|
40
|
+
expect(docids[row['id']]).to be_nil
|
41
41
|
docids[row['id']] = true
|
42
42
|
end
|
43
43
|
end
|
44
|
-
docids.keys.length.
|
44
|
+
expect(docids.keys.length).to eql 100
|
45
45
|
end
|
46
46
|
it "should yield each docrow group" do
|
47
47
|
@pager.all_docs(10) do |docrows|
|
48
48
|
doc = @db.get(docrows[0]['id'])
|
49
|
-
doc['number'].class.
|
49
|
+
expect(doc['number'].class).to eql Fixnum
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -64,12 +64,12 @@ describe CouchRest::Pager do
|
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should have docs" do
|
67
|
-
@docs.length.
|
68
|
-
@db.documents['rows'].length.
|
67
|
+
expect(@docs.length).to eql 100
|
68
|
+
expect(@db.documents['rows'].length).to eql 101
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should have a view" do
|
72
|
-
@db.view('magic/number', :limit => 10)['rows'][0]['key'].
|
72
|
+
expect(@db.view('magic/number', :limit => 10)['rows'][0]['key']).to eql 0
|
73
73
|
end
|
74
74
|
|
75
75
|
it "should yield once per key" do
|
@@ -77,8 +77,8 @@ describe CouchRest::Pager do
|
|
77
77
|
@pager.key_reduce('magic/number', 20) do |k,vs|
|
78
78
|
results[k] = vs.length
|
79
79
|
end
|
80
|
-
results[0].
|
81
|
-
results[3].
|
80
|
+
expect(results[0]).to eql 10
|
81
|
+
expect(results[3]).to eql 10
|
82
82
|
end
|
83
83
|
|
84
84
|
it "with a small step size should yield once per key" do
|
@@ -86,30 +86,30 @@ describe CouchRest::Pager do
|
|
86
86
|
@pager.key_reduce('magic/number', 7) do |k,vs|
|
87
87
|
results[k] = vs.length
|
88
88
|
end
|
89
|
-
results[0].
|
90
|
-
results[3].
|
91
|
-
results[9].
|
89
|
+
expect(results[0]).to eql 10
|
90
|
+
expect(results[3]).to eql 10
|
91
|
+
expect(results[9]).to eql 10
|
92
92
|
end
|
93
93
|
it "with a large step size should yield once per key" do
|
94
94
|
results = {}
|
95
95
|
@pager.key_reduce('magic/number', 1000) do |k,vs|
|
96
96
|
results[k] = vs.length
|
97
97
|
end
|
98
|
-
results[0].
|
99
|
-
results[3].
|
100
|
-
results[9].
|
98
|
+
expect(results[0]).to eql 10
|
99
|
+
expect(results[3]).to eql 10
|
100
|
+
expect(results[9]).to eql 10
|
101
101
|
end
|
102
102
|
it "with a begin and end should only yield in the range (and leave out the lastkey)" do
|
103
103
|
results = {}
|
104
104
|
@pager.key_reduce('magic/number', 1000, 4, 7) do |k,vs|
|
105
105
|
results[k] = vs.length
|
106
106
|
end
|
107
|
-
results[0].
|
108
|
-
results[4].
|
109
|
-
results[6].
|
110
|
-
results[7].
|
111
|
-
results[8].
|
112
|
-
results[9].
|
107
|
+
expect(results[0]).to be_nil
|
108
|
+
expect(results[4]).to eql 10
|
109
|
+
expect(results[6]).to eql 10
|
110
|
+
expect(results[7]).to be_nil
|
111
|
+
expect(results[8]).to be_nil
|
112
|
+
expect(results[9]).to be_nil
|
113
113
|
end
|
114
114
|
end
|
115
115
|
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require File.expand_path("../../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe CouchRest::StreamRowParser do
|
4
|
+
|
5
|
+
describe :initialize do
|
6
|
+
|
7
|
+
let :obj do
|
8
|
+
CouchRest::StreamRowParser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should provide object" do
|
12
|
+
expect(obj).to_not be_nil
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#parse with rows" do
|
18
|
+
|
19
|
+
let :obj do
|
20
|
+
CouchRest::StreamRowParser.new
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should parse a basic complete segment" do
|
24
|
+
data = <<-EOF
|
25
|
+
{
|
26
|
+
"total_rows": 3, "offset": 0, "rows": [
|
27
|
+
{"id": "doc1", "key": "doc1", "value": {"rev": "4324BB"}},
|
28
|
+
{"id": "doc2", "key": "doc2", "value": {"rev":"2441HF"}},
|
29
|
+
{"id": "doc3", "key": "doc3", "value": {"rev":"74EC24"}}
|
30
|
+
]
|
31
|
+
}
|
32
|
+
EOF
|
33
|
+
rows = []
|
34
|
+
obj.parse(data) do |row|
|
35
|
+
rows << row
|
36
|
+
end
|
37
|
+
|
38
|
+
expect(rows.length).to eql(3)
|
39
|
+
row = nil
|
40
|
+
expect do
|
41
|
+
row = MultiJson.load(rows[0])
|
42
|
+
end.to_not raise_error
|
43
|
+
expect(row['id']).to eql('doc1')
|
44
|
+
|
45
|
+
head = nil
|
46
|
+
expect do
|
47
|
+
head = MultiJson.load(obj.header)
|
48
|
+
end.to_not raise_error
|
49
|
+
expect(head).to include('total_rows')
|
50
|
+
expect(head['total_rows']).to eql(3)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should deal with basic data in segments" do
|
54
|
+
data = []
|
55
|
+
data << '{ "total_rows": 3, "offset": 0, "ro'
|
56
|
+
data << 'ws": [ {"id": "doc1", "key": "doc1", "value": {"rev": '
|
57
|
+
data << '"4324BB"}}, {"id": "doc2", "key": "doc2", "value": '
|
58
|
+
data << '{"rev":"2441HF"}}, {"id": "doc3", "key": "doc3", "value": {"rev":"74EC24"}}'
|
59
|
+
data << '] }'
|
60
|
+
|
61
|
+
rows = []
|
62
|
+
data.each do |d|
|
63
|
+
obj.parse(d) do |row|
|
64
|
+
rows << row
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
expect(rows.length).to eql(3)
|
69
|
+
row = nil
|
70
|
+
expect do
|
71
|
+
row = MultiJson.load(rows[1])
|
72
|
+
end.to_not raise_error
|
73
|
+
expect(row['id']).to eql('doc2')
|
74
|
+
|
75
|
+
head = nil
|
76
|
+
expect do
|
77
|
+
head = MultiJson.load(obj.header)
|
78
|
+
end.to_not raise_error
|
79
|
+
expect(head).to include('total_rows')
|
80
|
+
expect(head['total_rows']).to eql(3)
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
it "should handle strings with '}'" do
|
85
|
+
data = <<-EOF
|
86
|
+
{
|
87
|
+
"total_rows": 3, "offset": 0, "rows": [
|
88
|
+
{"id": "doc1", "key": "doc1", "value": {"rev":"43}24BB"}},
|
89
|
+
{"id": "doc2", "key": "doc2", "value": {"rev":"2{441HF"}},
|
90
|
+
{"id": "doc3", "key": "doc3", "value": {"rev":"74EC24"}}
|
91
|
+
]
|
92
|
+
}
|
93
|
+
EOF
|
94
|
+
rows = []
|
95
|
+
obj.parse(data) do |row|
|
96
|
+
rows << row
|
97
|
+
end
|
98
|
+
expect(rows.length).to eql(3)
|
99
|
+
expect(rows.first).to match(/43}24BB/)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should handle escaped chars" do
|
103
|
+
data = <<-EOF
|
104
|
+
{
|
105
|
+
"total_rows": 3, "offset": 0, "rows": [
|
106
|
+
{"id": "doc1", "key": "doc1", "value": {"rev":"43\\"4BB"}},
|
107
|
+
{"id": "doc2", "key": "doc2", "value": {"rev":"2441HF"}},
|
108
|
+
{"id": "doc3", "key": "doc3", "value": {"rev":"74EC24"}}
|
109
|
+
]
|
110
|
+
}
|
111
|
+
EOF
|
112
|
+
rows = []
|
113
|
+
obj.parse(data) do |row|
|
114
|
+
rows << row
|
115
|
+
end
|
116
|
+
expect(rows.length).to eql(3)
|
117
|
+
row = MultiJson.load(rows.first)
|
118
|
+
expect(row['value']['rev']).to match(/43"4BB/)
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
describe "#parse with feed" do
|
125
|
+
|
126
|
+
let :obj do
|
127
|
+
CouchRest::StreamRowParser.new(:feed)
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should parse a basic complete segment" do
|
131
|
+
data = <<-EOF
|
132
|
+
{"id": "doc1", "key": "doc1", "value": {"rev": "4324BB"}}
|
133
|
+
{"id": "doc2", "key": "doc2", "value": {"rev":"2441HF"}}
|
134
|
+
{"id": "doc3", "key": "doc3", "value": {"rev":"74EC24"}}
|
135
|
+
EOF
|
136
|
+
rows = []
|
137
|
+
obj.parse(data) do |row|
|
138
|
+
rows << row
|
139
|
+
end
|
140
|
+
|
141
|
+
expect(rows.length).to eql(3)
|
142
|
+
row = nil
|
143
|
+
expect do
|
144
|
+
row = MultiJson.load(rows[0])
|
145
|
+
end.to_not raise_error
|
146
|
+
expect(row['id']).to eql('doc1')
|
147
|
+
|
148
|
+
obj.header.should be_empty
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
@@ -6,236 +6,72 @@ describe CouchRest::RestAPI do
|
|
6
6
|
|
7
7
|
subject { CouchRest }
|
8
8
|
|
9
|
-
let
|
10
|
-
|
11
|
-
let(:parser) { MultiJson }
|
12
|
-
let(:parser_opts) { {:max_nesting => false} }
|
13
|
-
|
14
|
-
it "should exist" do
|
15
|
-
should respond_to :get
|
16
|
-
should respond_to :put
|
17
|
-
should respond_to :post
|
18
|
-
should respond_to :copy
|
19
|
-
should respond_to :delete
|
20
|
-
should respond_to :head
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should provide default headers" do
|
24
|
-
should respond_to :default_headers
|
25
|
-
CouchRest.default_headers.should be_a(Hash)
|
9
|
+
let :mock_conn do
|
10
|
+
CouchRest::Connection.new(URI "http://mock")
|
26
11
|
end
|
27
12
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should never modify options" do
|
38
|
-
options = {:timeout => 1000}
|
39
|
-
options.freeze
|
40
|
-
request.should_receive(:execute).and_return(simple_response)
|
41
|
-
parser.should_receive(:decode)
|
42
|
-
expect { CouchRest.get('foo', options) }.to_not raise_error
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
it "should accept 'content_type' header" do
|
47
|
-
req = {:url => 'foo', :method => :get, :headers => CouchRest.default_headers.merge(:content_type => :foo)}
|
48
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
49
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
50
|
-
CouchRest.get('foo', :content_type => :foo)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should accept 'accept' header" do
|
54
|
-
req = {:url => 'foo', :method => :get, :headers => CouchRest.default_headers.merge(:accept => :foo)}
|
55
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
56
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
57
|
-
CouchRest.get('foo', :accept => :foo)
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should forward RestClient options" do
|
61
|
-
req = {:url => 'foo', :method => :get, :timeout => 1000, :headers => CouchRest.default_headers}
|
62
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
63
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
64
|
-
CouchRest.get('foo', :timeout => 1000)
|
65
|
-
end
|
66
|
-
|
67
|
-
it "should forward parser options" do
|
68
|
-
req = {:url => 'foo', :method => :get, :headers => CouchRest.default_headers}
|
69
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
70
|
-
parser.should_receive(:decode).with(simple_response, parser_opts.merge(:random => 'foo'))
|
71
|
-
CouchRest.get('foo', :random => 'foo')
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should accept raw option" do
|
75
|
-
req = {:url => 'foo', :method => :get, :headers => CouchRest.default_headers}
|
76
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
77
|
-
parser.should_not_receive(:decode)
|
78
|
-
CouchRest.get('foo', :raw => true).should eql(simple_response)
|
79
|
-
end
|
80
|
-
|
81
|
-
it "should allow override of method (not that you'd want to!)" do
|
82
|
-
req = {:url => 'foo', :method => :fubar, :headers => CouchRest.default_headers}
|
83
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
84
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
85
|
-
CouchRest.get('foo', :method => :fubar)
|
86
|
-
end
|
87
|
-
|
88
|
-
it "should allow override of url (not that you'd want to!)" do
|
89
|
-
req = {:url => 'foobardom', :method => :get, :headers => CouchRest.default_headers}
|
90
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
91
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
92
|
-
CouchRest.get('foo', :url => 'foobardom')
|
93
|
-
end
|
94
|
-
|
95
|
-
|
96
|
-
it "should forward an exception if raised" do
|
97
|
-
request.should_receive(:execute).and_raise(RestClient::Exception)
|
98
|
-
expect { CouchRest.get('foo') }.to raise_error(RestClient::Exception)
|
99
|
-
end
|
100
|
-
|
101
|
-
context 'when decode_json_objects is true' do
|
102
|
-
class TestObject
|
103
|
-
def self.json_create(args)
|
104
|
-
new
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
before(:each) do
|
109
|
-
CouchRest.decode_json_objects = true
|
110
|
-
end
|
111
|
-
|
112
|
-
after(:each) do
|
113
|
-
CouchRest.decode_json_objects = false
|
114
|
-
end
|
115
|
-
|
116
|
-
it 'should return the response as a Ruby object' do
|
117
|
-
CouchRest.put "#{COUCHHOST}/#{TESTDB}/test", JSON.create_id => TestObject.to_s
|
118
|
-
|
119
|
-
CouchRest.get("#{COUCHHOST}/#{TESTDB}/test").class.should eql(TestObject)
|
120
|
-
end
|
121
|
-
end
|
13
|
+
it "should exist" do
|
14
|
+
expect(subject).to respond_to :get
|
15
|
+
expect(subject).to respond_to :put
|
16
|
+
expect(subject).to respond_to :post
|
17
|
+
expect(subject).to respond_to :copy
|
18
|
+
expect(subject).to respond_to :delete
|
19
|
+
expect(subject).to respond_to :head
|
122
20
|
end
|
123
21
|
|
124
|
-
describe
|
125
|
-
it "should send basic request" do
|
126
|
-
req = {:url => 'foo', :method => :post, :headers => CouchRest.default_headers, :payload => 'data'}
|
127
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
128
|
-
parser.should_receive(:encode).with('data').and_return('data')
|
129
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
130
|
-
CouchRest.post('foo', 'data')
|
131
|
-
end
|
132
|
-
|
133
|
-
it "should send basic request" do
|
134
|
-
req = {:url => 'foo', :method => :post, :headers => CouchRest.default_headers, :payload => 'data'}
|
135
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
136
|
-
parser.should_receive(:encode).with('data').and_return('data')
|
137
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
138
|
-
CouchRest.post('foo', 'data')
|
139
|
-
end
|
22
|
+
describe "basic forwarding" do
|
140
23
|
|
141
|
-
|
142
|
-
|
143
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
144
|
-
parser.should_not_receive(:encode)
|
145
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
146
|
-
CouchRest.post('foo', 'data', :raw => true)
|
24
|
+
let :uri do
|
25
|
+
URI("http://mock/db/doc")
|
147
26
|
end
|
148
27
|
|
149
|
-
it "should
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
28
|
+
it "should start and use connection" do
|
29
|
+
expect(CouchRest::Connection).to receive(:new)
|
30
|
+
.with(uri, {})
|
31
|
+
.and_return(mock_conn)
|
32
|
+
|
33
|
+
stub_request(:get, uri.to_s)
|
34
|
+
.to_return(:body => {'_id' => 'test', 'name' => 'none'}.to_json)
|
156
35
|
|
157
|
-
|
158
|
-
|
159
|
-
req = {:url => 'foo', :method => :post, :headers => CouchRest.default_headers, :payload => f}
|
160
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
161
|
-
parser.should_not_receive(:encode)
|
162
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
163
|
-
CouchRest.post('foo', f)
|
164
|
-
f.close
|
36
|
+
res = CouchRest.get(uri.to_s)
|
37
|
+
expect(res['name']).to eql('none')
|
165
38
|
end
|
166
39
|
|
167
|
-
it "should
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
f.close
|
175
|
-
end
|
40
|
+
it "should start connection with options" do
|
41
|
+
expect(CouchRest::Connection).to receive(:new)
|
42
|
+
.with(uri, hash_including(:test => 'foo'))
|
43
|
+
.and_return(mock_conn)
|
44
|
+
|
45
|
+
stub_request(:get, uri.to_s)
|
46
|
+
.to_return(:body => {'_id' => 'test', 'name' => 'none'}.to_json)
|
176
47
|
|
177
|
-
|
178
|
-
|
179
|
-
doc = CouchRest::Document.new(h)
|
180
|
-
doc.should_receive(:as_couch_json).and_return(h)
|
181
|
-
request.should_receive(:execute).and_return(simple_response)
|
182
|
-
parser.should_receive(:encode).with(h)
|
183
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
184
|
-
CouchRest.post('foo', doc)
|
48
|
+
res = CouchRest.get(uri.to_s, :test => 'foo')
|
49
|
+
expect(res['name']).to eql('none')
|
185
50
|
end
|
186
|
-
end
|
187
51
|
|
52
|
+
it "should handle query parameters and send them to connection" do
|
188
53
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
54
|
+
uri = URI("http://mock/db/doc?q=a")
|
55
|
+
expect(CouchRest::Connection).to receive(:new)
|
56
|
+
.with(uri, {})
|
57
|
+
.and_return(mock_conn)
|
58
|
+
stub_request(:get, uri.to_s)
|
59
|
+
.to_return(:body => {'_id' => 'test', 'name' => 'none'}.to_json)
|
60
|
+
res = CouchRest.get(uri.to_s)
|
61
|
+
expect(res['name']).to eql('none')
|
197
62
|
end
|
198
63
|
|
199
64
|
end
|
200
65
|
|
201
66
|
describe :delete do
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
describe :copy do
|
211
|
-
it "should send basic request" do
|
212
|
-
headers = CouchRest.default_headers.merge(
|
213
|
-
'Destination' => 'fooobar'
|
214
|
-
)
|
215
|
-
req = {:url => 'foo', :method => :copy, :headers => headers}
|
216
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
217
|
-
parser.should_receive(:decode).with(simple_response, parser_opts)
|
218
|
-
CouchRest.copy('foo', 'fooobar')
|
67
|
+
|
68
|
+
it "should delete a document" do
|
69
|
+
res = CouchRest.post(DB.uri.to_s, {'name' => "TestDoc"})
|
70
|
+
res = CouchRest.delete("#{DB.uri.to_s}/#{res['id']}?rev=#{res['rev']}")
|
71
|
+
expect(res['ok']).to be_true
|
219
72
|
end
|
220
73
|
|
221
|
-
it "should never modify header options" do
|
222
|
-
options = {:headers => {:content_type => :foo}}
|
223
|
-
options.freeze
|
224
|
-
request.should_receive(:execute).and_return(simple_response)
|
225
|
-
parser.should_receive(:decode)
|
226
|
-
expect { CouchRest.copy('foo', 'foobar', options) }.to_not raise_error
|
227
|
-
end
|
228
|
-
|
229
|
-
end
|
230
|
-
|
231
|
-
describe :head do
|
232
|
-
it "should send basic request" do
|
233
|
-
req = {:url => 'foo', :method => :head, :headers => CouchRest.default_headers}
|
234
|
-
request.should_receive(:execute).with(req).and_return(simple_response)
|
235
|
-
CouchRest.head('foo')
|
236
|
-
end
|
237
74
|
end
|
238
75
|
|
239
76
|
end
|
240
|
-
|
241
77
|
end
|