vkontakte_api 1.2 → 1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +5 -0
- data/Guardfile +3 -1
- data/README.md +9 -3
- data/lib/vkontakte_api/client.rb +10 -0
- data/lib/vkontakte_api/namespace.rb +30 -1
- data/lib/vkontakte_api/resolvable.rb +1 -1
- data/lib/vkontakte_api/resolver.rb +13 -28
- data/lib/vkontakte_api/uploading.rb +3 -3
- data/lib/vkontakte_api/version.rb +1 -1
- data/spec/integration_spec.rb +24 -27
- data/spec/vkontakte_api/api_spec.rb +13 -13
- data/spec/vkontakte_api/authorization_spec.rb +27 -24
- data/spec/vkontakte_api/client_spec.rb +74 -38
- data/spec/vkontakte_api/configuration_spec.rb +12 -11
- data/spec/vkontakte_api/error_spec.rb +10 -12
- data/spec/vkontakte_api/logger_spec.rb +31 -28
- data/spec/vkontakte_api/method_spec.rb +21 -18
- data/spec/vkontakte_api/namespace_spec.rb +47 -1
- data/spec/vkontakte_api/resolvable_spec.rb +5 -7
- data/spec/vkontakte_api/resolver_spec.rb +6 -66
- data/spec/vkontakte_api/result_spec.rb +43 -34
- data/spec/vkontakte_api/uploading_spec.rb +20 -16
- data/spec/vkontakte_api/utils_spec.rb +15 -18
- data/spec/vkontakte_api_spec.rb +9 -7
- data/vkontakte_api.gemspec +7 -2
- metadata +34 -4
@@ -1,5 +1,51 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe VkontakteApi::Namespace do
|
4
|
-
|
4
|
+
describe ".names" do
|
5
|
+
before(:each) do
|
6
|
+
VkontakteApi::Namespace.instance_variable_set(:@names, nil)
|
7
|
+
end
|
8
|
+
|
9
|
+
context "on first call" do
|
10
|
+
it "loads namespaces from a file" do
|
11
|
+
filename = double("Filename")
|
12
|
+
expect(File).to receive(:expand_path).and_return(filename)
|
13
|
+
namespaces = double("Namespaces list")
|
14
|
+
expect(YAML).to receive(:load_file).with(filename).and_return(namespaces)
|
15
|
+
|
16
|
+
VkontakteApi::Namespace.names
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "on subsequent calls" do
|
21
|
+
before(:each) do
|
22
|
+
VkontakteApi::Namespace.names
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns the cached list" do
|
26
|
+
expect(YAML).not_to receive(:load_file)
|
27
|
+
VkontakteApi::Namespace.names
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".exists?" do
|
33
|
+
context "with an existing namespace" do
|
34
|
+
it "returns true" do
|
35
|
+
expect(VkontakteApi::Namespace).to exist('users')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "with a non-existent namespace" do
|
40
|
+
it "returns false" do
|
41
|
+
expect(VkontakteApi::Namespace).not_to exist('admins')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "with an existing symbol namespace" do
|
46
|
+
it "returns true" do
|
47
|
+
expect(VkontakteApi::Namespace).to exist(:users)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
5
51
|
end
|
@@ -8,14 +8,12 @@ describe VkontakteApi::Resolvable do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe "#initialize" do
|
11
|
-
it "
|
12
|
-
|
13
|
-
|
14
|
-
resolver = Hashie::Mash.new(token: token)
|
11
|
+
it "saves the name and the resolver" do
|
12
|
+
resolver = Hashie::Mash.new(token: 'token')
|
13
|
+
resolvable = @class.new(:name, resolver: resolver)
|
15
14
|
|
16
|
-
resolvable
|
17
|
-
resolvable.
|
18
|
-
resolvable.token.should == token
|
15
|
+
expect(resolvable.name).to eq('name')
|
16
|
+
expect(resolvable.token).to eq('token')
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
@@ -11,39 +11,6 @@ describe VkontakteApi::Resolver do
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
describe "#method_missing" do
|
15
|
-
before(:each) do
|
16
|
-
@resolver = @class.new(:trololo)
|
17
|
-
@token = double("Token")
|
18
|
-
@resolver.stub(:token).and_return(@token)
|
19
|
-
end
|
20
|
-
|
21
|
-
context "called with a namespace" do
|
22
|
-
it "returns a Namespace instance" do
|
23
|
-
namespace = @resolver.users
|
24
|
-
namespace.should be_a(VkontakteApi::Namespace)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context "called with a method" do
|
29
|
-
before(:each) do
|
30
|
-
@result = double("Result")
|
31
|
-
@method = double("Method", call: @result)
|
32
|
-
VkontakteApi::Method.stub(:new).and_return(@method)
|
33
|
-
end
|
34
|
-
|
35
|
-
it "creates a Method instance" do
|
36
|
-
VkontakteApi::Method.should_receive(:new).with('get', resolver: @resolver.resolver)
|
37
|
-
@resolver.get(id: 1)
|
38
|
-
end
|
39
|
-
|
40
|
-
it "calls Method#call and returns the result" do
|
41
|
-
@method.should_receive(:call).with(id: 1)
|
42
|
-
@resolver.get(id: 1).should == @result
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
14
|
describe "#send" do
|
48
15
|
before(:each) do
|
49
16
|
@resolver = @class.new('trololo')
|
@@ -53,7 +20,7 @@ describe VkontakteApi::Resolver do
|
|
53
20
|
|
54
21
|
it "gets into #method_missing" do
|
55
22
|
method = double("Method", call: nil)
|
56
|
-
|
23
|
+
expect(@resolver).to receive(:method_missing).with(:send, message: 'hello')
|
57
24
|
@resolver.send(message: 'hello')
|
58
25
|
end
|
59
26
|
end
|
@@ -66,44 +33,17 @@ describe VkontakteApi::Resolver do
|
|
66
33
|
@resolver.stub(:token).and_return(@token)
|
67
34
|
end
|
68
35
|
|
36
|
+
let(:resolver) { @resolver.resolver }
|
37
|
+
|
69
38
|
it "returns a Hashie::Mash with a name and a token" do
|
70
|
-
|
71
|
-
|
72
|
-
r.token.should == @token
|
39
|
+
expect(resolver.name).to eq(@name)
|
40
|
+
expect(resolver.token).to eq(@token)
|
73
41
|
end
|
74
42
|
|
75
43
|
it "caches the result" do
|
76
44
|
@mash = double("Mash", name: @name, token: @token)
|
77
|
-
Hashie::Mash.
|
45
|
+
expect(Hashie::Mash).to receive(:new).once.and_return(@mash)
|
78
46
|
5.times { @resolver.resolver }
|
79
47
|
end
|
80
48
|
end
|
81
|
-
|
82
|
-
describe ".namespaces" do
|
83
|
-
before(:each) do
|
84
|
-
VkontakteApi::Resolver.instance_variable_set(:@namespaces, nil)
|
85
|
-
end
|
86
|
-
|
87
|
-
context "on first call" do
|
88
|
-
it "loads namespaces from a file" do
|
89
|
-
filename = double("Filename")
|
90
|
-
File.should_receive(:expand_path).and_return(filename)
|
91
|
-
namespaces = double("Namespaces list")
|
92
|
-
YAML.should_receive(:load_file).with(filename).and_return(namespaces)
|
93
|
-
|
94
|
-
VkontakteApi::Resolver.namespaces
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
context "on subsequent calls" do
|
99
|
-
before(:each) do
|
100
|
-
VkontakteApi::Resolver.namespaces
|
101
|
-
end
|
102
|
-
|
103
|
-
it "returns the cached list" do
|
104
|
-
YAML.should_not_receive(:load_file)
|
105
|
-
VkontakteApi::Resolver.namespaces
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
49
|
end
|
@@ -2,90 +2,99 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe VkontakteApi::Result do
|
4
4
|
describe ".process" do
|
5
|
+
let(:response) { double("Response") }
|
6
|
+
let(:result) { double("Result") }
|
7
|
+
|
5
8
|
before(:each) do
|
6
|
-
|
7
|
-
@result = double("Result")
|
8
|
-
subject.stub(:extract_result).and_return(@result)
|
9
|
+
subject.stub(:extract_result).and_return(result)
|
9
10
|
end
|
10
11
|
|
11
12
|
it "calls .extract_result passing it the response" do
|
12
|
-
subject.
|
13
|
-
subject.process(
|
13
|
+
expect(subject).to receive(:extract_result).with(response)
|
14
|
+
subject.process(response, :anything, nil)
|
14
15
|
end
|
15
16
|
|
16
17
|
context "with a non-enumerable result" do
|
18
|
+
let(:type) { double("Type") }
|
19
|
+
let(:typecasted_value) { double("Typecasted value") }
|
20
|
+
|
17
21
|
before(:each) do
|
18
|
-
|
19
|
-
@typecasted_value = double("Typecasted value")
|
20
|
-
subject.stub(:typecast).and_return(@typecasted_value)
|
22
|
+
subject.stub(:typecast).and_return(typecasted_value)
|
21
23
|
end
|
22
24
|
|
23
25
|
it "returns #typecast-ed value" do
|
24
|
-
subject.
|
25
|
-
subject.
|
26
|
+
expect(subject).to receive(:typecast).with(result, type).and_return(typecasted_value)
|
27
|
+
expect(subject.process(result, type, nil)).to eq(typecasted_value)
|
26
28
|
end
|
27
29
|
|
28
30
|
context "when block_given?" do
|
29
31
|
it "yields the #typecast-ed value and returns the result of the block" do
|
30
32
|
block_result = double("Block result")
|
31
|
-
|
33
|
+
expect(typecasted_value).to receive(:result_method).and_return(block_result)
|
32
34
|
block = proc(&:result_method)
|
33
35
|
|
34
|
-
subject.
|
36
|
+
expect(subject.process(response, type, block)).to eq(block_result)
|
35
37
|
end
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
39
41
|
context "with an enumerable result" do
|
42
|
+
let(:element1) { double("First element") }
|
43
|
+
let(:element2) { double("Second element") }
|
44
|
+
let(:enumerable_result) { [element1, element2] }
|
45
|
+
|
40
46
|
before(:each) do
|
41
|
-
|
42
|
-
@element2 = double("Second element")
|
43
|
-
@enumerable_result = [@element1, @element2]
|
44
|
-
subject.stub(:extract_result).and_return(@enumerable_result)
|
47
|
+
subject.stub(:extract_result).and_return(enumerable_result)
|
45
48
|
end
|
46
49
|
|
47
50
|
it "returns the untouched value" do
|
48
|
-
subject.
|
51
|
+
expect(subject.process(enumerable_result, :anything, nil)).to eq(enumerable_result)
|
49
52
|
end
|
50
53
|
|
51
54
|
context "when block_given?" do
|
52
55
|
it "yields each element untouched to the block" do
|
53
56
|
result1 = double("First element after result_method")
|
54
57
|
result2 = double("Second element after result_method")
|
55
|
-
|
56
|
-
|
58
|
+
expect(element1).to receive(:result_method).and_return(result1)
|
59
|
+
expect(element2).to receive(:result_method).and_return(result2)
|
57
60
|
block = proc(&:result_method)
|
58
61
|
|
59
|
-
subject.
|
62
|
+
expect(subject.process(enumerable_result, :anything, block)).to eq([result1, result2])
|
60
63
|
end
|
61
64
|
end
|
62
65
|
end
|
63
66
|
end
|
64
67
|
|
65
68
|
describe ".extract_result" do
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
+
let(:result_response) do
|
70
|
+
{ 'key' => 'value' }
|
71
|
+
end
|
72
|
+
|
73
|
+
let(:result_error) do
|
74
|
+
{
|
75
|
+
'request_params' => [
|
76
|
+
{
|
77
|
+
'key' => 'error',
|
78
|
+
'value' => 'description'
|
79
|
+
}
|
80
|
+
]
|
81
|
+
}
|
69
82
|
end
|
70
83
|
|
71
84
|
context "with a successful response" do
|
72
|
-
|
73
|
-
@result = Hashie::Mash.new(response: @result_response)
|
74
|
-
end
|
85
|
+
let(:result) { Hashie::Mash.new(response: result_response) }
|
75
86
|
|
76
87
|
it "returns the response part" do
|
77
|
-
subject.send(:extract_result,
|
88
|
+
expect(subject.send(:extract_result, result)).to eq(result_response)
|
78
89
|
end
|
79
90
|
end
|
80
91
|
|
81
92
|
context "with an error response" do
|
82
|
-
|
83
|
-
@result = Hashie::Mash.new(error: @result_error)
|
84
|
-
end
|
93
|
+
let(:result) { Hashie::Mash.new(error: result_error) }
|
85
94
|
|
86
95
|
it "raises a VkontakteApi::Error" do
|
87
96
|
expect {
|
88
|
-
subject.send(:extract_result,
|
97
|
+
subject.send(:extract_result, result)
|
89
98
|
}.to raise_error(VkontakteApi::Error)
|
90
99
|
end
|
91
100
|
end
|
@@ -94,20 +103,20 @@ describe VkontakteApi::Result do
|
|
94
103
|
describe ".typecast" do
|
95
104
|
context "with an :anything type" do
|
96
105
|
it "returns it's argument untouched" do
|
97
|
-
subject.send(:typecast, :some_arg, :anything).
|
106
|
+
expect(subject.send(:typecast, :some_arg, :anything)).to eq(:some_arg)
|
98
107
|
end
|
99
108
|
end
|
100
109
|
|
101
110
|
context "with a :boolean type" do
|
102
111
|
context "and zero result" do
|
103
112
|
it "returns false" do
|
104
|
-
subject.send(:typecast, '0', :boolean).
|
113
|
+
expect(subject.send(:typecast, '0', :boolean)).to eq(false)
|
105
114
|
end
|
106
115
|
end
|
107
116
|
|
108
117
|
context "and non-zero parameter" do
|
109
118
|
it "returns true" do
|
110
|
-
subject.send(:typecast, '1', :boolean).
|
119
|
+
expect(subject.send(:typecast, '1', :boolean)).to eq(true)
|
111
120
|
end
|
112
121
|
end
|
113
122
|
end
|
@@ -1,26 +1,27 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe VkontakteApi::Uploading do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
let(:uploader) do
|
5
|
+
Object.new.tap do |object|
|
6
|
+
object.extend VkontakteApi::Uploading
|
7
|
+
end
|
7
8
|
end
|
8
9
|
|
9
10
|
describe "#upload" do
|
11
|
+
let(:upload_io) { double("Faraday::UploadIO instance") }
|
12
|
+
let(:response_body) { double("Server response body") }
|
13
|
+
let(:response) { double("Server response", body: response_body) }
|
14
|
+
let(:connection) { double("Faraday connection", post: response) }
|
15
|
+
|
10
16
|
before(:each) do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@response_body = double("Server response body")
|
15
|
-
response = double("Server response", body: @response_body)
|
16
|
-
@connection = double("Faraday connection", post: response)
|
17
|
-
VkontakteApi::API.stub(:connection).and_return(@connection)
|
17
|
+
Faraday::UploadIO.stub(:new).and_return(upload_io)
|
18
|
+
VkontakteApi::API.stub(:connection).and_return(connection)
|
18
19
|
end
|
19
20
|
|
20
21
|
context "without a :url param" do
|
21
22
|
it "raises an ArgumentError" do
|
22
23
|
expect {
|
23
|
-
|
24
|
+
uploader.upload
|
24
25
|
}.to raise_error(ArgumentError)
|
25
26
|
end
|
26
27
|
end
|
@@ -28,19 +29,22 @@ describe VkontakteApi::Uploading do
|
|
28
29
|
it "creates a Faraday::UploadIO for each file passed in" do
|
29
30
|
path = double("File path")
|
30
31
|
type = double("File mime type")
|
31
|
-
|
32
|
-
|
32
|
+
io = double("File IO")
|
33
|
+
|
34
|
+
expect(Faraday::UploadIO).to receive(:new).with(path, type, nil)
|
35
|
+
expect(Faraday::UploadIO).to receive(:new).with(io, type, path)
|
36
|
+
uploader.upload(url: 'http://example.com', file1: [path, type], file2: [io, type, path])
|
33
37
|
end
|
34
38
|
|
35
39
|
it "POSTs the files through the connection to a given URL" do
|
36
40
|
url = double("URL")
|
37
41
|
file = double("File")
|
38
|
-
|
39
|
-
|
42
|
+
expect(connection).to receive(:post).with(url, file1: upload_io)
|
43
|
+
uploader.upload(url: url, file1: file)
|
40
44
|
end
|
41
45
|
|
42
46
|
it "returns the server response" do
|
43
|
-
|
47
|
+
expect(uploader.upload(url: 'http://example.com')).to eq(response_body)
|
44
48
|
end
|
45
49
|
end
|
46
50
|
end
|
@@ -2,45 +2,42 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe VkontakteApi::Utils do
|
4
4
|
describe ".flatten_arguments" do
|
5
|
+
let(:arg1) { double("First argument") }
|
6
|
+
let(:arg2) { double("Second argument") }
|
7
|
+
let(:flat_arg1) { double("Flattened first argument") }
|
8
|
+
let(:flat_arg2) { double("Flattened second argument") }
|
9
|
+
|
5
10
|
before(:each) do
|
6
|
-
@arg1 = double("First argument")
|
7
|
-
@arg2 = double("Second argument")
|
8
|
-
@flat_arg1 = double("Flattened first argument")
|
9
|
-
@flat_arg2 = double("Flattened second argument")
|
10
|
-
|
11
11
|
VkontakteApi::Utils.stub(:flatten_argument) do |arg|
|
12
12
|
case arg
|
13
|
-
when
|
14
|
-
when
|
13
|
+
when arg1 then flat_arg1
|
14
|
+
when arg2 then flat_arg2
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
it "sends each value to .flatten_argument" do
|
20
|
-
flat_arguments = VkontakteApi::Utils.flatten_arguments(arg1:
|
21
|
-
flat_arguments.
|
20
|
+
flat_arguments = VkontakteApi::Utils.flatten_arguments(arg1: arg1, arg2: arg2)
|
21
|
+
expect(flat_arguments).to eq(arg1: flat_arg1, arg2: flat_arg2)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
describe ".flatten_argument" do
|
26
26
|
context "with a flat argument" do
|
27
|
-
|
28
|
-
@argument = :flat
|
29
|
-
end
|
27
|
+
let(:argument) { :flat }
|
30
28
|
|
31
29
|
it "leaves it untouched" do
|
32
|
-
subject.send(:flatten_argument,
|
30
|
+
result = subject.send(:flatten_argument, argument)
|
31
|
+
expect(result).to eq(argument)
|
33
32
|
end
|
34
33
|
end
|
35
34
|
|
36
35
|
context "with an array argument" do
|
37
|
-
|
38
|
-
@array_argument = [1, 2, 3]
|
39
|
-
end
|
36
|
+
let(:array_argument) { [1, 2, 3] }
|
40
37
|
|
41
38
|
it "joins the elements with a comma" do
|
42
|
-
flat_argument = subject.send(:flatten_argument,
|
43
|
-
flat_argument.
|
39
|
+
flat_argument = subject.send(:flatten_argument, array_argument)
|
40
|
+
expect(flat_argument).to eq('1,2,3')
|
44
41
|
end
|
45
42
|
end
|
46
43
|
end
|