diff --git a/app/controllers/epp/domains_controller.rb b/app/controllers/epp/domains_controller.rb index 675dcb90e..6962f42c8 100644 --- a/app/controllers/epp/domains_controller.rb +++ b/app/controllers/epp/domains_controller.rb @@ -105,29 +105,36 @@ class Epp::DomainsController < EppController balance_ok?('renew', period, period_unit) # loading pricelist - ActiveRecord::Base.transaction do - success = @domain.renew( - params[:parsed_frame].css('curExpDate').text, - period, period_unit - ) + begin + ActiveRecord::Base.transaction(isolation: :serializable) do + @domain.reload - if success - unless balance_ok?('renew', period, period_unit) - handle_errors - fail ActiveRecord::Rollback + success = @domain.renew( + params[:parsed_frame].css('curExpDate').text, + period, period_unit + ) + + if success + unless balance_ok?('renew', period, period_unit) + handle_errors + fail ActiveRecord::Rollback + end + + current_user.registrar.debit!({ + sum: @domain_pricelist.price.amount, + description: "#{I18n.t('renew')} #{@domain.name}", + activity_type: AccountActivity::RENEW, + log_pricelist_id: @domain_pricelist.id + }) + + render_epp_response '/epp/domains/renew' + else + handle_errors(@domain) end - - current_user.registrar.debit!({ - sum: @domain_pricelist.price.amount, - description: "#{I18n.t('renew')} #{@domain.name}", - activity_type: AccountActivity::RENEW, - log_pricelist_id: @domain_pricelist.id - }) - - render_epp_response '/epp/domains/renew' - else - handle_errors(@domain) end + rescue ActiveRecord::StatementInvalid => e + sleep rand / 100 + retry end end diff --git a/config/database-example-development.yml b/config/database-example-development.yml index 8bcaf097f..ba798d7e0 100644 --- a/config/database-example-development.yml +++ b/config/database-example-development.yml @@ -18,11 +18,6 @@ api_log_development: <<: *default database: registry_api_log_development -registrant_write_development: - <<: *default - database: registry_development - - test: <<: *default database: registry_test @@ -34,8 +29,3 @@ whois_test: api_log_test: <<: *default database: registry_api_log_test - -registrant_write_test: - <<: *default - database: registry_test - diff --git a/config/database-example-registrant.yml b/config/database-example-registrant.yml index 693c25115..7aaaf9216 100644 --- a/config/database-example-registrant.yml +++ b/config/database-example-registrant.yml @@ -25,14 +25,6 @@ staging: username: registrant_read_only password: registrant_read_only_pwd -registrant_write_staging: - <<: *default - database: registry_development # registry real database - host: localhost - username: registrant_write # user should have write access only to registrant_verifications table - password: registrant_write_pwd - - # # Production config for Registrant # @@ -43,10 +35,3 @@ production: host: localhost # registry production mirror location username: registrant_read_only password: registrant_read_only_pwd - -registrant_write_production: - <<: *default - database: registry_production # registry production database name - host: localhost # registry database location - username: registrant_write # user should have write access only to registrant_verifications table - password: registrant_write_pwd diff --git a/config/database-robot.yml b/config/database-robot.yml index f6eabc6cd..1a7809ccb 100644 --- a/config/database-robot.yml +++ b/config/database-robot.yml @@ -18,11 +18,6 @@ api_log_test: <<: *default database: registry_api_log_test -registrant_write_test: - <<: *default - database: registry_test - -# only for testing assets production: <<: *default database: registry_test @@ -34,7 +29,3 @@ whois_test: api_log_test: <<: *default database: registry_api_log_test - -registrant_write_test: - <<: *default - database: registry_test diff --git a/config/database-travis.yml b/config/database-travis.yml index 8bd81faa4..b79e2c453 100644 --- a/config/database-travis.yml +++ b/config/database-travis.yml @@ -17,7 +17,3 @@ whois_test: api_log_test: <<: *default database: registry_api_log_test - -registrant_write_test: - <<: *default - database: registry_test diff --git a/spec/requests/epp/domain/renew/account_balance_spec.rb b/spec/requests/epp/domain/renew/account_balance_spec.rb new file mode 100644 index 000000000..9dc840422 --- /dev/null +++ b/spec/requests/epp/domain/renew/account_balance_spec.rb @@ -0,0 +1,90 @@ +require 'rails_helper' + +RSpec.describe 'EPP domain:renew' do + let(:request) { post '/epp/command/renew', frame: request_xml } + let!(:user) { create(:api_user_epp, registrar: registrar) } + let!(:pricelist) { create(:pricelist, + category: 'com', + duration: '1year', + price: Money.from_amount(1), + operation_category: 'renew', + valid_from: Time.zone.parse('05.07.2010'), + valid_to: Time.zone.parse('05.07.2010')) + } + + before :example do + Setting.days_to_renew_domain_before_expire = 0 + travel_to Time.zone.parse('05.07.2010') + sign_in_to_epp_area(user: user) + end + + context 'when account balance is sufficient' do + let!(:registrar) { create(:registrar_with_unlimited_balance) } + let!(:domain) { create(:domain, + registrar: registrar, + name: 'test.com', + expire_time: Time.zone.parse('05.07.2010')) + } + let(:request_xml) { <<-XML + + + + + + test.com + 2010-07-05 + 1 + + + + + XML + } + + it 'renews domain' do + request + domain.reload + expect(domain.expire_time).to eq(Time.zone.parse('05.07.2011')) + end + + specify do + request + expect(response).to have_code_of(1000) + end + end + + context 'when account balance is not sufficient' do + let!(:registrar) { create(:registrar_with_zero_balance) } + let!(:domain) { create(:domain, + registrar: registrar, + name: 'test.com', + expire_time: Time.zone.parse('05.07.2010')) + } + let(:request_xml) { <<-XML + + + + + + test.com + 2010-07-04 + 1 + + + + + XML + } + + it 'does not renew domain' do + request + domain.reload + expect(domain.expire_time).to eq(Time.zone.parse('05.07.2010')) + end + + specify do + request + expect(response).to have_code_of(2104) + end + end +end diff --git a/spec/requests/epp/domain/renew/expire_time_spec.rb b/spec/requests/epp/domain/renew/expire_time_spec.rb new file mode 100644 index 000000000..b6b5caf99 --- /dev/null +++ b/spec/requests/epp/domain/renew/expire_time_spec.rb @@ -0,0 +1,89 @@ +require 'rails_helper' + +RSpec.describe 'EPP domain:renew' do + let(:request) { post '/epp/command/renew', frame: request_xml } + let!(:user) { create(:api_user_epp, registrar: registrar) } + let!(:registrar) { create(:registrar_with_unlimited_balance) } + let!(:pricelist) { create(:pricelist, + category: 'com', + duration: '1year', + price: Money.from_amount(1), + operation_category: 'renew', + valid_from: Time.zone.parse('05.07.2010'), + valid_to: Time.zone.parse('05.07.2010')) + } + + before :example do + Setting.days_to_renew_domain_before_expire = 0 + travel_to Time.zone.parse('05.07.2010') + sign_in_to_epp_area(user: user) + end + + context 'when given expire time and current match' do + let!(:domain) { create(:domain, + registrar: registrar, + name: 'test.com', + expire_time: Time.zone.parse('05.07.2010')) + } + let(:request_xml) { <<-XML + + + + + + test.com + 2010-07-05 + 1 + + + + + XML + } + + it 'renews domain' do + request + domain.reload + expect(domain.expire_time).to eq(Time.zone.parse('05.07.2011')) + end + + specify do + request + expect(response).to have_code_of(1000) + end + end + + context 'when given expire time and current do not match' do + let!(:domain) { create(:domain, + registrar: registrar, + name: 'test.com', + expire_time: Time.zone.parse('05.07.2010')) + } + let(:request_xml) { <<-XML + + + + + + test.com + 2010-07-04 + 1 + + + + + XML + } + + it 'does not renew domain' do + request + domain.reload + expect(domain.expire_time).to eq(Time.zone.parse('05.07.2010')) + end + + specify do + request + expect(response).to have_code_of(2306) + end + end +end diff --git a/spec/requests/epp/domain/renew_spec.rb b/spec/requests/epp/domain/renew/limit_spec.rb similarity index 99% rename from spec/requests/epp/domain/renew_spec.rb rename to spec/requests/epp/domain/renew/limit_spec.rb index 69a482bf4..c8fbee7f0 100644 --- a/spec/requests/epp/domain/renew_spec.rb +++ b/spec/requests/epp/domain/renew/limit_spec.rb @@ -7,7 +7,7 @@ RSpec.describe 'EPP domain:renew' do subject(:response_code) { response_xml.xpath('//xmlns:result').first['code'] } subject(:response_description) { response_xml.css('result msg').text } - before do + before :example do travel_to Time.zone.parse('05.07.2010') sign_in_to_epp_area(user: user) FactoryGirl.create(:account, registrar: registrar, balance: 1)