From 446b9fbf770772972a74cbec6badc2e540671e68 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 15 Feb 2019 13:32:07 +0200 Subject: [PATCH] Complete auction integration --- app/controllers/api/v1/auctions_controller.rb | 6 +++-- app/models/auction.rb | 10 ++++++++ doc/api/v1/auctions.md | 2 +- .../api/v1/auctions/details_test.rb | 8 ++++++- .../api/v1/auctions/update_test.rb | 18 +++++++++++++- test/models/auction_test.rb | 24 ++++++++++++++++++- 6 files changed, 62 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/auctions_controller.rb b/app/controllers/api/v1/auctions_controller.rb index e9241cdfc..7438acf2e 100644 --- a/app/controllers/api/v1/auctions_controller.rb +++ b/app/controllers/api/v1/auctions_controller.rb @@ -8,12 +8,12 @@ module Api end def show - auction = Auction.find_by(uuid: params[:uuid]) + auction = Auction.find_by!(uuid: params[:uuid]) render json: serializable_hash(auction) end def update - auction = Auction.find_by(uuid: params[:uuid]) + auction = Auction.find_by!(uuid: params[:uuid]) case params[:status] when Auction.statuses[:awaiting_payment] @@ -24,6 +24,8 @@ module Api auction.mark_as_payment_received when Auction.statuses[:payment_not_received] auction.mark_as_payment_not_received + when Auction.statuses[:domain_not_registered] + auction.mark_as_domain_not_registered else raise "Invalid status #{params[:status]}" end diff --git a/app/models/auction.rb b/app/models/auction.rb index 1b37b5af4..750f326b9 100644 --- a/app/models/auction.rb +++ b/app/models/auction.rb @@ -6,6 +6,7 @@ class Auction < ActiveRecord::Base payment_received: 'payment_received', payment_not_received: 'payment_not_received', domain_registered: 'domain_registered', + domain_not_registered: 'domain_not_registered', } PENDING_STATUSES = [statuses[:started], @@ -43,6 +44,15 @@ class Auction < ActiveRecord::Base end end + def mark_as_domain_not_registered + self.status = self.class.statuses[:domain_not_registered] + + transaction do + save! + restart + end + end + def domain_registrable?(registration_code = nil) payment_received? && registration_code_matches?(registration_code) end diff --git a/doc/api/v1/auctions.md b/doc/api/v1/auctions.md index 2a18019b3..12351f571 100644 --- a/doc/api/v1/auctions.md +++ b/doc/api/v1/auctions.md @@ -46,7 +46,7 @@ Updates auction. ### Parameters | Field name | Required | Type | Allowed values | Description | | ---------- | -------- | ---- | -------------- | ----------- | -| status | no | String | "awaiting_payment", "no_bids", "payment_received", "payment_not_received" +| status | no | String | "awaiting_payment", "no_bids", "payment_received", "payment_not_received", "domain_not_registered" ## Request ``` diff --git a/test/integration/api/v1/auctions/details_test.rb b/test/integration/api/v1/auctions/details_test.rb index 9d12cc844..996151cee 100644 --- a/test/integration/api/v1/auctions/details_test.rb +++ b/test/integration/api/v1/auctions/details_test.rb @@ -23,4 +23,10 @@ class ApiV1AuctionDetailsTest < ActionDispatch::IntegrationTest 'status' => Auction.statuses[:no_bids] }), ActiveSupport::JSON .decode(response.body) end -end + + def test_auction_not_found + assert_raises ActiveRecord::RecordNotFound do + get api_v1_auction_path('non-existing-uuid'), nil, 'Content-Type' => Mime::JSON.to_s + end + end +end \ No newline at end of file diff --git a/test/integration/api/v1/auctions/update_test.rb b/test/integration/api/v1/auctions/update_test.rb index 451f91f21..09dbf2fe7 100644 --- a/test/integration/api/v1/auctions/update_test.rb +++ b/test/integration/api/v1/auctions/update_test.rb @@ -89,6 +89,15 @@ class ApiV1AuctionUpdateTest < ActionDispatch::IntegrationTest assert DNS::DomainName.new('auction.test').at_auction? end + def test_restarts_an_auction_when_domain_is_not_registered + @auction.update!(domain: 'auction.test', status: Auction.statuses[:payment_received]) + + patch api_v1_auction_path(@auction.uuid), { status: Auction.statuses[:domain_not_registered] } + .to_json, 'Content-Type' => Mime::JSON.to_s + + assert DNS::DomainName.new('auction.test').at_auction? + end + def test_inaccessible_when_ip_address_is_not_allowed ENV['auction_api_allowed_ips'] = '' @@ -97,4 +106,11 @@ class ApiV1AuctionUpdateTest < ActionDispatch::IntegrationTest assert_response :unauthorized end -end + + def test_auction_not_found + assert_raises ActiveRecord::RecordNotFound do + patch api_v1_auction_path('non-existing-uuid'), { status: Auction.statuses[:no_bids] }.to_json, + 'Content-Type' => Mime::JSON.to_s + end + end +end \ No newline at end of file diff --git a/test/models/auction_test.rb b/test/models/auction_test.rb index 68cac6b65..9417c4a8c 100644 --- a/test/models/auction_test.rb +++ b/test/models/auction_test.rb @@ -15,7 +15,8 @@ class AuctionTest < ActiveSupport::TestCase 'awaiting_payment' => 'awaiting_payment', 'payment_received' => 'payment_received', 'payment_not_received' => 'payment_not_received', - 'domain_registered' => 'domain_registered' }), Auction.statuses + 'domain_registered' => 'domain_registered', + 'domain_not_registered' => 'domain_not_registered' }), Auction.statuses end def test_selling_domain_starts_new_auction @@ -95,6 +96,27 @@ class AuctionTest < ActiveSupport::TestCase assert new_auction.started? end + def test_marking_as_domain_not_registered + @auction.update!(status: Auction.statuses[:payment_received]) + + @auction.mark_as_domain_not_registered + @auction.reload + + assert @auction.domain_not_registered? + end + + def test_restarts_an_auction_when_domain_is_not_registered + @auction.update!(domain: 'auction.test', status: Auction.statuses[:domain_not_registered]) + + assert_difference 'Auction.count' do + @auction.mark_as_domain_not_registered + end + + new_auction = Auction.last + assert_equal 'auction.test', new_auction.domain + assert new_auction.started? + end + def test_domain_registrable assert @auction.no_bids? assert_not @auction.domain_registrable?