diff --git a/app/controllers/repp/v1/domains/renews_controller.rb b/app/controllers/repp/v1/domains/renews_controller.rb index 46dd9fbba..052228e67 100644 --- a/app/controllers/repp/v1/domains/renews_controller.rb +++ b/app/controllers/repp/v1/domains/renews_controller.rb @@ -2,26 +2,40 @@ module Repp module V1 module Domains class RenewsController < BaseController + before_action :validate_renew_period, only: [:bulk_renew] + before_action :select_renewable_domains, only: [:bulk_renew] + def bulk_renew + renew = run_bulk_renew_task(@domains, bulk_renew_params[:renew_period]) + return render_success(data: { updated_domains: @domains.map(&:name) }) if renew.valid? + + @epp_errors << { code: 2304, + msg: renew.errors.keys.map { |k, _v| renew.errors[k] }.join(',') } + handle_errors + end + + private + + def validate_renew_period + @epp_errors ||= [] + periods = Depp::Domain::PERIODS.map { |p| p[1] } + return if periods.include? bulk_renew_params[:renew_period] + + @epp_errors << { code: 2005, msg: "Invalid renew period" } + end + + def select_renewable_domains @epp_errors ||= [] if bulk_renew_params[:domains].instance_of?(Array) - domains = bulk_renew_domains + @domains = bulk_renew_domains else @epp_errors << { code: 2005, msg: 'Domains attribute must be an array' } end return handle_errors if @epp_errors.any? - - renew = run_bulk_renew_task(domains, bulk_renew_params[:renew_period]) - return render_success(data: { updated_domains: domains.map(&:name) }) if renew.valid? - - @epp_errors << { code: 2304, msg: renew.errors.full_messages.join(',') } - handle_errors end - private - def run_bulk_renew_task(domains, period) ::Domains::BulkRenew::Start.run(domains: domains, period_element: period, registrar: current_user.registrar) @@ -38,7 +52,7 @@ module Repp @epp_errors ||= [] domains = [] bulk_renew_params[:domains].each do |idn| - domain = Epp::Domain.find_by_idn(idn) + domain = Epp::Domain.find_by(name: idn) domains << domain if domain @epp_errors << { code: 2304, msg: "Object does not exist: #{idn}" } unless domain end diff --git a/app/interactions/domains/bulk_renew/start.rb b/app/interactions/domains/bulk_renew/start.rb index a0a2f9bf0..f758b52cd 100644 --- a/app/interactions/domains/bulk_renew/start.rb +++ b/app/interactions/domains/bulk_renew/start.rb @@ -41,7 +41,7 @@ module Domains end def manage_errors(task) - errors.merge!(task.errors) unless task.valid? + task.errors.each { |k, v| errors.add(k, v) } unless task.valid? errors.add(:domain, I18n.t('not_enough_funds')) unless task.result end diff --git a/app/models/depp/domain.rb b/app/models/depp/domain.rb index 17fadab65..e37f03334 100644 --- a/app/models/depp/domain.rb +++ b/app/models/depp/domain.rb @@ -35,7 +35,7 @@ module Depp token = Base64.urlsafe_encode64("#{registrar.username}:#{registrar.plain_text_password}") headers = { Authorization: "Basic #{token}" } - RestClient.post("#{ENV['repp_url']}domains/renew/bulk", payload, headers).response + RestClient.post("http://localhost:3000/repp/v1/domains/renew/bulk", payload, headers) rescue RestClient::ExceptionWithResponse => e e.response end diff --git a/test/integration/repp/v1/domains/bulk_renew_test.rb b/test/integration/repp/v1/domains/bulk_renew_test.rb new file mode 100644 index 000000000..fde383682 --- /dev/null +++ b/test/integration/repp/v1/domains/bulk_renew_test.rb @@ -0,0 +1,80 @@ +require 'test_helper' + +class ReppV1DomainsBulkRenewTest < ActionDispatch::IntegrationTest + def setup + travel_to Time.zone.parse('2010-07-05 10:30') + @user = users(:api_bestnames) + token = Base64.encode64("#{@user.username}:#{@user.plain_text_password}") + token = "Basic #{token}" + @domain = domains(:hospital) + + @auth_headers = { 'Authorization' => token } + end + + def test_renews_domains + payload = { + "domains": [ + 'shop.test', + 'airport.test', + 'library.test' + ], + "renew_period": "1y" + } + post "/repp/v1/domains/renew/bulk", headers: @auth_headers, params: payload + json = JSON.parse(response.body, symbolize_names: true) + + assert_response :ok + assert_equal 1000, json[:code] + assert_equal 'Command completed successfully', json[:message] + assert json[:data][:updated_domains].include? 'shop.test' + assert json[:data][:updated_domains].include? 'airport.test' + assert json[:data][:updated_domains].include? 'library.test' + end + + def test_throws_error_when_domain_not_renewable + payload = { + "domains": [ + 'invalid.test', + ], + "renew_period": "1y" + } + post "/repp/v1/domains/renew/bulk", headers: @auth_headers, params: payload + json = JSON.parse(response.body, symbolize_names: true) + + assert_response :bad_request + assert_equal 2304, json[:code] + assert_equal 'Domain renew error for invalid.test', json[:message] + end + + def test_throws_error_when_not_enough_balance + billing_prices(:renew_one_year).update(price_cents: 99999999) + payload = { + "domains": [ + 'invalid.test', + ], + "renew_period": "1y" + } + post "/repp/v1/domains/renew/bulk", headers: @auth_headers, params: payload + json = JSON.parse(response.body, symbolize_names: true) + + assert_response :bad_request + assert_equal 2304, json[:code] + assert_equal 'Not enough funds for renew domains', json[:message] + end + + def test_throws_error_if_invalid_renew_period + payload = { + "domains": [ + 'shop.test' + ], + "renew_period": "nope" + } + + post "/repp/v1/domains/renew/bulk", headers: @auth_headers, params: payload + json = JSON.parse(response.body, symbolize_names: true) + + assert_response :bad_request + assert_equal 2005, json[:code] + assert_equal 'Invalid renew period', json[:message] + end +end