flickrmocks 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +36 -0
- data/.document +5 -0
- data/.gitignore +23 -0
- data/.rspec +3 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +59 -0
- data/Rakefile +76 -0
- data/VERSION +1 -0
- data/autotest/discover.rb +1 -0
- data/flickrmocks.gemspec +155 -0
- data/lib/flickr_mocks/api/api.rb +42 -0
- data/lib/flickr_mocks/api/flickr.rb +27 -0
- data/lib/flickr_mocks/api/helpers.rb +19 -0
- data/lib/flickr_mocks/api/options.rb +55 -0
- data/lib/flickr_mocks/api/sanitize.rb +29 -0
- data/lib/flickr_mocks/fixtures.rb +35 -0
- data/lib/flickr_mocks/flickraw/custom_clone.rb +19 -0
- data/lib/flickr_mocks/flickraw/custom_compare.rb +25 -0
- data/lib/flickr_mocks/flickraw/custom_marshal.rb +39 -0
- data/lib/flickr_mocks/flickraw/flickraw.rb +14 -0
- data/lib/flickr_mocks/helpers.rb +52 -0
- data/lib/flickr_mocks/models/helpers.rb +14 -0
- data/lib/flickr_mocks/models/photo.rb +101 -0
- data/lib/flickr_mocks/models/photo_details.rb +86 -0
- data/lib/flickr_mocks/models/photo_dimensions.rb +103 -0
- data/lib/flickr_mocks/models/photo_search.rb +115 -0
- data/lib/flickr_mocks/models/photo_size.rb +60 -0
- data/lib/flickr_mocks/models/photo_sizes.rb +93 -0
- data/lib/flickr_mocks/models/photos.rb +133 -0
- data/lib/flickr_mocks/stubs.rb +103 -0
- data/lib/flickr_mocks/version.rb +4 -0
- data/lib/flickrmocks.rb +27 -0
- data/spec/api/api_spec.rb +84 -0
- data/spec/api/flickr_spec.rb +48 -0
- data/spec/api/helper_spec.rb +37 -0
- data/spec/api/options_spec.rb +152 -0
- data/spec/api/sanitize_spec.rb +90 -0
- data/spec/base/fixtures_spec.rb +89 -0
- data/spec/base/flickraw/custom_clone_spec.rb +70 -0
- data/spec/base/flickraw/custom_compare_spec.rb +98 -0
- data/spec/base/flickraw/custom_marshal_spec.rb +45 -0
- data/spec/base/helpers_spec.rb +63 -0
- data/spec/base/stubs_spec.rb +180 -0
- data/spec/base/version_spec.rb +15 -0
- data/spec/fixtures/author_photos.marshal +0 -0
- data/spec/fixtures/empty_photos.marshal +0 -0
- data/spec/fixtures/expected_methods.marshal +17 -0
- data/spec/fixtures/interesting_photos.marshal +0 -0
- data/spec/fixtures/photo.marshal +0 -0
- data/spec/fixtures/photo_details.marshal +0 -0
- data/spec/fixtures/photo_size.marshal +0 -0
- data/spec/fixtures/photo_sizes.marshal +0 -0
- data/spec/fixtures/photos.marshal +0 -0
- data/spec/models/helpers_spec.rb +25 -0
- data/spec/models/photo_details_spec.rb +224 -0
- data/spec/models/photo_dimensions_spec.rb +208 -0
- data/spec/models/photo_search_spec.rb +255 -0
- data/spec/models/photo_size_spec.rb +122 -0
- data/spec/models/photo_sizes_spec.rb +168 -0
- data/spec/models/photo_spec.rb +278 -0
- data/spec/models/photos_spec.rb +305 -0
- data/spec/shared_examples/array_accessor.rb +157 -0
- data/spec/shared_examples/collection.rb +49 -0
- data/spec/shared_examples/image_url_helpers.rb +56 -0
- data/spec/shared_examples/size_accessor.rb +13 -0
- data/spec/spec_helper.rb +24 -0
- data/tasks/fixtures.rb +164 -0
- metadata +259 -0
@@ -0,0 +1,133 @@
|
|
1
|
+
module FlickrMocks
|
2
|
+
class Photos
|
3
|
+
attr_reader :current_page,:per_page,:total_entries,:total_pages,:photos
|
4
|
+
alias :perpage :per_page
|
5
|
+
|
6
|
+
@defaults = {
|
7
|
+
:max_entries => 4000,
|
8
|
+
:per_page => 50
|
9
|
+
}
|
10
|
+
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr_accessor :defaults
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(data)
|
17
|
+
raise ArgumentError, 'Expecting class of FlickRaw::ResponseList' unless data.class == FlickRaw::ResponseList
|
18
|
+
self.current_page= data.page
|
19
|
+
self.per_page= data.perpage
|
20
|
+
self.total_entries= data.total
|
21
|
+
self.total_pages = data.pages
|
22
|
+
self.photos = data.photo
|
23
|
+
end
|
24
|
+
|
25
|
+
def default(value)
|
26
|
+
Photos.defaults[value.to_s.to_sym]
|
27
|
+
end
|
28
|
+
|
29
|
+
def capped_entries
|
30
|
+
total_entries > max_entries ? max_entries : total_entries
|
31
|
+
end
|
32
|
+
|
33
|
+
def capped?
|
34
|
+
max_entries < total_entries ? true : false
|
35
|
+
end
|
36
|
+
|
37
|
+
def max_entries
|
38
|
+
default(:max_entries)
|
39
|
+
end
|
40
|
+
|
41
|
+
def pages
|
42
|
+
max_pages = default(:max_entries)/perpage
|
43
|
+
total_pages > max_pages ? max_pages : total_pages
|
44
|
+
end
|
45
|
+
|
46
|
+
def usable_photos
|
47
|
+
photos.clone.keep_if(&:usable?)
|
48
|
+
end
|
49
|
+
|
50
|
+
def collection(usable=nil)
|
51
|
+
case usable
|
52
|
+
when true
|
53
|
+
usable_photos = photos.clone.keep_if(&:usable?)
|
54
|
+
::WillPaginate::Collection.create(1, per_page, usable_photos.length) do |obj|
|
55
|
+
obj.replace(usable_photos)
|
56
|
+
end
|
57
|
+
else
|
58
|
+
::WillPaginate::Collection.create(current_page, per_page, capped_entries) do |obj|
|
59
|
+
obj.replace(photos)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def ==(other)
|
66
|
+
return false unless other.class == Photos
|
67
|
+
return false unless [:current_page,:per_page,:total_entries,:total_pages].inject(true) do |state,method|
|
68
|
+
state && (self.send(method) == other.send(method))
|
69
|
+
end
|
70
|
+
other.respond_to?(:photos) ? photos == other.photos : false
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# metaprogramming methods
|
75
|
+
def method_missing(id,*args,&block)
|
76
|
+
return photos.send(id,*args,&block) if delegated_instance_methods.include?(id)
|
77
|
+
super
|
78
|
+
end
|
79
|
+
|
80
|
+
alias :old_respond_to? :respond_to?
|
81
|
+
def respond_to?(method)
|
82
|
+
old_respond_to?(method) || delegated_instance_methods.include?(method)
|
83
|
+
end
|
84
|
+
|
85
|
+
alias :old_methods :methods
|
86
|
+
def methods
|
87
|
+
delegated_instance_methods + old_methods
|
88
|
+
end
|
89
|
+
|
90
|
+
def delegated_instance_methods
|
91
|
+
FlickrMocks::Models::Helpers.array_accessor_methods
|
92
|
+
end
|
93
|
+
|
94
|
+
# custom cloning methods
|
95
|
+
def initialize_copy(orig)
|
96
|
+
super
|
97
|
+
@photos = @photos.map do |photo|
|
98
|
+
photo.clone
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
def current_page=(value)
|
104
|
+
raise ArgumentError,"Expected Fixnum but was #{value.class}" unless value.is_a?(Fixnum) or value.is_a?(String)
|
105
|
+
@current_page=value.to_i
|
106
|
+
end
|
107
|
+
|
108
|
+
def per_page=(value)
|
109
|
+
raise ArgumentError,"Expected Fixnum but was #{value.class}" unless value.is_a?(Fixnum) or value.is_a?(String)
|
110
|
+
@per_page=value.to_i
|
111
|
+
end
|
112
|
+
|
113
|
+
def total_entries=(value)
|
114
|
+
raise ArgumentError,"Expected Fixnum but was #{value.class}" unless value.is_a?(Fixnum) or value.is_a?(String)
|
115
|
+
@total_entries=value.to_i
|
116
|
+
end
|
117
|
+
|
118
|
+
def total_pages=(value)
|
119
|
+
raise ArgumentError,"Expected Fixnum but was #{value.class}" unless value.is_a?(Fixnum) or value.is_a?(String)
|
120
|
+
@total_pages=value.to_i
|
121
|
+
end
|
122
|
+
|
123
|
+
def photos=(photos)
|
124
|
+
raise ArgumentError,"Expected argument that responds to :each but got class #{photos.class}" unless photos.respond_to?(:each)
|
125
|
+
results = []
|
126
|
+
photos.each do |photo|
|
127
|
+
raise ArgumentError,"Expected FlickRaw::Response but was #{value.class}" unless photo.is_a?(FlickRaw::Response)
|
128
|
+
results.push(Photo.new(photo))
|
129
|
+
end
|
130
|
+
@photos=results
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module FlickrMocks
|
2
|
+
module Stubs
|
3
|
+
|
4
|
+
def self.stub_flickr
|
5
|
+
[:stub_search,:stub_getInfo,:stub_getSizes,:stub_interestingness].each do |method|
|
6
|
+
self.send(method)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def self.stub_search
|
12
|
+
fixtures = Fixtures.new
|
13
|
+
Proc.new { flickr.photos.stub(:search) do |params|
|
14
|
+
if !params.is_a?(Hash)
|
15
|
+
raise FlickRaw::FailedResponse.new('Parameterless searches have been disabled. Please use flickr.photos.getRecent instead.',
|
16
|
+
'code','flickr.photos.search'
|
17
|
+
)
|
18
|
+
elsif(params[:tags] == 'garbage' || params[:user_id] == 'garbage')
|
19
|
+
fixtures.empty_photos
|
20
|
+
elsif(params[:tags] && params[:user_id])
|
21
|
+
fixtures.author_photos
|
22
|
+
elsif params.has_key?(:tags)
|
23
|
+
fixtures.photos
|
24
|
+
elsif params.has_key?(:user_id)
|
25
|
+
fixtures.author_photos
|
26
|
+
else
|
27
|
+
raise FlickRaw::FailedResponse.new('Parameterless searches have been disabled. Please use flickr.photos.getRecent instead.',
|
28
|
+
'code','flickr.photos.search'
|
29
|
+
)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
}.call
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.stub_getInfo
|
36
|
+
Proc.new {
|
37
|
+
flickr.photos.stub(:getInfo) do |params|
|
38
|
+
if !params.is_a?(Hash)
|
39
|
+
raise FlickRaw::FailedResponse.new('Photo not found',
|
40
|
+
'code', 'flickr.photos.getInfo')
|
41
|
+
elsif !params.has_key?(:photo_id)
|
42
|
+
raise FlickRaw::FailedResponse.new('Photo not found',
|
43
|
+
'code', 'flickr.photos.getInfo')
|
44
|
+
elsif params[:photo_id] == 'garbage'
|
45
|
+
raise FlickRaw::FailedResponse.new('Photo "%s" not found (invalid ID)' % params[:photo_id],
|
46
|
+
'code','flickr.photos.getInfo')
|
47
|
+
else
|
48
|
+
Fixtures.new.photo_details
|
49
|
+
end
|
50
|
+
end
|
51
|
+
}.call
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.stub_getSizes
|
55
|
+
Proc.new {
|
56
|
+
flickr.photos.stub(:getSizes) do |params|
|
57
|
+
if !params.is_a?(Hash)
|
58
|
+
raise FlickRaw::FailedResponse.new('Photo not found',
|
59
|
+
'code', 'flickr.photos.getSizes')
|
60
|
+
elsif !params.has_key?(:photo_id)
|
61
|
+
raise FlickRaw::FailedResponse.new('Photo not found',
|
62
|
+
'code', 'flickr.photos.getSizes')
|
63
|
+
elsif params[:photo_id] == 'garbage'
|
64
|
+
raise FlickRaw::FailedResponse.new('Photo not found',
|
65
|
+
'code','flickr.photos.getSizes')
|
66
|
+
else
|
67
|
+
Fixtures.new.photo_sizes
|
68
|
+
end
|
69
|
+
end
|
70
|
+
}.call
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.stub_interestingness
|
74
|
+
Proc.new {
|
75
|
+
flickr.interestingness.stub(:getList) do |params|
|
76
|
+
if !params.is_a?(Hash)
|
77
|
+
Fixtures.new.interesting_photos
|
78
|
+
elsif !params.has_key?(:date)
|
79
|
+
Fixtures.new.interesting_photos
|
80
|
+
elsif params[:date] == 'garbage'
|
81
|
+
raise FlickRaw::FailedResponse.new('Not a valid date string',
|
82
|
+
'code','flickr.interestingness.getList'
|
83
|
+
)
|
84
|
+
elsif params[:date] == '2000-01-01'
|
85
|
+
Fixtures.new.empty_photos
|
86
|
+
else
|
87
|
+
Fixtures.new.interesting_photos
|
88
|
+
end
|
89
|
+
end
|
90
|
+
}.call
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
data/lib/flickrmocks.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'chronic'
|
2
|
+
|
3
|
+
require 'find'
|
4
|
+
require 'delegate'
|
5
|
+
require 'cgi'
|
6
|
+
|
7
|
+
require 'will_paginate/collection'
|
8
|
+
|
9
|
+
# Use user specified FlickRaw definition, if not defined use flickraw-cached if
|
10
|
+
# available
|
11
|
+
begin
|
12
|
+
require 'flickraw-cached' unless defined?(FlickRaw)
|
13
|
+
rescue LoadError
|
14
|
+
require 'flickraw'
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
flickrmocks_path = File.expand_path('../flickr_mocks/', __FILE__)
|
20
|
+
|
21
|
+
|
22
|
+
# include all ruby files in the library path
|
23
|
+
Find.find(flickrmocks_path) do |file|
|
24
|
+
if File.file?(file)
|
25
|
+
require file if File.extname(file) == '.rb'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ruby-debug'
|
3
|
+
describe APP::Api do
|
4
|
+
let(:klass) { APP::Api }
|
5
|
+
|
6
|
+
let(:fixtures) { APP::Fixtures.new }
|
7
|
+
let(:photo) {fixtures.photo}
|
8
|
+
let(:photos) {fixtures.photos}
|
9
|
+
let(:sizes) {fixtures.photo_sizes}
|
10
|
+
let(:photo_details) {fixtures.photo_details}
|
11
|
+
let(:interesting_photos) {fixtures.interesting_photos}
|
12
|
+
|
13
|
+
|
14
|
+
context "class instance variables" do
|
15
|
+
context "@defaults" do
|
16
|
+
before(:each) do
|
17
|
+
@defaults = klass.defaults.clone
|
18
|
+
end
|
19
|
+
after(:each) do
|
20
|
+
klass.defaults = @defaults
|
21
|
+
end
|
22
|
+
it "returns has with expected set of keys" do
|
23
|
+
klass.defaults.keys.sort.should == [:per_page,:license,:media,:extras,:tag_mode,:flickr_tag_modes].sort
|
24
|
+
end
|
25
|
+
it "returns object whose elements can be set similar to a hash" do
|
26
|
+
expected = "#{Random.srand}"
|
27
|
+
klass.defaults.keys.each do |k|
|
28
|
+
klass.defaults[k] = expected
|
29
|
+
klass.defaults[k].should == expected
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "class methods" do
|
36
|
+
specify {klass.should respond_to(:photo)}
|
37
|
+
context "photo" do
|
38
|
+
it "returns expected Photo object" do
|
39
|
+
flickr.photos.stub(:getInfo).and_return(photo)
|
40
|
+
klass.photo({:photo =>photo.id,
|
41
|
+
:secret => photo.secret}).should == APP::Photo.new(photo)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
specify {klass.should respond_to(:photos)}
|
46
|
+
context "photos" do
|
47
|
+
it "returns expected PhotoSearch object" do
|
48
|
+
flickr.photos.stub(:search).and_return(photos)
|
49
|
+
klass.photos({:search_terms => 'iran'}).should ==
|
50
|
+
APP::PhotoSearch.new(photos,{:search_terms => 'iran'})
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
specify {klass.should respond_to(:photo_sizes)}
|
55
|
+
describe "photo_sizes" do
|
56
|
+
it "returns expected PhotoSizes object" do
|
57
|
+
expected = APP::PhotoSizes.new(sizes)
|
58
|
+
flickr.photos.stub(:getSizes).and_return(sizes)
|
59
|
+
klass.photo_sizes(:photo => expected.id,
|
60
|
+
:secret => expected.secret).should == expected
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
specify {klass.should respond_to(:photo_details)}
|
65
|
+
describe "photo_details" do
|
66
|
+
it "returns expected PhotoDetails object" do
|
67
|
+
flickr.photos.stub(:getSizes).and_return(sizes)
|
68
|
+
flickr.photos.stub(:getInfo).and_return(photo)
|
69
|
+
klass.photo_details(:photo => photo.id,
|
70
|
+
:secret => photo.secret).should == APP::PhotoDetails.new(photo,sizes)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
specify {klass.should respond_to(:interesting_photos)}
|
75
|
+
describe "interesting_photos" do
|
76
|
+
it "returns expected PhotoSearch object" do
|
77
|
+
flickr.interestingness.stub(:getList).and_return(interesting_photos)
|
78
|
+
klass.interesting_photos({:date => '2010-01-01'}).should ==
|
79
|
+
APP::PhotoSearch.new(interesting_photos,{:date => '2010-01-01'})
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe APP::Api do
|
4
|
+
let(:klass){APP::Api}
|
5
|
+
let(:fixtures){APP::Fixtures.new}
|
6
|
+
|
7
|
+
context "class methods" do
|
8
|
+
specify {klass.should respond_to(:flickr_photos)}
|
9
|
+
context "flickr_photos" do
|
10
|
+
it "returns list of photos" do
|
11
|
+
flickr.photos.stub(:search).and_return(fixtures.photos)
|
12
|
+
klass.flickr_photos({}).should == fixtures.photos
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
specify {klass.should respond_to(:flickr_photo)}
|
17
|
+
context "flickr_photos" do
|
18
|
+
it "returns photo" do
|
19
|
+
flickr.photos.stub(:getInfo).and_return(fixtures.photo)
|
20
|
+
klass.flickr_photo({}).should == fixtures.photo
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
specify {klass.should respond_to(:flickr_photo_sizes)}
|
25
|
+
context "flickr_photo_sizes" do
|
26
|
+
it "returns list sizes for a photo" do
|
27
|
+
flickr.photos.stub(:getSizes).and_return(fixtures.photo_sizes)
|
28
|
+
klass.flickr_photo_sizes({}).should == fixtures.photo_sizes
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
specify {klass.should respond_to(:flickr_interestingness)}
|
33
|
+
context "flickr_interestingness" do
|
34
|
+
it "returns list of interesting photos" do
|
35
|
+
flickr.interestingness.stub(:getList).and_return(fixtures.interesting_photos)
|
36
|
+
klass.flickr_interestingness({}).should == fixtures.interesting_photos
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
specify {klass.should respond_to(:flickr_author)}
|
41
|
+
context "flickr_author" do
|
42
|
+
it "returns list of photos for an author" do
|
43
|
+
flickr.photos.stub(:search).and_return(fixtures.author_photos)
|
44
|
+
klass.flickr_author({}).should == fixtures.author_photos
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe APP::Api do
|
4
|
+
|
5
|
+
let(:klass) {APP::Api}
|
6
|
+
context "class methods" do
|
7
|
+
specify {klass.should respond_to(:default)}
|
8
|
+
context "default" do
|
9
|
+
it "returns key stored in @defaults class instance variable when symbol specified" do
|
10
|
+
klass.default(:per_page).should == klass.defaults[:per_page]
|
11
|
+
end
|
12
|
+
it "returns key stored in @defaults class instance variable when string specified" do
|
13
|
+
klass.default('per_page').should == klass.defaults[:per_page]
|
14
|
+
end
|
15
|
+
it "returns nil when key that is not in @defaults class instance variable is specified" do
|
16
|
+
klass.default('garbage').should == nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
specify {klass.should respond_to(:time)}
|
21
|
+
context "time" do
|
22
|
+
it "returns yesterday when no time is specified" do
|
23
|
+
expected = Chronic.parse('yesterday').strftime('%Y-%m-%d')
|
24
|
+
klass.time.should == expected
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns user specified date when proper date given" do
|
28
|
+
expected = '2010-12-25'
|
29
|
+
klass.time(expected).should == expected
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns yesterday when garbage date given" do
|
33
|
+
klass.time('garbage').should == Chronic.parse('yesterday').strftime('%Y-%m-%d')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe APP::Api do
|
4
|
+
let(:api) {APP::Api}
|
5
|
+
let(:subject) {APP::Api}
|
6
|
+
let(:extras){
|
7
|
+
{ :license => '4,5,6,7',
|
8
|
+
:media => 'photos',
|
9
|
+
:extras => 'license',
|
10
|
+
:tag_mode => 'any'}
|
11
|
+
}
|
12
|
+
let(:expected){
|
13
|
+
{ :per_page => '400',
|
14
|
+
:user_id => nil,
|
15
|
+
:tags => 'iran,shiraz',
|
16
|
+
:page => '2'}.merge(extras.clone)
|
17
|
+
}
|
18
|
+
|
19
|
+
let(:options){
|
20
|
+
{
|
21
|
+
:search_terms => 'iran,shiraz',
|
22
|
+
:page => '2'
|
23
|
+
}.merge(extras.clone)
|
24
|
+
}
|
25
|
+
|
26
|
+
|
27
|
+
describe "search_options" do
|
28
|
+
it "should give correct options when all options are specified except :author_id" do
|
29
|
+
subject.search_options(options.clone.merge(:per_page =>'400')).should == expected
|
30
|
+
end
|
31
|
+
it "should return options when fully specified" do
|
32
|
+
subject.search_options(:per_page => '400',:owner_id => 'authorid',:page => '2').should ==
|
33
|
+
expected.clone.merge(:user_id => 'authorid',:tags => nil)
|
34
|
+
|
35
|
+
end
|
36
|
+
it "should give correct values when :perpage given in lieu of :per_page" do
|
37
|
+
subject.search_options(options.clone.merge({:perpage => '400'})).should == expected
|
38
|
+
end
|
39
|
+
it "should give correct value when no :perpage is specified" do
|
40
|
+
subject.search_options(options).should == expected.clone.merge({:per_page => '200'})
|
41
|
+
end
|
42
|
+
it "should give preference to :per_page to :perpage" do
|
43
|
+
subject.search_options(options.clone.merge({:per_page => '500', :perpage => '444'})).should ==
|
44
|
+
expected.clone.merge(:per_page => '500')
|
45
|
+
end
|
46
|
+
it "should be able to set :tag_mode" do
|
47
|
+
subject.search_options(options.clone.merge(:per_page => '500', :tag_mode=>'all' )).should ==
|
48
|
+
expected.clone.merge({:per_page => '500',:tag_mode => 'all'}
|
49
|
+
)
|
50
|
+
end
|
51
|
+
it "should give default tag_mode when not specified" do
|
52
|
+
subject.search_options(options.clone.merge(:per_page => '500')).should ==
|
53
|
+
expected.clone.merge({:per_page => '500'}
|
54
|
+
)
|
55
|
+
end
|
56
|
+
it "should give default tag_mode when junk given for tag_mode" do
|
57
|
+
subject.search_options(options.clone.merge(:per_page => '500', :tag_mode => 'junk')).should ==
|
58
|
+
expected.clone.merge({:per_page => '500'}
|
59
|
+
)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "interesting_options" do
|
64
|
+
let(:expected){
|
65
|
+
{ :date => '2010-02-14',
|
66
|
+
:per_page => '2',
|
67
|
+
:page => '2'
|
68
|
+
}
|
69
|
+
}
|
70
|
+
it "should return proper date with default options" do
|
71
|
+
subject.interesting_options(expected).should == expected.clone.merge(:extras => 'license')
|
72
|
+
end
|
73
|
+
it "should return proper date when no page given" do
|
74
|
+
subject.interesting_options(:date => '2010-02-14', :per_page => '2').should ==
|
75
|
+
expected.clone.merge(:page => '1', :extras => 'license')
|
76
|
+
|
77
|
+
end
|
78
|
+
it "should return proper date when not specified" do
|
79
|
+
date = Chronic.parse('yesterday').strftime('%Y-%m-%d')
|
80
|
+
subject.interesting_options({:date => date})[:date].should == date
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "photo_options" do
|
85
|
+
let(:expected) {
|
86
|
+
{:photo_id => '20030', :secret => 'abcdef'}
|
87
|
+
}
|
88
|
+
|
89
|
+
it "should extract :photo_id and :secret" do
|
90
|
+
subject.photo_options(expected).should == expected
|
91
|
+
end
|
92
|
+
it "should return photo id when present" do
|
93
|
+
subject.photo_options(:id => '20030',:secret => 'abcdef').should == expected
|
94
|
+
end
|
95
|
+
it "should give preference to :photo_id over :id" do
|
96
|
+
subject.photo_options(expected.clone.merge(:id => 'not correct')).should == expected
|
97
|
+
end
|
98
|
+
it "should give preference to :photo_secret over :secret" do
|
99
|
+
subject.photo_options(:photo_secret => 'abcdef', :secret => 'not correct', :id => '20030').should ==
|
100
|
+
expected
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "search_params" do
|
106
|
+
let(:expected){
|
107
|
+
{
|
108
|
+
:search_terms => 'iran,shiraz',
|
109
|
+
:owner_id => 'authorid',
|
110
|
+
:base_url => 'http://www.happyboy.com/'
|
111
|
+
}
|
112
|
+
}
|
113
|
+
let(:base_url) {'http://www.example.com/'}
|
114
|
+
|
115
|
+
it "should return properly when all options specified" do
|
116
|
+
subject.search_params(expected).should == expected
|
117
|
+
end
|
118
|
+
it "should filter non-required options" do
|
119
|
+
subject.search_params(expected.clone.merge(:date => '2010-10-02',:per_page => '2')).should ==
|
120
|
+
expected
|
121
|
+
|
122
|
+
end
|
123
|
+
it "should properly extract :base_url" do
|
124
|
+
subject.search_params(expected.clone.merge(:base_url => base_url)).should ==
|
125
|
+
expected.clone.merge(:base_url => base_url)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "interesting_params" do
|
130
|
+
|
131
|
+
let(:expected) {
|
132
|
+
{
|
133
|
+
:date => 'iran,shiraz',
|
134
|
+
:base_url => 'http://www.happyboy.com/'
|
135
|
+
}
|
136
|
+
}
|
137
|
+
it "should return correct options when all are specified" do
|
138
|
+
subject.interesting_params(expected).should == expected
|
139
|
+
end
|
140
|
+
it "should filter non-required options" do
|
141
|
+
subject.interesting_params(expected.clone.merge(:search_terms => 'iran,shiraz',
|
142
|
+
:owner_id => 'authorid')).should == expected
|
143
|
+
end
|
144
|
+
it "should extract base_url options" do
|
145
|
+
subject.interesting_params(expected.clone.merge(:base_url => expected[:base_url])).should ==
|
146
|
+
expected.clone.merge(:base_url => expected[:base_url])
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe APP::Api do
|
4
|
+
let(:klass) {APP::Api}
|
5
|
+
|
6
|
+
|
7
|
+
context "class methods" do
|
8
|
+
specify {klass.should respond_to(:sanitize_tags)}
|
9
|
+
context "sanitize_tags" do
|
10
|
+
it "returns expected tags when specified" do
|
11
|
+
klass.sanitize_tags('iran,shiraz').should == 'iran,shiraz'
|
12
|
+
end
|
13
|
+
it "returns lower cased version of tags when mixed case tag is specified" do
|
14
|
+
klass.sanitize_tags('IrAn,ShiRaZ').should == 'iran,shiraz'
|
15
|
+
end
|
16
|
+
it "returns tags stripped of extraneous spaces between tags" do
|
17
|
+
klass.sanitize_tags('iran , shiraz ').should == 'iran,shiraz'
|
18
|
+
end
|
19
|
+
it "returns tags that preserve spaces within a tag" do
|
20
|
+
klass.sanitize_tags('iran , shiraz hafez, isfehan').should == 'iran,shiraz hafez,isfehan'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
specify {klass.should respond_to(:sanitize_per_page)}
|
25
|
+
context "sanitize_per_page" do
|
26
|
+
it "returns expected per_page when per_page specified" do
|
27
|
+
klass.sanitize_per_page(:per_page => '2').should == '2'
|
28
|
+
end
|
29
|
+
it "returns default per_page when per_page is not specified" do
|
30
|
+
klass.sanitize_per_page({}).should == klass.default(:per_page)
|
31
|
+
end
|
32
|
+
it "returns expected per_page when perpage specified" do
|
33
|
+
klass.sanitize_per_page(:perpage => '33').should == '33'
|
34
|
+
end
|
35
|
+
it "returns per_page when both :perpage and per_page is specified" do
|
36
|
+
klass.sanitize_per_page(:per_page => '222', :perpage => '333').should == '222'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
specify {klass.should respond_to(:sanitize_page)}
|
41
|
+
context "sanitize_page" do
|
42
|
+
it "returns specified page number when given" do
|
43
|
+
klass.sanitize_page(:page => 2).should == '2'
|
44
|
+
end
|
45
|
+
it "returns '1' when page number not specified" do
|
46
|
+
klass.sanitize_page({}).should == '1'
|
47
|
+
end
|
48
|
+
it "returns '1' when string '0' specified for page number" do
|
49
|
+
klass.sanitize_page(:page => '0').should == '1'
|
50
|
+
end
|
51
|
+
it "returns '1' when number 0 specified as page number" do
|
52
|
+
klass.sanitize_page(:page => 0).should == '1'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
specify {klass.should respond_to(:sanitize_tag_mode)}
|
57
|
+
context "sanitize_tag_mode" do
|
58
|
+
it "returns 'any' if specified" do
|
59
|
+
klass.sanitize_tag_mode(:tag_mode => 'any').should == 'any'
|
60
|
+
end
|
61
|
+
it "returns default tag_mode when non-specified" do
|
62
|
+
klass.sanitize_tag_mode.should == klass.default(:tag_mode)
|
63
|
+
end
|
64
|
+
it "returns default tag_mode when garbage specified" do
|
65
|
+
klass.sanitize_tag_mode(:tag_mode => 'garbage').should == klass.default(:tag_mode)
|
66
|
+
end
|
67
|
+
it "returns default tag mode if nil given" do
|
68
|
+
klass.sanitize_tag_mode(:tag_mode => nil).should == klass.default(:tag_mode)
|
69
|
+
end
|
70
|
+
it "returns 'all' if specified" do
|
71
|
+
klass.sanitize_tag_mode(:tag_mode => 'all').should == 'all'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
specify {klass.should respond_to(:sanitize_time)}
|
76
|
+
context "sanitize_time" do
|
77
|
+
it "returns expected date when format '2010-12-22'" do
|
78
|
+
klass.sanitize_time(:date => '2010-12-22').should == '2010-12-22'
|
79
|
+
end
|
80
|
+
it "returns expected date when format 'Jan 1 2003'" do
|
81
|
+
date = Chronic.parse('Jan 1 2003').strftime('%Y-%m-%d')
|
82
|
+
klass.sanitize_time(:date => 'Jan 1 2003').should == date
|
83
|
+
end
|
84
|
+
it "returns yesterday if no date specified" do
|
85
|
+
date = Chronic.parse('yesterday').strftime('%Y-%m-%d')
|
86
|
+
klass.sanitize_time.should == date
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|