From a9ebbf24b7e23267a3609be40f327f64988c719d Mon Sep 17 00:00:00 2001 From: Nikolay Sokolov Date: Tue, 15 Aug 2017 20:34:35 -0700 Subject: [PATCH] Fix zones parsing for run activities --- activities.go | 10 ++++++++++ activities_test.go | 20 +++++++++++++++++++- cassettes/activity_list_zones.body | 2 +- zones.go | 10 +++++++--- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/activities.go b/activities.go index 430443e..bbce4a0 100644 --- a/activities.go +++ b/activities.go @@ -348,6 +348,15 @@ func (s *ActivitiesService) ListZones(activityId int64) *ActivitiesListZonesCall } } +func postProcessZones(zones []*ZonesSummary) { + for _, zones := range zones { + for _, bucket := range zones.Buckets { + bucket.Max = int(bucket.MaxFloat) + bucket.Min = int(bucket.MinFloat) + } + } +} + func (c *ActivitiesListZonesCall) Do() ([]*ZonesSummary, error) { data, err := c.service.client.run("GET", fmt.Sprintf("/activities/%d/zones", c.id), nil) if err != nil { @@ -359,6 +368,7 @@ func (c *ActivitiesListZonesCall) Do() ([]*ZonesSummary, error) { if err != nil { return nil, err } + postProcessZones(zones) return zones, nil } diff --git a/activities_test.go b/activities_test.go index 5938c4e..9fc73fc 100644 --- a/activities_test.go +++ b/activities_test.go @@ -3,6 +3,7 @@ package strava import ( "io/ioutil" "reflect" + "strconv" "testing" "time" ) @@ -411,6 +412,11 @@ func TestActivitiesListPhotos(t *testing.T) { } } +func parseFloat(str string) float64 { + x, _ := strconv.ParseFloat(str, 64) + return x +} + func TestActivitiesListZones(t *testing.T) { client := newCassetteClient(testToken, "activity_list_zones") zones, err := NewActivitiesService(client).ListZones(103221154).Do() @@ -443,12 +449,24 @@ func TestActivitiesListZones(t *testing.T) { t.Fatal("Buckets not parsed") } - expected := &ZoneBucket{Max: 143, Min: 108, Time: 910} + expected := &ZoneBucket{ + Max: 143, Min: 108, + MaxFloat: parseFloat("143"), MinFloat: parseFloat("108"), + Time: 910} if !reflect.DeepEqual(zones[0].Buckets[1], expected) { t.Errorf("should match\n%v\n%v", zones[0].Buckets[1], expected) } + expectedPaceBucket := &ZoneBucket{ + Min: 1, Max: 2, + MinFloat: parseFloat("1.8331809410114008"), MaxFloat: parseFloat("2.156683460013413"), + Time: 67} + + if !reflect.DeepEqual(zones[2].Buckets[1], expectedPaceBucket) { + t.Errorf("should match\n%v\n%v", zones[2].Buckets[1], expectedPaceBucket) + } + // from here on out just check the request parameters s := NewActivitiesService(newStoreRequestClient()) diff --git a/cassettes/activity_list_zones.body b/cassettes/activity_list_zones.body index 33ce326..dbde0dc 100644 --- a/cassettes/activity_list_zones.body +++ b/cassettes/activity_list_zones.body @@ -1 +1 @@ -[{"score":12,"distribution_buckets":[{"max":108,"min":0,"time":1918},{"max":143,"min":108,"time":910},{"max":161,"min":143,"time":8},{"max":178,"min":161,"time":0},{"max":-1,"min":178,"time":0}],"type":"heartrate","resource_state":3,"sensor_based":true,"points":0,"custom_zones":false},{"distribution_buckets":[{"max":0,"min":0,"time":322},{"max":50,"min":0,"time":121},{"max":100,"min":50,"time":187},{"max":150,"min":100,"time":850},{"max":200,"min":150,"time":1033},{"max":250,"min":200,"time":199},{"max":300,"min":250,"time":57},{"max":350,"min":300,"time":22},{"max":400,"min":350,"time":17},{"max":450,"min":400,"time":8},{"max":-1,"min":450,"time":20}],"type":"power","resource_state":3,"sensor_based":true}] \ No newline at end of file +[{"score":12,"distribution_buckets":[{"max":108,"min":0,"time":1918},{"max":143,"min":108,"time":910},{"max":161,"min":143,"time":8},{"max":178,"min":161,"time":0},{"max":-1,"min":178,"time":0}],"type":"heartrate","resource_state":3,"sensor_based":true,"points":0,"custom_zones":false},{"distribution_buckets":[{"max":0,"min":0,"time":322},{"max":50,"min":0,"time":121},{"max":100,"min":50,"time":187},{"max":150,"min":100,"time":850},{"max":200,"min":150,"time":1033},{"max":250,"min":200,"time":199},{"max":300,"min":250,"time":57},{"max":350,"min":300,"time":22},{"max":400,"min":350,"time":17},{"max":450,"min":400,"time":8},{"max":-1,"min":450,"time":20}],"type":"power","resource_state":3,"sensor_based":true},{"score":42,"distribution_buckets":[{"max":1.8331809410114008,"min":0,"time":117},{"max":2.156683460013413,"min":1.8331809410114008,"time":67},{"max":2.4435539047991397,"min":2.156683460013413,"time":71},{"max":2.869924875495906,"min":2.4435539047991397,"time":121},{"max":-1,"min":2.869924875495906,"time":413}],"type":"pace","resource_state":3,"sensor_based":true}] \ No newline at end of file diff --git a/zones.go b/zones.go index b19a149..69d16cd 100644 --- a/zones.go +++ b/zones.go @@ -10,7 +10,11 @@ type ZonesSummary struct { } type ZoneBucket struct { - Min int `json:"min"` - Max int `json:"max"` - Time int `json:"time"` + // legacy, left intact for compatibility + Min int + Max int + // precision fields + MinFloat float64 `json:"min"` + MaxFloat float64 `json:"max"` + Time int `json:"time"` }