trubl 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. data/.yardopts +8 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +72 -0
  4. data/Rakefile +11 -0
  5. data/lib/trubl.rb +30 -0
  6. data/lib/trubl/api/category.rb +33 -0
  7. data/lib/trubl/api/channel.rb +32 -0
  8. data/lib/trubl/api/conversation.rb +31 -0
  9. data/lib/trubl/api/hashtags.rb +45 -0
  10. data/lib/trubl/api/me.rb +68 -0
  11. data/lib/trubl/api/search.rb +35 -0
  12. data/lib/trubl/api/streams.rb +14 -0
  13. data/lib/trubl/api/suggested_users.rb +16 -0
  14. data/lib/trubl/api/touts.rb +143 -0
  15. data/lib/trubl/api/users.rb +79 -0
  16. data/lib/trubl/authorization.rb +7 -0
  17. data/lib/trubl/authorizations.rb +8 -0
  18. data/lib/trubl/base.rb +37 -0
  19. data/lib/trubl/category.rb +7 -0
  20. data/lib/trubl/channel.rb +7 -0
  21. data/lib/trubl/client.rb +252 -0
  22. data/lib/trubl/collection.rb +43 -0
  23. data/lib/trubl/conversation.rb +7 -0
  24. data/lib/trubl/hashtag.rb +7 -0
  25. data/lib/trubl/hashtags.rb +8 -0
  26. data/lib/trubl/oauth.rb +56 -0
  27. data/lib/trubl/pagination.rb +17 -0
  28. data/lib/trubl/tout.rb +29 -0
  29. data/lib/trubl/touts.rb +8 -0
  30. data/lib/trubl/user.rb +29 -0
  31. data/lib/trubl/users.rb +8 -0
  32. data/lib/trubl/version.rb +16 -0
  33. data/lib/trubl/widget.rb +15 -0
  34. data/lib/trubl/widgets.rb +8 -0
  35. data/spec/fixtures/category_response.json +1 -0
  36. data/spec/fixtures/category_touts_response.json +689 -0
  37. data/spec/fixtures/category_users_response.json +1709 -0
  38. data/spec/fixtures/channel_response.json +1 -0
  39. data/spec/fixtures/channel_touts_response.json +1 -0
  40. data/spec/fixtures/channel_users_response.json +1 -0
  41. data/spec/fixtures/client1_auth_resp.json +1 -0
  42. data/spec/fixtures/client2_auth_resp.json +1 -0
  43. data/spec/fixtures/conversation_authors_response.json +37 -0
  44. data/spec/fixtures/conversation_response.json +41 -0
  45. data/spec/fixtures/conversation_touts_response.json +107 -0
  46. data/spec/fixtures/featured_touts_response.json +4249 -0
  47. data/spec/fixtures/hashtag_response.json +1 -0
  48. data/spec/fixtures/hashtags_touts_response.json +304 -0
  49. data/spec/fixtures/latest_touts_response.json +3600 -0
  50. data/spec/fixtures/like_tout_response.json +109 -0
  51. data/spec/fixtures/me_authorizations_response.json +14 -0
  52. data/spec/fixtures/me_fb_sharing_response.json +21 -0
  53. data/spec/fixtures/me_friends_response.json +121 -0
  54. data/spec/fixtures/me_retrieve_user_friends_response.json +174 -0
  55. data/spec/fixtures/me_retrieve_user_liked_touts_response.json +1255 -0
  56. data/spec/fixtures/me_retrieve_user_touts_response.json +479 -0
  57. data/spec/fixtures/retout_tout_response.json +99 -0
  58. data/spec/fixtures/retrieve_me_response.json +35 -0
  59. data/spec/fixtures/retrieve_tout.json +98 -0
  60. data/spec/fixtures/retrieve_tout_response.json +98 -0
  61. data/spec/fixtures/search_hashtags_response.json +100 -0
  62. data/spec/fixtures/search_touts_response.json +304 -0
  63. data/spec/fixtures/search_users_response.json +37 -0
  64. data/spec/fixtures/suggested_hashtags_response.json +137 -0
  65. data/spec/fixtures/suggested_users_response.json +1 -0
  66. data/spec/fixtures/test.mp4 +0 -0
  67. data/spec/fixtures/tout.json +98 -0
  68. data/spec/fixtures/tout_conversation_response.json +41 -0
  69. data/spec/fixtures/touts_liked_by_response.json +65 -0
  70. data/spec/fixtures/touts_liked_by_user_response.json +106 -0
  71. data/spec/fixtures/touts_me_updates_response.json +357 -0
  72. data/spec/fixtures/touts_search_results.json +304 -0
  73. data/spec/fixtures/trending_hashtags_response.json +149 -0
  74. data/spec/fixtures/unlike_tout_response.json +109 -0
  75. data/spec/fixtures/update_me_response.json +35 -0
  76. data/spec/fixtures/user.json +28 -0
  77. data/spec/fixtures/user_followers.json +1409 -0
  78. data/spec/fixtures/user_touts_response.json +479 -0
  79. data/spec/fixtures/user_with_utf8.json +29 -0
  80. data/spec/fixtures/users.json +58 -0
  81. data/spec/fixtures/users_search_results.json +37 -0
  82. data/spec/fixtures/widgets.json +142 -0
  83. data/spec/spec_helper.rb +61 -0
  84. data/spec/trubl/api/category_spec.rb +39 -0
  85. data/spec/trubl/api/channel_spec.rb +39 -0
  86. data/spec/trubl/api/conversation_spec.rb +38 -0
  87. data/spec/trubl/api/hashtags_spec.rb +60 -0
  88. data/spec/trubl/api/me_spec.rb +98 -0
  89. data/spec/trubl/api/search_spec.rb +40 -0
  90. data/spec/trubl/api/streams_spec.rb +18 -0
  91. data/spec/trubl/api/suggested_users_spec.rb +17 -0
  92. data/spec/trubl/api/touts_spec.rb +215 -0
  93. data/spec/trubl/api/users_spec.rb +122 -0
  94. data/spec/trubl/base_spec.rb +88 -0
  95. data/spec/trubl/category_spec.rb +15 -0
  96. data/spec/trubl/channel_spec.rb +16 -0
  97. data/spec/trubl/client_spec.rb +141 -0
  98. data/spec/trubl/conversation_spec.rb +13 -0
  99. data/spec/trubl/hashtag_spec.rb +11 -0
  100. data/spec/trubl/oauth_spec.rb +27 -0
  101. data/spec/trubl/tout_spec.rb +41 -0
  102. data/spec/trubl/user_spec.rb +65 -0
  103. data/spec/trubl_spec.rb +23 -0
  104. data/trubl.gemspec +41 -0
  105. metadata +494 -0
@@ -0,0 +1,122 @@
1
+ require_relative '../../spec_helper'
2
+ require 'trubl/client'
3
+ require 'webmock'
4
+
5
+ describe Trubl::API::Users do
6
+
7
+ let(:client) { Trubl::Client.new }
8
+
9
+ it '.retrieve_user returns a Trubl::User' do
10
+ stub_get("https://api.tout.com/api/v1/users/karmin").to_return(:body => fixture("user.json"))
11
+ user = client.retrieve_user("karmin")
12
+ expect(user).to be_a Trubl::User
13
+ expect(user.uid).to eq("karmin")
14
+ some_request(:get, "/api/v1/users/karmin").should have_been_made
15
+ end
16
+
17
+ describe '#retrieve_users' do
18
+ subject { client.retrieve_users(uids) }
19
+
20
+ context 'providing an array of users uids' do
21
+ let(:sorted_uids) { 125.times.collect { |i| "test_user_#{i}" }.sort }
22
+ let(:uids) { sorted_uids.shuffle }
23
+
24
+ before do
25
+ sorted_uids.in_groups_of(100, false) do |uid_group|
26
+ fake_user_response = {users: uid_group.collect { |uid| {user: {uid: uid} } } }
27
+
28
+ stub_request(:get, "https://api.tout.com/api/v1/users?uids=#{uid_group.join(',')}").
29
+ to_return(
30
+ status: 200,
31
+ body: fake_user_response.to_json,
32
+ headers: {}
33
+ )
34
+ end
35
+ end
36
+
37
+ its(:size) { should == uids.size }
38
+ it 'should contain the users' do
39
+ expect(subject.map(&:uid).sort).to eq sorted_uids
40
+ end
41
+ end
42
+
43
+ context 'providing a single uid as string' do
44
+ let(:uids) { 'zackryder' }
45
+ before do
46
+ stub_request(:get, "https://api.tout.com/api/v1/users?uids=#{uids}").
47
+ to_return(
48
+ status: 200,
49
+ body: {users: [{user: {uid: uids}}]}.to_json,
50
+ headers: {}
51
+ )
52
+ end
53
+ its(:size) { should == 1 }
54
+ its('first.uid') { should == uids }
55
+ end
56
+
57
+ context 'providing a blank list' do
58
+ let(:uids) { nil }
59
+ before do
60
+ client.should_not_receive(:multi_request)
61
+ end
62
+ it { should == [] }
63
+ end
64
+ end
65
+
66
+
67
+ it '.retrieve_user_likes returns a Collection of Touts liked by the specified user' do
68
+ stub_get("https://api.tout.com/api/v1/users/karmin/likes").to_return(:body => fixture("touts_liked_by_user_response.json"))
69
+ touts = client.retrieve_user_likes("karmin")
70
+ expect(touts).to be_a Trubl::Touts
71
+ #expect(touts.pagination).to be_a Trubl::Pagination
72
+ touts.each do |u|
73
+ expect(u).to be_a Trubl::Tout
74
+ end
75
+ some_request(:get, "/api/v1/users/karmin/likes").should have_been_made
76
+ end
77
+
78
+ it '.retrieve_user_touts returns a Collection of Touts created by the specified user' do
79
+ stub_get("https://api.tout.com/api/v1/users/teamtout/touts").to_return(:body => fixture("user_touts_response.json"))
80
+ touts = client.retrieve_user_touts("teamtout")
81
+ expect(touts).to be_a Trubl::Touts
82
+ #expect(touts.pagination).to be_a Trubl::Pagination
83
+ touts.each do |u|
84
+ expect(u).to be_a Trubl::Tout
85
+ end
86
+ some_request(:get, "/api/v1/users/teamtout/touts").should have_been_made
87
+ end
88
+
89
+ it '.retrieve_user_followers returns the Users following the specified user' do
90
+ stub_get("https://api.tout.com/api/v1/users/teamtout/followers").to_return(:body => fixture("user_followers.json"))
91
+ users = client.retrieve_user_followers("teamtout")
92
+ expect(users).to be_a Trubl::Users
93
+ #expect(users.pagination).to be_a Trubl::Pagination
94
+ users.each do |u|
95
+ expect(u).to be_a Trubl::User
96
+ end
97
+ some_request(:get, "/api/v1/users/teamtout/followers").should have_been_made
98
+ end
99
+
100
+ it '.follow_user executes a follow for the specified user with a user authed token' do
101
+ stub_post("https://api.tout.com/api/v1/users/teamtout/follow").to_return(:body => "")
102
+ client.follow_user('teamtout')
103
+ some_request(:post, "/api/v1/users/teamtout/follow").should have_been_made
104
+ end
105
+
106
+ describe '.retrieve_user_widgets' do
107
+ let(:user_uid) { 'teamtout'}
108
+ let(:path) { "https://api.tout.com/api/v1/users/#{user_uid}/widgets" }
109
+ before do
110
+ stub_get(path).to_return(body: fixture("widgets.json"))
111
+ end
112
+ subject { Trubl::Client.new.retrieve_user_widgets(user_uid) }
113
+ it { should be_kind_of Trubl::Widgets }
114
+ it 'does the right api call' do
115
+ subject
116
+ some_request(:get,path).should have_been_made
117
+ end
118
+ end
119
+
120
+
121
+
122
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+ require 'trubl/base'
3
+
4
+ describe Trubl::Base do
5
+
6
+ subject{ Trubl::Base.new }
7
+
8
+ let(:response){
9
+ resp = double("Response")
10
+ resp.stub(:body).and_return('{"base": {}}')
11
+ resp
12
+ }
13
+
14
+ let(:missing_response){
15
+ resp = double("Response")
16
+ resp.stub(:body).and_return('{"error": "resource not found"}')
17
+ resp.stub(:code).and_return(404)
18
+ resp
19
+ }
20
+
21
+ let(:error_response){
22
+ resp = double("Response")
23
+ resp.stub(:body).and_return('{"error": "kaboom"}')
24
+ resp.stub(:code).and_return(500)
25
+ resp
26
+ }
27
+
28
+
29
+ it "inherits from Hash" do
30
+ subject.is_a? Hash
31
+ end
32
+
33
+ it "inherits from Hashie::Mash" do
34
+ subject.is_a? Hashie::Mash
35
+ end
36
+
37
+ describe "#from_response" do
38
+
39
+ it "returns nil if response code is 4xx" do
40
+ missing_response.should_receive(:code)
41
+ instance = subject.from_response(missing_response)
42
+ instance.should be_nil
43
+ end
44
+
45
+ it "returns nil if response code is 5xx" do
46
+ error_response.should_receive(:code)
47
+ instance = subject.from_response(error_response)
48
+ instance.should be_nil
49
+ end
50
+
51
+ it "parses the response body" do
52
+ response.should_receive(:code)
53
+ subject.should_receive(:parse).with(response)
54
+ subject.from_response(response)
55
+ end
56
+
57
+ it "uses the inferred class name" do
58
+ response.should_receive(:code)
59
+ subject.should_receive(:klass_name)
60
+ subject.from_response(response)
61
+ end
62
+
63
+ it "re-initializes the instance" do
64
+ response.should_receive(:code)
65
+ subject.should_receive :initialize
66
+ subject.from_response(response)
67
+ end
68
+
69
+ end
70
+
71
+ describe "#parse" do
72
+
73
+ it "parses the response body into a json object" do
74
+ JSON.should_receive(:parse).with(response.body).and_return({})
75
+ subject.parse(response)
76
+ end
77
+
78
+ end
79
+
80
+ describe "klass_name" do
81
+
82
+ it "downcases the class name " do
83
+ subject.klass_name.should == 'base'
84
+ end
85
+
86
+ end
87
+
88
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+ require 'trubl/category'
3
+
4
+ describe Trubl::Category do
5
+ # this is the silly namespace one
6
+ # this is also an example of the simple OpenStruct usage, to be replaced eventually
7
+
8
+ let(:category_uid){"music"}
9
+
10
+ it "magically creates a Tout object from json" do
11
+ category = Trubl::Category.new(json_fixture("category_response.json")["category"])
12
+ expect(category.uid).to eq(category_uid)
13
+ end
14
+
15
+ end
@@ -0,0 +1,16 @@
1
+
2
+ require 'spec_helper'
3
+ require 'trubl/channel'
4
+
5
+ describe Trubl::Channel do
6
+ # this is the silly namespace one
7
+ # this is also an example of the simple OpenStruct usage, to be replaced eventually
8
+
9
+ let(:channel_uid){"new-york-fashion-week"}
10
+
11
+ it "magically creates a Tout object from json" do
12
+ channel = Trubl::Channel.new(json_fixture("channel_response.json")["channel"])
13
+ expect(channel.uid).to eq(channel_uid)
14
+ end
15
+
16
+ end
@@ -0,0 +1,141 @@
1
+ require_relative "../spec_helper"
2
+ require "trubl/client"
3
+
4
+ describe Trubl::Client do
5
+
6
+ let(:client) { Trubl::Client.new() }
7
+
8
+ describe '#new' do
9
+ subject { client }
10
+ it { should be_a Trubl::Client }
11
+ end
12
+
13
+ describe ".auth" do
14
+ it "stores access_token" do
15
+ body = "client_id=&client_secret=&grant_type=client_credentials"
16
+ headers = {'Accept'=>'application/json', 'Authorization'=>'Bearer', 'Connection'=>'keep-alive'}
17
+ stub_post("https://www.tout.com/oauth/token").with(body: body, headers: headers).to_return(body: fixture("client1_auth_resp.json"))
18
+ client.client_auth()
19
+ expect(client.access_token).to eq "6bffd46fca32a9dc640a7f2284edd55b5175d59323923f984b92ee5ec6a0a9e4"
20
+ end
21
+ end
22
+
23
+ describe ".credentials" do
24
+ it "returns a hash of creds" do
25
+ body = "client_id=client_id&client_secret=client_sekrit&grant_type=client_credentials"
26
+ headers = {'Accept'=>'application/json', 'Authorization'=>'Bearer', 'Connection'=>'keep-alive'}
27
+ stub_post("https://www.tout.com/oauth/token").with(body: body, headers: headers).to_return(body: fixture("client1_auth_resp.json"))
28
+ client = Trubl::Client.new("client_id", "client_sekrit")
29
+ client.client_auth()
30
+ expect(client.credentials).to eq({client_id:"client_id", client_secret:"client_sekrit", access_token:"6bffd46fca32a9dc640a7f2284edd55b5175d59323923f984b92ee5ec6a0a9e4"})
31
+
32
+ end
33
+ end
34
+
35
+ describe ".api_uri_root" do
36
+ let(:port) { nil }
37
+ let(:host) { nil }
38
+ let(:uri_scheme) { nil }
39
+ subject { Trubl::Client.new(:fake_id, :fake_secret, nil, uri_port: port, uri_host: host, uri_scheme: uri_scheme) }
40
+
41
+ its(:api_uri_root) { should == 'https://api.tout.com/api/v1/' }
42
+
43
+ context 'setting a port' do
44
+ let(:port) { 3000 }
45
+ its(:api_uri_root) { should == 'https://api.tout.com:3000/api/v1/' }
46
+ end
47
+
48
+ context 'setting a host and protocol' do
49
+ let(:host) { 'localhost' }
50
+ let(:uri_scheme) { 'http' }
51
+ its(:api_uri_root) { should == 'http://localhost/api/v1/' }
52
+ end
53
+ end
54
+
55
+ describe ".delete" do
56
+ it "processes a delete" do
57
+ path = "toutitout"
58
+ stub_delete(path).to_return(:status => 200, :body => "", :headers => {})
59
+ client.delete(path)
60
+ some_request(:delete, path).should have_been_made
61
+ end
62
+ end
63
+
64
+ describe ".post" do
65
+ it "processes a post" do
66
+ path = "toutitout"
67
+ stub_post(path).to_return(:status => 200, :body => "", :headers => {})
68
+ client.post(path)
69
+ some_request(:post, path).should have_been_made
70
+ end
71
+ end
72
+
73
+ describe ".get" do
74
+ it "processes a get" do
75
+ path = "toutitout"
76
+ stub_get(path).to_return(:status => 200, :body => "", :headers => {})
77
+ client.get(path)
78
+ some_request(:get, path).should have_been_made
79
+ end
80
+ end
81
+
82
+ describe ".put" do
83
+ it "processes a put" do
84
+ path = "toutitout"
85
+ stub_put(path).to_return(:status => 200, :body => "", :headers => {})
86
+ client.put(path)
87
+ some_request(:put, path).should have_been_made
88
+ end
89
+ end
90
+
91
+ describe ".multi_request" do
92
+ # See https://github.com/typhoeus/typhoeus/issues/278
93
+ # there might be a bug then requests.size > max_concurrency while running specs
94
+ let(:uids) { 9.times.collect { |i| "random-user-#{i}" } }
95
+ let(:requests) { uids.collect { |uid| { path: "/users/#{uid}" } } }
96
+ let(:method) { :get }
97
+ let(:multi_request) { client.multi_request(method, requests)}
98
+ subject { multi_request }
99
+
100
+ context 'with a valid request method' do
101
+ before do
102
+ (requests || []).each_with_index do |request, index|
103
+ uid = request[:path].split('/').last
104
+ request_stub(method, request[:path]).to_return(status: 200 + index, body: "fake-#{uid}", headers: {})
105
+ end
106
+ end
107
+
108
+ its(:size) { should == uids.size }
109
+
110
+ describe 'response bodies' do
111
+ subject { multi_request.map(&:body).sort }
112
+ it { should == uids.collect { |u| "fake-#{u}"} }
113
+ end
114
+
115
+ describe 'response status codes' do
116
+ subject do
117
+ RUBY_ENGINE == 'ruby' ? multi_request.map(&:status).sort : multi_request.map(&:code).sort
118
+ end
119
+ it { should == uids.size.times.collect { |i| 200+i } }
120
+ end
121
+
122
+ context 'with a blank request list' do
123
+ let(:requests) { nil }
124
+ before do
125
+ Typhoeus::Hydra.should_not_receive(:new) if RUBY_ENGINE == 'ruby'
126
+ end
127
+ it { should == [] }
128
+ end
129
+
130
+ end
131
+
132
+ context 'with an invalid request method' do
133
+ let(:method) { :unsupported }
134
+ before do
135
+ Typhoeus::Hydra.should_not_receive(:new) if RUBY_ENGINE == 'ruby'
136
+ end
137
+ it { should == [] }
138
+ end
139
+ end
140
+
141
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+ require 'trubl/conversation'
3
+
4
+ describe Trubl::Conversation do
5
+ # this is the silly namespace one
6
+ # this is also an example of the simple OpenStruct usage, to be replaced eventually
7
+
8
+ it "magically creates a Tout object from json" do
9
+ conversation = Trubl::Conversation.new(json_fixture("conversation_response.json")["conversation"])
10
+ expect(conversation.uid).to eq("iummti53")
11
+ end
12
+
13
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "../spec_helper"
2
+ require "trubl/hashtag"
3
+
4
+ describe Trubl::Hashtag do
5
+
6
+ it "magically creates a Hashtag object from json" do
7
+ hashtag = Trubl::Hashtag.new(json_fixture("hashtag_response.json")["hashtag"])
8
+ expect(hashtag.uid).to eq("pets")
9
+ end
10
+
11
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require 'trubl/oauth'
3
+
4
+ describe Trubl::OAuth do
5
+
6
+ describe ".auth" do
7
+
8
+ it "parses json and stores attributes properly" do
9
+ stub_post("https://www.tout.com/oauth/token").with(:body => /.*/).to_return(body: fixture("client1_auth_resp.json"))
10
+ @client = Trubl.client()
11
+ @client.client_auth()
12
+ expect(@client.access_token).to eq("6bffd46fca32a9dc640a7f2284edd55b5175d59323923f984b92ee5ec6a0a9e4")
13
+ end
14
+
15
+ end
16
+
17
+ describe ".user_auth" do
18
+
19
+ it "handles the password auth scheme properly" do
20
+ stub_post("https://www.tout.com/oauth/token").with(:body => /.*/).to_return(body: fixture("client1_auth_resp.json"))
21
+ @client = Trubl.client('client_id', 'client_secret', 'callback_url', email: 'fake@tout.com', password: 'password')
22
+ @client.user_auth()
23
+ expect(@client.access_token).to eq("6bffd46fca32a9dc640a7f2284edd55b5175d59323923f984b92ee5ec6a0a9e4")
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,41 @@
1
+ require_relative "../spec_helper"
2
+ require "trubl/tout"
3
+
4
+ describe Trubl::Tout do
5
+ # this is also an example of the simple OpenStruct usage, to be replaced eventually
6
+
7
+ it "magically creates a Tout object from json" do
8
+ tout = Trubl::Tout.new(json_fixture("tout.json")["tout"])
9
+ expect(tout.uid).to eq("fhcl57")
10
+ end
11
+
12
+ it ".delete is a usable verb when created via a client" do
13
+ stub_post("https://api.tout.com/api/v1/touts").to_return(:body => fixture('tout.json'))
14
+ file = File.join(File.dirname(__FILE__), '../fixtures/test.mp4')
15
+ payload = {tout: { data: file, text: 'Some text here'}}
16
+ tout = Trubl::Client.new.create_tout(payload)
17
+ stub_delete("https://api.tout.com/api/v1/touts")
18
+ result = tout.delete
19
+ expect(result). to eq(true)
20
+ some_request(:delete, "/api/v1/touts/fhcl57").should have_been_made
21
+ end
22
+
23
+ it ".like is a usable verb when created via a client" do
24
+ stub_get("https://api.tout.com/api/v1/touts/fhcl57").to_return(:body => fixture("retrieve_tout.json"))
25
+ tout = Trubl::Client.new.retrieve_tout("fhcl57")
26
+ stub_post("https://api.tout.com/api/v1/touts/fhcl57/likes").to_return(:body => fixture("like_tout_response.json"))
27
+ result = tout.like
28
+ expect(result). to eq(true)
29
+ some_request(:post, "/api/v1/touts/fhcl57/likes").should have_been_made
30
+ end
31
+
32
+ it ".unlike is a usable verb when created via a client" do
33
+ stub_get("https://api.tout.com/api/v1/touts/fhcl57").to_return(:body => fixture("retrieve_tout.json"))
34
+ tout = Trubl::Client.new.retrieve_tout("fhcl57")
35
+ stub_delete("https://api.tout.com/api/v1/touts/fhcl57/likes").to_return(:body => fixture("unlike_tout_response.json"))
36
+ result = tout.unlike
37
+ expect(result). to eq(true)
38
+ some_request(:delete, "/api/v1/touts/fhcl57/likes").should have_been_made
39
+ end
40
+
41
+ end