strava-api 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,87 @@
1
+ require 'helper'
2
+ require 'mocha'
3
+ require 'json'
4
+
5
+ class TestClubs < Test::Unit::TestCase
6
+ ###### Testing StravaApi::Base
7
+ def setup
8
+ @s = StravaApi::Base.new
9
+ end
10
+
11
+ def test_clubs_no_search_string
12
+ expect_error(StravaApi::CommandError) { @s.clubs('') }
13
+ end
14
+
15
+ def test_clubs_all_spaces_search_string
16
+ expect_error(StravaApi::CommandError) { @s.clubs(' ') }
17
+ end
18
+
19
+ def test_clubs_index
20
+ #curl http://www.strava.com/api/v1/clubs?name=X
21
+ api_result = JSON.parse clubs_index_json
22
+ api_result.stubs(:parsed_response).returns("")
23
+ StravaApi::Base.stubs(:get).with('/clubs', {:query => {:name => 'X'}}).returns(api_result)
24
+
25
+ result = @s.clubs('X')
26
+
27
+ assert result.is_a?(Array)
28
+
29
+ result.each do |club|
30
+ assert club.is_a?(StravaApi::Club)
31
+ end
32
+ end
33
+
34
+ def test_clubs_index_that_returns_nothing
35
+ #curl http://www.strava.com/api/v1/clubs?name=X5678i9o90
36
+ api_result = JSON.parse '{"clubs":[]}'
37
+ api_result.stubs(:parsed_response).returns("")
38
+ StravaApi::Base.stubs(:get).with('/clubs', {:query => {:name => 'X93afadf80833'}}).returns(api_result)
39
+
40
+ result = @s.clubs('X93afadf80833')
41
+
42
+ assert result.is_a?(Array)
43
+ assert result.empty?
44
+ end
45
+
46
+ #SLO Nexus, id = 23
47
+ def test_club_show
48
+ api_result = JSON.parse club_show_json
49
+ api_result.stubs(:parsed_response).returns("")
50
+ StravaApi::Base.stubs(:get).with('/clubs/23', { :query => {} }).returns(api_result)
51
+
52
+ result = @s.club_show(23)
53
+
54
+ assert result.is_a?(StravaApi::Club)
55
+ assert result.name == "SLO Nexus"
56
+ assert result.id == 23
57
+ assert result.location == "San Luis Obispo, CA"
58
+ assert result.description == "SLO Nexus brings together people who love to ride bikes, race bikes, and promote bike riding in our community. Our fresh outlook on the local bike scene incorporates support, fun, education, and fitness and is designed to bring together the growing number"
59
+ end
60
+
61
+ def test_club_show_bad_id
62
+ #curl http://www.strava.com/api/v1/clubs/0
63
+ api_result = JSON.parse '{"error":"Invalid clubs/0"}'
64
+ api_result.stubs(:parsed_response).returns("")
65
+ StravaApi::Base.stubs(:get).with('/clubs/0', { :query => {} }).returns(api_result)
66
+
67
+ expect_error(StravaApi::InvalidResponseError) { @s.club_show(0) }
68
+
69
+ assert @s.errors.include?("Invalid clubs/0")
70
+ end
71
+
72
+ def test_club_members
73
+ #curl http://www.strava.com/api/v1/clubs/23/members
74
+ api_result = JSON.parse club_members_json
75
+ api_result.stubs(:parsed_response).returns("")
76
+ StravaApi::Base.stubs(:get).with('/clubs/23/members', { :query => {} }).returns(api_result)
77
+
78
+ result = @s.club_members(23)
79
+
80
+ assert result.is_a?(Array)
81
+ result.each do |member|
82
+ assert member.is_a?(StravaApi::Member)
83
+ end
84
+
85
+ assert result.first.name == "Dan Speirs"
86
+ end
87
+ end
@@ -0,0 +1,31 @@
1
+ require 'helper'
2
+ require 'mocha'
3
+ require 'json'
4
+
5
+ class TestEffort < Test::Unit::TestCase
6
+ def setup
7
+ @s = StravaApi::Base.new
8
+
9
+ api_result = JSON.parse ride_efforts_json
10
+ api_result.stubs(:parsed_response).returns("")
11
+ StravaApi::Base.stubs(:get).with('/rides/77563/efforts', {:query => {}}).returns(api_result)
12
+
13
+ @effort = @s.ride_efforts(77563).first
14
+ end
15
+
16
+ def test_show
17
+ api_result = JSON.parse effort_show_method
18
+ api_result.stubs(:parsed_response).returns("")
19
+ StravaApi::Base.stubs(:get).with('/efforts/2231990', { :query => {} }).returns(api_result)
20
+
21
+ assert @effort.athlete.nil?
22
+ assert @effort.average_speed.nil?
23
+
24
+ result = @effort.show
25
+
26
+ assert result.is_a?(StravaApi::Effort)
27
+
28
+ assert @effort.athlete.name == "Julian Bill"
29
+ assert @effort.average_speed == 20149.3205741627
30
+ end
31
+ end
@@ -0,0 +1,79 @@
1
+ require 'helper'
2
+ require 'mocha'
3
+ require 'json'
4
+
5
+ class TestHashBasedStore < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @connection = :placeholder
9
+ @attribute_map = {'name' => :name, 'id' => :id }
10
+ @initial_values = {'id' => 3, 'name' => 'Fred'}
11
+
12
+ @nested_class_map = { :bike => StravaApi::Bike }
13
+ @complex_attribute_map = {'name' => :name, 'id' => :id, 'bike' => :bike }
14
+ @complex_initial_values = {'id' => 3, 'name' => 'Fred', 'bike' => {'id' => 7, 'name' => 'Cruiser'}}
15
+ end
16
+
17
+ def test_creating
18
+ obj = StravaApi::HashBasedStore.new(@connection, @attribute_map, {}, {})
19
+
20
+ assert obj.is_a?(StravaApi::HashBasedStore)
21
+ end
22
+
23
+ def test_storing_values
24
+ obj = StravaApi::HashBasedStore.new(@connection, @attribute_map, {}, @initial_values)
25
+
26
+ assert obj[:id] == @initial_values['id']
27
+ assert obj[:name] == @initial_values['name']
28
+ end
29
+
30
+ def test_getting_values_via_methods
31
+ obj = StravaApi::HashBasedStore.new(@connection, @attribute_map, {}, @initial_values)
32
+
33
+ assert obj.id == @initial_values['id']
34
+ assert obj.name == @initial_values['name']
35
+ end
36
+
37
+ def test_create_with_nested_object
38
+ obj = StravaApi::HashBasedStore.new(@connection, @complex_attribute_map, @nested_class_map, @complex_initial_values)
39
+
40
+ assert obj[:id] == @complex_initial_values['id']
41
+ assert obj[:name] == @complex_initial_values['name']
42
+
43
+ assert obj[:bike].is_a?(StravaApi::Bike)
44
+ assert obj[:bike][:id] == @complex_initial_values['bike']['id']
45
+ assert obj[:bike][:name] == @complex_initial_values['bike']['name']
46
+ end
47
+
48
+ def test_create_with_nested_object_via_methods
49
+ obj = StravaApi::HashBasedStore.new(@connection, @complex_attribute_map, @nested_class_map, @complex_initial_values)
50
+
51
+ assert obj.id == @complex_initial_values['id']
52
+ assert obj.name == @complex_initial_values['name']
53
+
54
+ assert obj.bike.is_a?(StravaApi::Bike)
55
+ assert obj.bike.id == @complex_initial_values['bike']['id']
56
+ assert obj.bike.name == @complex_initial_values['bike']['name']
57
+ end
58
+
59
+ def test_merge
60
+ @big_attribute_map = {'name' => :name, 'id' => :id, "extra1" => :extra1, "extra2" => :extra2 }
61
+
62
+ obj1 = StravaApi::HashBasedStore.new(@connection, @big_attribute_map, {}, {'id' => 13, 'name' => 'Fred'})
63
+ assert obj1.name == 'Fred'
64
+ assert obj1.id == 13
65
+
66
+ obj2 = StravaApi::HashBasedStore.new(@connection, @big_attribute_map, {},
67
+ {'id' => 13, 'name' => 'Fred', 'extra1' => 'red', 'extra2' => 'sneaker'})
68
+ assert obj2.name == 'Fred'
69
+ assert obj2.id == 13
70
+ assert obj2.extra1 == 'red'
71
+ assert obj2.extra2 == 'sneaker'
72
+
73
+ obj1.merge(obj2)
74
+ assert obj1.name == 'Fred'
75
+ assert obj1.id == 13
76
+ assert obj1.extra1 == 'red'
77
+ assert obj1.extra2 == 'sneaker'
78
+ end
79
+ end
data/test/test_ride.rb ADDED
@@ -0,0 +1,49 @@
1
+ require 'helper'
2
+ require 'mocha'
3
+ require 'json'
4
+
5
+ class TestRide < Test::Unit::TestCase
6
+ def setup
7
+ @s = StravaApi::Base.new
8
+
9
+ api_result = JSON.parse rides_index_by_club_json
10
+ api_result.stubs(:parsed_response).returns("")
11
+ StravaApi::Base.stubs(:get).with('/rides', { :query => {'clubId' => 23} }).returns(api_result)
12
+
13
+ @ride = @s.rides(:club_id => 23).first
14
+ end
15
+
16
+ def test_show
17
+ api_result = JSON.parse ride_show_method_json
18
+ api_result.stubs(:parsed_response).returns("")
19
+ StravaApi::Base.stubs(:get).with('/rides/191846', { :query => {} }).returns(api_result)
20
+
21
+ assert @ride.id == 191846
22
+ assert @ride.name == "from SVRMC"
23
+ assert @ride.distance.nil?
24
+ assert @ride.location.nil?
25
+
26
+ result = @ride.show
27
+ assert result.is_a?(StravaApi::Ride)
28
+
29
+ assert @ride.id == 191846
30
+ assert @ride.name == "from SVRMC"
31
+ assert @ride.distance == 12958.6
32
+ assert @ride.location == "San Luis Obispo, CA"
33
+ end
34
+
35
+ def test_efforts
36
+ api_result = JSON.parse ride_effort_method_json
37
+ api_result.stubs(:parsed_response).returns("")
38
+ StravaApi::Base.stubs(:get).with('/rides/191846/efforts', { :query => {} }).returns(api_result)
39
+
40
+ efforts = @ride.efforts
41
+
42
+ assert efforts.is_a?(Array)
43
+ assert efforts.size == 1
44
+ efforts.each do |effort|
45
+ assert effort.is_a?(StravaApi::Effort)
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,186 @@
1
+ require 'helper'
2
+ require 'mocha'
3
+ require 'json'
4
+
5
+ class TestRides < Test::Unit::TestCase
6
+ def setup
7
+ @s = StravaApi::Base.new
8
+ end
9
+
10
+ def test_rides_index_no_arguments
11
+ expect_error(StravaApi::CommandError) { @s.rides }
12
+ end
13
+
14
+ def test_rides_index_invalid_argument
15
+ expect_error(StravaApi::CommandError) { @s.rides(:invalid => true) }
16
+ end
17
+
18
+ def test_rides_index_by_club
19
+ api_result = JSON.parse rides_index_by_club_json
20
+ api_result.stubs(:parsed_response).returns("")
21
+ StravaApi::Base.stubs(:get).with('/rides', { :query => {'clubId' => 23} }).returns(api_result)
22
+
23
+ result = @s.rides(:club_id => 23)
24
+
25
+ assert result.is_a?(Array)
26
+
27
+ result.each do |ride|
28
+ assert ride.is_a?(StravaApi::Ride)
29
+ end
30
+ end
31
+
32
+ def test_rides_index_by_athlete
33
+ #curl http://www.strava.com/api/v1/rides?athleteId=779
34
+ api_result = JSON.parse rides_index_by_athlete_json
35
+ api_result.stubs(:parsed_response).returns("")
36
+ StravaApi::Base.stubs(:get).with('/rides', { :query => {'athleteId' => 779} }).returns(api_result)
37
+
38
+ result = @s.rides(:athlete_id => 779)
39
+
40
+ assert result.is_a?(Array)
41
+
42
+ result.each do |ride|
43
+ assert ride.is_a?(StravaApi::Ride)
44
+ end
45
+ end
46
+
47
+ def test_rides_index_by_club_and_athlete
48
+ #curl "http://www.strava.com/api/v1/rides?clubId=23&athleteId=779"
49
+ api_result = JSON.parse rides_index_by_club_and_athlete_json
50
+ api_result.stubs(:parsed_response).returns("")
51
+ StravaApi::Base.stubs(:get).with('/rides', { :query => {'clubId' => 23, 'athleteId' => 779} }).returns(api_result)
52
+
53
+ result = @s.rides(:club_id => 23, :athlete_id => 779)
54
+
55
+ assert result.is_a?(Array)
56
+
57
+ result.each do |ride|
58
+ assert ride.is_a?(StravaApi::Ride)
59
+ end
60
+ end
61
+
62
+ def test_rides_index_with_mismatched_club_and_athlete
63
+ #curl "http://www.strava.com/api/v1/rides?clubId=24&athleteId=779"
64
+ api_result = JSON.parse '{"error":"Invalid clubId"}'
65
+ api_result.stubs(:parsed_response).returns("")
66
+ StravaApi::Base.stubs(:get).with('/rides', { :query => {'clubId' => 24, 'athleteId' => 779} }).returns(api_result)
67
+
68
+ expect_error(StravaApi::InvalidResponseError) { @s.rides(:club_id => 24, :athlete_id => 779) }
69
+
70
+ assert @s.errors.include?("Invalid clubId")
71
+ end
72
+
73
+ def test_rides_index_ignores_invalid_parameter
74
+ #curl http://www.strava.com/api/v1/rides?athleteId=779
75
+ api_result = JSON.parse rides_index_ignores_invalid_parameter_json
76
+ api_result.stubs(:parsed_response).returns("")
77
+ StravaApi::Base.stubs(:get).with('/rides', { :query => {'athleteId' => 779} }).returns(api_result)
78
+
79
+ result = @s.rides(:athlete_id => 779, :xclub_id => 24)
80
+
81
+ assert result.is_a?(Array)
82
+
83
+ result.each do |ride|
84
+ assert ride.is_a?(StravaApi::Ride)
85
+ end
86
+ end
87
+
88
+ def test_rides_after_start_date
89
+ #curl "http://www.strava.com/api/v1/rides?athleteId=779&startDate=2010-09-21"
90
+ api_result = JSON.parse rides_after_start_date_json
91
+ api_result.stubs(:parsed_response).returns("")
92
+ StravaApi::Base.stubs(:get).with('/rides', { :query => {'athleteId' => 779, 'startDate' => Date.civil(2010,9,21)} }).returns(api_result)
93
+
94
+ result = @s.rides(:athlete_id => 779, :start_date => Date.civil(2010,9,21))
95
+
96
+ assert result.is_a?(Array)
97
+
98
+ result.each do |ride|
99
+ assert ride.is_a?(StravaApi::Ride)
100
+ #TODO check that each ride is after 9/21/2010
101
+ end
102
+ end
103
+
104
+ def test_rides_using_offset
105
+ #curl "http://www.strava.com/api/v1/rides?athleteId=779&startDate=2010-07-1&endDate=2010_09_01"
106
+ api_result = JSON.parse rides_using_offset_json
107
+ api_result.stubs(:parsed_response).returns("")
108
+ StravaApi::Base.stubs(:get).with('/rides', { :query => {'startDate' => Date.civil(2010,7,1),
109
+ 'endDate' => Date.civil(2010,7,5)} }).returns(api_result)
110
+
111
+ api_result2 = JSON.parse rides_using_offset_50_json
112
+ api_result2.stubs(:parsed_response).returns("")
113
+ StravaApi::Base.stubs(:get).with('/rides', { :query => {'startDate' => Date.civil(2010,7,1),
114
+ 'endDate' => Date.civil(2010,7,5), 'offset' => 50} }).returns(api_result2)
115
+
116
+ set_1 = @s.rides(:start_date => Date.civil(2010,7,1), :end_date => Date.civil(2010,7,5))
117
+ set_2 = @s.rides(:start_date => Date.civil(2010,7,1), :end_date => Date.civil(2010,7,5), :offset => set_1.size)
118
+
119
+ assert set_1.is_a?(Array)
120
+ assert set_2.is_a?(Array)
121
+
122
+ set_1.each {|ride| assert ride.is_a?(StravaApi::Ride)}
123
+ set_2.each {|ride| assert ride.is_a?(StravaApi::Ride)}
124
+
125
+ #but there shouldn't be any overlap
126
+ set_1_ids = set_1.collect(&:id)
127
+ set_2_ids = set_2.collect(&:id)
128
+
129
+ set_1_ids.each do |set_1_id|
130
+ assert !set_2_ids.include?(set_1_id), "Error: #{set_1_id} is included in both sets"
131
+ end
132
+ end
133
+
134
+ def test_ride_show
135
+ #curl "http://www.strava.com/api/v1/rides/77563"
136
+ api_result = JSON.parse ride_show_json
137
+ api_result.stubs(:parsed_response).returns("")
138
+ StravaApi::Base.stubs(:get).with('/rides/77563', { :query => {} }).returns(api_result)
139
+
140
+ result = @s.ride_show(77563)
141
+
142
+ assert result.is_a?(StravaApi::Ride)
143
+
144
+ {
145
+ :time_zone_offset => -8.0,
146
+ :elevation_gain => 1441.02,
147
+ :location => "San Francisco, CA",
148
+ :elapsed_time => 14579,
149
+ :description => nil,
150
+ :name => "02/28/10 San Francisco, CA",
151
+ :moving_time => 12748,
152
+ :average_speed => 23260.8064010041,
153
+ :distance => 82369.1,
154
+ :start_date => "2010-02-28T16:31:35Z",
155
+ :average_watts => 175.112,
156
+ :start_date_local => "2010-02-28T08:31:35Z",
157
+ :id => 77563,
158
+ :maximum_speed => 64251.72
159
+ }.each do |property, value|
160
+ assert result[property] == value, "mismatch on #{property}: #{result[property]} != #{value}"
161
+ end
162
+
163
+ assert result[:athlete].is_a?(StravaApi::Member)
164
+ assert result[:athlete].username == "julianbill"
165
+
166
+ assert result[:bike].is_a?(StravaApi::Bike)
167
+ assert result[:bike].name == "Serotta Legend Ti"
168
+ end
169
+
170
+ def test_ride_efforts
171
+ #curl "http://www.strava.com/api/v1/rides/77563/efforts"
172
+ api_result = JSON.parse ride_efforts_json
173
+ api_result.stubs(:parsed_response).returns("")
174
+ StravaApi::Base.stubs(:get).with('/rides/77563/efforts', { :query => {} }).returns(api_result)
175
+
176
+ result = @s.ride_efforts(77563)
177
+
178
+ assert result.is_a?(Array)
179
+ result.each do |effort|
180
+ assert effort.is_a?(StravaApi::Effort)
181
+ end
182
+
183
+ assert result.first.segment.is_a?(StravaApi::Segment)
184
+ assert result.first.segment.name == "Panhandle to GGP"
185
+ end
186
+ end
@@ -0,0 +1,63 @@
1
+ require 'helper'
2
+ require 'mocha'
3
+ require 'json'
4
+
5
+ class TestSegment < Test::Unit::TestCase
6
+ def setup
7
+ @s = StravaApi::Base.new
8
+
9
+ api_result = JSON.parse segments_index_json
10
+ api_result.stubs(:parsed_response).returns("")
11
+ StravaApi::Base.stubs(:get).with('/segments', {:query => {:name => 'Hawk Hill'}}).returns(api_result)
12
+
13
+ @segment = @s.segments("Hawk Hill").first
14
+ end
15
+
16
+ def test_show
17
+ api_result = JSON.parse segment_show_json
18
+ api_result.stubs(:parsed_response).returns("")
19
+ StravaApi::Base.stubs(:get).with('/segments/99243', { :query => {} }).returns(api_result)
20
+
21
+ assert @segment.id == 99243
22
+ assert @segment.name == "Hawk Hill Saddle"
23
+ assert @segment.elevation_gain.nil?
24
+ assert @segment.elevation_high.nil?
25
+
26
+ result = @segment.show
27
+ assert result.is_a?(StravaApi::Segment)
28
+
29
+ assert @segment.id == 99243
30
+ assert @segment.name == "Hawk Hill Saddle"
31
+ assert @segment.elevation_gain == 76.553
32
+ assert @segment.elevation_high == 172.694
33
+ end
34
+
35
+ def test_efforts
36
+ api_result = JSON.parse segment_efforts_index_json
37
+ api_result.stubs(:parsed_response).returns("")
38
+ StravaApi::Base.stubs(:get).with('/segments/99243/efforts', { :query => {} }).returns(api_result)
39
+
40
+ efforts = @segment.efforts
41
+
42
+ assert efforts.is_a?(Array)
43
+ assert efforts.size == 3
44
+ efforts.each do |effort|
45
+ assert effort.is_a?(StravaApi::Effort)
46
+ end
47
+ end
48
+
49
+ def test_efforts_with_athlete_id
50
+ api_result = JSON.parse segment_efforts_index_by_athlete_id_json
51
+ api_result.stubs(:parsed_response).returns("")
52
+ StravaApi::Base.stubs(:get).with('/segments/99243/efforts', { :query => {'athleteId' => 1377} }).returns(api_result)
53
+
54
+ efforts = @segment.efforts(:athlete_id => 1377)
55
+
56
+ assert efforts.is_a?(Array)
57
+
58
+ assert efforts.size == 17
59
+ efforts.each do |effort|
60
+ assert effort.is_a?(StravaApi::Effort)
61
+ end
62
+ end
63
+ end