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)