fleakr 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/README.rdoc +88 -57
  2. data/Rakefile +28 -9
  3. data/lib/fleakr.rb +25 -31
  4. data/lib/fleakr/api/option.rb +34 -34
  5. data/lib/fleakr/api/parameter_list.rb +23 -23
  6. data/lib/fleakr/objects.rb +4 -1
  7. data/lib/fleakr/objects/metadata.rb +35 -0
  8. data/lib/fleakr/objects/metadata_collection.rb +36 -0
  9. data/lib/fleakr/objects/photo.rb +15 -11
  10. data/lib/fleakr/objects/set.rb +17 -13
  11. data/lib/fleakr/objects/url.rb +83 -0
  12. data/lib/fleakr/objects/user.rb +8 -0
  13. data/lib/fleakr/support.rb +3 -1
  14. data/lib/fleakr/support/attribute.rb +2 -2
  15. data/lib/fleakr/support/object.rb +44 -29
  16. data/lib/fleakr/support/url_expander.rb +37 -0
  17. data/lib/fleakr/support/utility.rb +66 -0
  18. data/lib/fleakr/version.rb +5 -5
  19. data/test/fixtures/photos.getExif.xml +362 -0
  20. data/test/test_helper.rb +44 -47
  21. data/test/unit/fleakr/api/authentication_request_test.rb +12 -12
  22. data/test/unit/fleakr/api/file_parameter_test.rb +15 -15
  23. data/test/unit/fleakr/api/method_request_test.rb +1 -1
  24. data/test/unit/fleakr/api/option_test.rb +44 -44
  25. data/test/unit/fleakr/api/parameter_list_test.rb +40 -40
  26. data/test/unit/fleakr/api/response_test.rb +10 -10
  27. data/test/unit/fleakr/api/upload_request_test.rb +28 -28
  28. data/test/unit/fleakr/api/value_parameter_test.rb +10 -10
  29. data/test/unit/fleakr/core_ext/false_class_test.rb +5 -5
  30. data/test/unit/fleakr/core_ext/hash_test.rb +9 -9
  31. data/test/unit/fleakr/core_ext/true_class_test.rb +5 -5
  32. data/test/unit/fleakr/objects/authentication_token_test.rb +23 -23
  33. data/test/unit/fleakr/objects/collection_test.rb +23 -23
  34. data/test/unit/fleakr/objects/comment_test.rb +15 -15
  35. data/test/unit/fleakr/objects/contact_test.rb +11 -11
  36. data/test/unit/fleakr/objects/error_test.rb +8 -8
  37. data/test/unit/fleakr/objects/group_test.rb +13 -13
  38. data/test/unit/fleakr/objects/image_test.rb +4 -4
  39. data/test/unit/fleakr/objects/metadata_collection_test.rb +55 -0
  40. data/test/unit/fleakr/objects/metadata_test.rb +27 -0
  41. data/test/unit/fleakr/objects/photo_context_test.rb +23 -23
  42. data/test/unit/fleakr/objects/photo_test.rb +71 -64
  43. data/test/unit/fleakr/objects/search_test.rb +22 -22
  44. data/test/unit/fleakr/objects/set_test.rb +62 -40
  45. data/test/unit/fleakr/objects/tag_test.rb +32 -31
  46. data/test/unit/fleakr/objects/url_test.rb +185 -0
  47. data/test/unit/fleakr/objects/user_test.rb +43 -16
  48. data/test/unit/fleakr/support/attribute_test.rb +15 -15
  49. data/test/unit/fleakr/support/object_test.rb +77 -33
  50. data/test/unit/fleakr/support/request_test.rb +12 -12
  51. data/test/unit/fleakr/support/url_expander_test.rb +44 -0
  52. data/test/unit/fleakr/support/utility_test.rb +70 -0
  53. data/test/unit/fleakr_test.rb +48 -41
  54. metadata +43 -23
@@ -1,98 +1,99 @@
1
- require File.dirname(__FILE__) + '/../../../test_helper'
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
2
 
3
3
  module Fleakr::Objects
4
4
  class TagTest < Test::Unit::TestCase
5
5
 
6
6
  context "The Tag class" do
7
-
8
- should_find_all :tags, :by => :photo_id, :call => 'tags.getListPhoto', :path => 'rsp/photo/tags/tag'
9
- should_find_all :tags, :by => :user_id, :call => 'tags.getListUser', :path => 'rsp/who/tags/tag'
7
+
8
+ should_find_all :tags, :by => :photo_id, :call => 'tags.getListPhoto', :path => 'rsp/photo/tags/tag', :class => Tag
9
+ should_find_all :tags, :by => :user_id, :call => 'tags.getListUser', :path => 'rsp/who/tags/tag', :class => Tag
10
+
10
11
  end
11
-
12
+
12
13
  context "An instance of the Tag class" do
13
-
14
+
14
15
  setup { @tag = Tag.new }
15
-
16
+
16
17
  context "when populating from the tags_getListPhoto XML data" do
17
18
  setup do
18
19
  @object = Tag.new(Hpricot.XML(read_fixture('tags.getListPhoto')).at('rsp/photo/tags/tag'))
19
20
  end
20
-
21
+
21
22
  should_have_a_value_for :id => '1'
22
23
  should_have_a_value_for :author_id => '15498419@N05'
23
24
  should_have_a_value_for :value => 'stu72'
24
25
  should_have_a_value_for :raw => 'stu 72'
25
26
  should_have_a_value_for :machine_flag => '0'
26
-
27
+
27
28
  end
28
-
29
+
29
30
  should "have an author" do
30
31
  user = stub()
31
-
32
+
32
33
  @tag.expects(:author_id).at_least_once.with().returns('1')
33
-
34
-
34
+
35
+
35
36
  User.expects(:find_by_id).with('1').returns(user)
36
-
37
+
37
38
  @tag.author.should == user
38
39
  end
39
-
40
+
40
41
  should "memoize the author data" do
41
42
  @tag.expects(:author_id).at_least_once.with().returns('1')
42
-
43
+
43
44
  User.expects(:find_by_id).with('1').once.returns(stub())
44
-
45
+
45
46
  2.times { @tag.author }
46
47
  end
47
-
48
+
48
49
  should "return nil for author if author_id is not present" do
49
50
  @tag.expects(:author_id).with().returns(nil)
50
-
51
+
51
52
  @tag.author.should be(nil)
52
53
  end
53
-
54
+
54
55
  should "have related tags" do
55
56
  @tag.expects(:value).with().returns('foo')
56
-
57
+
57
58
  response = mock_request_cycle :for => 'tags.getRelated', :with => {:tag => 'foo'}
58
59
 
59
60
  stubs = []
60
61
  elements = (response.body/'rsp/tags/tag').map
61
-
62
+
62
63
  elements.each do |element|
63
64
  stub = stub()
64
65
  stubs << stub
65
66
 
66
67
  Tag.expects(:new).with(element).returns(stub)
67
68
  end
68
-
69
+
69
70
  @tag.related.should == stubs
70
71
  end
71
-
72
+
72
73
  should "memoize the data for related tags" do
73
74
  @tag.expects(:value).with().returns('foo')
74
-
75
+
75
76
  mock_request_cycle :for => 'tags.getRelated', :with => {:tag => 'foo'}
76
-
77
+
77
78
  2.times { @tag.related }
78
79
  end
79
-
80
+
80
81
  should "be able to generate a string representation of itself" do
81
82
  @tag.expects(:value).with().returns('foo')
82
83
  @tag.to_s.should == 'foo'
83
84
  end
84
-
85
+
85
86
  should "know that it is not a machine tag" do
86
87
  @tag.expects(:machine_flag).with().returns('0')
87
88
  @tag.machine?.should be(false)
88
89
  end
89
-
90
+
90
91
  should "know that it is a machine tag" do
91
92
  @tag.expects(:machine_flag).with().returns('1')
92
93
  @tag.machine?.should be(true)
93
94
  end
94
-
95
+
95
96
  end
96
-
97
+
97
98
  end
98
99
  end
@@ -0,0 +1,185 @@
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
+
3
+ module Fleakr::Objects
4
+ class UrlTest < Test::Unit::TestCase
5
+
6
+ context "An instance of the Url class" do
7
+
8
+ should "know that it's not a shortened URL" do
9
+ u = Url.new('http://flickr.com/photos/reagent/4041660453/')
10
+ u.shortened?.should be(false)
11
+ end
12
+
13
+ should "know that it's a shortened URL" do
14
+ u = Url.new('http://flic.kr/p/7a9yQV')
15
+ u.shortened?.should be(true)
16
+ end
17
+
18
+ should "know the path for a shortened URL" do
19
+ url = 'http://flic.kr/p/7a9yQV'
20
+
21
+ Fleakr::Support::UrlExpander.stubs(:expand).with(url).returns('/expanded/path')
22
+
23
+ u = Url.new(url)
24
+ u.path.should == '/expanded/path'
25
+ end
26
+
27
+ should "now the path for a normal URL" do
28
+ u = Url.new('http://www.flickr.com/photos/reagent/4041660453/')
29
+ u.path.should == '/photos/reagent/4041660453/'
30
+ end
31
+
32
+ should "know the path when there is no hostname" do
33
+ u = Url.new('http://flickr.com/photos/reagent/4041660453/')
34
+ u.path.should == '/photos/reagent/4041660453/'
35
+ end
36
+
37
+ should "be able to retrieve a user" do
38
+ u = Url.new('')
39
+ u.stubs(:user_identifier).with().returns('reagent')
40
+
41
+ User.expects(:find_by_identifier).with('reagent').returns('user')
42
+
43
+ u.user.should == 'user'
44
+ end
45
+
46
+ should "memoize the user" do
47
+ u = Url.new('')
48
+ u.stubs(:user_identifier).with().returns('reagent')
49
+
50
+ User.expects(:find_by_identifier).with('reagent').once.returns('user')
51
+
52
+ 2.times { u.user }
53
+ end
54
+
55
+ context "when provided a single photo URL" do
56
+ subject { Url.new('http://flickr.com/photos/reagent/4041660453/') }
57
+
58
+ should "know that it's retrieving a photo resource" do
59
+ subject.resource_type.should == Photo
60
+ end
61
+
62
+ should "know the :user_identifier" do
63
+ subject.user_identifier.should == 'reagent'
64
+ end
65
+
66
+ should "know the :resource_identifier" do
67
+ subject.resource_identifier.should == '4041660453'
68
+ end
69
+
70
+ should "know that it's not retrieving a collection of resources" do
71
+ subject.collection?.should be(false)
72
+ end
73
+
74
+ should "return the resource" do
75
+ Fleakr::Objects::Photo.expects(:find_by_id).with('4041660453').returns('photo')
76
+ subject.resource.should == 'photo'
77
+ end
78
+ end
79
+
80
+ context "when provided with a photoset URL" do
81
+ subject { @subject ||= Url.new('http://www.flickr.com/photos/reagent/') }
82
+
83
+ should "know that it's retrieving a Photo resource" do
84
+ subject.resource_type.should == Photo
85
+ end
86
+
87
+ should "know the :user_identifier" do
88
+ subject.user_identifier.should == 'reagent'
89
+ end
90
+
91
+ should "not have a :resource_identifier" do
92
+ subject.resource_identifier.should be_nil
93
+ end
94
+
95
+ should "know that it's retrieving a collection of resources" do
96
+ subject.collection?.should be(true)
97
+ end
98
+
99
+ should "return the resource" do
100
+ subject.stubs(:user).with().returns(stub(:id => '1'))
101
+
102
+ Fleakr::Objects::Photo.expects(:find_all_by_user_id).with('1').returns('photos')
103
+ subject.resource.should == 'photos'
104
+ end
105
+
106
+ end
107
+
108
+ context "when provided with a profile URL" do
109
+ subject { @subject ||= Url.new('http://www.flickr.com/people/reagent/') }
110
+
111
+ should "know that it's retrieving a user resource" do
112
+ subject.resource_type.should == User
113
+ end
114
+
115
+ should "know the :user_identifier" do
116
+ subject.user_identifier.should == 'reagent'
117
+ end
118
+
119
+ should "not have a :resource_identifier" do
120
+ subject.resource_identifier.should be_nil
121
+ end
122
+
123
+ should "return the resource" do
124
+ subject.expects(:user).with().returns('user')
125
+ subject.resource.should == 'user'
126
+ end
127
+ end
128
+
129
+ context "when provided a profile URL with a user ID" do
130
+ subject { Url.new('http://www.flickr.com/people/43955217@N05/') }
131
+
132
+ should "know the :user_identifier" do
133
+ subject.user_identifier.should == '43955217@N05'
134
+ end
135
+
136
+ end
137
+
138
+ context "when provided with a single set URL" do
139
+ subject { Url.new('http://www.flickr.com/photos/reagent/sets/72157622660138146/') }
140
+
141
+ should "know that it's retrieving a set resource" do
142
+ subject.resource_type.should == Set
143
+ end
144
+
145
+ should "know the :user_identifier" do
146
+ subject.user_identifier.should == 'reagent'
147
+ end
148
+
149
+ should "know the :resource_identifier" do
150
+ subject.resource_identifier.should == '72157622660138146'
151
+ end
152
+
153
+ should "return the resource" do
154
+ Fleakr::Objects::Set.expects(:find_by_id).with('72157622660138146').returns('set')
155
+ subject.resource.should == 'set'
156
+ end
157
+ end
158
+
159
+ context "when provided a set listing URL" do
160
+ subject { @subject ||= Url.new('http://www.flickr.com/photos/reagent/sets/') }
161
+
162
+ should "know that it's retrieving a set resource" do
163
+ subject.resource_type.should == Set
164
+ end
165
+
166
+ should "know the :user_identifier" do
167
+ subject.user_identifier.should == 'reagent'
168
+ end
169
+
170
+ should "not have a :resource_identifier" do
171
+ subject.resource_identifier.should be_nil
172
+ end
173
+
174
+ should "return the resource" do
175
+ subject.stubs(:user).with().returns(stub(:id => '1'))
176
+
177
+ Fleakr::Objects::Set.expects(:find_all_by_user_id).with('1').returns('sets')
178
+ subject.resource.should == 'sets'
179
+ end
180
+ end
181
+
182
+ end
183
+
184
+ end
185
+ end
@@ -1,21 +1,48 @@
1
- require File.dirname(__FILE__) + '/../../../test_helper'
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
2
 
3
3
  module Fleakr::Objects
4
4
  class UserTest < Test::Unit::TestCase
5
5
 
6
6
  should_search_by :user_id
7
7
 
8
- should_have_many :photos, :groups, :sets, :contacts, :tags, :collections
9
-
8
+ should_have_many :photos, :class => Photo
9
+ should_have_many :groups, :class => Group
10
+ should_have_many :sets, :class => Set
11
+ should_have_many :contacts, :class => Contact
12
+ should_have_many :tags, :class => Tag
13
+ should_have_many :collections, :class => Collection
14
+
10
15
  should_autoload_when_accessing :name, :photos_url, :profile_url, :photos_count, :location, :with => :load_info
11
16
  should_autoload_when_accessing :icon_server, :icon_farm, :pro, :admin, :icon_url, :with => :load_info
12
17
 
13
18
  context "The User class" do
14
19
 
15
- should_find_one :user, :by => :username, :call => 'people.findByUsername', :path => 'rsp/user'
16
- should_find_one :user, :by => :email, :with => :find_email, :call => 'people.findByEmail', :path => 'rsp/user'
17
- should_find_one :user, :by => :id, :with => :user_id, :call => 'people.getInfo', :path => 'rsp/person'
18
- should_find_one :user, :by => :url, :call => 'urls.lookupUser', :path => 'rsp/user'
20
+ should_find_one :user, :by => :username, :call => 'people.findByUsername', :path => 'rsp/user', :class => User
21
+ should_find_one :user, :by => :email, :with => :find_email, :call => 'people.findByEmail', :path => 'rsp/user', :class => User
22
+ should_find_one :user, :by => :id, :with => :user_id, :call => 'people.getInfo', :path => 'rsp/person', :class => User
23
+ should_find_one :user, :by => :url, :call => 'urls.lookupUser', :path => 'rsp/user', :class => User
24
+
25
+ should "recognize a string as not being a Flickr user ID" do
26
+ User.user_id?('reagent').should be(false)
27
+ end
28
+
29
+ should "recognize a string as being a Flickr user ID" do
30
+ User.user_id?('43955217@N05').should be(true)
31
+ end
32
+
33
+ should "be able to find a user by ID when supplied with an identifier" do
34
+ id = '43955217@N05'
35
+ User.expects(:find_by_id).with(id).returns('user')
36
+
37
+ User.find_by_identifier(id).should == 'user'
38
+ end
39
+
40
+ should "be able to find a user by username when supplied with an identifier" do
41
+ username = 'reagent'
42
+ User.expects(:find_by_username).with(username).returns('user')
43
+
44
+ User.find_by_identifier(username).should == 'user'
45
+ end
19
46
 
20
47
  end
21
48
 
@@ -37,18 +64,18 @@ module Fleakr::Objects
37
64
  should_have_a_value_for :icon_farm => '1'
38
65
  should_have_a_value_for :pro => '1'
39
66
  should_have_a_value_for :admin => '0'
40
-
67
+
41
68
  end
42
-
69
+
43
70
  context "when populating an object from the urls.lookupUser API call" do
44
71
  setup do
45
72
  document = Hpricot.XML(read_fixture('urls.lookupUser'))
46
73
  @object = User.new(document)
47
74
  end
48
-
75
+
49
76
  should_have_a_value_for :id => '123456'
50
77
  should_have_a_value_for :username => 'frootpantz'
51
-
78
+
52
79
  end
53
80
 
54
81
  context "in general" do
@@ -79,23 +106,23 @@ module Fleakr::Objects
79
106
  @user.stubs(:icon_server).with().returns(nil)
80
107
  @user.icon_url.should == 'http://www.flickr.com/images/buddyicon.jpg'
81
108
  end
82
-
109
+
83
110
  should "return a boolean value for :pro?" do
84
111
  @user.stubs(:pro).with().returns('0')
85
112
  @user.pro?.should be(false)
86
-
113
+
87
114
  @user.stubs(:pro).with().returns('1')
88
115
  @user.pro?.should be(true)
89
116
  end
90
-
117
+
91
118
  should "return a boolean value for :admin?" do
92
119
  @user.stubs(:admin).with().returns('0')
93
120
  @user.admin?.should be(false)
94
-
121
+
95
122
  @user.stubs(:admin).with().returns('1')
96
123
  @user.admin?.should be(true)
97
124
  end
98
-
125
+
99
126
  end
100
127
  end
101
128
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../../../test_helper'
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
2
 
3
3
  module Fleakr::Support
4
4
  class AttributeTest < Test::Unit::TestCase
@@ -13,7 +13,7 @@ module Fleakr::Support
13
13
  attr = Attribute.new(:foo)
14
14
  attr.sources.should == ['foo']
15
15
  end
16
-
16
+
17
17
  should "be able to assign multiple sources" do
18
18
  attr = Attribute.new(:foo, ['foo1', 'foo2'])
19
19
  attr.sources.should == ['foo1', 'foo2']
@@ -23,32 +23,32 @@ module Fleakr::Support
23
23
  attr = Attribute.new('foo')
24
24
  attr.location('foo').should == 'foo'
25
25
  end
26
-
26
+
27
27
  should "return the location when splitting" do
28
28
  attr = Attribute.new('foo')
29
29
  attr.split('foo').should == ['foo', nil]
30
30
  end
31
-
31
+
32
32
  should "return the name for the location when splitting if the location isn't specified" do
33
33
  attr = Attribute.new('foo')
34
34
  attr.split('@bar').should == ['foo', 'bar']
35
35
  end
36
-
36
+
37
37
  should "allow the setting of the location information" do
38
38
  attr = Attribute.new('foo', 'bar')
39
39
  attr.sources.should == ['bar']
40
40
  end
41
-
41
+
42
42
  should "allow the setting of the attribute value" do
43
43
  attr = Attribute.new('foo')
44
44
  attr.attribute('@bogon').should == 'bogon'
45
45
  end
46
-
46
+
47
47
  should "use the location as the attribute" do
48
48
  attr = Attribute.new('foo')
49
49
  attr.attribute('foo').should == 'foo'
50
50
  end
51
-
51
+
52
52
  should "use the attribute for the attribute if specified" do
53
53
  attr = Attribute.new(:id, '@nsid')
54
54
  attr.attribute('@nsid').should == 'nsid'
@@ -57,15 +57,15 @@ module Fleakr::Support
57
57
  should "be able to retrieve the node from the path" do
58
58
  document = Hpricot.XML('<name>Bassdrive</name>')
59
59
  expected = document.at('name')
60
-
60
+
61
61
  attr = Attribute.new(:name)
62
62
  attr.node_for(document, 'name').should == expected
63
63
  end
64
-
64
+
65
65
  should "be able to retrieve the node that contains the specified attribute" do
66
66
  document = Hpricot.XML('<user id="1337" />')
67
67
  expected = document.at('user')
68
-
68
+
69
69
  attr = Attribute.new(:id)
70
70
  attr.node_for(document, '@id').should == expected
71
71
  end
@@ -73,11 +73,11 @@ module Fleakr::Support
73
73
  should "be able to retrieve the node for the specified attribute" do
74
74
  document = Hpricot.XML('<user nsid="1337" />')
75
75
  expected = document.at('user')
76
-
76
+
77
77
  attr = Attribute.new(:id, '@nsid')
78
78
  attr.node_for(document, '@nsid').should == expected
79
79
  end
80
-
80
+
81
81
  should "be able to pull simple values from an XML document" do
82
82
  document = Hpricot.XML('<name>Bassdrive</name>')
83
83
  attr = Attribute.new(:name)
@@ -89,7 +89,7 @@ module Fleakr::Support
89
89
  attr = Attribute.new(:id)
90
90
  attr.value_from(document).should == '1337'
91
91
  end
92
-
92
+
93
93
  should "be able to pull a specific attribute value from the current XML node" do
94
94
  document = Hpricot.XML('<user nsid="1337" />')
95
95
  attr = Attribute.new(:id, '@nsid')
@@ -101,7 +101,7 @@ module Fleakr::Support
101
101
  attr = Attribute.new(:slug, 'station/genre@slug')
102
102
  attr.value_from(document).should == 'dnb'
103
103
  end
104
-
104
+
105
105
  should "be able to pull a value from a nested XML node" do
106
106
  document = Hpricot.XML('<rsp><user>blip</user></rsp>')
107
107
  attr = Attribute.new(:user)