Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 27 additions & 15 deletions app/models/registry/auction_creator.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
module Registry
class AuctionCreator < Base
ALLOWED_PATTERN = /\A[a-z0-9äöüõšžÄÖÜÕŠŽ\-]+\z/.freeze

def initialize; end

def request
Expand All @@ -14,6 +16,11 @@ def call

body_as_json = JSON.parse(body_as_string, symbolize_names: true)
body_as_json.each do |item|
unless valid_domain_name?(item[:domain])
Rails.logger.info "Skipping invalid domain name: #{item[:domain]}"
next
end

duplicate = Auction.where(domain_name: item[:domain]).last
next if duplicate&.in_progress?

Expand All @@ -24,6 +31,26 @@ def call

private

def valid_domain_name?(domain_name)
return false if domain_name.nil? || domain_name.empty?

# For test domains
return true if domain_name.to_s.downcase.end_with?('.test')

name_part = domain_name.to_s.downcase.split('.').first
return false if name_part.nil? || name_part.empty?

return false if name_part.length < 1 || name_part.length > 63
return false if name_part.start_with?('-') || name_part.end_with?('-')
return false if name_part.length >= 4 && name_part[2] == '-' && name_part[3] == '-'

return false unless name_part.match?(ALLOWED_PATTERN)

return false if name_part.include?('_')

true
end

def auction_duration_in_seconds
Setting.find_by(code: 'auction_duration').retrieve * 60 * 60
end
Expand Down Expand Up @@ -85,16 +112,6 @@ def put_same_values_as_before_for_new_round(auction)
auction.ends_at = nil
else
legacy_auction = auctions.first
# new_ends_at = legacy_auction.ends_at
# if legacy_auction.initial_ends_at.present?
# legacy_time_difference = (legacy_auction.initial_ends_at - legacy_auction.starts_at).to_i.abs
# legacy_difference_in_day = legacy_time_difference / 86_400
# legacy_time = legacy_auction.initial_ends_at.strftime('%H:%M:%S')
# t = Time.parse(legacy_time).seconds_since_midnight.seconds
# new_ends_at = Time.zone.now.beginning_of_day + legacy_difference_in_day.day + t
# end


ends_at_value = legacy_auction.initial_ends_at.presence || legacy_auction.ends_at

legacy_time_difference = (ends_at_value - legacy_auction.starts_at).to_i.abs
Expand All @@ -114,11 +131,6 @@ def put_same_values_as_before_for_new_round(auction)
auction.ends_at = new_ends_at.to_s
auction.ends_at = auction.ends_at + additional_day.day
auction.initial_ends_at = auction.ends_at

# if legacy_auction.initial_ends_at.present?
# auction.initial_ends_at = new_ends_at.to_s
# auction.initial_ends_at = auction.initial_ends_at + additional_day.day
# end
end

auction.save!
Expand Down
103 changes: 103 additions & 0 deletions test/models/registry/auction_creator_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,109 @@ def test_next_round_auctions_should_be_comes_with_enabled_deposit_for_previous_p
end
end

def test_domain_validation_allows_test_domains_with_underscores
instance = Registry::AuctionCreator.new

body = [
{ 'id' => 'test-underscore-1', 'domain' => 'new_test_domain.test', 'status' => 'started' },
{ 'id' => 'test-underscore-2', 'domain' => 'another_test_domain.test', 'status' => 'started' },
{ 'id' => 'test-underscore-3', 'domain' => 'test_with_multiple_underscores.test', 'status' => 'started' }
]

response = Minitest::Mock.new
response.expect(:code, '200')
response.expect(:code, '200')
response.expect(:body, body.to_json)

http = Minitest::Mock.new
http.expect(:request, nil, [instance.request])

Net::HTTP.stub(:start, response, http) do
assert_changes('Auction.count', 3) do
instance.call
end
end

assert Auction.find_by(remote_id: 'test-underscore-1')
assert Auction.find_by(remote_id: 'test-underscore-2')
assert Auction.find_by(remote_id: 'test-underscore-3')
end

def test_domain_name_validation_skips_invalid_domains
instance = Registry::AuctionCreator.new

body = [
{ 'id' => 'valid-1', 'domain' => 'example.ee', 'status' => 'started' },
{ 'id' => 'valid-2', 'domain' => 'test123.ee', 'status' => 'started' },
{ 'id' => 'valid-3', 'domain' => 'äöüõ.ee', 'status' => 'started' },
{ 'id' => 'valid-4', 'domain' => 'test-domain.ee', 'status' => 'started' },
{ 'id' => 'valid-5', 'domain' => 'a.ee', 'status' => 'started' },
{ 'id' => 'valid-6', 'domain' => '123.ee', 'status' => 'started' },
{ 'id' => 'valid-7', 'domain' => 'test-123-abc.ee', 'status' => 'started' },
{ 'id' => 'valid-8', 'domain' => 'UPPERCASE.ee', 'status' => 'started' },
{ 'id' => 'valid-9', 'domain' => 'šž.ee', 'status' => 'started' },

{ 'id' => 'invalid-1', 'domain' => 'test_domain.ee', 'status' => 'started' },
{ 'id' => 'invalid-2', 'domain' => '-test.ee', 'status' => 'started' },
{ 'id' => 'invalid-3', 'domain' => 'test-.ee', 'status' => 'started' },
{ 'id' => 'invalid-4', 'domain' => 'te--st.ee', 'status' => 'started' },
{ 'id' => 'invalid-5', 'domain' => 'hhla_tk.ee', 'status' => 'started' },
{ 'id' => 'invalid-6', 'domain' => 'test@domain.ee', 'status' => 'started' },
{ 'id' => 'invalid-7', 'domain' => 'test#domain.ee', 'status' => 'started' },
{ 'id' => 'invalid-8', 'domain' => 'test domain.ee', 'status' => 'started' },
{ 'id' => 'invalid-9', 'domain' => '.ee', 'status' => 'started' },
{ 'id' => 'invalid-10', 'domain' => 'a' * 64 + '.ee', 'status' => 'started' },
{ 'id' => 'invalid-11', 'domain' => '', 'status' => 'started' },
{ 'id' => 'invalid-12', 'domain' => nil, 'status' => 'started' },
]

response = Minitest::Mock.new
response.expect(:code, '200')
response.expect(:code, '200')
response.expect(:body, body.to_json)

http = Minitest::Mock.new
http.expect(:request, nil, [instance.request])

logged_messages = []
Rails.logger.stub :info, ->(msg) { logged_messages << msg } do
Net::HTTP.stub(:start, response, http) do
assert_changes('Auction.count', 9) do
instance.call
end
end
end

assert Auction.find_by(remote_id: 'valid-1')
assert Auction.find_by(remote_id: 'valid-2')
assert Auction.find_by(remote_id: 'valid-3')
assert Auction.find_by(remote_id: 'valid-4')
assert Auction.find_by(remote_id: 'valid-5')
assert Auction.find_by(remote_id: 'valid-6')
assert Auction.find_by(remote_id: 'valid-7')
assert Auction.find_by(remote_id: 'valid-8')
assert Auction.find_by(remote_id: 'valid-9')

assert_nil Auction.find_by(remote_id: 'invalid-1')
assert_nil Auction.find_by(remote_id: 'invalid-2')
assert_nil Auction.find_by(remote_id: 'invalid-3')
assert_nil Auction.find_by(remote_id: 'invalid-4')
assert_nil Auction.find_by(remote_id: 'invalid-5')
assert_nil Auction.find_by(remote_id: 'invalid-6')
assert_nil Auction.find_by(remote_id: 'invalid-7')
assert_nil Auction.find_by(remote_id: 'invalid-8')
assert_nil Auction.find_by(remote_id: 'invalid-9')
assert_nil Auction.find_by(remote_id: 'invalid-10')
assert_nil Auction.find_by(remote_id: 'invalid-11')
assert_nil Auction.find_by(remote_id: 'invalid-12')

assert logged_messages.include?("Skipping invalid domain name: test_domain.ee")
assert logged_messages.include?("Skipping invalid domain name: hhla_tk.ee")
assert logged_messages.include?("Skipping invalid domain name: -test.ee")
assert logged_messages.include?("Skipping invalid domain name: test-.ee")
assert logged_messages.include?("Skipping invalid domain name: te--st.ee")
end

def reassign_ends_at(legacy_auction, new_auction)
t1 = legacy_auction.starts_at
t2 = new_auction.starts_at
Expand Down
Loading