Skip to content
This repository was archived by the owner on Apr 13, 2025. It is now read-only.

Commit d685eb0

Browse files
authored
Merge pull request #140 from perrystreetsoftware/master
Update an existing review
2 parents 2c656e6 + ecdc0c1 commit d685eb0

7 files changed

Lines changed: 72 additions & 2 deletions

File tree

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ task = story.tasks.first # Get
8686
task.complete = true
8787
task.save # Mark a task complete
8888

89+
review = story.reviews.first # Mark a review as complete
90+
review.status = 'pass'
91+
review.save
92+
8993
epics = project.epics # Get all epics for a project
9094
epic = epics.first
9195
label = epic.label # Get an epic's label

lib/tracker_api.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ module Endpoints
6666
autoload :Attachments, 'tracker_api/endpoints/attachments'
6767
autoload :Releases, 'tracker_api/endpoints/releases'
6868
autoload :Release, 'tracker_api/endpoints/release'
69+
autoload :Review, 'tracker_api/endpoints/review'
6970
autoload :Reviews, 'tracker_api/endpoints/reviews'
7071
end
7172

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module TrackerApi
2+
module Endpoints
3+
class Review
4+
attr_accessor :client
5+
6+
def initialize(client)
7+
@client = client
8+
end
9+
10+
def update(review, params = {})
11+
raise ArgumentError, 'Valid review required to update.' unless review.instance_of?(Resources::Review)
12+
13+
data = client.put("/projects/#{review.project_id}/stories/#{review.story_id}/reviews/#{review.id}", params: params).body
14+
15+
review.attributes = data
16+
review.clean!
17+
review
18+
end
19+
end
20+
end
21+
end

lib/tracker_api/resources/review.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,29 @@ class Review
77

88
attribute :id, Integer
99
attribute :story_id, Integer
10+
attribute :project_id, Integer
1011
attribute :review_type_id, Integer
1112
attribute :reviewer_id, Integer
1213
attribute :status, String # (unstarted, in_review, pass, revise)
1314
attribute :created_at, DateTime
1415
attribute :updated_at, DateTime
1516
attribute :kind, String
1617
attribute :review_type, ReviewType
18+
19+
class UpdateRepresenter < Representable::Decorator
20+
include Representable::JSON
21+
22+
property :id
23+
property :review_type_id
24+
property :reviewer_id
25+
property :status
26+
end
27+
28+
def save
29+
raise ArgumentError, 'Cannot update a review with an unknown story_id.' if story_id.nil?
30+
31+
Endpoints::Review.new(client).update(self, UpdateRepresenter.new(Review.new(dirty_attributes)))
32+
end
1733
end
1834
end
19-
end
35+
end

lib/tracker_api/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module TrackerApi
2-
VERSION = '1.11.0'
2+
VERSION = '1.12.0'
33
end

test/review_test.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require_relative 'minitest_helper'
2+
3+
describe TrackerApi::Resources::Review do
4+
let(:pt_user) { PT_USER_1 }
5+
let(:client) { TrackerApi::Client.new token: pt_user[:token] }
6+
let(:story) do
7+
TrackerApi::Resources::Story.new(
8+
client: client,
9+
project_id: pt_user[:project_id],
10+
id: '66728004'
11+
)
12+
end
13+
let(:reviews) { VCR.use_cassette('get story reviews') { story.reviews } }
14+
let(:existing_review) { reviews.first }
15+
16+
it 'can update an existing review' do
17+
new_state = 'pass'
18+
existing_review.status = new_state
19+
20+
VCR.use_cassette('save review', record: :new_episodes) do
21+
existing_review.save
22+
end
23+
24+
_(existing_review.status).must_equal new_state
25+
_(existing_review.clean?).must_equal true
26+
end
27+
end
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "http_interactions": [ { "request": { "method": "put", "uri": "https://www.pivotaltracker.com/services/v5/projects/1027488/stories/66728004/reviews/1129224", "body": { "encoding": "UTF-8", "string": "{\"status\":\"pass\"}" }, "headers": { "User-Agent": [ "Ruby/2.3.1 (x86_64-darwin15; ruby) TrackerApi/1.7.0 Faraday/0.9.2" ], "X-TrackerToken": ["d55c3bc1f74346b843ca84ba340b29bf"], "Content-Type": ["application/json"] } }, "response": { "status": { "code": 200, "message": null }, "headers": { "Access-Control-Allow-Credentials": ["false"], "Access-Control-Allow-Headers": [ "X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is" ], "Access-Control-Allow-Methods": ["GET, POST, PUT, DELETE, OPTIONS"], "Access-Control-Allow-Origin": ["*"], "Cache-Control": ["max-age=0, private, must-revalidate"], "Content-Type": ["application/json; charset=utf-8"], "Date": ["Wed, 03 May 2017 23:29:39 GMT"], "Etag": ["\"32f56ee2d2f58495f5243892aa8ab824\""], "Server": ["nginx + Phusion Passenger"], "Status": ["200 OK"], "Strict-Transport-Security": [ "max-age=31536000; includeSubDomains; preload" ], "X-Content-Type-Options": ["nosniff"], "X-Powered-By": ["Phusion Passenger Enterprise"], "X-Rack-Cache": ["invalidate, pass"], "X-Request-Id": ["51304f42f751d73a2484764013fcd838"], "X-Runtime": ["0.344871"], "X-Tracker-Client-Pinger-Interval": ["20"], "X-Tracker-Project-Version": ["231"], "X-Ua-Compatible": ["IE=Edge,chrome=1"], "X-Vcap-Request-Id": ["76b36118-3332-4513-5eef-f0667c4b9bb6"], "X-Xss-Protection": ["1; mode=block"], "Content-Length": ["176"], "Connection": ["keep-alive"] }, "body": { "encoding": "ASCII-8BIT", "string": "{\"kind\":\"review\",\"id\":1129224,\"story_id\":66728004,\"review_type_id\":2293634,\"reviewer_id\":1266314,\"status\":\"pass\",\"created_at\":\"2020-06-03T15:55:47Z\",\"updated_at\":\"2020-06-03T15:56:00Z\"}" }, "http_version": null }, "recorded_at": "Wed, 03 May 2017 23:29:39 GMT" } ], "recorded_with": "VCR 2.9.3" }

0 commit comments

Comments
 (0)