link_shrink 0.0.2 → 0.0.3
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.
- data/.rspec +1 -1
- data/.travis.yml +2 -0
- data/Changelog.md +13 -0
- data/README.md +45 -0
- data/lib/link_shrink/cli.rb +15 -3
- data/lib/link_shrink/config.rb +24 -0
- data/lib/link_shrink/request.rb +5 -3
- data/lib/link_shrink/shrinkers/base.rb +41 -6
- data/lib/link_shrink/shrinkers/google.rb +18 -6
- data/lib/link_shrink/shrinkers/tinyurl.rb +31 -0
- data/lib/link_shrink/version.rb +1 -1
- data/lib/link_shrink.rb +14 -3
- data/link_shrink.gemspec +4 -4
- data/spec/link_shrink/config_spec.rb +29 -0
- data/spec/link_shrink/google_spec.rb +2 -1
- data/spec/link_shrink/link_shrink_spec.rb +31 -2
- data/spec/link_shrink/request_spec.rb +3 -6
- data/spec/link_shrink/shrinker_base_spec.rb +69 -8
- data/spec/link_shrink/tiny_url_spec.rb +43 -0
- data/spec/spec_helper.rb +24 -1
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/creates_a_short_url.yml +134 -0
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/when_called_with_additional_options/json_option/returns_JSON_when_set_to_true.yml +91 -0
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/when_called_with_additional_options/json_option/returns_default_response_when_set_to_false.yml +91 -0
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/when_called_with_additional_options/qr_code_option/returns_QR_code_when_set_to_true.yml +91 -0
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/when_called_with_additional_options/qr_code_option/returns_default_response_when_set_to_false.yml +91 -0
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/when_called_with_additional_options/returns_default_response_when_called_with_empty_hash.yml +91 -0
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/when_called_with_image_size_200x200/returns_QR_code_link_with_custom_size.yml +91 -0
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/when_called_with_json_and_qr_code_options/returns_qr_code_in_JSON.yml +91 -0
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/when_called_with_json_qr_code_and_image_size_300x300/returns_QR_code_in_JSON_with_custom_size.yml +91 -0
- data/spec/vcr_cassettes/LinkShrink/_shrink_url/when_called_with_no_qr_code_and_image_size_200x200/returns_QR_code_link_with_custom_size.yml +95 -0
- metadata +44 -18
data/.rspec
CHANGED
data/.travis.yml
CHANGED
data/Changelog.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# LinkShrink Changelog
|
2
2
|
|
3
|
+
## 0.0.3
|
4
|
+
|
5
|
+
Released September 6, 2013 ([0.0.3](https://github.com/jonahoffline/link_shrink/tree/v0.0.3)).
|
6
|
+
|
7
|
+
* Add Coverall gem to gemspec.
|
8
|
+
* Add Config class for configuring Shrinker API to use.
|
9
|
+
* Add TinyURL Shrinker.
|
10
|
+
* Add documentation to TinyUrl, Google and Base class.
|
11
|
+
* Add new options for command-line application.
|
12
|
+
* Update README.
|
13
|
+
* Refactor Shrinker Base class and the Google class.
|
14
|
+
* Added 2.0 and JRuby support through TravisCI.
|
15
|
+
|
3
16
|
## 0.0.2
|
4
17
|
|
5
18
|
Released July 16, 2013 ([0.0.2](https://github.com/jonahoffline/link_shrink/tree/v0.0.2)).
|
data/README.md
CHANGED
@@ -8,6 +8,27 @@ Installation
|
|
8
8
|
|
9
9
|
$ gem install link_shrink
|
10
10
|
|
11
|
+
|
12
|
+
Setup
|
13
|
+
-------
|
14
|
+
|
15
|
+
Works best with a Google URL API key. You can sign-up for a free one at
|
16
|
+
[Google URL API](https://code.google.com/apis/console)
|
17
|
+
|
18
|
+
1. In the Services pane, activate the Google URL Shortener API;
|
19
|
+
if the Terms of Service appear, read and accept them.
|
20
|
+
|
21
|
+
2. Go to the [API Access pane](https://code.google.com/apis/console#access). The API key is near the bottom of that pane,
|
22
|
+
in the section titled "Simple API Access."
|
23
|
+
|
24
|
+
#### Configuration ####
|
25
|
+
|
26
|
+
Set your key as an environment variable:
|
27
|
+
|
28
|
+
$ export GOOGLE_URL_KEY='your_api_key_here'
|
29
|
+
|
30
|
+
You could also save it in your ~/.bash_profile
|
31
|
+
|
11
32
|
## Usage ##
|
12
33
|
|
13
34
|
Ruby:
|
@@ -29,6 +50,25 @@ LinkShrink.shrink_url("http://www.ruby-lang.org", { :qr_code => true, image_size
|
|
29
50
|
|
30
51
|
LinkShrink.shrink_url("http://www.ruby-lang.org", { json: true, qr_code: true, image_size: '300x300' })
|
31
52
|
=> "{\"kind\":\"urlshortener#url\",\"id\":\"http://goo.gl/MprR\",\"longUrl\":\"http://www.ruby-lang.org/\",\"qr_code\":\"http://chart.googleapis.com/chart?cht=qr&chs=300x300&choe=UTF-8&chld=H&chl=http://goo.gl/MprR\"}"
|
53
|
+
|
54
|
+
```
|
55
|
+
|
56
|
+
To change the default shrinker (Google API):
|
57
|
+
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
LinkShrink.configure do |c|
|
61
|
+
c.api = 'TinyUrl'
|
62
|
+
end
|
63
|
+
|
64
|
+
# or
|
65
|
+
|
66
|
+
LinkShrink::Config.api = 'TinyUrl'
|
67
|
+
|
68
|
+
LinkShrink.shrink_url('http://www.google.com')
|
69
|
+
=> "http://tinyurl.com/1c2"
|
70
|
+
|
71
|
+
|
32
72
|
```
|
33
73
|
|
34
74
|
|
@@ -36,9 +76,14 @@ In your terminal:
|
|
36
76
|
|
37
77
|
$ linkshrink http://www.rubyrogues.com
|
38
78
|
http://goo.gl/Noh9X
|
79
|
+
|
80
|
+
$ linkshrink --tinyurl http://www.rubyrogues.com
|
81
|
+
http://tinyurl.com/k2butj9
|
39
82
|
|
40
83
|
### Command-Line Options ###
|
41
84
|
|
85
|
+
* -t, --tinyurl - use TinyUrl API
|
86
|
+
* -g, --google - use Google API (Default)
|
42
87
|
* -j, --json - return JSON response
|
43
88
|
* -q, --qrcode - return QR Code
|
44
89
|
* -h, --help - show help message
|
data/lib/link_shrink/cli.rb
CHANGED
@@ -13,8 +13,11 @@ module LinkShrink
|
|
13
13
|
# Configures the arguments for the command
|
14
14
|
# @param opts [OptionParser]
|
15
15
|
def set_options(opts)
|
16
|
+
%w(@json @qr_code @tiny_url)
|
16
17
|
@json = false
|
17
18
|
@qr_code = false
|
19
|
+
@tiny_url = false
|
20
|
+
@google = false
|
18
21
|
opts.version = LinkShrink::VERSION
|
19
22
|
opts.banner = <<MSG
|
20
23
|
Usage: link_shrink [OPTION] [URL]
|
@@ -24,12 +27,20 @@ Description:
|
|
24
27
|
Options:
|
25
28
|
MSG
|
26
29
|
opts.set_program_name 'LinkShrink'
|
30
|
+
opts.on_head('-t', '--tinyurl', 'use TinyURL') do
|
31
|
+
@tiny_url = :true
|
32
|
+
end
|
33
|
+
|
34
|
+
opts.on_head('-g', '--google', 'use Google (Default)') do
|
35
|
+
@google = :true
|
36
|
+
end
|
37
|
+
|
27
38
|
opts.on_head('-j', '--json', 'return JSON response') do
|
28
39
|
@json = :true
|
29
40
|
end
|
30
41
|
|
31
42
|
opts.on_head('-q', '--qrcode', 'return QR Code') do
|
32
|
-
@qr_code = :true
|
43
|
+
@qr_code = :true unless @tiny_url
|
33
44
|
end
|
34
45
|
|
35
46
|
opts.on_tail('-v', '--version', 'display the version of LinkShrink and exit') do
|
@@ -53,11 +64,12 @@ MSG
|
|
53
64
|
end
|
54
65
|
|
55
66
|
def process_url
|
67
|
+
LinkShrink.configure { |c| c.api = 'TinyUrl' } if @tiny_url
|
56
68
|
LinkShrink.shrink_url(@args.last, { json: @json, qr_code: @qr_code })
|
57
69
|
end
|
58
70
|
|
59
71
|
def url_present?
|
60
|
-
!!(@args.last =~ /^(
|
72
|
+
!!(@args.last =~ /^(http?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/)
|
61
73
|
end
|
62
74
|
end
|
63
|
-
end
|
75
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module LinkShrink
|
2
|
+
module Config
|
3
|
+
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
4
|
+
# Configurable module for integrating with other URL APIs
|
5
|
+
extend self
|
6
|
+
|
7
|
+
# Returns and Sets API key to be used
|
8
|
+
# @param api_key [String] API key to be used
|
9
|
+
attr_accessor :api_key
|
10
|
+
|
11
|
+
# Sets API to be used
|
12
|
+
# @param api [String or Symbol] api to be used
|
13
|
+
def api=(api)
|
14
|
+
@api = LinkShrink::Shrinkers.const_get(api).new
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns API used
|
18
|
+
# Unless an API is defined, it returns Google by default
|
19
|
+
# @return [LinkShrink::Shrinkers::Google] instance
|
20
|
+
def api
|
21
|
+
@api || LinkShrink::Shrinkers::Google.new
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/link_shrink/request.rb
CHANGED
@@ -10,11 +10,12 @@ module LinkShrink
|
|
10
10
|
|
11
11
|
module_function
|
12
12
|
|
13
|
-
def process_request(url, options, shrinker = LinkShrink::
|
13
|
+
def process_request(url, options, shrinker = LinkShrink::Config.api)
|
14
14
|
process_response(request(url, shrinker).body, options, shrinker)
|
15
15
|
end
|
16
16
|
|
17
17
|
def process_response(response, options, shrinker, json = JSONParser)
|
18
|
+
return response if shrinker.content_type.eql?('text/plain')
|
18
19
|
option = Options.new(options)
|
19
20
|
parsed_json = json.parse_json(response)
|
20
21
|
plain = parsed_json['id']
|
@@ -45,11 +46,12 @@ module LinkShrink
|
|
45
46
|
# @see LinkShrink::Shrinkers::Base#api_url
|
46
47
|
# @see LinkShrink::Shrinkers::Base#body_parameters
|
47
48
|
def request(url, shrinker)
|
49
|
+
shrinker.url = url
|
48
50
|
Typhoeus::Request.new(
|
49
51
|
shrinker.api_url,
|
50
|
-
method:
|
52
|
+
method: shrinker.http_method,
|
51
53
|
body: shrinker.body_parameters(url),
|
52
|
-
headers: { 'Content-Type' =>
|
54
|
+
headers: { 'Content-Type' => shrinker.content_type }
|
53
55
|
).run
|
54
56
|
end
|
55
57
|
end
|
@@ -5,11 +5,14 @@ module LinkShrink
|
|
5
5
|
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
6
6
|
# an Abstract Base class for implementing other URL APIs
|
7
7
|
class Base
|
8
|
+
attr_reader :url
|
8
9
|
# Callback method that dynamically defines a sub_klass method for reference
|
9
10
|
# @return [String] inherited class name
|
10
11
|
def self.inherited(sub_klass)
|
11
|
-
|
12
|
-
|
12
|
+
sub_klass.class_eval do
|
13
|
+
define_method 'sub_klass' do
|
14
|
+
@sub_klass = "#{sub_klass.name}"[/::(\w+)::(\w+)/, 2]
|
15
|
+
end
|
13
16
|
end
|
14
17
|
end
|
15
18
|
|
@@ -24,8 +27,10 @@ module LinkShrink
|
|
24
27
|
end
|
25
28
|
|
26
29
|
# Parameters to be used in API request
|
27
|
-
|
28
|
-
|
30
|
+
# @param params [Hash] parameters to be used
|
31
|
+
# @return [NilClass] nil if parameters are empty
|
32
|
+
def body_parameters(params = {})
|
33
|
+
nil if params.empty?
|
29
34
|
end
|
30
35
|
|
31
36
|
# Complete URL with query parameters
|
@@ -46,8 +51,38 @@ module LinkShrink
|
|
46
51
|
end
|
47
52
|
|
48
53
|
# Encodes URL
|
49
|
-
|
50
|
-
|
54
|
+
# @param new_url [String] url to be parsed
|
55
|
+
# @return [String] parsed URL
|
56
|
+
def sanitize_url(new_url)
|
57
|
+
URI.encode(!(new_url =~ /^(http?:\/\/)?/) ? "http://#{new_url}" : new_url)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns HTTP method to be used in request
|
61
|
+
# @return [Symbol] http method
|
62
|
+
def http_method
|
63
|
+
:get
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns Content-Type to be used in Request headers
|
67
|
+
# @return [String] content-type
|
68
|
+
def content_type
|
69
|
+
'application/json'
|
70
|
+
end
|
71
|
+
|
72
|
+
# Sets URL to be used in request
|
73
|
+
# @see #sanitize_url
|
74
|
+
# @param new_url [String] url to be parsed
|
75
|
+
# @return [String] parsed url
|
76
|
+
def url=(new_url)
|
77
|
+
@url = sanitize_url(new_url)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Method for generating QR codes or charts
|
81
|
+
# @param new_url [String] url to be processed
|
82
|
+
# @param image_size [Hash<symbol>] image size target
|
83
|
+
# @return [String] chart or qr code url
|
84
|
+
def generate_chart_url(new_url, image_size = {})
|
85
|
+
fail "#{__method__} not implemented"
|
51
86
|
end
|
52
87
|
end
|
53
88
|
end
|
@@ -5,27 +5,39 @@ module LinkShrink
|
|
5
5
|
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
6
6
|
# Implements Google's URL Shortener API
|
7
7
|
class Google < Base
|
8
|
+
# Returns URL base for API
|
9
|
+
# @return [String] api base url
|
8
10
|
def base_url
|
9
11
|
'https://www.googleapis.com/urlshortener/v1/url'
|
10
12
|
end
|
11
13
|
|
14
|
+
# Returns URL query parameters
|
15
|
+
# @return [String] query parameters to be used in request
|
12
16
|
def api_query_parameter
|
13
17
|
"?key=#{api_key}"
|
14
18
|
end
|
15
19
|
|
16
|
-
|
17
|
-
|
20
|
+
# Returns body parameters used in request header
|
21
|
+
# @return [String] body parameters to be used in request header
|
22
|
+
def body_parameters(new_url = nil)
|
23
|
+
{ 'longUrl' => url }.to_json
|
18
24
|
end
|
19
25
|
|
20
26
|
# Generates QR code URL
|
21
27
|
# @return [String] QR code url with '150x150' or custom image size
|
22
|
-
def generate_chart_url(
|
23
|
-
return "#{
|
28
|
+
def generate_chart_url(new_url, image_size = {})
|
29
|
+
return "#{new_url}.qr" if image_size.empty?
|
24
30
|
|
25
31
|
chart_url = 'http://chart.googleapis.com/chart'
|
26
|
-
params = "?cht=qr&chs=#{image_size}&choe=UTF-8&chld=H&chl=#{
|
32
|
+
params = "?cht=qr&chs=#{image_size}&choe=UTF-8&chld=H&chl=#{new_url}"
|
27
33
|
chart_url.concat(params)
|
28
34
|
end
|
35
|
+
|
36
|
+
# Returns HTTP method to be used in request
|
37
|
+
# @return [Symbol] post http method
|
38
|
+
def http_method
|
39
|
+
:post
|
40
|
+
end
|
29
41
|
end
|
30
42
|
end
|
31
|
-
end
|
43
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module LinkShrink
|
2
|
+
module Shrinkers
|
3
|
+
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
4
|
+
# Implements Tiny URL Shortener API
|
5
|
+
class TinyUrl < Base
|
6
|
+
# Returns URL base for API
|
7
|
+
# @return [String] api base url
|
8
|
+
def base_url
|
9
|
+
'http://tinyurl.com/api-create.php'
|
10
|
+
end
|
11
|
+
|
12
|
+
# URL query parameters
|
13
|
+
# @return [String] query parameters to be used in request
|
14
|
+
def api_query_parameter
|
15
|
+
"?url=#{url}"
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns Content-Type to be used in Request headers
|
19
|
+
# @return [String] text/plain as content-type
|
20
|
+
def content_type
|
21
|
+
'text/plain'
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns full api url
|
25
|
+
# @return [String] full api url with query parameters
|
26
|
+
def api_url
|
27
|
+
base_url.concat api_query_parameter
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/link_shrink/version.rb
CHANGED
data/lib/link_shrink.rb
CHANGED
@@ -4,10 +4,13 @@ require 'link_shrink/request'
|
|
4
4
|
require 'link_shrink/json_parser'
|
5
5
|
require 'link_shrink/shrinkers/base'
|
6
6
|
require 'link_shrink/shrinkers/google'
|
7
|
+
require 'link_shrink/shrinkers/tinyurl'
|
8
|
+
require 'link_shrink/config'
|
7
9
|
|
8
10
|
# @author Jonah Ruiz <jonah@pixelhipsters.com>
|
9
11
|
# Creates a short URL and QR codes
|
10
12
|
module LinkShrink
|
13
|
+
extend self
|
11
14
|
include LinkShrink::Request
|
12
15
|
# Returns a short URL or JSON response
|
13
16
|
# example: shrink_url('http://www.wtf.com', { json: true, qr_code: true })
|
@@ -16,7 +19,7 @@ module LinkShrink
|
|
16
19
|
# @param url [String] long URL to be shortened
|
17
20
|
# @param options [Hash] format to be returned
|
18
21
|
# @return [String] generated short URL or JSON response
|
19
|
-
def
|
22
|
+
def shrink_url(url, options = { json: false, qr_code: false })
|
20
23
|
process_request(url, options)
|
21
24
|
rescue
|
22
25
|
'Problem generating short URL. Try again.'
|
@@ -28,9 +31,17 @@ module LinkShrink
|
|
28
31
|
# @param url [String] long URL to be shortened
|
29
32
|
# @param options [Hash] image_size: '300x300' for a custom size
|
30
33
|
# @return [String] QR code URL using default or custom size
|
31
|
-
def
|
34
|
+
def generate_qr_code(url, options = {})
|
32
35
|
new_url = process_request(url, {})
|
33
36
|
image_size = options.fetch(:image_size, {})
|
34
|
-
|
37
|
+
Config.api.generate_chart_url(new_url, image_size)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Yield's to Config for options
|
41
|
+
#
|
42
|
+
# @param <config> [String] api interface to use
|
43
|
+
# @param <api_key> [String] api key to use
|
44
|
+
def configure
|
45
|
+
yield LinkShrink::Config if block_given?
|
35
46
|
end
|
36
47
|
end
|
data/link_shrink.gemspec
CHANGED
@@ -24,9 +24,9 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
25
25
|
spec.add_development_dependency 'rspec', '~> 2.14.1'
|
26
26
|
spec.add_development_dependency 'rake'
|
27
|
-
spec.add_development_dependency 'autotest-standalone', '~> 4.5.11'
|
28
|
-
spec.add_development_dependency 'autotest-fsevent', '~> 0.2.8'
|
29
|
-
spec.add_development_dependency 'rspec-nc', '~> 0.0.6'
|
30
27
|
spec.add_development_dependency 'simplecov', '~> 0.7.1'
|
31
28
|
spec.add_development_dependency 'simplecov-gem-adapter', '~> 1.0.1'
|
32
|
-
|
29
|
+
spec.add_development_dependency 'coveralls', '~> 0.6.7'
|
30
|
+
spec.add_development_dependency 'webmock', '~> 1.13.0'
|
31
|
+
spec.add_development_dependency 'vcr', '~> 2.5.0'
|
32
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LinkShrink::Config do
|
4
|
+
include_examples 'shared_examples'
|
5
|
+
|
6
|
+
let(:link_shrink) { described_class }
|
7
|
+
|
8
|
+
describe '#api_key' do
|
9
|
+
it 'sets api_key' do
|
10
|
+
link_shrink.api_key = '12345'
|
11
|
+
expect(link_shrink.api_key).to eq('12345')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#api' do
|
16
|
+
it 'sets api' do
|
17
|
+
link_shrink = LinkShrink
|
18
|
+
link_shrink.configure { |c| c.api = 'Google' }
|
19
|
+
expect(link_shrink::Config.api.class).to eq(LinkShrink::Shrinkers::Google)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'by default api is set to Google' do
|
23
|
+
it 'returns api name' do
|
24
|
+
expect(link_shrink.api).to be_a(LinkShrink::Shrinkers::Google)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -45,7 +45,8 @@ describe LinkShrink::Shrinkers::Google do
|
|
45
45
|
|
46
46
|
describe '#body_parameters' do
|
47
47
|
it 'returns body parameters for API request' do
|
48
|
-
|
48
|
+
link_shrink.stub(:url).and_return('http://www.google.com')
|
49
|
+
expect(link_shrink.body_parameters())
|
49
50
|
.to eq("{\"longUrl\":\"http://www.google.com\"}")
|
50
51
|
end
|
51
52
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe LinkShrink do
|
4
4
|
include_examples 'shared_examples'
|
5
5
|
|
6
|
-
describe '.shrink_url' do
|
6
|
+
describe '.shrink_url', :vcr => 'google_url' do
|
7
7
|
it 'creates a short url' do
|
8
8
|
expect(link_shrink.shrink_url(url)).to eq(short_url)
|
9
9
|
end
|
@@ -52,14 +52,30 @@ describe LinkShrink do
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
context 'when called with no qr_code and image_size: 200x200' do
|
56
|
+
it 'returns QR code link with custom size' do
|
57
|
+
expect(link_shrink.shrink_url(url, {:image_size => "200x200"}))
|
58
|
+
.to eq(chart_url)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
55
62
|
context 'when called with json, qr_code and image_size: 300x300' do
|
56
|
-
let(:options) { { json: true, qr_code: true, image_size: "300x300" }}
|
63
|
+
let(:options) { { json: true, qr_code: true, image_size: "300x300" } }
|
57
64
|
|
58
65
|
it 'returns QR code in JSON with custom size' do
|
59
66
|
expect(link_shrink.shrink_url(url, options))
|
60
67
|
.to eq(json_qr_code_custom)
|
61
68
|
end
|
62
69
|
end
|
70
|
+
|
71
|
+
context 'when API is down' do
|
72
|
+
it 'raises rescue exception' do
|
73
|
+
link_shrink.stub(:request).and_return(nil)
|
74
|
+
|
75
|
+
expect(link_shrink.shrink_url('www.google.com'))
|
76
|
+
.to eq('Problem generating short URL. Try again.')
|
77
|
+
end
|
78
|
+
end
|
63
79
|
end
|
64
80
|
|
65
81
|
describe '.generate_qr_code' do
|
@@ -74,4 +90,17 @@ describe LinkShrink do
|
|
74
90
|
end
|
75
91
|
end
|
76
92
|
end
|
93
|
+
|
94
|
+
describe '.configure' do
|
95
|
+
context 'when passed a block' do
|
96
|
+
it 'yields to Config' do
|
97
|
+
expect { |c| link_shrink.configure(&c) }.to yield_control
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'sets API Shrinker' do
|
101
|
+
link_shrink.should_receive(:configure).and_yield(LinkShrink::Config)
|
102
|
+
link_shrink.configure { |config| api = 'TinyURL' }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
77
106
|
end
|
@@ -2,18 +2,15 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe LinkShrink::Request do
|
4
4
|
include_examples 'shared_examples'
|
5
|
-
let(:shrinker) { LinkShrink::
|
5
|
+
let(:shrinker) { LinkShrink::Config.api }
|
6
6
|
let(:json_default) {{ :json => false }}
|
7
7
|
|
8
8
|
describe '.process_request' do
|
9
9
|
it 'calls request and returns short link' do
|
10
|
-
expect(link_shrink.process_request(url, json_default))
|
10
|
+
expect(link_shrink.process_request(url, json_default, shrinker))
|
11
|
+
.to eq(short_url)
|
11
12
|
end
|
12
13
|
|
13
|
-
#it 'calls request and returns short link' do
|
14
|
-
# expect(link_shrink.process_request(url)).to eq(short_url)
|
15
|
-
#end
|
16
|
-
|
17
14
|
context 'when called with qr_code true, image_size 300x300' do
|
18
15
|
it 'returns QR code with custom size' do
|
19
16
|
options = { json: true, qr_code: true, image_size: '300x300' }
|
@@ -16,28 +16,62 @@ describe LinkShrink::Shrinkers::Base do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
describe '#body_parameters' do
|
19
|
-
it 'raises
|
20
|
-
expect
|
19
|
+
it 'raises nil when called without arguments' do
|
20
|
+
expect(link_shrink.body_parameters).to eq(nil)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
describe '#api_url' do
|
25
|
+
context 'when api_key is found' do
|
26
|
+
it 'returns base_url with api_query_parameters' do
|
27
|
+
link_shrink.stub(:sub_klass).and_return('Blahblah')
|
28
|
+
link_shrink.stub(:api_key).and_return('12345')
|
29
|
+
link_shrink.stub(:api_key?).and_return(true)
|
30
|
+
|
31
|
+
link_shrink.stub(:base_url).and_return('http://blah.io/api')
|
32
|
+
link_shrink.stub(:api_query_parameter).and_return('?key=12345')
|
33
|
+
expect(link_shrink.api_url).to eq('http://blah.io/api?key=12345')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when api_key is not found' do
|
38
|
+
it 'returns base_url' do
|
39
|
+
link_shrink.stub(:sub_klass).and_return('Blahblahblah')
|
40
|
+
link_shrink.stub(:api_key?).and_return(false)
|
41
|
+
link_shrink.stub(:base_url).and_return('http://blah.io/api')
|
42
|
+
expect(link_shrink.api_url).to eq('http://blah.io/api')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#generate_chart_url' do
|
25
48
|
it 'raises error due to other methods not being overridden' do
|
26
|
-
expect{ link_shrink.
|
49
|
+
expect{ link_shrink.generate_chart_url('something') }.to raise_error
|
27
50
|
end
|
28
51
|
end
|
29
|
-
|
52
|
+
|
30
53
|
describe '#api_key?' do
|
31
54
|
it 'returns false when API is not found' do
|
32
|
-
link_shrink.stub(:sub_klass).and_return('
|
55
|
+
link_shrink.stub(:sub_klass).and_return('blahbla')
|
33
56
|
expect(link_shrink.api_key?).to be_false
|
34
57
|
end
|
35
58
|
end
|
36
59
|
|
37
60
|
describe '#api_key' do
|
38
|
-
|
39
|
-
|
40
|
-
|
61
|
+
context 'when not found' do
|
62
|
+
it 'returns nil' do
|
63
|
+
link_shrink.stub(:sub_klass).and_return('Blahh')
|
64
|
+
expect(link_shrink.api_key).to eq(nil)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when found' do
|
69
|
+
it 'returns api_key' do
|
70
|
+
link_shrink.stub(:sub_klass).and_return('Blah')
|
71
|
+
#link_shrink.stub(:api).and_return('Blah')
|
72
|
+
ENV.store('BLAH_URL_KEY', '12345')
|
73
|
+
expect(link_shrink.api_key).to eq('12345')
|
74
|
+
end
|
41
75
|
end
|
42
76
|
end
|
43
77
|
|
@@ -47,4 +81,31 @@ describe LinkShrink::Shrinkers::Base do
|
|
47
81
|
.to eq("http://www.google.com/%20")
|
48
82
|
end
|
49
83
|
end
|
84
|
+
|
85
|
+
describe '#http_method' do
|
86
|
+
it 'returns :get' do
|
87
|
+
expect(link_shrink.http_method).to eq(:get)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#content_type' do
|
92
|
+
it 'returns application/json by default' do
|
93
|
+
expect(link_shrink.content_type).to eq('application/json')
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '#url' do
|
98
|
+
context 'when set' do
|
99
|
+
it 'returns url' do
|
100
|
+
link_shrink.url = 'http://www.google.com'
|
101
|
+
expect(link_shrink.url).to eq('http://www.google.com')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'when called without being set' do
|
106
|
+
it 'returns nil' do
|
107
|
+
expect(link_shrink.url).to eq(nil)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
50
111
|
end
|