Merge remote-tracking branch 'origin/master' into 1422-record-payment-method-and-failed-payments

This commit is contained in:
Karl Erik Õunapuu 2020-02-27 12:08:29 +02:00
commit 5d999f96c5
75 changed files with 847 additions and 782 deletions

View file

@ -1 +1 @@
2.4.7 2.6.5

View file

@ -1,3 +1,31 @@
26.02.2020
* Registrar: added an option to remove clientHold status [#1481](https://github.com/internetee/registry/issues/1481)
* Admin: fixed domain status removal issue [#1543](https://github.com/internetee/registry/issues/1543)
* Implemented consistent and automated data migrations [#1298](https://github.com/internetee/registry/issues/1298)
20.02.2020
* E-invoice sending to Que to manage resending in case of an error [#1509](https://github.com/internetee/registry/issues/1509)
* Check to make sure all monthly invoices fit in available invoice number range [#277](https://github.com/internetee/registry/issues/277)
* Disabled aurbreak performance monitoring [#1534](https://github.com/internetee/registry/pull/1534)
14.02.2020
* Fixed Papertrail warnings [#1530](https://github.com/internetee/registry/issues/1530)
12.02.2020
* Fixed papertrails double recording issue [#1526](https://github.com/internetee/registry/issues/1526)
* Requests to Directo are now saved for both credit and monthly invoices [#344](https://github.com/internetee/registry/issues/344)
10.02.2020
* Resolved Money gem deprecation warning and silenced all warnings due plan to replace papertrail [#1522](https://github.com/internetee/registry/pull/1522)
06.02.2020
* Permit & turn ActiveController::Parameters to hash on domain create [#1516](https://github.com/internetee/registry/issues/1516)
05.02.2020
* Ruby version upgrade to 2.6.3 [#846](https://github.com/internetee/registry/issues/846)
* Added retries & raise to connect api to handle timeouts [#1474](https://github.com/internetee/registry/issues/1474)
* Added logging of XML if there is NoMethodError#text on xml data fields [#1475](https://github.com/internetee/registry/issues/1475)
04.02.2020 04.02.2020
* Fixed bug that allowed bypassing blocked domain validation using punycode [#1142](https://github.com/internetee/registry/issues/1142) * Fixed bug that allowed bypassing blocked domain validation using punycode [#1142](https://github.com/internetee/registry/issues/1142)
* SimpleIDN gem update to 0.0.9 [#1508](https://github.com/internetee/registry/pull/1508) * SimpleIDN gem update to 0.0.9 [#1508](https://github.com/internetee/registry/pull/1508)

View file

@ -1,4 +1,4 @@
FROM internetee/ruby:2.4 FROM internetee/ruby:2.6-buster
RUN mkdir -p /opt/webapps/app/tmp/pids RUN mkdir -p /opt/webapps/app/tmp/pids
WORKDIR /opt/webapps/app WORKDIR /opt/webapps/app

14
Gemfile
View file

@ -1,8 +1,8 @@
source 'https://rubygems.org' source 'https://rubygems.org'
# core # core
gem 'iso8601', '0.8.6' # for dates and times gem 'iso8601', '0.12.1' # for dates and times
gem 'rails', '~> 5.0.7' gem 'rails', '~> 5.1.7'
gem 'rest-client' gem 'rest-client'
gem 'uglifier' gem 'uglifier'
@ -10,11 +10,11 @@ gem 'uglifier'
gem 'figaro', '1.1.1' gem 'figaro', '1.1.1'
# model related # model related
gem 'pg', '0.19.0' gem 'paper_trail', '~> 8.1'
gem 'pg', '1.2.2'
# 1.8 is for Rails < 5.0 # 1.8 is for Rails < 5.0
gem 'ransack', '~> 1.8' gem 'ransack', '~> 1.8'
gem 'validates_email_format_of', '1.6.3' # validates email against RFC 2822 and RFC 3696 gem 'validates_email_format_of', '1.6.3' # validates email against RFC 2822 and RFC 3696
gem 'paper_trail', '~> 4.0'
# 0.7.3 is the latest for Rails 4.2, however, it is absent on Rubygems server # 0.7.3 is the latest for Rails 4.2, however, it is absent on Rubygems server
# https://github.com/huacnlee/rails-settings-cached/issues/165 # https://github.com/huacnlee/rails-settings-cached/issues/165
@ -36,10 +36,10 @@ gem 'devise', '~> 4.7'
gem 'grape' gem 'grape'
# registry specfic # registry specfic
gem 'data_migrate', '~> 6.1'
gem 'isikukood' # for EE-id validation gem 'isikukood' # for EE-id validation
gem 'simpleidn', '0.0.9' # For punycode gem 'simpleidn', '0.0.9' # For punycode
gem 'money-rails' gem 'money-rails'
gem 'data_migrate'
gem 'whenever', '0.9.4', require: false gem 'whenever', '0.9.4', require: false
# country listing # country listing
@ -63,7 +63,7 @@ gem 'airbrake'
gem 'company_register', github: 'internetee/company_register', branch: :master gem 'company_register', github: 'internetee/company_register', branch: :master
gem 'e_invoice', github: 'internetee/e_invoice', branch: :master gem 'e_invoice', github: 'internetee/e_invoice', branch: :master
gem 'lhv', github: 'internetee/lhv', tag: 'v0.1.0' gem 'lhv', github: 'internetee/lhv', branch: :master
gem 'domain_name' gem 'domain_name'
gem 'haml', '~> 5.0' gem 'haml', '~> 5.0'
gem 'wkhtmltopdf-binary' gem 'wkhtmltopdf-binary'
@ -84,8 +84,8 @@ end
group :test do group :test do
gem 'capybara' gem 'capybara'
gem 'database_cleaner' gem 'database_cleaner'
gem 'minitest', '~> 5.14'
gem 'simplecov', require: false gem 'simplecov', require: false
gem 'webdrivers' gem 'webdrivers'
gem 'webmock' gem 'webmock'
gem 'minitest', '~> 5.10.0'
end end

View file

@ -27,7 +27,7 @@ GIT
GIT GIT
remote: https://github.com/internetee/epp.git remote: https://github.com/internetee/epp.git
revision: 76f9fd487d0ca3865b6f706c5a72703951c03996 revision: af7cefda37ac81d14b1d12641cde410776082d59
branch: master branch: master
specs: specs:
epp (1.5.0) epp (1.5.0)
@ -36,11 +36,12 @@ GIT
GIT GIT
remote: https://github.com/internetee/lhv.git remote: https://github.com/internetee/lhv.git
revision: e211516bc5fff2139584d4da41c17511863c229d revision: 145f66e21d65a4a7543f6b28a4124440d36fec98
tag: v0.1.0 branch: master
specs: specs:
lhv (0.1.0) lhv (0.1.0)
keystores keystores
logger
nokogiri nokogiri
GIT GIT
@ -58,70 +59,66 @@ GIT
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
actioncable (5.0.7.2) actioncable (5.1.7)
actionpack (= 5.0.7.2) actionpack (= 5.1.7)
nio4r (>= 1.2, < 3.0) nio4r (~> 2.0)
websocket-driver (~> 0.6.1) websocket-driver (~> 0.6.1)
actionmailer (5.0.7.2) actionmailer (5.1.7)
actionpack (= 5.0.7.2) actionpack (= 5.1.7)
actionview (= 5.0.7.2) actionview (= 5.1.7)
activejob (= 5.0.7.2) activejob (= 5.1.7)
mail (~> 2.5, >= 2.5.4) mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
actionpack (5.0.7.2) actionpack (5.1.7)
actionview (= 5.0.7.2) actionview (= 5.1.7)
activesupport (= 5.0.7.2) activesupport (= 5.1.7)
rack (~> 2.0) rack (~> 2.0)
rack-test (~> 0.6.3) rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2) rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.0.7.2) actionview (5.1.7)
activesupport (= 5.0.7.2) activesupport (= 5.1.7)
builder (~> 3.1) builder (~> 3.1)
erubis (~> 2.7.0) erubi (~> 1.4)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3) rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (5.0.7.2) activejob (5.1.7)
activesupport (= 5.0.7.2) activesupport (= 5.1.7)
globalid (>= 0.3.6) globalid (>= 0.3.6)
activemodel (5.0.7.2) activemodel (5.1.7)
activesupport (= 5.0.7.2) activesupport (= 5.1.7)
activerecord (5.0.7.2) activerecord (5.1.7)
activemodel (= 5.0.7.2) activemodel (= 5.1.7)
activesupport (= 5.0.7.2) activesupport (= 5.1.7)
arel (~> 7.0) arel (~> 8.0)
activesupport (5.0.7.2) activesupport (5.1.7)
concurrent-ruby (~> 1.0, >= 1.0.2) concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2) i18n (>= 0.7, < 2)
minitest (~> 5.1) minitest (~> 5.1)
tzinfo (~> 1.1) tzinfo (~> 1.1)
addressable (2.7.0) addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0) public_suffix (>= 2.0.2, < 5.0)
airbrake (9.4.5) airbrake (10.0.1)
airbrake-ruby (~> 4.7) airbrake-ruby (~> 4.13)
airbrake-ruby (4.7.1) airbrake-ruby (4.13.0)
rbtree3 (~> 0.5) rbtree3 (~> 0.5)
akami (1.3.1) akami (1.3.1)
gyoku (>= 0.4.0) gyoku (>= 0.4.0)
nokogiri nokogiri
arel (7.1.4) arel (8.0.0)
autodoc (0.7.3) autodoc (0.7.3)
actionpack actionpack
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
rspec rspec
autoprefixer-rails (9.6.5) autoprefixer-rails (9.7.4)
execjs execjs
axiom-types (0.1.1)
descendants_tracker (~> 0.0.4)
ice_nine (~> 0.11.0)
thread_safe (~> 0.3, >= 0.3.1)
bcrypt (3.1.13) bcrypt (3.1.13)
bootstrap-sass (3.4.1) bootstrap-sass (3.4.1)
autoprefixer-rails (>= 5.2.1) autoprefixer-rails (>= 5.2.1)
sassc (>= 2.0.0) sassc (>= 2.0.0)
builder (3.2.3) builder (3.2.4)
cancancan (3.0.1) cancancan (3.0.2)
capybara (3.29.0) capybara (3.31.0)
addressable addressable
mini_mime (>= 0.1.3) mini_mime (>= 0.1.3)
nokogiri (~> 1.8) nokogiri (~> 1.8)
@ -132,8 +129,6 @@ GEM
childprocess (3.0.0) childprocess (3.0.0)
chronic (0.10.2) chronic (0.10.2)
coderay (1.1.0) coderay (1.1.0)
coercible (1.0.0)
descendants_tracker (~> 0.0.1)
coffee-rails (4.2.2) coffee-rails (4.2.2)
coffee-script (>= 2.2.0) coffee-script (>= 2.2.0)
railties (>= 4.0.0) railties (>= 4.0.0)
@ -148,16 +143,14 @@ GEM
unicode_utils (~> 1.4) unicode_utils (~> 1.4)
crack (0.4.3) crack (0.4.3)
safe_yaml (~> 1.0.0) safe_yaml (~> 1.0.0)
crass (1.0.5) crass (1.0.6)
daemons (1.3.1) daemons (1.3.1)
daemons-rails (1.2.1) daemons-rails (1.2.1)
daemons daemons
multi_json (~> 1.0) multi_json (~> 1.0)
data_migrate (6.0.5) data_migrate (6.2.0)
rails (>= 5.0) rails (>= 5.0)
database_cleaner (1.7.0) database_cleaner (1.8.2)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
devise (4.7.1) devise (4.7.1)
bcrypt (~> 3.0) bcrypt (~> 3.0)
orm_adapter (~> 0.1) orm_adapter (~> 0.1)
@ -168,21 +161,42 @@ GEM
docile (1.3.2) docile (1.3.2)
domain_name (0.5.20190701) domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
equalizer (0.0.11) dry-configurable (0.9.0)
concurrent-ruby (~> 1.0)
dry-core (~> 0.4, >= 0.4.7)
dry-container (0.7.2)
concurrent-ruby (~> 1.0)
dry-configurable (~> 0.1, >= 0.1.3)
dry-core (0.4.9)
concurrent-ruby (~> 1.0)
dry-equalizer (0.3.0)
dry-inflector (0.2.0)
dry-logic (1.0.5)
concurrent-ruby (~> 1.0)
dry-core (~> 0.2)
dry-equalizer (~> 0.2)
dry-types (1.2.2)
concurrent-ruby (~> 1.0)
dry-container (~> 0.3)
dry-core (~> 0.4, >= 0.4.4)
dry-equalizer (~> 0.3)
dry-inflector (~> 0.1, >= 0.1.2)
dry-logic (~> 1.0, >= 1.0.2)
erubi (1.9.0)
erubis (2.7.0) erubis (2.7.0)
execjs (2.7.0) execjs (2.7.0)
ffi (1.11.1) ffi (1.12.2)
figaro (1.1.1) figaro (1.1.1)
thor (~> 0.14) thor (~> 0.14)
globalid (0.4.2) globalid (0.4.2)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
grape (1.2.4) grape (1.3.0)
activesupport activesupport
builder builder
dry-types (>= 1.1)
mustermann-grape (~> 1.0.0) mustermann-grape (~> 1.0.0)
rack (>= 1.3.0) rack (>= 1.3.0)
rack-accept rack-accept
virtus (>= 1.0.0)
gyoku (1.3.1) gyoku (1.3.1)
builder (>= 2.1.2) builder (>= 2.1.2)
haml (5.1.2) haml (5.1.2)
@ -197,12 +211,11 @@ GEM
httpi (2.4.4) httpi (2.4.4)
rack rack
socksify socksify
i18n (1.7.0) i18n (1.8.2)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
i18n_data (0.8.0) i18n_data (0.8.0)
ice_nine (0.11.2)
isikukood (0.1.2) isikukood (0.1.2)
iso8601 (0.8.6) iso8601 (0.12.1)
jquery-rails (4.3.5) jquery-rails (4.3.5)
rails-dom-testing (>= 1, < 3) rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0) railties (>= 4.2.0)
@ -210,27 +223,28 @@ GEM
jquery-ui-rails (5.0.5) jquery-ui-rails (5.0.5)
railties (>= 3.2.16) railties (>= 3.2.16)
json (1.8.6) json (1.8.6)
kaminari (1.1.1) kaminari (1.2.0)
activesupport (>= 4.1.0) activesupport (>= 4.1.0)
kaminari-actionview (= 1.1.1) kaminari-actionview (= 1.2.0)
kaminari-activerecord (= 1.1.1) kaminari-activerecord (= 1.2.0)
kaminari-core (= 1.1.1) kaminari-core (= 1.2.0)
kaminari-actionview (1.1.1) kaminari-actionview (1.2.0)
actionview actionview
kaminari-core (= 1.1.1) kaminari-core (= 1.2.0)
kaminari-activerecord (1.1.1) kaminari-activerecord (1.2.0)
activerecord activerecord
kaminari-core (= 1.1.1) kaminari-core (= 1.2.0)
kaminari-core (1.1.1) kaminari-core (1.2.0)
keystores (0.4.0) keystores (0.4.0)
libxml-ruby (3.1.0) libxml-ruby (3.1.0)
loofah (2.3.1) logger (1.4.2)
loofah (2.4.0)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.5.9) nokogiri (>= 1.5.9)
mail (2.7.1) mail (2.7.1)
mini_mime (>= 0.1.1) mini_mime (>= 0.1.1)
method_source (0.8.2) method_source (0.8.2)
mime-types (3.3) mime-types (3.3.1)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2019.1009) mime-types-data (3.2019.1009)
mina (0.3.1) mina (0.3.1)
@ -238,38 +252,38 @@ GEM
rake rake
mini_mime (1.0.2) mini_mime (1.0.2)
mini_portile2 (2.4.0) mini_portile2 (2.4.0)
minitest (5.10.3) minitest (5.14.0)
monetize (1.9.2) monetize (1.9.4)
money (~> 6.12) money (~> 6.12)
money (6.13.4) money (6.13.7)
i18n (>= 0.6.4, <= 2) i18n (>= 0.6.4, <= 2)
money-rails (1.13.2) money-rails (1.13.3)
activesupport (>= 3.0) activesupport (>= 3.0)
monetize (~> 1.9.0) monetize (~> 1.9.0)
money (~> 6.13.2) money (~> 6.13.2)
railties (>= 3.0) railties (>= 3.0)
multi_json (1.14.1) multi_json (1.14.1)
mustermann (1.0.3) mustermann (1.1.1)
mustermann-grape (1.0.0) ruby2_keywords (~> 0.0.1)
mustermann (~> 1.0.0) mustermann-grape (1.0.1)
mustermann (>= 1.0.0)
netrc (0.11.0) netrc (0.11.0)
nio4r (2.5.2) nio4r (2.5.2)
nokogiri (1.10.4) nokogiri (1.10.8)
mini_portile2 (~> 2.4.0) mini_portile2 (~> 2.4.0)
nori (2.6.0) nori (2.6.0)
open4 (1.3.4) open4 (1.3.4)
orm_adapter (0.5.0) orm_adapter (0.5.0)
paper_trail (4.2.0) paper_trail (8.1.2)
activerecord (>= 3.0, < 6.0) activerecord (>= 4.2, < 5.2)
activesupport (>= 3.0, < 6.0)
request_store (~> 1.1) request_store (~> 1.1)
pdfkit (0.8.4.1) pdfkit (0.8.4.1)
pg (0.19.0) pg (1.2.2)
pry (0.10.1) pry (0.10.1)
coderay (~> 1.1.0) coderay (~> 1.1.0)
method_source (~> 0.8.1) method_source (~> 0.8.1)
slop (~> 3.4) slop (~> 3.4)
public_suffix (4.0.1) public_suffix (4.0.3)
puma (4.3.1) puma (4.3.1)
nio4r (~> 2.0) nio4r (~> 2.0)
que (0.14.3) que (0.14.3)
@ -277,25 +291,25 @@ GEM
erubis erubis
que (~> 0.8) que (~> 0.8)
sinatra sinatra
rack (2.0.8) rack (2.1.2)
rack-accept (0.4.5) rack-accept (0.4.5)
rack (>= 0.4) rack (>= 0.4)
rack-protection (2.0.7) rack-protection (2.0.8.1)
rack rack
rack-test (0.6.3) rack-test (1.1.0)
rack (>= 1.0) rack (>= 1.0, < 3)
railroady (1.3.0) railroady (1.3.0)
rails (5.0.7.2) rails (5.1.7)
actioncable (= 5.0.7.2) actioncable (= 5.1.7)
actionmailer (= 5.0.7.2) actionmailer (= 5.1.7)
actionpack (= 5.0.7.2) actionpack (= 5.1.7)
actionview (= 5.0.7.2) actionview (= 5.1.7)
activejob (= 5.0.7.2) activejob (= 5.1.7)
activemodel (= 5.0.7.2) activemodel (= 5.1.7)
activerecord (= 5.0.7.2) activerecord (= 5.1.7)
activesupport (= 5.0.7.2) activesupport (= 5.1.7)
bundler (>= 1.3.0) bundler (>= 1.3.0)
railties (= 5.0.7.2) railties (= 5.1.7)
sprockets-rails (>= 2.0.0) sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.3) rails-dom-testing (2.0.3)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
@ -304,25 +318,25 @@ GEM
loofah (~> 2.3) loofah (~> 2.3)
rails-settings-cached (0.7.2) rails-settings-cached (0.7.2)
rails (>= 4.2.0) rails (>= 4.2.0)
railties (5.0.7.2) railties (5.1.7)
actionpack (= 5.0.7.2) actionpack (= 5.1.7)
activesupport (= 5.0.7.2) activesupport (= 5.1.7)
method_source method_source
rake (>= 0.8.7) rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0) thor (>= 0.18.1, < 2.0)
rake (13.0.0) rake (13.0.1)
ransack (1.8.10) ransack (1.8.10)
actionpack (>= 3.0, < 5.2) actionpack (>= 3.0, < 5.2)
activerecord (>= 3.0, < 5.2) activerecord (>= 3.0, < 5.2)
activesupport (>= 3.0, < 5.2) activesupport (>= 3.0, < 5.2)
i18n i18n
rb-fsevent (0.10.3) rb-fsevent (0.10.3)
rb-inotify (0.10.0) rb-inotify (0.10.1)
ffi (~> 1.0) ffi (~> 1.0)
rbtree3 (0.5.0) rbtree3 (0.6.0)
rdoc (4.3.0) rdoc (4.3.0)
regexp_parser (1.6.0) regexp_parser (1.6.0)
request_store (1.4.1) request_store (1.5.0)
rack (>= 1.4) rack (>= 1.4)
responders (3.0.0) responders (3.0.0)
actionpack (>= 5.0) actionpack (>= 5.0)
@ -336,16 +350,17 @@ GEM
rspec-core (~> 3.9.0) rspec-core (~> 3.9.0)
rspec-expectations (~> 3.9.0) rspec-expectations (~> 3.9.0)
rspec-mocks (~> 3.9.0) rspec-mocks (~> 3.9.0)
rspec-core (3.9.0) rspec-core (3.9.1)
rspec-support (~> 3.9.0) rspec-support (~> 3.9.1)
rspec-expectations (3.9.0) rspec-expectations (3.9.0)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.9.0) rspec-support (~> 3.9.0)
rspec-mocks (3.9.0) rspec-mocks (3.9.1)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.9.0) rspec-support (~> 3.9.0)
rspec-support (3.9.0) rspec-support (3.9.2)
rubyzip (2.0.0) ruby2_keywords (0.0.2)
rubyzip (2.2.0)
safe_yaml (1.0.5) safe_yaml (1.0.5)
sass (3.7.4) sass (3.7.4)
sass-listen (~> 4.0.0) sass-listen (~> 4.0.0)
@ -374,19 +389,18 @@ GEM
select2-rails (3.5.9.3) select2-rails (3.5.9.3)
thor (~> 0.14) thor (~> 0.14)
selectize-rails (0.12.1) selectize-rails (0.12.1)
selenium-webdriver (3.142.6) selenium-webdriver (3.142.7)
childprocess (>= 0.5, < 4.0) childprocess (>= 0.5, < 4.0)
rubyzip (>= 1.2.2) rubyzip (>= 1.2.2)
simplecov (0.17.1) simplecov (0.18.1)
docile (~> 1.1) docile (~> 1.1)
json (>= 1.8, < 3) simplecov-html (~> 0.11.0)
simplecov-html (~> 0.10.0) simplecov-html (0.11.0)
simplecov-html (0.10.2)
simpleidn (0.0.9) simpleidn (0.0.9)
sinatra (2.0.7) sinatra (2.0.8.1)
mustermann (~> 1.0) mustermann (~> 1.0)
rack (~> 2.0) rack (~> 2.0)
rack-protection (= 2.0.7) rack-protection (= 2.0.8.1)
tilt (~> 2.0) tilt (~> 2.0)
sixarm_ruby_unaccent (1.2.0) sixarm_ruby_unaccent (1.2.0)
slop (3.6.0) slop (3.6.0)
@ -402,7 +416,7 @@ GEM
thor (0.20.3) thor (0.20.3)
thread_safe (0.3.6) thread_safe (0.3.6)
tilt (2.0.10) tilt (2.0.10)
tzinfo (1.2.5) tzinfo (1.2.6)
thread_safe (~> 0.1) thread_safe (~> 0.1)
uglifier (4.2.0) uglifier (4.2.0)
execjs (>= 0.3.0, < 3) execjs (>= 0.3.0, < 3)
@ -412,21 +426,16 @@ GEM
unicode_utils (1.4.0) unicode_utils (1.4.0)
validates_email_format_of (1.6.3) validates_email_format_of (1.6.3)
i18n i18n
virtus (1.0.5)
axiom-types (~> 0.1)
coercible (~> 1.0)
descendants_tracker (~> 0.0, >= 0.0.3)
equalizer (~> 0.0, >= 0.0.9)
warden (1.2.8) warden (1.2.8)
rack (>= 2.0.6) rack (>= 2.0.6)
wasabi (3.5.0) wasabi (3.5.0)
httpi (~> 2.0) httpi (~> 2.0)
nokogiri (>= 1.4.2) nokogiri (>= 1.4.2)
webdrivers (4.1.3) webdrivers (4.2.0)
nokogiri (~> 1.6) nokogiri (~> 1.6)
rubyzip (>= 1.3.0) rubyzip (>= 1.3.0)
selenium-webdriver (>= 3.0, < 4.0) selenium-webdriver (>= 3.0, < 4.0)
webmock (3.7.6) webmock (3.8.0)
addressable (>= 2.3.6) addressable (>= 2.3.6)
crack (>= 0.3.2) crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0) hashdiff (>= 0.4.0, < 2.0.0)
@ -435,7 +444,7 @@ GEM
websocket-extensions (0.1.4) websocket-extensions (0.1.4)
whenever (0.9.4) whenever (0.9.4)
chronic (>= 0.6.3) chronic (>= 0.6.3)
wkhtmltopdf-binary (0.12.4) wkhtmltopdf-binary (0.12.5.1)
xpath (3.2.0) xpath (3.2.0)
nokogiri (~> 1.8) nokogiri (~> 1.8)
@ -453,7 +462,7 @@ DEPENDENCIES
company_register! company_register!
countries countries
daemons-rails (= 1.2.1) daemons-rails (= 1.2.1)
data_migrate data_migrate (~> 6.1)
database_cleaner database_cleaner
devise (~> 4.7) devise (~> 4.7)
digidoc_client! digidoc_client!
@ -465,24 +474,24 @@ DEPENDENCIES
grape grape
haml (~> 5.0) haml (~> 5.0)
isikukood isikukood
iso8601 (= 0.8.6) iso8601 (= 0.12.1)
jquery-rails jquery-rails
jquery-ui-rails (= 5.0.5) jquery-ui-rails (= 5.0.5)
kaminari kaminari
lhv! lhv!
mina (= 0.3.1) mina (= 0.3.1)
minitest (~> 5.10.0) minitest (~> 5.14)
money-rails money-rails
nokogiri nokogiri
paper_trail (~> 4.0) paper_trail (~> 8.1)
pdfkit pdfkit
pg (= 0.19.0) pg (= 1.2.2)
pry (= 0.10.1) pry (= 0.10.1)
puma puma
que que
que-web que-web
railroady (= 1.3.0) railroady (= 1.3.0)
rails (~> 5.0.7) rails (~> 5.1.7)
rails-settings-cached (= 0.7.2) rails-settings-cached (= 0.7.2)
ransack (~> 1.8) ransack (~> 1.8)
rest-client rest-client
@ -500,4 +509,4 @@ DEPENDENCIES
wkhtmltopdf-binary wkhtmltopdf-binary
BUNDLED WITH BUNDLED WITH
2.0.2 2.1.4

View file

@ -1,5 +1,6 @@
class ApplicationController < ActionController::Base class ApplicationController < ActionController::Base
check_authorization unless: :devise_controller? check_authorization unless: :devise_controller?
before_action :set_paper_trail_whodunnit
# Prevent CSRF attacks by raising an exception. # Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead. # For APIs, you may want to use :null_session instead.
@ -32,4 +33,4 @@ class ApplicationController < ActionController::Base
def available_languages def available_languages
{ en: 'English', et: 'Estonian' }.invert { en: 'English', et: 'Estonian' }.invert
end end
end end

View file

@ -10,7 +10,7 @@ module Epp
before_action :latin_only before_action :latin_only
before_action :validate_against_schema before_action :validate_against_schema
before_action :validate_request before_action :validate_request
before_action :update_epp_session, if: 'signed_in?' before_action :update_epp_session, if: -> { signed_in? }
around_action :wrap_exceptions around_action :wrap_exceptions

View file

@ -2,6 +2,7 @@ module Epp
class DomainsController < BaseController class DomainsController < BaseController
before_action :find_domain, only: %i[info renew update transfer delete] before_action :find_domain, only: %i[info renew update transfer delete]
before_action :find_password, only: %i[info update transfer delete] before_action :find_password, only: %i[info update transfer delete]
before_action :set_paper_trail_whodunnit
def info def info
authorize! :info, @domain authorize! :info, @domain

View file

@ -1,6 +1,7 @@
module Epp module Epp
class SessionsController < BaseController class SessionsController < BaseController
skip_authorization_check only: [:hello, :login, :logout] skip_authorization_check only: [:hello, :login, :logout]
before_action :set_paper_trail_whodunnit
def hello def hello
render_epp_response('greeting') render_epp_response('greeting')

View file

@ -59,6 +59,7 @@ class Registrar
def info def info
authorize! :info, Depp::Domain authorize! :info, Depp::Domain
@data = @domain.info(params[:domain_name]) if params[:domain_name] @data = @domain.info(params[:domain_name]) if params[:domain_name]
@client_holded = client_holded(@data)
if response_ok? if response_ok?
render 'info' render 'info'
else else
@ -85,7 +86,7 @@ class Registrar
def create def create
authorize! :create, Depp::Domain authorize! :create, Depp::Domain
@domain_params = params[:domain] @domain_params = domain_params.to_h
@data = @domain.create(@domain_params) @data = @domain.create(@domain_params)
if response_ok? if response_ok?
@ -153,12 +154,26 @@ class Registrar
render json: scope.pluck(:name, :code).map { |c| { display_key: "#{c.second} #{c.first}", value: c.second } } render json: scope.pluck(:name, :code).map { |c| { display_key: "#{c.second} #{c.first}", value: c.second } }
end end
def remove_hold
authorize! :remove_hold, Depp::Domain
return unless params[:domain_name]
@data = @domain.remove_hold(params)
flash[:alert] = @data.css('msg').text unless response_ok?
redirect_to info_registrar_domains_url(domain_name: params[:domain_name])
end
private private
def init_domain def init_domain
@domain = Depp::Domain.new(current_user: depp_current_user) @domain = Depp::Domain.new(current_user: depp_current_user)
end end
def client_holded(data)
data.css('status')&.map { |element| element.attribute('s').value }
&.any? { |status| status == DomainStatus::CLIENT_HOLD }
end
def contacts def contacts
current_registrar_user.registrar.contacts current_registrar_user.registrar.contacts
@ -187,5 +202,12 @@ class Registrar
:valid_to_lteq, :valid_to_lteq,
:s) :s)
end end
def domain_params
params.require(:domain).permit(:name, :period, :registrant, :registrant_helper, :reserved_pw,
:legal_document, contacts_attributes: {},
nameservers_attributes: {},
dnskeys_attributes: {})
end
end end
end end

View file

@ -0,0 +1,43 @@
class SendEInvoiceJob < Que::Job
def run(invoice_id)
invoice = run_condition(Invoice.find_by(id: invoice_id))
invoice.to_e_invoice.deliver
ActiveRecord::Base.transaction do
invoice.update(e_invoice_sent_at: Time.zone.now)
log_success(invoice)
destroy
end
rescue StandardError => e
log_error(invoice: invoice, error: e)
raise e
end
private
def run_condition(invoice)
destroy unless invoice
destroy if invoice.do_not_send_e_invoice?
invoice
end
def log_success(invoice)
id = invoice.try(:id) || invoice
message = "E-Invoice for an invoice with ID # #{id} was sent successfully"
logger.info message
end
def log_error(invoice:, error:)
id = invoice.try(:id) || invoice
message = <<~TEXT.squish
There was an error sending e-invoice for invoice with ID # #{id}.
The error message was the following: #{error}
This job will retry.
TEXT
logger.error message
end
def logger
Rails.logger
end
end

View file

@ -50,6 +50,7 @@ class Ability
can(:check, Epp::Domain) can(:check, Epp::Domain)
can(:create, Epp::Domain) can(:create, Epp::Domain)
can(:renew, Epp::Domain) { |d| d.registrar_id == @user.registrar_id } can(:renew, Epp::Domain) { |d| d.registrar_id == @user.registrar_id }
can(:remove_hold, Epp::Domain) { |d| d.registrar_id == @user.registrar_id }
can(:update, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || d.transfer_code == pw } can(:update, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || d.transfer_code == pw }
can(:transfer, Epp::Domain) can(:transfer, Epp::Domain)
can(:delete, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || d.transfer_code == pw } can(:delete, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || d.transfer_code == pw }

View file

@ -4,7 +4,7 @@ class AdminUser < User
validates :identity_code, presence: true, if: -> { country_code == 'EE' } validates :identity_code, presence: true, if: -> { country_code == 'EE' }
validates :email, presence: true validates :email, presence: true
validates :password, :password_confirmation, presence: true, if: :new_record? validates :password, :password_confirmation, presence: true, if: :new_record?
validates :password_confirmation, presence: true, if: :encrypted_password_changed? validates :password_confirmation, presence: true, if: :will_save_change_to_encrypted_password?
validate :validate_identity_code, if: -> { country_code == 'EE' } validate :validate_identity_code, if: -> { country_code == 'EE' }
ROLES = %w(user customer_service admin) # should not match to api_users roles ROLES = %w(user customer_service admin) # should not match to api_users roles

View file

@ -43,7 +43,7 @@ class ApiUser < User
after_initialize :set_defaults after_initialize :set_defaults
def set_defaults def set_defaults
return unless new_record? return unless new_record?
self.active = true unless active_changed? self.active = true unless saved_change_to_active?
end end
class << self class << self

View file

@ -3,7 +3,7 @@ module Concerns::Contact::Transferable
included do included do
validates :auth_info, presence: true validates :auth_info, presence: true
after_initialize :generate_auth_info, if: 'new_record? && auth_info.blank?' after_initialize :generate_auth_info, if: -> { new_record? && auth_info.blank? }
end end
def transfer(new_registrar) def transfer(new_registrar)

View file

@ -0,0 +1,9 @@
module RemoveHold
extend ActiveSupport::Concern
def remove_hold(params)
xml = epp_xml.update(name: { value: params[:domain_name] },
rem: [status: { attrs: { s: 'clientHold' }, value: '' }])
current_user.request(xml)
end
end

View file

@ -1,10 +1,16 @@
# Papertrail concerns is mainly tested at country spec # Papertrail concerns is mainly tested at country spec
module Versions module Versions
extend ActiveSupport::Concern extend ActiveSupport::Concern
WITH_CHILDREN = %w[Domain Contact].freeze
included do included do
attr_accessor :version_loader attr_accessor :version_loader
has_paper_trail class_name: "#{model_name}Version"
if WITH_CHILDREN.include?(model_name.name)
has_paper_trail class_name: "#{model_name}Version", meta: { children: :children_log }
else
has_paper_trail class_name: "#{model_name}Version"
end
# add creator and updator # add creator and updator
before_create :add_creator before_create :add_creator
@ -45,17 +51,17 @@ module Versions
# callbacks # callbacks
def touch_domain_version def touch_domain_version
domain.try(:touch_with_version) domain.paper_trail.try(:touch_with_version)
end end
def touch_domains_version def touch_domains_version
domains.each(&:touch_with_version) domains.each { |domain| domain.paper_trail.touch_with_version }
end end
end end
module ClassMethods module ClassMethods
def all_versions_for(ids, time) def all_versions_for(ids, time)
ver_klass = paper_trail_version_class ver_klass = paper_trail.version_class
from_history = ver_klass.where(item_id: ids.to_a). from_history = ver_klass.where(item_id: ids.to_a).
order(:item_id). order(:item_id).
preceding(time + 1, true). preceding(time + 1, true).

View file

@ -14,8 +14,6 @@ class Contact < ApplicationRecord
has_many :registrant_domains, class_name: 'Domain', foreign_key: 'registrant_id' has_many :registrant_domains, class_name: 'Domain', foreign_key: 'registrant_id'
has_many :actions, dependent: :destroy has_many :actions, dependent: :destroy
has_paper_trail class_name: "ContactVersion", meta: { children: :children_log }
attr_accessor :legal_document_id attr_accessor :legal_document_id
alias_attribute :kind, :ident_type alias_attribute :kind, :ident_type
alias_attribute :copy_from_id, :original_id # Old attribute name; for PaperTrail alias_attribute :copy_from_id, :original_id # Old attribute name; for PaperTrail
@ -23,12 +21,14 @@ class Contact < ApplicationRecord
accepts_nested_attributes_for :legal_documents accepts_nested_attributes_for :legal_documents
validates :name, :email, presence: true validates :name, :email, presence: true
validates :street, :city, :zip, :country_code, presence: true, if: 'self.class.address_processing?' validates :street, :city, :zip, :country_code, presence: true, if: lambda {
self.class.address_processing?
}
validates :phone, presence: true, e164: true, phone: true validates :phone, presence: true, e164: true, phone: true
validates :email, format: /@/ validates :email, format: /@/
validates :email, email_format: { message: :invalid }, if: proc { |c| c.email_changed? } validates :email, email_format: { message: :invalid }, if: proc { |c| c.will_save_change_to_email? }
validates :code, validates :code,
uniqueness: { message: :epp_id_taken }, uniqueness: { message: :epp_id_taken },
@ -37,7 +37,7 @@ class Contact < ApplicationRecord
validates_associated :identifier validates_associated :identifier
validate :validate_html validate :validate_html
validate :validate_country_code, if: 'self.class.address_processing?' validate :validate_country_code, if: -> { self.class.address_processing? }
after_initialize do after_initialize do
self.status_notes = {} if status_notes.nil? self.status_notes = {} if status_notes.nil?

View file

@ -1,6 +1,7 @@
module Depp module Depp
class Domain class Domain
include ActiveModel::Conversion include ActiveModel::Conversion
include RemoveHold
extend ActiveModel::Naming extend ActiveModel::Naming
attr_accessor :name, :current_user, :epp_xml attr_accessor :name, :current_user, :epp_xml

View file

@ -48,16 +48,18 @@ class Directo < ApplicationRecord
Rails.logger.info("[Directo] XML request: #{data}") Rails.logger.info("[Directo] XML request: #{data}")
response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false) response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false)
Rails.logger.info("[Directo] Directo responded with code: #{response.code}, body: #{response.body}") Rails.logger.info("[Directo] Directo responded with code: #{response.code}, body: #{response.body}")
dump_result_to_db(mappers, response.to_s) dump_result_to_db(mappers: mappers, xml: response.to_s, data: data)
end end
STDOUT << "#{Time.zone.now.utc} - Directo receipts sending finished. #{counter} of #{total} are sent\n" STDOUT << "#{Time.zone.now.utc} - Directo receipts sending finished. #{counter} of #{total} are sent\n"
end end
def self.dump_result_to_db mappers, xml def self.dump_result_to_db(mappers:, xml:, data:)
Nokogiri::XML(xml).css("Result").each do |res| Nokogiri::XML(xml).css("Result").each do |res|
obj = mappers[res.attributes["docid"].value.to_i] obj = mappers[res.attributes["docid"].value.to_i]
obj.directo_records.create!(response: res.as_json.to_h, invoice_number: obj.number) obj.directo_records.create!(request: data,
response: res.as_json.to_h,
invoice_number: obj.number)
obj.update_columns(in_directo: true) obj.update_columns(in_directo: true)
Rails.logger.info("[DIRECTO] Invoice #{res.attributes["docid"].value} was pushed and return is #{res.as_json.to_h.inspect}") Rails.logger.info("[DIRECTO] Invoice #{res.attributes["docid"].value} was pushed and return is #{res.as_json.to_h.inspect}")
end end
@ -65,7 +67,7 @@ class Directo < ApplicationRecord
def self.send_monthly_invoices(debug: false) def self.send_monthly_invoices(debug: false)
I18n.locale = :et I18n.locale = :et unless Rails.env.test?
month = Time.now - 1.month month = Time.now - 1.month
invoices_until = month.end_of_month invoices_until = month.end_of_month
date_format = "%Y-%m-%d" date_format = "%Y-%m-%d"
@ -74,8 +76,9 @@ class Directo < ApplicationRecord
min_directo = Setting.directo_monthly_number_min.presence.try(:to_i) min_directo = Setting.directo_monthly_number_min.presence.try(:to_i)
max_directo = Setting.directo_monthly_number_max.presence.try(:to_i) max_directo = Setting.directo_monthly_number_max.presence.try(:to_i)
last_directo = [Setting.directo_monthly_number_last.presence.try(:to_i), min_directo].compact.max || 0 last_directo = [Setting.directo_monthly_number_last.presence.try(:to_i), min_directo].compact.max || 0
if max_directo && max_directo <= last_directo if max_directo && (max_directo <= last_directo + Registrar.count)
raise "Directo counter is out of period (max allowed number is smaller than last counter number)" raise 'Directo counter is out of period (max allowed number is smaller than last counter'\
'number plus Registrar\'s count)'
end end
directo_next = last_directo directo_next = last_directo

View file

@ -9,10 +9,16 @@ class Dnskey < ApplicationRecord
validate :validate_protocol validate :validate_protocol
validate :validate_flags validate :validate_flags
before_save -> { generate_digest if public_key_changed? && !ds_digest_changed? } before_save lambda {
generate_digest if will_save_change_to_public_key? && !will_save_change_to_ds_digest?
}
before_save lambda { before_save lambda {
if (public_key_changed? || flags_changed? || alg_changed? || protocol_changed?) && !ds_key_tag_changed? if (will_save_change_to_public_key? ||
will_save_change_to_flags? ||
will_save_change_to_alg? ||
will_save_change_to_protocol?) &&
!will_save_change_to_ds_key_tag?
generate_ds_key_tag generate_ds_key_tag
end end
} }

View file

@ -10,8 +10,6 @@ class Domain < ApplicationRecord
include Concerns::Domain::RegistryLockable include Concerns::Domain::RegistryLockable
include Concerns::Domain::Releasable include Concerns::Domain::Releasable
has_paper_trail class_name: "DomainVersion", meta: { children: :children_log }
attr_accessor :roles attr_accessor :roles
attr_accessor :legal_document_id attr_accessor :legal_document_id
@ -73,12 +71,13 @@ class Domain < ApplicationRecord
before_update :manage_statuses before_update :manage_statuses
def manage_statuses def manage_statuses
return unless registrant_id_changed? # rollback has not yet happened return unless will_save_change_to_registrant_id? # rollback has not yet happened
pending_update! if registrant_verification_asked? pending_update! if registrant_verification_asked?
true true
end end
after_commit :update_whois_record, unless: 'domain_name.at_auction?' after_commit :update_whois_record, unless: -> { domain_name.at_auction? }
after_create :update_reserved_domains after_create :update_reserved_domains
def update_reserved_domains def update_reserved_domains
@ -486,9 +485,9 @@ class Domain < ApplicationRecord
self.delete_date = nil self.delete_date = nil
when DomainStatus::SERVER_MANUAL_INZONE # removal causes server hold to set when DomainStatus::SERVER_MANUAL_INZONE # removal causes server hold to set
self.outzone_at = Time.zone.now if force_delete_scheduled? self.outzone_at = Time.zone.now if force_delete_scheduled?
when DomainStatus::DomainStatus::EXPIRED # removal causes server hold to set when DomainStatus::EXPIRED # removal causes server hold to set
self.outzone_at = self.expire_time + 15.day self.outzone_at = self.expire_time + 15.day
when DomainStatus::DomainStatus::SERVER_HOLD # removal causes server hold to set when DomainStatus::SERVER_HOLD # removal causes server hold to set
self.outzone_at = nil self.outzone_at = nil
end end
end end
@ -547,7 +546,7 @@ class Domain < ApplicationRecord
activate if nameservers.reject(&:marked_for_destruction?).size >= Setting.ns_min_count activate if nameservers.reject(&:marked_for_destruction?).size >= Setting.ns_min_count
end end
cancel_force_delete if force_delete_scheduled? && registrant_id_changed? cancel_force_delete if force_delete_scheduled? && will_save_change_to_registrant_id?
if statuses.empty? && valid? if statuses.empty? && valid?
statuses << DomainStatus::OK statuses << DomainStatus::OK

View file

@ -182,7 +182,7 @@ class Epp::Contact < Contact
self.attributes = at self.attributes = at
email_changed = email_changed? email_changed = will_save_change_to_email?
old_email = email_was old_email = email_was
updated = save updated = save

View file

@ -103,6 +103,14 @@ class Invoice < ApplicationRecord
generator.generate generator.generate
end end
def do_not_send_e_invoice?
e_invoice_sent? || cancelled? || paid?
end
def e_invoice_sent?
e_invoice_sent_at.present?
end
private private
def apply_default_buyer_vat_no def apply_default_buyer_vat_no

View file

@ -93,9 +93,7 @@ module PaymentOrders
source = number_with_precision( source = number_with_precision(
BigDecimal(response['VK_AMOUNT']), precision: 2, separator: '.' BigDecimal(response['VK_AMOUNT']), precision: 2, separator: '.'
) )
target = number_with_precision( target = number_with_precision(invoice.total, precision: 2, separator: '.')
invoice.total, precision: 2, separator: '.'
)
source == target source == target
end end

View file

@ -21,9 +21,9 @@ class Registrar < ApplicationRecord
validates :reference_no, format: Billing::ReferenceNo::REGEXP validates :reference_no, format: Billing::ReferenceNo::REGEXP
validate :forbid_special_code validate :forbid_special_code
validates :vat_rate, presence: true, if: 'vat_liable_in_foreign_country? && vat_no.blank?' validates :vat_rate, presence: true, if: -> { vat_liable_in_foreign_country? && vat_no.blank? }
validates :vat_rate, absence: true, if: :vat_liable_locally? validates :vat_rate, absence: true, if: :vat_liable_locally?
validates :vat_rate, absence: true, if: 'vat_liable_in_foreign_country? && vat_no?' validates :vat_rate, absence: true, if: -> { vat_liable_in_foreign_country? && vat_no? }
validates :vat_rate, numericality: { greater_than_or_equal_to: 0, less_than: 100 }, validates :vat_rate, numericality: { greater_than_or_equal_to: 0, less_than: 100 },
allow_nil: true allow_nil: true
@ -33,7 +33,7 @@ class Registrar < ApplicationRecord
after_initialize :set_defaults after_initialize :set_defaults
validates :email, email_format: { message: :invalid }, validates :email, email_format: { message: :invalid },
allow_blank: true, if: proc { |c| c.email_changed? } allow_blank: true, if: proc { |c| c.will_save_change_to_email? }
validates :billing_email, email_format: { message: :invalid }, allow_blank: true validates :billing_email, email_format: { message: :invalid }, allow_blank: true
alias_attribute :contact_email, :email alias_attribute :contact_email, :email
@ -99,9 +99,7 @@ class Registrar < ApplicationRecord
} }
] ]
) )
SendEInvoiceJob.enqueue(invoice.id)
e_invoice = invoice.to_e_invoice
e_invoice.deliver
invoice invoice
end end

View file

@ -6,6 +6,10 @@
class: 'btn btn-default') %> class: 'btn btn-default') %>
<%= link_to(t(:delete), delete_registrar_domains_path(domain_name: params[:domain_name]), <%= link_to(t(:delete), delete_registrar_domains_path(domain_name: params[:domain_name]),
class: 'btn btn-default') %> class: 'btn btn-default') %>
<% if @client_holded %>
<%= link_to(t(:remove_client_hold), remove_hold_registrar_domains_path(domain_name: params[:domain_name]),
class: 'btn btn-default') %>
<% end %>
<% else %> <% else %>
<%= link_to t('.transfer_btn'), new_registrar_domain_transfer_path(domain_name: params[:domain_name]), <%= link_to t('.transfer_btn'), new_registrar_domain_transfer_path(domain_name: params[:domain_name]),
class: 'btn btn-default' %> class: 'btn btn-default' %>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
<command>
<update>
<domain:update
xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
<domain:name>example.ee</domain:name>
<domain:rem>
<domain:status s="clientHold"/>
</domain:rem>
</domain:update>
</update>
<clTRID>timo-1579351654</clTRID>
</command>
</epp>

View file

@ -29,6 +29,9 @@
, ,
%a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'domain', epp_action: 'delete'}} %a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'domain', epp_action: 'delete'}}
Delete Delete
,
%a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'domain', epp_action: 'client_hold'}}
Remove Client Hold
%h4 Poll %h4 Poll
%a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'poll', epp_action: 'poll'}} %a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'poll', epp_action: 'poll'}}

View file

@ -1,33 +1,36 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
require 'pathname' require 'pathname'
require 'fileutils' include FileUtils
# path to your application root. # path to your application root.
APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
def system!(*args) def system!(*args)
system(*args) || abort("\n== Command #{args} failed ==") system(*args) || abort("\n== Command #{args} failed ==")
end end
Dir.chdir APP_ROOT do chdir APP_ROOT do
# This script is a starting point to setup your application.
# Add necessary setup steps to this file.
puts '== Installing dependencies with bundler ==' puts '== Installing dependencies =='
system! 'gem install bundler --conservative' system! 'gem install bundler --conservative'
system('bundle check') || system!('bundle install') system('bundle check') || system!('bundle install')
puts "\n== Copying sample development database config files ==" # Install JavaScript dependencies if using Yarn
unless File.exist?('config/database.yml') # system('bin/yarn')
system! 'cp config/database-example-development.yml config/database.yml'
end puts "\n== Copying sample files =="
unless File.exist?('config/database.yml')
system! 'cp config/database.yml.sample config/database.yml'
end
puts "\n== Preparing database ==" puts "\n== Preparing database =="
system! 'bin/rails db:setup' system! 'bin/rails db:setup'
puts "\n== Removing old logs and tempfiles ==" puts "\n== Removing old logs and tempfiles =="
system! 'bin/rake log:clear tmp:clear' system! 'bin/rails log:clear tmp:clear'
puts "\n== Restarting application server ==" puts "\n== Restarting application server =="
system! 'touch tmp/restart.txt' system! 'bin/rails restart'
end end

0
bin/update Normal file → Executable file
View file

11
bin/yarn Executable file
View file

@ -0,0 +1,11 @@
#!/usr/bin/env ruby
VENDOR_PATH = File.expand_path('..', __dir__)
Dir.chdir(VENDOR_PATH) do
begin
exec "yarnpkg #{ARGV.join(" ")}"
rescue Errno::ENOENT
$stderr.puts "Yarn executable was not detected in the system."
$stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install"
exit 1
end
end

View file

@ -16,6 +16,7 @@ end
module DomainNameRegistry module DomainNameRegistry
class Application < Rails::Application class Application < Rails::Application
config.load_defaults 5.1
# Settings in config/environments/* take precedence over those specified here. # Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers # Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded. # -- all .rb files in that directory are automatically loaded.

View file

@ -7,3 +7,4 @@ test:
production: production:
adapter: redis adapter: redis
url: redis://localhost:6379/1 url: redis://localhost:6379/1
channel_prefix: domain_name_registry_production

View file

@ -66,7 +66,7 @@ Rails.application.configure do
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation cannot be found). # the I18n.default_locale when a translation cannot be found).
config.i18n.fallbacks = [I18n.default_locale] config.i18n.fallbacks = true
# Send deprecation notices to registered listeners. # Send deprecation notices to registered listeners.
config.active_support.deprecation = :notify config.active_support.deprecation = :notify

View file

@ -1,4 +1,6 @@
Rails.application.configure do Rails.application.configure do
$VERBOSE = nil
# Settings specified here will take precedence over those in config/application.rb. # Settings specified here will take precedence over those in config/application.rb.
# The test environment is used exclusively to run your application's # The test environment is used exclusively to run your application's
@ -30,7 +32,7 @@ Rails.application.configure do
config.action_mailer.raise_delivery_errors = false config.action_mailer.raise_delivery_errors = false
# Print deprecation notices to the stderr. # Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr config.active_support.deprecation = :silence
# Raises error for missing translations # Raises error for missing translations
config.action_view.raise_on_missing_translations = true config.action_view.raise_on_missing_translations = true

View file

@ -3,6 +3,9 @@ Airbrake.configure do |config|
config.project_id = ENV['airbrake_project_id'] config.project_id = ENV['airbrake_project_id']
config.project_key = ENV['airbrake_project_key'] config.project_key = ENV['airbrake_project_key']
config.root_directory = Rails.root config.root_directory = Rails.root
config.job_stats = false
config.query_stats = false
config.performance_stats = false
config.logger = config.logger =
if ENV['RAILS_LOG_TO_STDOUT'].present? if ENV['RAILS_LOG_TO_STDOUT'].present?
Logger.new(STDOUT, level: Rails.logger.level) Logger.new(STDOUT, level: Rails.logger.level)

View file

@ -5,7 +5,7 @@ Rails.application.configure do
config.assets.version = '1.0' config.assets.version = '1.0'
# Add additional assets to the asset load path # Add additional assets to the asset load path
config.assets.paths << Rails.root.join('vendor', 'assets', 'fonts') config.assets.paths << Rails.root.join('vendor', 'assets', 'fonts', 'node_modules')
# Precompile additional assets. # Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
@ -14,4 +14,5 @@ Rails.application.configure do
config.assets.precompile += %w(admin-manifest.css admin-manifest.js) config.assets.precompile += %w(admin-manifest.css admin-manifest.js)
config.assets.precompile += %w(registrar-manifest.css registrar-manifest.js) config.assets.precompile += %w(registrar-manifest.css registrar-manifest.js)
config.assets.precompile += %w(registrant-manifest.css registrant-manifest.js) config.assets.precompile += %w(registrant-manifest.css registrant-manifest.js)
config.assets.precompile += %w( admin.js admin.css )
end end

View file

@ -1,4 +1,6 @@
MoneyRails.configure do |config| MoneyRails.configure do |config|
# Wrapper for Money#default_currency with additional functionality # Wrapper for Money#default_currency with additional functionality
config.default_currency = :eur config.default_currency = :eur
end config.rounding_mode = BigDecimal::ROUND_HALF_EVEN
config.locale_backend = :i18n
end

View file

@ -6,7 +6,8 @@
# #
# Read the Guide for Upgrading Ruby on Rails for more info on each option. # Read the Guide for Upgrading Ruby on Rails for more info on each option.
Rails.application.config.action_controller.raise_on_unfiltered_parameters = true # DEPRECATION WARNING: raise_on_unfiltered_parameters is deprecated and has no effect in Rails 5.1.
#Rails.application.config.action_controller.raise_on_unfiltered_parameters = true
# Enable per-form CSRF tokens. Previous versions had false. # Enable per-form CSRF tokens. Previous versions had false.
Rails.application.config.action_controller.per_form_csrf_tokens = true Rails.application.config.action_controller.per_form_csrf_tokens = true
@ -19,7 +20,9 @@ Rails.application.config.action_controller.forgery_protection_origin_check = tru
ActiveSupport.to_time_preserves_timezone = true ActiveSupport.to_time_preserves_timezone = true
# Do not halt callback chains when a callback returns false. Previous versions had true. # Do not halt callback chains when a callback returns false. Previous versions had true.
ActiveSupport.halt_callback_chains_on_return_false = false # DEPRECATION WARNING: ActiveSupport.halt_callback_chains_on_return_false= is deprecated and
# will be removed in Rails 5.2.
#ActiveSupport.halt_callback_chains_on_return_false = false
# Configure SSL options to enable HSTS with subdomains. Previous versions had false. # Configure SSL options to enable HSTS with subdomains. Previous versions had false.
Rails.application.config.ssl_options = { hsts: { subdomains: true } } Rails.application.config.ssl_options = { hsts: { subdomains: true } }

View file

@ -0,0 +1,14 @@
# Be sure to restart your server when you modify this file.
#
# This file contains migration options to ease your Rails 5.1 upgrade.
#
# Once upgraded flip defaults one by one to migrate to the new default.
#
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
# Make `form_with` generate non-remote forms.
Rails.application.config.action_view.form_with_generates_remote_forms = false
# Unknown asset fallback will return the path passed in when the given
# asset is not present in the asset pipeline.
# Rails.application.config.assets.unknown_asset_fallback = false

View file

@ -0,0 +1 @@
PaperTrail.config.track_associations = false

View file

@ -206,6 +206,7 @@ en:
statuses: 'Statuses' statuses: 'Statuses'
description: 'Description' description: 'Description'
delete: 'Delete' delete: 'Delete'
remove_client_hold: 'Remove clientHold'
are_you_sure: 'Are you sure?' are_you_sure: 'Are you sure?'
back: 'Back' back: 'Back'
new_domain: 'New domain' new_domain: 'New domain'
@ -580,6 +581,7 @@ en:
tech: Tech contact tech: Tech contact
valid: Valid valid: Valid
object_is_not_eligible_for_renewal: 'Object is not eligible for renewal' object_is_not_eligible_for_renewal: 'Object is not eligible for renewal'
object_is_not_holded: 'Object is not holded'
bank_statement_desc: 'Import file row will match only when matching following attributes: <b><br>ref number<br>payment amount<br>invoice number (the first numerical value in comment field)</b>.' bank_statement_desc: 'Import file row will match only when matching following attributes: <b><br>ref number<br>payment amount<br>invoice number (the first numerical value in comment field)</b>.'
create_bank_statement: 'Create bank statement' create_bank_statement: 'Create bank statement'
create_bank_transaction: 'Create bank transaction' create_bank_transaction: 'Create bank transaction'

View file

@ -1,13 +1,13 @@
# Puma can serve each request in a thread from an internal thread pool. # Puma can serve each request in a thread from an internal thread pool.
# The `threads` method setting takes two numbers a minimum and maximum. # The `threads` method setting takes two numbers: a minimum and maximum.
# Any libraries that use thread pools should be configured to match # Any libraries that use thread pools should be configured to match
# the maximum value specified for Puma. Default is set to 5 threads for minimum # the maximum value specified for Puma. Default is set to 5 threads for minimum
# and maximum, this matches the default thread size of Active Record. # and maximum; this matches the default thread size of Active Record.
# #
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count threads threads_count, threads_count
# Specifies the `port` that Puma will listen on to receive requests, default is 3000. # Specifies the `port` that Puma will listen on to receive requests; default is 3000.
# #
port ENV.fetch("PORT") { 3000 } port ENV.fetch("PORT") { 3000 }
@ -32,16 +32,25 @@ environment ENV.fetch("RAILS_ENV") { "development" }
# #
# preload_app! # preload_app!
# If you are preloading your application and using Active Record, it's
# recommended that you close any connections to the database before workers
# are forked to prevent connection leakage.
#
# before_fork do
# ActiveRecord::Base.connection_pool.disconnect! if defined?(ActiveRecord)
# end
# The code in the `on_worker_boot` will be called if you are using # The code in the `on_worker_boot` will be called if you are using
# clustered mode by specifying a number of `workers`. After each worker # clustered mode by specifying a number of `workers`. After each worker
# process is booted this block will be run, if you are using `preload_app!` # process is booted, this block will be run. If you are using the `preload_app!`
# option you will want to use this block to reconnect to any threads # option, you will want to use this block to reconnect to any threads
# or connections that may have been created at application boot, Ruby # or connections that may have been created at application boot, as Ruby
# cannot share connections between processes. # cannot share connections between processes.
# #
# on_worker_boot do # on_worker_boot do
# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) # ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
# end # end
#
# Allow puma to be restarted by `rails restart` command. # Allow puma to be restarted by `rails restart` command.
plugin :tmp_restart plugin :tmp_restart

View file

@ -99,6 +99,7 @@ Rails.application.routes.draw do
get 'check' get 'check'
get 'delete' get 'delete'
get 'search_contacts' get 'search_contacts'
get 'remove_hold'
end end
end end
resources :domain_transfers, only: %i[new create] resources :domain_transfers, only: %i[new create]

6
config/spring.rb Normal file
View file

@ -0,0 +1,6 @@
%w(
.ruby-version
.rbenv-vars
tmp/restart.txt
tmp/caching-dev.txt
).each { |path| Spring.watch(path) }

View file

@ -1,16 +1,15 @@
class AddCertCommonName < ActiveRecord::Migration class AddCertCommonName < ActiveRecord::Migration[5.1]
def self.up def self.up
Certificate.all.each do |x| # Certificate.all.each do |x|
if x.crt.blank? && x.csr.present? # if x.crt.blank? && x.csr.present?
pc = x.parsed_csr.try(:subject).try(:to_s) || '' # pc = x.parsed_csr.try(:subject).try(:to_s) || ''
cn = pc.scan(/\/CN=(.+)/).flatten.first # cn = pc.scan(/\/CN=(.+)/).flatten.first
x.common_name = cn.split('/').first # x.common_name = cn.split('/').first
end # end
x.save # x.save
end # end
end end
def self.down def self.down
raise ActiveRecord::IrreversibleMigration
end end
end end

View file

@ -1,28 +1,27 @@
class AddCertMd5 < ActiveRecord::Migration class AddCertMd5 < ActiveRecord::Migration[5.1]
def self.up def self.up
Certificate.all.each do |x| # Certificate.all.each do |x|
if x.crt.present? && x.csr.present? # if x.crt.present? && x.csr.present?
x.interface = Certificate::REGISTRAR # x.interface = Certificate::REGISTRAR
x.md5 = OpenSSL::Digest::MD5.new(x.parsed_crt.to_der).to_s # x.md5 = OpenSSL::Digest::MD5.new(x.parsed_crt.to_der).to_s
#
pc = x.parsed_crt.try(:subject).try(:to_s) || '' # pc = x.parsed_crt.try(:subject).try(:to_s) || ''
cn = pc.scan(/\/CN=(.+)/).flatten.first # cn = pc.scan(/\/CN=(.+)/).flatten.first
x.common_name = cn.split('/').first # x.common_name = cn.split('/').first
elsif x.crt.present? && x.csr.blank? # elsif x.crt.present? && x.csr.blank?
x.interface = Certificate::API # x.interface = Certificate::API
x.md5 = OpenSSL::Digest::MD5.new(x.parsed_crt.to_der).to_s # x.md5 = OpenSSL::Digest::MD5.new(x.parsed_crt.to_der).to_s
#
pc = x.parsed_crt.try(:subject).try(:to_s) || '' # pc = x.parsed_crt.try(:subject).try(:to_s) || ''
cn = pc.scan(/\/CN=(.+)/).flatten.first # cn = pc.scan(/\/CN=(.+)/).flatten.first
x.common_name = cn.split('/').first # x.common_name = cn.split('/').first
elsif x.crt.blank? && x.csr.present? # elsif x.crt.blank? && x.csr.present?
x.interface = Certificate::REGISTRAR # x.interface = Certificate::REGISTRAR
end # end
x.save # x.save
end # end
end end
def self.down def self.down
raise ActiveRecord::IrreversibleMigration
end end
end end

View file

@ -1,9 +1,8 @@
class AddRenewSetting < ActiveRecord::Migration class AddRenewSetting < ActiveRecord::Migration[5.1]
def self.up def self.up
Setting.days_to_renew_domain_before_expire = 90 # Setting.days_to_renew_domain_before_expire = 90
end end
def self.down def self.down
raise ActiveRecord::IrreversibleMigration
end end
end end

View file

@ -1,10 +1,9 @@
class AddExpireSettings < ActiveRecord::Migration class AddExpireSettings < ActiveRecord::Migration[5.1]
def self.up def self.up
Setting.expire_warning_period = 15 # Setting.expire_warning_period = 15
Setting.redemption_grace_period = 30 # Setting.redemption_grace_period = 30
end end
def self.down def self.down
raise ActiveRecord::IrreversibleMigration
end end
end end

View file

@ -1,15 +1,14 @@
class RefactorDomainStatuses < ActiveRecord::Migration class RefactorDomainStatuses < ActiveRecord::Migration[5.1]
def self.up def self.up
Domain.find_each do |x| # Domain.find_each do |x|
statuses = [] # statuses = []
x.domain_statuses.each do |ds| # x.domain_statuses.each do |ds|
statuses << ds.value # statuses << ds.value
end # end
x.update_column('statuses', statuses) # x.update_column('statuses', statuses) if x.statuses.blank?
end # end
end end
def self.down def self.down
raise ActiveRecord::IrreversibleMigration
end end
end end

View file

@ -1,15 +1,14 @@
class RefactorContactStatuses < ActiveRecord::Migration class RefactorContactStatuses < ActiveRecord::Migration[5.1]
def self.up def self.up
Contact.find_each do |contact| # Contact.find_each do |contact|
statuses = [] # statuses = []
contact.depricated_statuses.each do |ds| # contact.depricated_statuses.each do |ds|
statuses << ds.value # statuses << ds.value
end # end
contact.update_column('statuses', statuses) # contact.update_column('statuses', statuses)
end # end
end end
def self.down def self.down
raise ActiveRecord::IrreversibleMigration
end end
end end

View file

@ -0,0 +1,19 @@
class ConvertDomainDeleteDate < ActiveRecord::Migration[5.1]
def up
# processed_domain_count = 0
#
# Domain.transaction do
# Domain.find_each do |domain|
# next unless domain.delete_date
#
# domain.update_columns(delete_date: domain.delete_date + 1.day)
# processed_domain_count += 1
# end
# end
#
# puts "Domains processed: #{processed_domain_count}"
end
def down
end
end

View file

@ -0,0 +1,18 @@
class DeleteOrphanedRegistrantVerifications < ActiveRecord::Migration[5.1]
def up
# orphaned_registrant_verifications = RegistrantVerification.where.not(domain_id: Domain.ids)
# orphaned_registrant_verification_count = orphaned_registrant_verifications.count
# processed_registrant_verification_count = 0
#
# orphaned_registrant_verifications.each do |registrant_verification|
# registrant_verification.destroy!
# processed_registrant_verification_count += 1
# end
#
# puts "Processed: #{processed_registrant_verification_count} out of" \
# " #{orphaned_registrant_verification_count}"
end
def down
end
end

View file

@ -0,0 +1,19 @@
class RegenerateRegistrarReferenceNumbers < ActiveRecord::Migration[5.1]
def up
# processed_registrar_count = 0
#
# Registrar.transaction do
# Registrar.all.each do |registrar|
# next unless registrar.reference_no.start_with?('RF')
#
# registrar.update_columns(reference_no: Billing::ReferenceNo.generate)
# processed_registrar_count += 1
# end
# end
#
# puts "Registrars processed: #{processed_registrar_count}"
end
def down
end
end

2
db/data_schema.rb Normal file
View file

@ -0,0 +1,2 @@
# encoding: UTF-8
DataMigrate::Data.define(version: 20150707103801)

View file

@ -0,0 +1,5 @@
class AddEInvoiceSentAtToInvoice < ActiveRecord::Migration[5.0]
def change
add_column :invoices, :e_invoice_sent_at, :datetime
end
end

File diff suppressed because it is too large Load diff

View file

View file

@ -1,16 +0,0 @@
namespace :data_migrations do
task convert_domain_delete_date: :environment do
processed_domain_count = 0
Domain.transaction do
Domain.find_each do |domain|
next unless domain.delete_date
domain.update_columns(delete_date: domain.delete_date + 1.day)
processed_domain_count += 1
end
end
puts "Domains processed: #{processed_domain_count}"
end
end

View file

@ -1,15 +0,0 @@
namespace :data_migrations do
task delete_orphaned_registrant_verifications: :environment do
orphaned_registrant_verifications = RegistrantVerification.where.not(domain_id: Domain.ids)
orphaned_registrant_verification_count = orphaned_registrant_verifications.count
processed_registrant_verification_count = 0
orphaned_registrant_verifications.each do |registrant_verification|
registrant_verification.destroy!
processed_registrant_verification_count += 1
end
puts "Processed: #{processed_registrant_verification_count} out of" \
" #{orphaned_registrant_verification_count}"
end
end

View file

@ -1,16 +0,0 @@
namespace :data_migrations do
task regenerate_registrar_reference_numbers: [:environment] do
processed_registrar_count = 0
Registrar.transaction do
Registrar.all.each do |registrar|
next unless registrar.reference_no.start_with?('RF')
registrar.update_columns(reference_no: Billing::ReferenceNo.generate)
processed_registrar_count += 1
end
end
puts "Registrars processed: #{processed_registrar_count}"
end
end

View file

@ -5,7 +5,7 @@ class ContactAuditLogTest < ActionDispatch::IntegrationTest
contact = contacts(:john) contact = contacts(:john)
contact.legal_document_id = 1 contact.legal_document_id = 1
assert_difference 'contact.versions.count' do assert_difference 'contact.versions.count', 1 do
contact.save! contact.save!
end end
@ -13,4 +13,4 @@ class ContactAuditLogTest < ActionDispatch::IntegrationTest
assert_equal ({ legal_documents: [1] }).with_indifferent_access, assert_equal ({ legal_documents: [1] }).with_indifferent_access,
contact_version.children.with_indifferent_access contact_version.children.with_indifferent_access
end end
end end

View file

@ -14,7 +14,7 @@ class DomainAuditLogTest < ActionDispatch::IntegrationTest
assert_equal registrant_id, domain.registrant_id assert_equal registrant_id, domain.registrant_id
domain.legal_document_id = legal_document_id domain.legal_document_id = legal_document_id
assert_difference 'domain.versions.count' do assert_difference 'domain.versions.count', 1 do
domain.save! domain.save!
end end
@ -26,4 +26,4 @@ class DomainAuditLogTest < ActionDispatch::IntegrationTest
assert_equal [legal_document_id], domain_version.children['legal_documents'] assert_equal [legal_document_id], domain_version.children['legal_documents']
assert_equal [registrant_id], domain_version.children['registrant'] assert_equal [registrant_id], domain_version.children['registrant']
end end
end end

View file

@ -1,61 +0,0 @@
require 'test_helper'
class RegenerateRegistrarReferenceNumbersTaskTest < ActiveSupport::TestCase
def test_regenerates_registrar_reference_numbers_to_estonian_format
registrar = registrars(:bestnames)
registrar.update_column(:reference_no, 'RF1111')
capture_io { run_task }
registrar.reload
assert_not registrar.reference_no.start_with?('RF')
end
def test_bypasses_registrar_validation
registrar = registrars(:invalid)
registrar.update_column(:reference_no, 'RF1111')
assert registrar.invalid?
capture_io { run_task }
registrar.reload
assert_not registrar.reference_no.start_with?('RF')
end
def test_does_not_regenerate_when_the_task_is_run_again
registrar = registrars(:bestnames)
registrar.update!(reference_no: '1111')
capture_io { run_task }
registrar.reload
assert_equal '1111', registrar.reference_no
end
def test_keeps_iso_reference_number_on_the_invoice_unchanged
registrar = registrars(:bestnames)
registrar.update_column(:reference_no, 'RF1111')
invoice = invoices(:one)
invoice.update!(reference_no: 'RF2222')
capture_io { run_task }
invoice.reload
assert_equal 'RF2222', invoice.reference_no
end
def test_output
registrar = registrars(:bestnames)
registrar.update_column(:reference_no, 'RF1111')
assert_output "Registrars processed: 1\n" do
run_task
end
end
private
def run_task
Rake::Task['data_migrations:regenerate_registrar_reference_numbers'].execute
end
end

View file

@ -0,0 +1,47 @@
require 'test_helper'
class SendEInvoiceJobTest < ActiveSupport::TestCase
def teardown
EInvoice.provider = EInvoice::Providers::TestProvider.new
EInvoice::Providers::TestProvider.deliveries.clear
end
def test_if_invoice_is_sended
@invoice = invoices(:one)
EInvoice.provider = EInvoice::Providers::TestProvider.new
EInvoice::Providers::TestProvider.deliveries.clear
assert_nothing_raised do
SendEInvoiceJob.enqueue(@invoice.id)
end
@invoice.reload
assert_not @invoice.e_invoice_sent_at.blank?
assert_equal 1, EInvoice::Providers::TestProvider.deliveries.count
end
def test_if_invoice_sending_retries
@invoice = invoices(:one)
provider_config = { password: nil,
test_mode: true }
EInvoice.provider = EInvoice::Providers::OmnivaProvider.new(provider_config)
stub_request(:get, "https://testfinance.post.ee/finance/erp/erpServices.wsdl").to_timeout
assert_raise HTTPClient::TimeoutError do
SendEInvoiceJob.enqueue(@invoice.id)
end
assert @invoicee_invoice_sent_at.blank?
EInvoice.provider = EInvoice::Providers::TestProvider.new
EInvoice::Providers::TestProvider.deliveries.clear
assert_nothing_raised do
SendEInvoiceJob.enqueue(@invoice.id)
end
@invoice.reload
assert_not @invoice.e_invoice_sent_at.blank?
assert_equal 1, EInvoice::Providers::TestProvider.deliveries.count
end
end

View file

@ -21,6 +21,25 @@ class PaperTrailLearningTest < ActiveSupport::TestCase
assert_respond_to @record.versions.first, :item_id assert_respond_to @record.versions.first, :item_id
end end
def test_returns_version_count_on_domains
@domain = domains(:airport)
@domain.save
assert_equal 1, @domain.versions.count
@domain.name = 'domain.test'
@domain.save!
assert_equal 2, @domain.versions.count
end
def test_returns_version_count_on_users
@user = users(:registrant)
@user.email = 'aaa@bbb.com'
@user.save!
assert_equal 1, @user.versions.count
end
def test_creates_new_version_upon_update def test_creates_new_version_upon_update
@record = Post.create!(title: 'old title') @record = Post.create!(title: 'old title')
original_record = @record.clone original_record = @record.clone
@ -40,7 +59,7 @@ class PaperTrailLearningTest < ActiveSupport::TestCase
@record = Post.create!(title: 'any') @record = Post.create!(title: 'any')
assert_difference -> { @record.versions.size } do assert_difference -> { @record.versions.size } do
@record.touch_with_version @record.paper_trail.touch_with_version
end end
end end
end end

View file

@ -36,22 +36,22 @@ class DepositTest < ActiveSupport::TestCase
def test_amount_is_converted_from_string def test_amount_is_converted_from_string
@deposit.amount = "12.00" @deposit.amount = "12.00"
assert_equal(BigDecimal.new("12.00"), @deposit.amount) assert_equal(BigDecimal("12.00"), @deposit.amount)
@deposit.amount = "12,11" @deposit.amount = "12,11"
assert_equal(BigDecimal.new("12.11"), @deposit.amount) assert_equal(BigDecimal("12.11"), @deposit.amount)
end end
def test_amount_is_converted_from_float def test_amount_is_converted_from_float
@deposit.amount = 12.0044 @deposit.amount = 12.0044
assert_equal(BigDecimal.new("12.0044"), @deposit.amount) assert_equal(BigDecimal("12.0044"), @deposit.amount)
@deposit.amount = 12.0144 @deposit.amount = 12.0144
assert_equal(BigDecimal.new("12.0144"), @deposit.amount) assert_equal(BigDecimal("12.0144"), @deposit.amount)
end end
def test_amount_is_converted_from_nil def test_amount_is_converted_from_nil
@deposit.amount = nil @deposit.amount = nil
assert_equal(BigDecimal.new("0.00"), @deposit.amount) assert_equal(BigDecimal("0.00"), @deposit.amount)
end end
end end

View file

@ -5,16 +5,38 @@ class DirectoTest < ActiveSupport::TestCase
@invoice = invoices(:one) @invoice = invoices(:one)
end end
def test_monthly_invoices_max_range_raises_if_overlaps
Setting.directo_monthly_number_max = Setting.directo_monthly_number_last.to_i + Registrar.count - 1
error_message = 'Directo counter is out of period (max allowed number is smaller than last '\
'counternumber plus Registrar\'s count)'
error = assert_raises RuntimeError do
Directo.send_monthly_invoices
end
assert_equal error_message, error.message
end
def test_xml_is_include_transaction_date def test_xml_is_include_transaction_date
@invoice.update(total: @invoice.account_activity.bank_transaction.sum) @invoice.update(total: @invoice.account_activity.bank_transaction.sum)
@invoice.account_activity.bank_transaction.update(paid_at: Time.zone.now) @invoice.account_activity.bank_transaction.update(paid_at: Time.zone.now)
response = <<-XML
<?xml version="1.0" encoding="UTF-8"?>
<results>
<Result Type="0" Desc="OK" docid="1" doctype="ARVE" submit="Invoices"/>
</results>
XML
stub_request(:post, ENV['directo_invoice_url']).with do |request| stub_request(:post, ENV['directo_invoice_url']).with do |request|
request.body.include? 'TransactionDate' request.body.include? 'TransactionDate'
end end.to_return(status: 200, body: response)
assert_nothing_raised do assert_nothing_raised do
Directo.send_receipts Directo.send_receipts
end end
assert_not_empty @invoice.directo_records.first.request
end end
end end

View file

@ -13,6 +13,8 @@ class AuctionDoubleTest < ActiveSupport::TestCase
end end
class DNS::DomainNameTest < ActiveSupport::TestCase class DNS::DomainNameTest < ActiveSupport::TestCase
fixtures 'whois/records'
def test_available_when_not_at_auction def test_available_when_not_at_auction
domain_name = DNS::DomainName.new('auction.test') domain_name = DNS::DomainName.new('auction.test')
auctions(:one).update!(domain: 'auction.test', status: Auction.statuses[:domain_registered]) auctions(:one).update!(domain: 'auction.test', status: Auction.statuses[:domain_registered])

View file

@ -1,96 +0,0 @@
# Built-in since Rails 5.1
module ActiveSupport
module Testing
module Assertions
UNTRACKED = Object.new # :nodoc:
# Assertion that the result of evaluating an expression is changed before
# and after invoking the passed in block.
#
# assert_changes 'Status.all_good?' do
# post :create, params: { status: { ok: false } }
# end
#
# You can pass the block as a string to be evaluated in the context of
# the block. A lambda can be passed for the block as well.
#
# assert_changes -> { Status.all_good? } do
# post :create, params: { status: { ok: false } }
# end
#
# The assertion is useful to test side effects. The passed block can be
# anything that can be converted to string with #to_s.
#
# assert_changes :@object do
# @object = 42
# end
#
# The keyword arguments :from and :to can be given to specify the
# expected initial value and the expected value after the block was
# executed.
#
# assert_changes :@object, from: nil, to: :foo do
# @object = :foo
# end
#
# An error message can be specified.
#
# assert_changes -> { Status.all_good? }, 'Expected the status to be bad' do
# post :create, params: { status: { incident: true } }
# end
def assert_changes(expression, message = nil, from: UNTRACKED, to: UNTRACKED, &block)
exp = expression.respond_to?(:call) ? expression : -> { eval(expression.to_s, block.binding) }
before = exp.call
retval = yield
unless from == UNTRACKED
error = "#{expression.inspect} isn't #{from.inspect}"
error = "#{message}.\n#{error}" if message
assert from === before, error
end
after = exp.call
if to == UNTRACKED
error = "#{expression.inspect} didn't changed"
error = "#{message}.\n#{error}" if message
assert_not_equal before, after, error
else
error = "#{expression.inspect} didn't change to #{to}"
error = "#{message}.\n#{error}" if message
assert to === after, error
end
retval
end
# Assertion that the result of evaluating an expression is changed before
# and after invoking the passed in block.
#
# assert_no_changes 'Status.all_good?' do
# post :create, params: { status: { ok: true } }
# end
#
# An error message can be specified.
#
# assert_no_changes -> { Status.all_good? }, 'Expected the status to be good' do
# post :create, params: { status: { ok: false } }
# end
def assert_no_changes(expression, message = nil, &block)
exp = expression.respond_to?(:call) ? expression : -> { eval(expression.to_s, block.binding) }
before = exp.call
retval = yield
after = exp.call
error = "#{expression.inspect} did change to #{after}"
error = "#{message}.\n#{error}" if message
assert_equal before, after, error
retval
end
end
end
end

View file

@ -35,4 +35,15 @@ class AdminDomainsTestTest < ApplicationSystemTestCase
assert_text 'deleteCandidate status has been removed' assert_text 'deleteCandidate status has been removed'
assert_no_link 'Remove deleteCandidate status' assert_no_link 'Remove deleteCandidate status'
end end
def test_remove_domain_status
@domain.update!(statuses: [DomainStatus::SERVER_REGISTRANT_CHANGE_PROHIBITED])
visit edit_admin_domain_url(@domain)
click_link_or_button 'Delete'
click_link_or_button 'Save'
assert_text 'Domain updated!'
end
end end

View file

@ -1,61 +0,0 @@
require 'test_helper'
class ConvertDomainDeleteDateTaskTest < ActiveSupport::TestCase
setup do
@domain = domains(:shop)
end
def test_moves_domain_delete_date_one_day_ahead
@domain.update!(delete_date: '2010-07-05')
capture_io do
run_task
end
@domain.reload
assert_equal Date.parse('2010-07-06'), @domain.delete_date
end
def test_processes_invalid_domains
@domain = domains(:invalid)
@domain.update_columns(delete_date: '2010-07-05')
capture_io do
run_task
end
@domain.reload
assert_equal Date.parse('2010-07-06'), @domain.delete_date
end
def test_skips_non_expired_domains
@domain.update!(delete_date: nil)
assert_nothing_raised do
capture_io do
run_task
end
end
end
def test_output
eliminate_effect_of_all_domains_except(@domain)
@domain.update!(delete_date: '2010-07-05')
assert_output "Domains processed: 1\n" do
run_task
end
end
private
def eliminate_effect_of_all_domains_except(domain)
Domain.connection.disable_referential_integrity do
Domain.where("id != #{domain.id}").delete_all
end
end
def run_task
Rake::Task['data_migrations:convert_domain_delete_date'].execute
end
end

View file

@ -1,43 +0,0 @@
require 'test_helper'
class ArchiveOrphanedRegistrantVerificationsTest < ActiveSupport::TestCase
def test_deletes_orphaned_registrant_verifications
create_orphaned_registrant_verification
assert_difference 'RegistrantVerification.count', -1 do
capture_io do
run_task
end
end
end
def test_keeps_non_orphaned_registrant_verifications_intact
assert_no_difference 'RegistrantVerification.count' do
capture_io do
run_task
end
end
end
def test_output
create_orphaned_registrant_verification
assert_output "Processed: 1 out of 1\n" do
run_task
end
end
private
def create_orphaned_registrant_verification
non_existent_domain_id = 55
assert_not_includes Domain.ids, non_existent_domain_id
RegistrantVerification.connection.disable_referential_integrity do
registrant_verifications(:one).update_columns(domain_id: non_existent_domain_id)
end
end
def run_task
Rake::Task['data_migrations:delete_orphaned_registrant_verifications'].execute end
end

View file

@ -16,7 +16,6 @@ require 'minitest/mock'
require 'capybara/rails' require 'capybara/rails'
require 'capybara/minitest' require 'capybara/minitest'
require 'webmock/minitest' require 'webmock/minitest'
require 'support/rails5_assertions' # Remove once upgraded to Rails 5.1
require 'support/assertions/epp_assertions' require 'support/assertions/epp_assertions'