diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb
index 563923af0..f16ad7fc3 100644
--- a/app/models/epp/domain.rb
+++ b/app/models/epp/domain.rb
@@ -603,6 +603,14 @@ class Epp::Domain < Domain
plural_period_unit_name = (unit == 'm' ? 'months' : 'years').to_sym
renewed_expire_time = valid_to.advance(plural_period_unit_name => period.to_i)
+ max_reg_time = 11.years.from_now
+
+ if renewed_expire_time >= max_reg_time
+ add_epp_error('2105', nil, nil, I18n.t('epp.domains.object_is_not_eligible_for_renewal',
+ max_date: max_reg_time.to_date.to_s(:db)))
+ return false if errors.any?
+ end
+
self.expire_time = renewed_expire_time
self.outzone_at = nil
self.delete_at = nil
diff --git a/spec/requests/epp/domain/renew/max_expire_time_spec.rb b/spec/requests/epp/domain/renew/max_expire_time_spec.rb
new file mode 100644
index 000000000..2a9a0c52c
--- /dev/null
+++ b/spec/requests/epp/domain/renew/max_expire_time_spec.rb
@@ -0,0 +1,91 @@
+require 'rails_helper'
+
+RSpec.describe 'EPP domain:renew' do
+ let(:user) { create(:api_user_epp, registrar: registrar) }
+ let(:registrar) { create(:registrar_with_unlimited_balance) }
+ let!(:zone) { create(:zone, origin: 'test') }
+ let!(:price) { create(:price,
+ duration: '10 years',
+ price: Money.from_amount(1),
+ operation_category: 'renew',
+ valid_from: Time.zone.parse('05.07.2010'),
+ valid_to: Time.zone.parse('05.07.2010'),
+ zone: zone)
+ }
+ subject(:response_xml) { Nokogiri::XML(response.body) }
+ subject(:response_code) { response_xml.xpath('//xmlns:result').first['code'] }
+ subject(:response_description) { response_xml.css('result msg').text }
+
+ before :example do
+ travel_to Time.zone.parse('05.07.2010')
+ Setting.days_to_renew_domain_before_expire = 0
+ sign_in_to_epp_area(user: user)
+ end
+
+ context 'when domain can be renewed' do
+ let!(:domain) { create(:domain,
+ registrar: registrar,
+ name: 'test.test',
+ expire_time: Time.zone.parse('05.07.2010'))
+ }
+ let(:request_xml) { <<-XML
+
+
+
+
+
+ test.test
+ 2010-07-05
+ 10
+
+
+
+
+ XML
+ }
+
+ it 'returns epp code of 1000' do
+ post '/epp/command/renew', frame: request_xml
+ expect(response_code).to eq('1000')
+ end
+
+ it 'returns epp description' do
+ post '/epp/command/renew', frame: request_xml
+ expect(response_description).to eq('Command completed successfully')
+ end
+ end
+
+ context 'when domain cannot be renewed' do
+ let!(:domain) { create(:domain,
+ registrar: registrar,
+ name: 'test.test',
+ expire_time: Time.zone.parse('05.07.2011'))
+ }
+ let(:request_xml) { <<-XML
+
+
+
+
+
+ test.test
+ 2011-07-05
+ 10
+
+
+
+
+ XML
+ }
+
+ it 'returns epp code of 2105' do
+ post '/epp/command/renew', frame: request_xml
+ expect(response_code).to eq('2105')
+ end
+
+ it 'returns epp description' do
+ post '/epp/command/renew', frame: request_xml
+ expect(response_description).to eq('Object is not eligible for renewal; ' \
+ 'Expiration date must be before 2021-07-05')
+ end
+ end
+end