From ecdc0c146592835d38844f254b0c571280ab81e9 Mon Sep 17 00:00:00 2001 From: Tim Labeeuw Date: Wed, 6 Jan 2021 20:05:57 -0500 Subject: [PATCH] Update an existing review --- README.md | 4 ++++ lib/tracker_api.rb | 1 + lib/tracker_api/endpoints/review.rb | 21 +++++++++++++++++++++ lib/tracker_api/resources/review.rb | 18 +++++++++++++++++- lib/tracker_api/version.rb | 2 +- test/review_test.rb | 27 +++++++++++++++++++++++++++ test/vcr/cassettes/save_review.json | 1 + 7 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 lib/tracker_api/endpoints/review.rb create mode 100644 test/review_test.rb create mode 100644 test/vcr/cassettes/save_review.json diff --git a/README.md b/README.md index 52f09b0..aa11ba2 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,10 @@ task = story.tasks.first # Get task.complete = true task.save # Mark a task complete +review = story.reviews.first # Mark a review as complete +review.status = 'pass' +review.save + epics = project.epics # Get all epics for a project epic = epics.first label = epic.label # Get an epic's label diff --git a/lib/tracker_api.rb b/lib/tracker_api.rb index 60aa1f3..fbebab3 100644 --- a/lib/tracker_api.rb +++ b/lib/tracker_api.rb @@ -66,6 +66,7 @@ module Endpoints autoload :Attachments, 'tracker_api/endpoints/attachments' autoload :Releases, 'tracker_api/endpoints/releases' autoload :Release, 'tracker_api/endpoints/release' + autoload :Review, 'tracker_api/endpoints/review' autoload :Reviews, 'tracker_api/endpoints/reviews' end diff --git a/lib/tracker_api/endpoints/review.rb b/lib/tracker_api/endpoints/review.rb new file mode 100644 index 0000000..6fa3370 --- /dev/null +++ b/lib/tracker_api/endpoints/review.rb @@ -0,0 +1,21 @@ +module TrackerApi + module Endpoints + class Review + attr_accessor :client + + def initialize(client) + @client = client + end + + def update(review, params = {}) + raise ArgumentError, 'Valid review required to update.' unless review.instance_of?(Resources::Review) + + data = client.put("/projects/#{review.project_id}/stories/#{review.story_id}/reviews/#{review.id}", params: params).body + + review.attributes = data + review.clean! + review + end + end + end +end diff --git a/lib/tracker_api/resources/review.rb b/lib/tracker_api/resources/review.rb index c37395a..8b5404e 100644 --- a/lib/tracker_api/resources/review.rb +++ b/lib/tracker_api/resources/review.rb @@ -7,6 +7,7 @@ class Review attribute :id, Integer attribute :story_id, Integer + attribute :project_id, Integer attribute :review_type_id, Integer attribute :reviewer_id, Integer attribute :status, String # (unstarted, in_review, pass, revise) @@ -14,6 +15,21 @@ class Review attribute :updated_at, DateTime attribute :kind, String attribute :review_type, ReviewType + + class UpdateRepresenter < Representable::Decorator + include Representable::JSON + + property :id + property :review_type_id + property :reviewer_id + property :status + end + + def save + raise ArgumentError, 'Cannot update a review with an unknown story_id.' if story_id.nil? + + Endpoints::Review.new(client).update(self, UpdateRepresenter.new(Review.new(dirty_attributes))) + end end end -end \ No newline at end of file +end diff --git a/lib/tracker_api/version.rb b/lib/tracker_api/version.rb index e12ffcf..6d0200b 100644 --- a/lib/tracker_api/version.rb +++ b/lib/tracker_api/version.rb @@ -1,3 +1,3 @@ module TrackerApi - VERSION = '1.11.0' + VERSION = '1.12.0' end diff --git a/test/review_test.rb b/test/review_test.rb new file mode 100644 index 0000000..07c9487 --- /dev/null +++ b/test/review_test.rb @@ -0,0 +1,27 @@ +require_relative 'minitest_helper' + +describe TrackerApi::Resources::Review do + let(:pt_user) { PT_USER_1 } + let(:client) { TrackerApi::Client.new token: pt_user[:token] } + let(:story) do + TrackerApi::Resources::Story.new( + client: client, + project_id: pt_user[:project_id], + id: '66728004' + ) + end + let(:reviews) { VCR.use_cassette('get story reviews') { story.reviews } } + let(:existing_review) { reviews.first } + + it 'can update an existing review' do + new_state = 'pass' + existing_review.status = new_state + + VCR.use_cassette('save review', record: :new_episodes) do + existing_review.save + end + + _(existing_review.status).must_equal new_state + _(existing_review.clean?).must_equal true + end +end diff --git a/test/vcr/cassettes/save_review.json b/test/vcr/cassettes/save_review.json new file mode 100644 index 0000000..29513ab --- /dev/null +++ b/test/vcr/cassettes/save_review.json @@ -0,0 +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" }