trubl 1.4.2

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