Merge pull request #947 from internetee/refactor-messages

Refactor messages
This commit is contained in:
Timo Võhmar 2018-09-19 13:23:05 +03:00 committed by GitHub
commit 6303f674f5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
36 changed files with 333 additions and 271 deletions

View file

@ -6,7 +6,8 @@ module Admin
domain.transaction do
domain.schedule_force_delete
domain.registrar.messages.create!(body: t('force_delete_set_on_domain', domain_name: domain.name))
domain.registrar.notifications.create!(text: t('force_delete_set_on_domain',
domain_name: domain.name))
if notify_by_email?
DomainDeleteMailer.forced(domain: domain,

View file

@ -9,12 +9,12 @@ class Epp::PollsController < EppController
private
def req_poll
@message = current_user.queued_messages.order('created_at DESC').take
@notification = current_user.unread_notifications.order('created_at DESC').take
render_epp_response 'epp/poll/poll_no_messages' and return unless @message
if @message.attached_obj_type && @message.attached_obj_id
render_epp_response 'epp/poll/poll_no_messages' and return unless @notification
if @notification.attached_obj_type && @notification.attached_obj_id
begin
@object = Object.const_get(@message.attached_obj_type).find(@message.attached_obj_id)
@object = Object.const_get(@notification.attached_obj_type).find(@notification.attached_obj_id)
rescue => problem
# the data model might be inconsistent; or ...
# this could happen if the registrar does not dequeue messages, and then the domain was deleted
@ -28,7 +28,7 @@ class Epp::PollsController < EppController
end
end
if @message.attached_obj_type == 'Keyrelay'
if @notification.attached_obj_type == 'Keyrelay'
render_epp_response 'epp/poll/poll_keyrelay'
else
render_epp_response 'epp/poll/poll_req'
@ -36,9 +36,9 @@ class Epp::PollsController < EppController
end
def ack_poll
@message = current_user.queued_messages.find_by(id: params[:parsed_frame].css('poll').first['msgID'])
@notification = current_user.unread_notifications.find_by(id: params[:parsed_frame].css('poll').first['msgID'])
unless @message
unless @notification
epp_errors << {
code: '2303',
msg: I18n.t('message_was_not_found'),
@ -47,7 +47,7 @@ class Epp::PollsController < EppController
handle_errors and return
end
handle_errors(@message) and return unless @message.dequeue
handle_errors(@notification) and return unless @notification.mark_as_read
render_epp_response 'epp/poll/poll_ack'
end
@ -56,6 +56,6 @@ class Epp::PollsController < EppController
end
def resource
@message
@notification
end
end

View file

@ -7,13 +7,13 @@ class DomainDeleteConfirmJob < Que::Job
case action
when RegistrantVerification::CONFIRMED
domain.poll_message!(:poll_pending_delete_confirmed_by_registrant)
domain.notify_registrar(:poll_pending_delete_confirmed_by_registrant)
domain.apply_pending_delete!
raise_errors!(domain)
when RegistrantVerification::REJECTED
domain.statuses.delete(DomainStatus::PENDING_DELETE_CONFIRMATION)
domain.poll_message!(:poll_pending_delete_rejected_by_registrant)
domain.notify_registrar(:poll_pending_delete_rejected_by_registrant)
domain.cancel_pending_delete
domain.save(validate: false)

View file

@ -8,8 +8,8 @@ class DomainDeleteJob < Que::Job
domain.destroy
bye_bye = domain.versions.last
domain.registrar.messages.create!(
body: "#{I18n.t(:domain_deleted)}: #{domain.name}",
domain.registrar.notifications.create!(
text: "#{I18n.t(:domain_deleted)}: #{domain.name}",
attached_obj_id: bye_bye.id,
attached_obj_type: bye_bye.class.to_s
)

View file

@ -8,7 +8,7 @@ class DomainUpdateConfirmJob < Que::Job
case action
when RegistrantVerification::CONFIRMED
old_registrant = domain.registrant
domain.poll_message!(:poll_pending_update_confirmed_by_registrant)
domain.notify_registrar(:poll_pending_update_confirmed_by_registrant)
raise_errors!(domain)
domain.apply_pending_update!
@ -22,7 +22,7 @@ class DomainUpdateConfirmJob < Que::Job
registrar: domain.registrar,
registrant: domain.registrant).deliver_now
domain.poll_message!(:poll_pending_update_rejected_by_registrant)
domain.notify_registrar(:poll_pending_update_rejected_by_registrant)
domain.preclean_pendings
domain.clean_pendings!

View file

@ -81,8 +81,8 @@ class ApiUser < User
username
end
def queued_messages
registrar.messages.queued
def unread_notifications
registrar.notifications.unread
end
def registrar_pki_ok?(crt, cn)

View file

@ -265,9 +265,9 @@ class Domain < ActiveRecord::Base
true
end
def poll_message!(message_key)
registrar.messages.create!(
body: "#{I18n.t(message_key)}: #{name}",
def notify_registrar(message_key)
registrar.notifications.create!(
text: "#{I18n.t(message_key)}: #{name}",
attached_obj_id: id,
attached_obj_type: self.class.to_s
)

View file

@ -73,8 +73,8 @@ class DomainTransfer < ActiveRecord::Base
old_contacts_codes = domain.contacts.pluck(:code).sort.uniq.join(', ')
old_registrant_code = domain.registrant.code
old_registrar.messages.create!(
body: I18n.t('messages.texts.domain_transfer',
old_registrar.notifications.create!(
text: I18n.t('notifications.texts.domain_transfer',
domain_name: domain.name,
old_contacts_codes: old_contacts_codes,
old_registrant_code: old_registrant_code),

View file

@ -625,8 +625,8 @@ class Epp::Domain < Domain
)
if dt.pending?
registrar.messages.create!(
body: I18n.t('transfer_requested'),
registrar.notifications.create!(
text: I18n.t('transfer_requested'),
attached_obj_id: dt.id,
attached_obj_type: dt.class.to_s
)
@ -727,8 +727,8 @@ class Epp::Domain < Domain
return false unless valid?
registrar.messages.create!(
body: 'Key Relay action completed successfully.',
registrar.notifications.create!(
text: 'Key Relay action completed successfully.',
attached_obj_type: kr.class.to_s,
attached_obj_id: kr.id
)

View file

@ -1,19 +0,0 @@
class Message < ActiveRecord::Base
include Versions # version/message_version.rb
belongs_to :registrar, required: true
before_create -> { self.queued = true }
scope :queued, -> { where(queued: true) }
validates :body, presence: true
def dequeue
self.queued = false
save
end
def name
"-"
end
end

View file

@ -0,0 +1,31 @@
class Notification < ActiveRecord::Base
include Versions # version/notification_version.rb
belongs_to :registrar
scope :unread, -> { where(read: false) }
validates :text, presence: true
after_initialize :set_defaults
def mark_as_read
raise 'Read notification cannot be marked as read again' if read?
self.read = true
save
end
def unread?
!read?
end
# Needed for EPP log
def name
"-"
end
private
def set_defaults
self.read = false if read.nil?
end
end

View file

@ -4,7 +4,7 @@ class Registrar < ActiveRecord::Base
has_many :domains, dependent: :restrict_with_error
has_many :contacts, dependent: :restrict_with_error
has_many :api_users, dependent: :restrict_with_error
has_many :messages
has_many :notifications
has_many :invoices, foreign_key: 'buyer_id'
has_many :accounts, dependent: :destroy
has_many :nameservers, through: :domains

View file

@ -1,5 +0,0 @@
class MessageVersion < PaperTrail::Version
include VersionSession
self.table_name = :log_messages
self.sequence_name = :log_messages_id_seq
end

View file

@ -0,0 +1,5 @@
class NotificationVersion < PaperTrail::Version
include VersionSession
self.table_name = :log_notifications
self.sequence_name = :log_notifications_id_seq
end

View file

@ -4,7 +4,7 @@ xml.epp_head do
xml.msg 'Command completed successfully'
end
xml.tag!('msgQ', 'count' => current_user.queued_messages.count, 'id' => @message.id)
xml.tag!('msgQ', 'count' => current_user.unread_notifications.count, 'id' => @notification.id)
render('epp/shared/trID', builder: xml)
end

View file

@ -10,9 +10,9 @@ xml.epp(
xml.msg 'Command completed successfully; ack to dequeue'
end
xml.tag!('msgQ', 'count' => current_user.queued_messages.count, 'id' => @message.id) do
xml.qDate @message.created_at.try(:iso8601)
xml.msg @message.body
xml.tag!('msgQ', 'count' => current_user.unread_notifications.count, 'id' => @notification.id) do
xml.qDate @notification.created_at.try(:iso8601)
xml.msg @notification.text
end
xml.resData do

View file

@ -4,12 +4,12 @@ xml.epp_head do
xml.msg 'Command completed successfully; ack to dequeue'
end
xml.tag!('msgQ', 'count' => current_user.queued_messages.count, 'id' => @message.id) do
xml.qDate @message.created_at.utc.xmlschema
xml.msg @message.body
xml.tag!('msgQ', 'count' => current_user.unread_notifications.count, 'id' => @notification.id) do
xml.qDate @notification.created_at.utc.xmlschema
xml.msg @notification.text
end
if @message.attached_obj_type == 'DomainTransfer'
if @notification.attached_obj_type == 'DomainTransfer'
xml.resData do
xml << render('epp/domains/partials/transfer', builder: xml, dt: @object)
end if @object

View file

@ -474,7 +474,6 @@ en:
message: 'Message'
message_no: 'Message #%{id}'
queue_date: 'Queue date'
messages_in_queue: 'Messages in queue'
you_have_no_new_messages: 'You have no new messages'
message_id: 'Message ID'
trStatus: 'Status'

View file

@ -1,5 +1,5 @@
en:
messages:
notifications:
texts:
domain_transfer: >-
Transfer of domain %{domain_name} has been approved.

View file

@ -0,0 +1,5 @@
class RenameMessagesToNotifications < ActiveRecord::Migration
def change
rename_table :messages, :notifications
end
end

View file

@ -0,0 +1,5 @@
class RenameLogMessagesToLogNotifications < ActiveRecord::Migration
def change
rename_table :log_messages, :log_notifications
end
end

View file

@ -0,0 +1,5 @@
class RenameNotificationsBodyToText < ActiveRecord::Migration
def change
rename_column :notifications, :body, :text
end
end

View file

@ -0,0 +1,5 @@
class RenameNotificationsQueuedToRead < ActiveRecord::Migration
def change
rename_column :notifications, :queued, :read
end
end

View file

@ -0,0 +1,5 @@
class ChangeNotificationsReadToNotNull < ActiveRecord::Migration
def change
change_column_null :notifications, :read, false
end
end

View file

@ -1652,44 +1652,6 @@ CREATE SEQUENCE public.log_keyrelays_id_seq
ALTER SEQUENCE public.log_keyrelays_id_seq OWNED BY public.log_keyrelays.id;
--
-- Name: log_messages; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE public.log_messages (
id integer NOT NULL,
item_type character varying NOT NULL,
item_id integer NOT NULL,
event character varying NOT NULL,
whodunnit character varying,
object json,
object_changes json,
created_at timestamp without time zone,
session character varying,
children json,
uuid character varying
);
--
-- Name: log_messages_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.log_messages_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: log_messages_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.log_messages_id_seq OWNED BY public.log_messages.id;
--
-- Name: log_nameservers; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
@ -1728,6 +1690,44 @@ CREATE SEQUENCE public.log_nameservers_id_seq
ALTER SEQUENCE public.log_nameservers_id_seq OWNED BY public.log_nameservers.id;
--
-- Name: log_notifications; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE public.log_notifications (
id integer NOT NULL,
item_type character varying NOT NULL,
item_id integer NOT NULL,
event character varying NOT NULL,
whodunnit character varying,
object json,
object_changes json,
created_at timestamp without time zone,
session character varying,
children json,
uuid character varying
);
--
-- Name: log_notifications_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.log_notifications_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: log_notifications_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.log_notifications_id_seq OWNED BY public.log_notifications.id;
--
-- Name: log_registrars; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
@ -1955,43 +1955,6 @@ CREATE SEQUENCE public.mail_templates_id_seq
ALTER SEQUENCE public.mail_templates_id_seq OWNED BY public.mail_templates.id;
--
-- Name: messages; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE public.messages (
id integer NOT NULL,
registrar_id integer NOT NULL,
body character varying NOT NULL,
attached_obj_type character varying,
attached_obj_id integer,
queued boolean,
created_at timestamp without time zone,
updated_at timestamp without time zone,
creator_str character varying,
updator_str character varying
);
--
-- Name: messages_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.messages_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: messages_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.messages_id_seq OWNED BY public.messages.id;
--
-- Name: nameservers; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
@ -2030,6 +1993,43 @@ CREATE SEQUENCE public.nameservers_id_seq
ALTER SEQUENCE public.nameservers_id_seq OWNED BY public.nameservers.id;
--
-- Name: notifications; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE public.notifications (
id integer NOT NULL,
registrar_id integer NOT NULL,
text character varying NOT NULL,
attached_obj_type character varying,
attached_obj_id integer,
read boolean NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone,
creator_str character varying,
updator_str character varying
);
--
-- Name: notifications_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.notifications_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: notifications_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.notifications_id_seq OWNED BY public.notifications.id;
--
-- Name: prices; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
@ -2715,14 +2715,14 @@ ALTER TABLE ONLY public.log_keyrelays ALTER COLUMN id SET DEFAULT nextval('publi
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.log_messages ALTER COLUMN id SET DEFAULT nextval('public.log_messages_id_seq'::regclass);
ALTER TABLE ONLY public.log_nameservers ALTER COLUMN id SET DEFAULT nextval('public.log_nameservers_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.log_nameservers ALTER COLUMN id SET DEFAULT nextval('public.log_nameservers_id_seq'::regclass);
ALTER TABLE ONLY public.log_notifications ALTER COLUMN id SET DEFAULT nextval('public.log_notifications_id_seq'::regclass);
--
@ -2771,14 +2771,14 @@ ALTER TABLE ONLY public.mail_templates ALTER COLUMN id SET DEFAULT nextval('publ
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.messages ALTER COLUMN id SET DEFAULT nextval('public.messages_id_seq'::regclass);
ALTER TABLE ONLY public.nameservers ALTER COLUMN id SET DEFAULT nextval('public.nameservers_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.nameservers ALTER COLUMN id SET DEFAULT nextval('public.nameservers_id_seq'::regclass);
ALTER TABLE ONLY public.notifications ALTER COLUMN id SET DEFAULT nextval('public.notifications_id_seq'::regclass);
--
@ -3130,14 +3130,6 @@ ALTER TABLE ONLY public.log_keyrelays
ADD CONSTRAINT log_keyrelays_pkey PRIMARY KEY (id);
--
-- Name: log_messages_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
ALTER TABLE ONLY public.log_messages
ADD CONSTRAINT log_messages_pkey PRIMARY KEY (id);
--
-- Name: log_nameservers_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
@ -3146,6 +3138,14 @@ ALTER TABLE ONLY public.log_nameservers
ADD CONSTRAINT log_nameservers_pkey PRIMARY KEY (id);
--
-- Name: log_notifications_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
ALTER TABLE ONLY public.log_notifications
ADD CONSTRAINT log_notifications_pkey PRIMARY KEY (id);
--
-- Name: log_registrars_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
@ -3194,14 +3194,6 @@ ALTER TABLE ONLY public.mail_templates
ADD CONSTRAINT mail_templates_pkey PRIMARY KEY (id);
--
-- Name: messages_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
ALTER TABLE ONLY public.messages
ADD CONSTRAINT messages_pkey PRIMARY KEY (id);
--
-- Name: nameservers_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
@ -3210,6 +3202,14 @@ ALTER TABLE ONLY public.nameservers
ADD CONSTRAINT nameservers_pkey PRIMARY KEY (id);
--
-- Name: notifications_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
ALTER TABLE ONLY public.notifications
ADD CONSTRAINT notifications_pkey PRIMARY KEY (id);
--
-- Name: prices_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
@ -3789,20 +3789,6 @@ CREATE INDEX index_log_keyrelays_on_item_type_and_item_id ON public.log_keyrelay
CREATE INDEX index_log_keyrelays_on_whodunnit ON public.log_keyrelays USING btree (whodunnit);
--
-- Name: index_log_messages_on_item_type_and_item_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_log_messages_on_item_type_and_item_id ON public.log_messages USING btree (item_type, item_id);
--
-- Name: index_log_messages_on_whodunnit; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_log_messages_on_whodunnit ON public.log_messages USING btree (whodunnit);
--
-- Name: index_log_nameservers_on_item_type_and_item_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
@ -3817,6 +3803,20 @@ CREATE INDEX index_log_nameservers_on_item_type_and_item_id ON public.log_namese
CREATE INDEX index_log_nameservers_on_whodunnit ON public.log_nameservers USING btree (whodunnit);
--
-- Name: index_log_notifications_on_item_type_and_item_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_log_notifications_on_item_type_and_item_id ON public.log_notifications USING btree (item_type, item_id);
--
-- Name: index_log_notifications_on_whodunnit; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_log_notifications_on_whodunnit ON public.log_notifications USING btree (whodunnit);
--
-- Name: index_log_registrars_on_item_type_and_item_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
@ -3873,13 +3873,6 @@ CREATE INDEX index_log_users_on_item_type_and_item_id ON public.log_users USING
CREATE INDEX index_log_users_on_whodunnit ON public.log_users USING btree (whodunnit);
--
-- Name: index_messages_on_registrar_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_messages_on_registrar_id ON public.messages USING btree (registrar_id);
--
-- Name: index_nameservers_on_domain_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
@ -3887,6 +3880,13 @@ CREATE INDEX index_messages_on_registrar_id ON public.messages USING btree (regi
CREATE INDEX index_nameservers_on_domain_id ON public.nameservers USING btree (domain_id);
--
-- Name: index_notifications_on_registrar_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_notifications_on_registrar_id ON public.notifications USING btree (registrar_id);
--
-- Name: index_prices_on_zone_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
@ -4102,7 +4102,7 @@ ALTER TABLE ONLY public.account_activities
-- Name: messages_registrar_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.messages
ALTER TABLE ONLY public.notifications
ADD CONSTRAINT messages_registrar_id_fk FOREIGN KEY (registrar_id) REFERENCES public.registrars(id);
@ -4766,5 +4766,15 @@ INSERT INTO schema_migrations (version) VALUES ('20180808064402');
INSERT INTO schema_migrations (version) VALUES ('20180816123540');
INSERT INTO schema_migrations (version) VALUES ('20180823161237');
INSERT INTO schema_migrations (version) VALUES ('20180823163548');
INSERT INTO schema_migrations (version) VALUES ('20180823174331');
INSERT INTO schema_migrations (version) VALUES ('20180823212823');
INSERT INTO schema_migrations (version) VALUES ('20180824092855');
INSERT INTO schema_migrations (version) VALUES ('20180824102834');

View file

@ -251,10 +251,11 @@ RSpec.describe Domain do
@domain.statuses = DomainStatus::OK # restore
end
it 'should add poll message to registrar' do
it 'should notify registrar' do
text = 'Registrant confirmed domain update: testpollmessage123.ee'
domain = create(:domain, name: 'testpollmessage123.ee')
domain.poll_message!(:poll_pending_update_confirmed_by_registrant)
domain.registrar.messages.first.body.should == 'Registrant confirmed domain update: testpollmessage123.ee'
domain.notify_registrar(:poll_pending_update_confirmed_by_registrant)
domain.registrar.notifications.first.text.should == text
end
context 'about registrant update confirm' do

View file

@ -1,16 +1,16 @@
greeting:
body: Welcome!
queued: true
text: Welcome!
read: false
registrar: bestnames
created_at: <%= Time.zone.parse('2010-07-04') %>
domain_deleted:
body: Your domain has been deleted
queued: true
text: Your domain has been deleted
read: false
registrar: bestnames
created_at: <%= Time.zone.parse('2010-07-05') %>
farewell:
body: Good bye!
queued: true
text: Good bye!
read: false
registrar: goodnames

View file

@ -47,7 +47,7 @@ class APIDomainTransfersTest < ApplicationIntegrationTest
def test_notifies_old_registrar
@old_registrar = @domain.registrar
assert_difference -> { @old_registrar.messages.count } do
assert_difference -> { @old_registrar.notifications.count } do
post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key }
end
end

View file

@ -48,7 +48,7 @@ class EppDomainTransferRequestTest < ApplicationIntegrationTest
def test_notifies_old_registrar
@old_registrar = @domain.registrar
assert_difference -> { @old_registrar.messages.count } do
assert_difference -> { @old_registrar.notifications.count } do
post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' }
end
end

View file

@ -1,9 +1,9 @@
require 'test_helper'
class EppPollTest < ApplicationIntegrationTest
# Deliberately does not conform to RFC5730, which requires the first message to be returned
def test_return_latest_message_when_queue_is_not_empty
message = messages(:domain_deleted)
# Deliberately does not conform to RFC5730, which requires the first notification to be returned
def test_return_latest_notification_when_queue_is_not_empty
notification = notifications(:domain_deleted)
request_xml = <<-XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
@ -19,16 +19,15 @@ class EppPollTest < ApplicationIntegrationTest
assert_equal 1301.to_s, response_xml.at_css('result')[:code]
assert_equal 1, response_xml.css('result').size
assert_equal 2.to_s, response_xml.at_css('msgQ')[:count]
assert_equal message.id.to_s, response_xml.at_css('msgQ')[:id]
assert_equal notification.id.to_s, response_xml.at_css('msgQ')[:id]
assert_equal Time.zone.parse('2010-07-05').utc.xmlschema, response_xml.at_css('msgQ qDate').text
assert_equal 'Your domain has been deleted', response_xml.at_css('msgQ msg').text
end
def test_no_messages_in_queue
registrars(:bestnames).messages.delete_all(:delete_all)
def test_no_notifications
registrars(:bestnames).notifications.delete_all(:delete_all)
request_xml =
<<-XML
request_xml = <<-XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
<command>
@ -37,55 +36,55 @@ class EppPollTest < ApplicationIntegrationTest
</epp>
XML
post '/epp/command/poll', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames'
response_xml = Nokogiri::XML(response.body)
assert_equal 1300.to_s, response_xml.at_css('result')[:code]
assert_equal 1, response_xml.css('result').size
xml_doc = Nokogiri::XML(response.body)
assert_equal 1300.to_s, xml_doc.at_css('result')[:code]
assert_equal 1, xml_doc.css('result').size
end
def test_dequeue_message
message = messages(:greeting)
def test_mark_as_read
notification = notifications(:greeting)
request_xml = <<-XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
<command>
<poll op="ack" msgID="#{message.id}"/>
<poll op="ack" msgID="#{notification.id}"/>
</command>
</epp>
XML
post '/epp/command/poll', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames'
message.reload
response_xml = Nokogiri::XML(response.body)
notification.reload
assert_not message.queued?
assert_equal 1000.to_s, response_xml.at_css('result')[:code]
assert_equal 1, response_xml.css('result').size
assert_equal 1.to_s, response_xml.at_css('msgQ')[:count]
assert_equal message.id.to_s, response_xml.at_css('msgQ')[:id]
xml_doc = Nokogiri::XML(response.body)
assert notification.read?
assert_equal 1000.to_s, xml_doc.at_css('result')[:code]
assert_equal 1, xml_doc.css('result').size
assert_equal 1.to_s, xml_doc.at_css('msgQ')[:count]
assert_equal notification.id.to_s, xml_doc.at_css('msgQ')[:id]
end
def test_message_of_other_registrars_cannot_be_dequeued
message = messages(:farewell)
def test_notification_of_other_registrars_cannot_be_marked_as_read
notification = notifications(:farewell)
request_xml = <<-XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
<command>
<poll op="ack" msgID="#{message.id}"/>
<poll op="ack" msgID="#{notification.id}"/>
</command>
</epp>
XML
post '/epp/command/poll', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames'
response_xml = Nokogiri::XML(response.body)
message.reload
notification.reload
assert message.queued?
assert_equal 2303.to_s, response_xml.at_css('result')[:code]
xml_doc = Nokogiri::XML(response.body)
assert notification.unread?
assert_equal 2303.to_s, xml_doc.at_css('result')[:code]
end
def test_message_not_found
def test_notification_not_found
request_xml = <<-XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
@ -95,8 +94,8 @@ class EppPollTest < ApplicationIntegrationTest
</epp>
XML
post '/epp/command/poll', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames'
response_xml = Nokogiri::XML(response.body)
assert_equal 2303.to_s, response_xml.at_css('result')[:code]
xml_doc = Nokogiri::XML(response.body)
assert_equal 2303.to_s, xml_doc.at_css('result')[:code]
end
end

View file

@ -18,19 +18,19 @@ class DomainDeleteConfirmJobTest < ActiveSupport::TestCase
super
end
def test_rejected_registrant_verification_polls_a_message
def test_rejected_registrant_verification_notifies_registrar
DomainDeleteConfirmJob.enqueue(@domain.id, RegistrantVerification::REJECTED)
last_registrar_message = @domain.registrar.messages.last
assert_equal(last_registrar_message.attached_obj_id, @domain.id)
assert_equal(last_registrar_message.body, 'Registrant rejected domain deletion: shop.test')
last_registrar_notification = @domain.registrar.notifications.last
assert_equal(last_registrar_notification.attached_obj_id, @domain.id)
assert_equal(last_registrar_notification.text, 'Registrant rejected domain deletion: shop.test')
end
def test_accepted_registrant_verification_polls_a_message
def test_accepted_registrant_verification_notifies_registrar
DomainDeleteConfirmJob.enqueue(@domain.id, RegistrantVerification::CONFIRMED)
last_registrar_message = @domain.registrar.messages.last
assert_equal(last_registrar_message.attached_obj_id, @domain.id)
assert_equal(last_registrar_message.body, 'Registrant confirmed domain deletion: shop.test')
last_registrar_notification = @domain.registrar.notifications.last
assert_equal(last_registrar_notification.attached_obj_id, @domain.id)
assert_equal(last_registrar_notification.text, 'Registrant confirmed domain deletion: shop.test')
end
end

View file

@ -18,19 +18,19 @@ class DomainUpdateConfirmJobTest < ActiveSupport::TestCase
super
end
def test_rejected_registrant_verification_polls_a_message
def test_rejected_registrant_verification_notifies_registrar
DomainUpdateConfirmJob.enqueue(@domain.id, RegistrantVerification::REJECTED)
last_registrar_message = @domain.registrar.messages.last
assert_equal(last_registrar_message.attached_obj_id, @domain.id)
assert_equal(last_registrar_message.body, 'Registrant rejected domain update: shop.test')
last_registrar_notification = @domain.registrar.notifications.last
assert_equal(last_registrar_notification.attached_obj_id, @domain.id)
assert_equal(last_registrar_notification.text, 'Registrant rejected domain update: shop.test')
end
def test_accepted_registrant_verification_polls_a_message
def test_accepted_registrant_verification_notifies_registrar
DomainUpdateConfirmJob.enqueue(@domain.id, RegistrantVerification::CONFIRMED)
last_registrar_message = @domain.registrar.messages.last
assert_equal(last_registrar_message.attached_obj_id, @domain.id)
assert_equal(last_registrar_message.body, 'Registrant confirmed domain update: shop.test')
last_registrar_notification = @domain.registrar.notifications.last
assert_equal(last_registrar_notification.attached_obj_id, @domain.id)
assert_equal(last_registrar_notification.text, 'Registrant confirmed domain update: shop.test')
end
end

View file

@ -14,19 +14,19 @@ class DomainTransferTest < ActiveSupport::TestCase
def test_notifies_old_registrar_on_approval
old_registrar = @domain_transfer.old_registrar
assert_difference -> { old_registrar.messages.count } do
assert_difference -> { old_registrar.notifications.count } do
@domain_transfer.approve
end
body = 'Transfer of domain shop.test has been approved.' \
text = 'Transfer of domain shop.test has been approved.' \
' It was associated with registrant john-001' \
' and contacts acme-ltd-001, jane-001, william-001.'
id = @domain_transfer.id
class_name = @domain_transfer.class.name
message = old_registrar.messages.last
assert_equal body, message.body
assert_equal id, message.attached_obj_id
assert_equal class_name, message.attached_obj_type
notification = old_registrar.notifications.last
assert_equal text, notification.text
assert_equal id, notification.attached_obj_id
assert_equal class_name, notification.attached_obj_type
end
end

View file

@ -1,27 +0,0 @@
require 'test_helper'
class MessageTest < ActiveSupport::TestCase
setup do
@message = messages(:greeting)
end
def test_valid
assert @message.valid?
end
def test_invalid_without_body
@message.body = nil
assert @message.invalid?
end
def test_invalid_without_registrar
@message.registrar = nil
assert @message.invalid?
end
def test_dequeue
@message.dequeue
@message.reload
assert_not @message.queued?
end
end

View file

@ -0,0 +1,42 @@
require 'test_helper'
class NotificationTest < ActiveSupport::TestCase
setup do
@notification = notifications(:greeting)
end
def test_valid
assert @notification.valid?
end
def test_invalid_without_text
@notification.text = ''
assert @notification.invalid?
end
def test_unread_by_default
notification = Notification.new(registrar: registrars(:bestnames), text: 'test')
assert notification.unread?
notification.save!
assert notification.unread?
end
def test_honor_given_read_state
notification = Notification.new(read: true)
assert notification.read?
end
def test_mark_as_read
@notification.mark_as_read
@notification.reload
assert @notification.read?
end
def test_read_notification_cannot_be_marked_as_read_again
@notification.mark_as_read
assert_raises do
@notification.mark_as_read
end
end
end

View file

@ -22,7 +22,7 @@ class AdminAreaDomainForceDeleteTest < ApplicationSystemTestCase
end
def test_notifies_registrar
assert_difference '@domain.registrar.messages.size' do
assert_difference '@domain.registrar.notifications.size' do
visit edit_admin_domain_url(@domain)
click_link_or_button 'Force delete domain'
end