croudia 0.0.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/README.md +31 -14
- data/Rakefile +11 -11
- data/croudia.gemspec +10 -8
- data/lib/croudia/api/favorites.rb +43 -0
- data/lib/croudia/api/oauth.rb +32 -0
- data/lib/croudia/api/statuses.rb +55 -0
- data/lib/croudia/api/timelines.rb +57 -0
- data/lib/croudia/base.rb +44 -0
- data/lib/croudia/client.rb +64 -0
- data/lib/croudia/configurable.rb +39 -0
- data/lib/croudia/creatable.rb +9 -0
- data/lib/croudia/default.rb +63 -0
- data/lib/croudia/ext/openssl.rb +19 -0
- data/lib/croudia/identity.rb +22 -39
- data/lib/croudia/status.rb +26 -0
- data/lib/croudia/user.rb +12 -43
- data/lib/croudia/version.rb +1 -1
- data/lib/croudia.rb +21 -12
- data/spec/croudia/api/favorites_spec.rb +35 -0
- data/spec/croudia/api/oauth_spec.rb +53 -0
- data/spec/croudia/api/statuses_spec.rb +73 -0
- data/spec/croudia/api/timelines_spec.rb +93 -0
- data/spec/croudia/base_spec.rb +27 -0
- data/spec/croudia/client_spec.rb +115 -0
- data/spec/croudia/identity_spec.rb +29 -65
- data/spec/croudia/status_spec.rb +30 -0
- data/spec/croudia/user_spec.rb +30 -43
- data/spec/croudia_spec.rb +48 -49
- data/spec/fixtures/access_token.json +6 -0
- data/spec/fixtures/status.json +1 -0
- data/spec/fixtures/timeline.json +1 -0
- data/spec/helper.rb +49 -32
- metadata +80 -84
- data/lib/croudia/api.rb +0 -5
- data/lib/croudia/error.rb +0 -5
- data/lib/croudia/scraper/friendships.rb +0 -72
- data/lib/croudia/scraper/login.rb +0 -42
- data/lib/croudia/scraper/parser/users.rb +0 -59
- data/lib/croudia/scraper/parser/voices.rb +0 -32
- data/lib/croudia/scraper/parser.rb +0 -13
- data/lib/croudia/scraper/users.rb +0 -20
- data/lib/croudia/scraper/voices.rb +0 -59
- data/lib/croudia/scraper.rb +0 -63
- data/lib/croudia/voice.rb +0 -21
- data/spec/croudia/api_spec.rb +0 -7
- data/spec/croudia/error_spec.rb +0 -13
- data/spec/croudia/scraper/friendships_spec.rb +0 -115
- data/spec/croudia/scraper/login_spec.rb +0 -137
- data/spec/croudia/scraper/parser/users_spec.rb +0 -292
- data/spec/croudia/scraper/parser/voices_spec.rb +0 -119
- data/spec/croudia/scraper/users_spec.rb +0 -78
- data/spec/croudia/scraper/voices_spec.rb +0 -178
- data/spec/croudia/scraper_spec.rb +0 -120
- data/spec/croudia/version_spec.rb +0 -7
- data/spec/croudia/voice_spec.rb +0 -16
- data/spec/fixtures/follow_request.html +0 -69
- data/spec/fixtures/follower_wktk.html +0 -89
- data/spec/fixtures/following_wktk.html +0 -89
- data/spec/fixtures/user_wktk1.html +0 -72
- data/spec/fixtures/user_wktk2.html +0 -75
- data/spec/fixtures/user_wktk3.html +0 -83
- data/spec/fixtures/voices_reply_list.html +0 -55
- data/spec/fixtures/voices_timeline.html +0 -60
- data/spec/fixtures/voices_written.html +0 -20
@@ -1,72 +0,0 @@
|
|
1
|
-
module Croudia
|
2
|
-
class Scraper
|
3
|
-
module Friendships
|
4
|
-
def follow(username)
|
5
|
-
require_login
|
6
|
-
post('/follows/target_follow',
|
7
|
-
:target_user_name => username,
|
8
|
-
:follow_action => 'enable',
|
9
|
-
)
|
10
|
-
end
|
11
|
-
|
12
|
-
def unfollow(username)
|
13
|
-
require_login
|
14
|
-
post('/follows/target_follow',
|
15
|
-
:target_user_name => username,
|
16
|
-
:follow_action => 'diable', # Yes, it is!
|
17
|
-
)
|
18
|
-
end
|
19
|
-
|
20
|
-
def approve(username)
|
21
|
-
require_login
|
22
|
-
post('/follows/follow_approve',
|
23
|
-
:target_user_name => username,
|
24
|
-
:follow_action => 'approve',
|
25
|
-
)
|
26
|
-
end
|
27
|
-
|
28
|
-
def refusal(username)
|
29
|
-
require_login
|
30
|
-
post('/follows/follow_refusal',
|
31
|
-
:target_user_name => username,
|
32
|
-
:follow_action => 'refusal',
|
33
|
-
)
|
34
|
-
end
|
35
|
-
alias refuse refusal
|
36
|
-
|
37
|
-
def block(username)
|
38
|
-
require_login
|
39
|
-
post('/blocks/setting',
|
40
|
-
:target_user_name => username,
|
41
|
-
:block_action => 'enable',
|
42
|
-
)
|
43
|
-
end
|
44
|
-
|
45
|
-
def unblock(username)
|
46
|
-
require_login
|
47
|
-
post('/blocks/setting',
|
48
|
-
:target_user_name => username,
|
49
|
-
:block_action => 'diable', # Yes, it's diable
|
50
|
-
)
|
51
|
-
end
|
52
|
-
|
53
|
-
def following(username=nil, params={})
|
54
|
-
username = @current_user.username unless username
|
55
|
-
Parser.user_list(get("/follows/following/#{username}", params))
|
56
|
-
end
|
57
|
-
alias followings following
|
58
|
-
|
59
|
-
def follower(username=nil, params={})
|
60
|
-
username = @current_user.username unless username
|
61
|
-
Parser.user_list(get("/follows/follower/#{username}", params))
|
62
|
-
end
|
63
|
-
alias followers follower
|
64
|
-
|
65
|
-
def follow_request
|
66
|
-
require_login
|
67
|
-
Parser.user_list(get('/follows/follow_request'))
|
68
|
-
end
|
69
|
-
alias follow_requests follow_request
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'croudia/error'
|
2
|
-
|
3
|
-
module Croudia
|
4
|
-
class Scraper
|
5
|
-
module Login
|
6
|
-
def login(username, password)
|
7
|
-
get('/')
|
8
|
-
params = {
|
9
|
-
:username => username,
|
10
|
-
:password => password,
|
11
|
-
:auto_login => 'on',
|
12
|
-
}
|
13
|
-
post('/', params)
|
14
|
-
raise ArgumentError, 'Wrong ID or password' if not logged_in?
|
15
|
-
end
|
16
|
-
alias login! login
|
17
|
-
|
18
|
-
def logout
|
19
|
-
require_login
|
20
|
-
post('/login/logout', :method_name => 'logout')
|
21
|
-
@current_user = nil
|
22
|
-
@logged_in = false
|
23
|
-
end
|
24
|
-
alias logout! logout
|
25
|
-
|
26
|
-
def logged_in?(force=false)
|
27
|
-
@logged_in = nil if force
|
28
|
-
@logged_in = @logged_in.nil? ? '/' != get('/').uri.path : @logged_in
|
29
|
-
end
|
30
|
-
alias logged_in logged_in?
|
31
|
-
|
32
|
-
def logged_out?(force=false)
|
33
|
-
!logged_in?(force)
|
34
|
-
end
|
35
|
-
alias logged_out logged_out?
|
36
|
-
|
37
|
-
def require_login
|
38
|
-
raise NotLoggedInError, 'Not logged in' if logged_out?
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
module Croudia
|
2
|
-
class Scraper
|
3
|
-
module Parser
|
4
|
-
module Users
|
5
|
-
def user_page(page)
|
6
|
-
return nil if /on Croudia$/ !~ page.title
|
7
|
-
doc = page.parser
|
8
|
-
attrs = {
|
9
|
-
:username => doc.xpath('//a[contains(@href, "/voices/user/")]').first.attribute('href').content.sub(%r{^/voices/user/}, ''),
|
10
|
-
:nickname => doc.css('.avatar_l').first.attribute('alt').content,
|
11
|
-
:avatar => "#{page.uri.scheme}://#{page.uri.host}" + doc.css('.avatar_l').first.attribute('src').content,
|
12
|
-
:self_introduction => doc.css('.fontg').first.content.strip,
|
13
|
-
:voices_count => doc.xpath('//span[preceding-sibling::a[contains(@href,"/voices/user/")]]').first.content,
|
14
|
-
:following_count => doc.xpath('//span[preceding-sibling::a[contains(@href,"/following/")]]').first.content,
|
15
|
-
:followers_count => doc.xpath('//span[preceding-sibling::a[contains(@href,"/follower/")]]').first.content,
|
16
|
-
:album_count => doc.xpath('//span[preceding-sibling::a[contains(@href,"/album")]]').first.content,
|
17
|
-
:spreadia => doc.xpath('//span[preceding-sibling::a[contains(@href,"/spreadia/")]]').first.content,
|
18
|
-
:favodia => doc.xpath('//span[preceding-sibling::a[contains(@href,"/favodia/")]]').first.content,
|
19
|
-
}
|
20
|
-
if (location = doc.xpath('//a[contains(@href, "/users/google_maps")]')).size.nonzero?
|
21
|
-
attrs[:position] = location.first.content
|
22
|
-
end
|
23
|
-
if (url = doc.xpath('//a[@target="_blank"][name(..)="li"]')).size.nonzero?
|
24
|
-
attrs[:user_url] = url.first.content
|
25
|
-
end
|
26
|
-
if (friendships = doc.css('.font1')).size.nonzero?
|
27
|
-
attrs[:following] = /#e/i !~ friendships[0].attribute('style').value
|
28
|
-
attrs[:followed_by] = /#e/i !~ friendships[1].attribute('style').value
|
29
|
-
end
|
30
|
-
Croudia::User.new(attrs)
|
31
|
-
end
|
32
|
-
|
33
|
-
def user_list(page)
|
34
|
-
user_nodes = page.parser.xpath('//div[@data-role="content"]/ul[@data-role="listview"]/li[not(@data-role="list-divider")]')
|
35
|
-
users = []
|
36
|
-
user_nodes.each do |user_node|
|
37
|
-
attrs = {
|
38
|
-
:nickname => user_node.css('.bord').first.content,
|
39
|
-
:avatar => "#{page.uri.scheme}://#{page.uri.host}" + user_node.css('img').first.attribute('src').value,
|
40
|
-
:self_introduction => user_node.css('.fontg').first.content.strip,
|
41
|
-
}
|
42
|
-
if (links = user_node.css('a')).size.nonzero?
|
43
|
-
# For following/followers page
|
44
|
-
attrs[:username] = links.first.attribute('href').value.sub(%r{^/}, '')
|
45
|
-
elsif (forms = user_node.xpath('//form[not(contains(@action,"/follows/"))]')).size.nonzero?
|
46
|
-
# For follow_request page
|
47
|
-
attrs[:username] = forms.first.attribute('action').value.sub(%r{^/}, '')
|
48
|
-
end
|
49
|
-
if (following = user_node.css('.font1')).size.nonzero?
|
50
|
-
attrs[:following] = /#e/i !~ following.first.attribute('style').value
|
51
|
-
end
|
52
|
-
users << Croudia::User.new(attrs)
|
53
|
-
end
|
54
|
-
users
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Croudia
|
2
|
-
class Scraper
|
3
|
-
module Parser
|
4
|
-
module Voices
|
5
|
-
def voices(page)
|
6
|
-
voice_nodes = page.parser.xpath('//div[@data-role="content"]/ul[@data-role="listview"]/li[child::a]')
|
7
|
-
voices = []
|
8
|
-
voice_nodes.each do |voice|
|
9
|
-
user = Croudia::User.new(
|
10
|
-
:username => voice.xpath('//a[parent::span[@class="test_span"]]').first.attribute('href').value.gsub(/\W/, ''),
|
11
|
-
:nickname => voice.xpath('//span[@class="bord"][parent::p]').first.content,
|
12
|
-
:avatar => "#{page.uri.scheme}://#{page.uri.host}" + voice.xpath('//img[@class="avatar"]').attribute('src').value,
|
13
|
-
)
|
14
|
-
attrs = {
|
15
|
-
:id => voice.xpath('//a[contains(@href,"/voices/show/")]').first.attribute('href').value.gsub(/\D/, ''),
|
16
|
-
:user => user,
|
17
|
-
:voice_desc => voice.css('.voice_desc').first.content,
|
18
|
-
:spreaded_count => voice.xpath('//span[contains(@style,"#396")]').first.content.gsub(/\D/, ''),
|
19
|
-
:favorited_count => voice.xpath('//span[contains(@style,"520")]').first.content.gsub(/\D/, ''),
|
20
|
-
}
|
21
|
-
if (time = voice.xpath('//p[@data-time]')).size.nonzero?
|
22
|
-
# For timeline
|
23
|
-
attrs[:time] = time.first.attribute('data-time').value
|
24
|
-
end
|
25
|
-
voices << Croudia::Voice.new(attrs)
|
26
|
-
end
|
27
|
-
voices
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'croudia/scraper/parser/users'
|
2
|
-
require 'croudia/scraper/parser/voices'
|
3
|
-
|
4
|
-
module Croudia
|
5
|
-
class Scraper
|
6
|
-
module Parser
|
7
|
-
class << self
|
8
|
-
include Croudia::Scraper::Parser::Users
|
9
|
-
include Croudia::Scraper::Parser::Voices
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Croudia
|
2
|
-
class Scraper
|
3
|
-
module Users
|
4
|
-
def current_user(force=false)
|
5
|
-
require_login
|
6
|
-
@current_user = nil if force
|
7
|
-
@current_user ||= Parser.user_page(get('/users/redirect_user'))
|
8
|
-
end
|
9
|
-
alias verify_credentials current_user
|
10
|
-
|
11
|
-
def user(username=nil, params={})
|
12
|
-
if username
|
13
|
-
Parser.user_page(get("/#{username}", params))
|
14
|
-
else
|
15
|
-
current_user
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
module Croudia
|
2
|
-
class Scraper
|
3
|
-
module Voices
|
4
|
-
def timeline(params={})
|
5
|
-
require_login
|
6
|
-
Parser.voices(get('/voices/timeline', params))
|
7
|
-
end
|
8
|
-
alias home_timeline timeline
|
9
|
-
|
10
|
-
def reply_list(params={})
|
11
|
-
require_login
|
12
|
-
Parser.voices(get('/voices/reply_list', params))
|
13
|
-
end
|
14
|
-
alias mentions reply_list
|
15
|
-
alias mentions_timeline reply_list
|
16
|
-
|
17
|
-
def update(text)
|
18
|
-
require_login
|
19
|
-
page = get('/voices/written')
|
20
|
-
form = page.form_with(:action => '/voices/write')
|
21
|
-
form['voice[tweet]'] = text
|
22
|
-
result = form.submit
|
23
|
-
raise 'Update failed' if result.body.include? 'error_popup'
|
24
|
-
end
|
25
|
-
|
26
|
-
def favorite(voice_id)
|
27
|
-
require_login
|
28
|
-
post('/favorites',
|
29
|
-
:favorites_action => 'enable',
|
30
|
-
:voice_id => voice_id,
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
def unfavorite(voice_id)
|
35
|
-
require_login
|
36
|
-
post('/favorites',
|
37
|
-
:favorites_action => 'disable',
|
38
|
-
:voice_id => voice_id,
|
39
|
-
)
|
40
|
-
end
|
41
|
-
|
42
|
-
def spread(voice_id)
|
43
|
-
require_login
|
44
|
-
post('/spreads/spread_voice',
|
45
|
-
:favorites_action => 'enable',
|
46
|
-
:voice_id => voice_id,
|
47
|
-
)
|
48
|
-
end
|
49
|
-
|
50
|
-
def unspread(voice_id)
|
51
|
-
require_login
|
52
|
-
post('/spreads/spread_voice',
|
53
|
-
:favorites_action => 'disable',
|
54
|
-
:voice_id => voice_id,
|
55
|
-
)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
data/lib/croudia/scraper.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'croudia/error'
|
2
|
-
require 'croudia/scraper/friendships'
|
3
|
-
require 'croudia/scraper/login'
|
4
|
-
require 'croudia/scraper/parser'
|
5
|
-
require 'croudia/scraper/users'
|
6
|
-
require 'croudia/scraper/voices'
|
7
|
-
require 'croudia/user'
|
8
|
-
require 'croudia/version'
|
9
|
-
require 'croudia/voice'
|
10
|
-
require 'mechanize'
|
11
|
-
|
12
|
-
module Croudia
|
13
|
-
class Scraper
|
14
|
-
include Croudia::Scraper::Friendships
|
15
|
-
include Croudia::Scraper::Login
|
16
|
-
include Croudia::Scraper::Users
|
17
|
-
include Croudia::Scraper::Voices
|
18
|
-
|
19
|
-
attr_accessor :agent, :endpoint
|
20
|
-
|
21
|
-
def initialize(username=nil, password=nil)
|
22
|
-
yield self if block_given?
|
23
|
-
|
24
|
-
@endpoint ||= 'https://croudia.com'
|
25
|
-
@user_agent ||= "The Croudia Gem/#{Croudia::VERSION} (https://github.com/wktk/croudia-gem)"
|
26
|
-
@agent ||= Mechanize.new do |s|
|
27
|
-
s.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
28
|
-
end
|
29
|
-
self.user_agent = @user_agent
|
30
|
-
|
31
|
-
username && password && login(username, password)
|
32
|
-
end
|
33
|
-
|
34
|
-
def user_agent
|
35
|
-
@agent.user_agent
|
36
|
-
end
|
37
|
-
|
38
|
-
def user_agent=(ua)
|
39
|
-
unless @agent
|
40
|
-
@user_agent = ua
|
41
|
-
else
|
42
|
-
@agent.user_agent = ua
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def get(path, params={})
|
47
|
-
pick_token(@agent.get(@endpoint + path, params))
|
48
|
-
end
|
49
|
-
|
50
|
-
def post(path, params={})
|
51
|
-
params = { :authenticity_token => @authenticity_token }.merge(params)
|
52
|
-
pick_token(@agent.post(@endpoint + path, params))
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
def pick_token(page)
|
57
|
-
page.respond_to?('parser') &&
|
58
|
-
(token = page.parser.xpath('//meta[@name="csrf-token"]')).size.nonzero? &&
|
59
|
-
@authenticity_token = token.first.attribute('content').content
|
60
|
-
page
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
data/lib/croudia/voice.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'croudia/identity'
|
2
|
-
|
3
|
-
module Croudia
|
4
|
-
class Voice < Croudia::Identity
|
5
|
-
attr_reader :user, :voice_desc, :spreaded_count, :favorited_count, :time
|
6
|
-
alias from_user user
|
7
|
-
alias text voice_desc
|
8
|
-
alias description voice_desc
|
9
|
-
alias desc voice_desc
|
10
|
-
alias spread_count spreaded_count
|
11
|
-
alias favorite_count favorited_count
|
12
|
-
|
13
|
-
def to_s
|
14
|
-
"@#{user.username}: #{voice_desc}"
|
15
|
-
end
|
16
|
-
|
17
|
-
def to_i
|
18
|
-
@id.to_i
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/spec/croudia/api_spec.rb
DELETED
data/spec/croudia/error_spec.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Croudia::Error do
|
4
|
-
it 'is a kind of Error' do
|
5
|
-
Croudia::Error.kind_of? StandardError
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
describe Croudia::NotLoggedInError do
|
10
|
-
it 'is a kind of Croudia::Error' do
|
11
|
-
Croudia::NotLoggedInError.kind_of? Croudia::Error
|
12
|
-
end
|
13
|
-
end
|
@@ -1,115 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Croudia::Scraper::Friendships do
|
4
|
-
context 'when logged in' do
|
5
|
-
before do
|
6
|
-
@croudia = Croudia::Scraper.new
|
7
|
-
@croudia.instance_variable_set('@logged_in', true)
|
8
|
-
end
|
9
|
-
|
10
|
-
describe '#follow' do
|
11
|
-
it 'posts to the correct resource' do
|
12
|
-
stub_post('/follows/target_follow').to_return(:headers => {:content_type => 'text/html'})
|
13
|
-
@croudia.follow('wktk')
|
14
|
-
a_post('/follows/target_follow').with(:body => /target_user_name=wktk/).should have_been_made
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '#unfollow' do
|
19
|
-
it 'posts to the correct resource' do
|
20
|
-
stub_post('/follows/target_follow').to_return(:headers => {:content_type => 'text/html'})
|
21
|
-
@croudia.follow('wktk')
|
22
|
-
a_post('/follows/target_follow').with(:body => /target_user_name=wktk/).should have_been_made
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe '#approve' do
|
27
|
-
it 'posts to the correct resource' do
|
28
|
-
stub_post('/follows/follow_approve').to_return(:headers => {:content_type => 'text/html'})
|
29
|
-
@croudia.approve('wktk')
|
30
|
-
a_post('/follows/follow_approve').with(:body => /target_user_name=wktk/).should have_been_made
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe '#refusal' do
|
35
|
-
it 'posts to the correct resource' do
|
36
|
-
stub_post('/follows/follow_refusal').to_return(:headers => {:content_type => 'text/html'})
|
37
|
-
@croudia.refusal('wktk')
|
38
|
-
a_post('/follows/follow_refusal').with(:body => /target_user_name=wktk/).should have_been_made
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe '#block' do
|
43
|
-
it 'posts to the correct resource' do
|
44
|
-
stub_post('/blocks/setting').to_return(:headers => {:content_type => 'text/html'})
|
45
|
-
@croudia.block('wktk')
|
46
|
-
a_post('/blocks/setting').with(:body => /target_user_name=wktk/).should have_been_made
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe '#unblock' do
|
51
|
-
it 'posts to the correct resource' do
|
52
|
-
stub_post('/blocks/setting').to_return(:headers => {:content_type => 'text/html'})
|
53
|
-
@croudia.unblock('wktk')
|
54
|
-
a_post('/blocks/setting').with(:body => /target_user_name=wktk/).should have_been_made
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
context 'when not logged in' do
|
60
|
-
before do
|
61
|
-
@croudia = Croudia::Scraper.new
|
62
|
-
@croudia.instance_variable_set('@logged_in', false)
|
63
|
-
end
|
64
|
-
|
65
|
-
describe '#follow' do
|
66
|
-
it 'raises an error' do
|
67
|
-
expect{ @croudia.follow('wktk') }.to raise_error Croudia::NotLoggedInError
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe '#unfollow' do
|
72
|
-
it 'raises an error' do
|
73
|
-
expect{ @croudia.follow('wktk') }.to raise_error Croudia::NotLoggedInError
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
describe '#approve' do
|
78
|
-
it 'raises an error' do
|
79
|
-
expect{ @croudia.approve('wktk') }.to raise_error Croudia::NotLoggedInError
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe '#refusal' do
|
84
|
-
it 'raises an error' do
|
85
|
-
expect{ @croudia.refusal('wktk') }.to raise_error Croudia::NotLoggedInError
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe '#follower' do
|
91
|
-
it 'gets the correct resource' do
|
92
|
-
stub_get('/follows/follower/wktk').to_return(:headers => {:content_type => 'text/html'})
|
93
|
-
Croudia::Scraper.new.follower('wktk')
|
94
|
-
a_get('/follows/follower/wktk').should have_been_made
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
describe '#following' do
|
99
|
-
it 'gets the correct resource' do
|
100
|
-
stub_get('/follows/following/wktk').to_return(:headers => {:content_type => 'text/html'})
|
101
|
-
Croudia::Scraper.new.following('wktk')
|
102
|
-
a_get('/follows/following/wktk').should have_been_made
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
describe '#follow_request' do
|
107
|
-
it 'gets the correct resource' do
|
108
|
-
stub_get('/follows/follow_request').to_return(:headers => {:content_type => 'text/html'})
|
109
|
-
@croudia = Croudia::Scraper.new
|
110
|
-
@croudia.instance_variable_set('@logged_in', true)
|
111
|
-
@croudia.follow_request
|
112
|
-
a_get('/follows/follow_request').should have_been_made
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
@@ -1,137 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Croudia::Scraper::Login do
|
4
|
-
describe '#login' do
|
5
|
-
before do
|
6
|
-
stub_get('/').to_return do |request|
|
7
|
-
if /logged_in=yes/ =~ request.headers['Cookie']
|
8
|
-
{:status => 302, :headers => {:location => Croudia.endpoint + '/logged_in'}}
|
9
|
-
else
|
10
|
-
{:headers => {:content_type => 'text/html'}}
|
11
|
-
end
|
12
|
-
end
|
13
|
-
stub_post('/').to_return do |request|
|
14
|
-
headers = {:content_type => 'text/html'}
|
15
|
-
if /username=username/ =~ request.body
|
16
|
-
headers.merge!(:set_cookie => 'logged_in=yes')
|
17
|
-
end
|
18
|
-
{:headers => headers}
|
19
|
-
end
|
20
|
-
stub_get('/logged_in').to_return(:headers => {:content_type => 'text/html'})
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'gets "/" before login' do
|
24
|
-
Croudia::Scraper.new.login('username', 'password')
|
25
|
-
a_get('/').should have_been_made.twice
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'posts the provided username and password to "/"' do
|
29
|
-
Croudia::Scraper.new.login('username', 'password')
|
30
|
-
a_post('/').with(:body => /username=username/).should have_been_made
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'checks if succeeded or not' do
|
34
|
-
Croudia::Scraper.new.login('username', 'password')
|
35
|
-
a_get('/').with(:headers => {:cookie => /logged_in=yes/}).should have_been_made
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'when the provided username and password are correct' do
|
39
|
-
it 'does not raise an error' do
|
40
|
-
expect{ Croudia::Scraper.new.login('username', 'password') }.not_to raise_error
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'sets @logged_in as true' do
|
44
|
-
@croudia = Croudia::Scraper.new
|
45
|
-
@croudia.login('username', 'password')
|
46
|
-
@croudia.instance_variable_get('@logged_in').should be_true
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context 'when the provided username and password are incorrect' do
|
51
|
-
it 'raises an error' do
|
52
|
-
expect{ Croudia::Scraper.new.login('wrong', 'wrong') }.to raise_error ArgumentError
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe '#logout' do
|
58
|
-
context 'when already logged out' do
|
59
|
-
it 'raises an error' do
|
60
|
-
@croudia = Croudia::Scraper.new
|
61
|
-
@croudia.instance_variable_set('@logged_in', false)
|
62
|
-
expect{ @croudia.logout }.to raise_error Croudia::NotLoggedInError
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context 'when logged in' do
|
67
|
-
before do
|
68
|
-
stub_post('/login/logout')
|
69
|
-
@croudia = Croudia::Scraper.new
|
70
|
-
@croudia.instance_variable_set('@logged_in', true)
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'posts a request to the correct resource' do
|
74
|
-
@croudia.logout
|
75
|
-
a_post('/login/logout').should have_been_made
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'sets @logged_in as false' do
|
79
|
-
@croudia.logout
|
80
|
-
@croudia.instance_variable_get('@logged_in').should be_false
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'sets @current_user nil' do
|
84
|
-
@croudia.logout
|
85
|
-
@croudia.instance_variable_get('@current_user').should be_nil
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe '#logged_in?' do
|
91
|
-
context 'when @logged_in is set' do
|
92
|
-
it 'returns @logged_in' do
|
93
|
-
@croudia = Croudia::Scraper.new
|
94
|
-
@croudia.instance_variable_set('@logged_in', true)
|
95
|
-
@croudia.logged_in?.should be_true
|
96
|
-
@croudia.instance_variable_set('@logged_in', false)
|
97
|
-
@croudia.logged_in?.should be_false
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
context 'when @logged_in is not set' do
|
102
|
-
it 'gets "/" to confirm logged-in or not' do
|
103
|
-
stub_get('/')
|
104
|
-
Croudia::Scraper.new.logged_in?
|
105
|
-
a_get('/').should have_been_made
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
describe '#logged_out?' do
|
111
|
-
it 'returns !self.logged_in' do
|
112
|
-
@croudia = Croudia::Scraper.new
|
113
|
-
@croudia.instance_variable_set('@logged_in', true)
|
114
|
-
@croudia.logged_out?.should be_false
|
115
|
-
@croudia.instance_variable_set('@logged_in', false)
|
116
|
-
@croudia.logged_out?.should be_true
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
describe '#require_login' do
|
121
|
-
context 'when logged out' do
|
122
|
-
it 'raises an errror' do
|
123
|
-
@croudia = Croudia::Scraper.new
|
124
|
-
@croudia.instance_variable_set('@logged_in', false)
|
125
|
-
expect{ @croudia.require_login }.to raise_error Croudia::NotLoggedInError
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
context 'when logged in' do
|
130
|
-
it 'does not raise an error' do
|
131
|
-
@croudia = Croudia::Scraper.new
|
132
|
-
@croudia.instance_variable_set('@logged_in', true)
|
133
|
-
expect{ @croudia.require_login }.not_to raise_error
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|