flickrmocks 0.8.5
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/.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
|