From 4e5aecb26de8c6a5c385f283c5467b80202cb4ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andres=20Keskk=C3=BCla?= Date: Wed, 26 Nov 2014 15:37:22 +0200 Subject: [PATCH] Support for disclosure settings. Tests --- app/models/contact.rb | 5 +++ app/models/contact_disclosure.rb | 36 +++++++++++--------- config/initializers/initial_settings.rb | 6 ++++ spec/epp/contact_spec.rb | 45 +++++++++++++++++++++++++ spec/models/contact_disclosure_spec.rb | 17 +++++++--- spec/models/contact_spec.rb | 22 +++++++++++- spec/support/general.rb | 9 +++++ 7 files changed, 119 insertions(+), 21 deletions(-) create mode 100644 config/initializers/initial_settings.rb diff --git a/app/models/contact.rb b/app/models/contact.rb index 82fe0940e..e11621273 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -37,6 +37,7 @@ class Contact < ActiveRecord::Base after_destroy :domains_snapshot before_create :generate_code before_create :generate_auth_info + after_create :ensure_disclosure # scopes scope :current_registrars, ->(id) { where(registrar_id: id) } @@ -63,6 +64,10 @@ class Contact < ActiveRecord::Base errors.add(:ident, 'bad format') unless code.valid? end + def ensure_disclosure + create_disclosure!(ContactDisclosure.default_values) unless disclosure + end + def domains_snapshot (domains + domains_owned).uniq.each do |domain| next unless domain.is_a?(Domain) diff --git a/app/models/contact_disclosure.rb b/app/models/contact_disclosure.rb index 61bd4794a..744c260c1 100644 --- a/app/models/contact_disclosure.rb +++ b/app/models/contact_disclosure.rb @@ -4,6 +4,18 @@ class ContactDisclosure < ActiveRecord::Base # value is true or false depending on disclosure flag # rules are the contents of disclose element class << self + def default_values + @dc = { + name: Setting.disclosure_name, + org_name: Setting.disclosure_org_name, + phone: Setting.disclosure_phone, + fax: Setting.disclosure_fax, + email: Setting.disclosure_email, + address: Setting.disclosure_address + } + @dc + end + def extract_attributes(parsed_frame) disclosure_hash = {} rules = parsed_frame.css('disclose').first @@ -11,35 +23,27 @@ class ContactDisclosure < ActiveRecord::Base value = rules.attributes['flag'].value disclosure_hash = parse_disclose_xml(rules) - disclosure_hash.each do |k, _v| + disclosure_hash.each do |k, _v| # provides a correct flag to disclosure elements disclosure_hash[k] = value end - disclosure_hash + default_values.merge(disclosure_hash) end private + # Returns list of disclosure elements present. def parse_disclose_xml(rules) - { int_name: parse_element_attributes_for('name', rules.children, 'int'), - int_org_name: parse_element_attributes_for('org_name', rules.children, 'int'), - int_addr: parse_element_attributes_for('addr', rules.children, 'int'), - loc_name: parse_element_attributes_for('name', rules.children, 'loc'), - loc_org_name: parse_element_attributes_for('org_name', rules.children, 'loc'), - loc_addr: parse_element_attributes_for('addr', rules.children, 'loc'), + { name: parse_element_attributes_for('name', rules.children), + org_name: parse_element_attributes_for('org_name', rules.children), + address: parse_element_attributes_for('addr', rules.children), phone: rules.css('voice').present?, email: rules.css('email').present?, fax: rules.css('fax').present? }.delete_if { |_k, v| v.nil? || v == false } end - # el is the element we are looking for - # rules are the contents of disclose element - # value is loc/int depending on what type of el we are looking for - def parse_element_attributes_for(el, rules, value) - rules.css(el).each do |rule| - next unless rule.try(:attributes) || rule.attributes['type'] - return rule.attributes['type'].value.present? if rule.attributes['type'].value == value - end + def parse_element_attributes_for(el, rules) + return true if rules.css(el).present? nil end end diff --git a/config/initializers/initial_settings.rb b/config/initializers/initial_settings.rb new file mode 100644 index 000000000..7b409f9f6 --- /dev/null +++ b/config/initializers/initial_settings.rb @@ -0,0 +1,6 @@ +Setting.disclosure_name = true if Setting.disclosure_name.nil? +Setting.disclosure_org_name = true if Setting.disclosure_org_name.nil? +Setting.disclosure_email = true if Setting.disclosure_email.nil? +Setting.disclosure_phone = false if Setting.disclosure_phone.nil? +Setting.disclosure_fax = false if Setting.disclosure_fax.nil? +Setting.disclosure_address = false if Setting.disclosure_address.nil? diff --git a/spec/epp/contact_spec.rb b/spec/epp/contact_spec.rb index d35138526..66bcf3308 100644 --- a/spec/epp/contact_spec.rb +++ b/spec/epp/contact_spec.rb @@ -22,6 +22,7 @@ describe 'EPP Contact', epp: true do Fabricate(:epp_user, username: 'zone', registrar: zone) Fabricate(:epp_user, username: 'elkdata', registrar: elkdata) create_settings + create_disclosure_settings end context 'create command' do @@ -96,6 +97,50 @@ describe 'EPP Contact', epp: true do # 5 seconds for what-ever weird lag reasons might happen expect(cr_date.text.to_time).to be_within(5).of(Time.now) end + + it 'creates disclosure data' do + xml = { + disclose: { value: { + voice: { value: '' }, + addr: { value: '' }, + name: { value: '' }, + org_name: { value: '' }, + email: { value: '' }, + fax: { value: '' } + }, attrs: { flag: '1' } + } + } + + response = epp_request(create_contact_xml(xml), :xml) + expect(response[:result_code]).to eq('1000') + + expect(Contact.last.disclosure.name).to eq(true) + expect(Contact.last.disclosure.org_name).to eq(true) + expect(Contact.last.disclosure.phone).to eq(true) + expect(Contact.last.disclosure.fax).to eq(true) + expect(Contact.last.disclosure.email).to eq(true) + expect(Contact.last.disclosure.address).to eq(true) + end + + it 'creates disclosure data merging with defaults' do + xml = { + disclose: { value: { + voice: { value: '' }, + addr: { value: '' } + }, attrs: { flag: '1' } + } + } + + response = epp_request(create_contact_xml(xml), :xml) + expect(response[:result_code]).to eq('1000') + + expect(Contact.last.disclosure.name).to eq(true) + expect(Contact.last.disclosure.org_name).to eq(true) + expect(Contact.last.disclosure.phone).to eq(true) + expect(Contact.last.disclosure.fax).to eq(false) + expect(Contact.last.disclosure.email).to eq(true) + expect(Contact.last.disclosure.address).to eq(true) + end end context 'update command' do diff --git a/spec/models/contact_disclosure_spec.rb b/spec/models/contact_disclosure_spec.rb index f468f93e1..fa9ae0e31 100644 --- a/spec/models/contact_disclosure_spec.rb +++ b/spec/models/contact_disclosure_spec.rb @@ -18,10 +18,19 @@ describe '.extract_attributes' do # TODO: remodel create contact xml to support disclosure it 'should return disclosure has if disclosure' do - f = File.open('spec/epp/requests/contacts/create_with_two_addresses.xml') - parsed_frame = Nokogiri::XML(f).remove_namespaces! - f.close + xml = EppXml::Contact.create( + { + disclose: { value: { + voice: { value: '' }, + addr: { value: '' }, + name: { value: '' }, + org_name: { value: '' }, + email: { value: '' }, + fax: { value: '' } + }, attrs: { flag: '0' } + } }) + parsed_frame = Nokogiri::XML(xml).remove_namespaces! result = ContactDisclosure.extract_attributes(parsed_frame) - expect(result).to eq({ phone: '0', email: '0' }) + expect(result).to eq({ phone: '0', email: '0', fax: '0', address: '0', name: '0', org_name: '0' }) end end diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb index 2d39fe391..6f69b9ba2 100644 --- a/spec/models/contact_spec.rb +++ b/spec/models/contact_spec.rb @@ -1,6 +1,7 @@ require 'rails_helper' describe Contact do + before { create_disclosure_settings } it { should have_one(:address) } context 'with invalid attribute' do @@ -32,11 +33,30 @@ describe Contact do end context 'with valid attributes' do - before(:each) { @contact = Fabricate(:contact) } + before(:each) { @contact = Fabricate(:contact, disclosure: nil) } it 'should return true' do expect(@contact.valid?).to be true end + + it 'should have default disclosure' do + expect(@contact.disclosure.name).to be true + expect(@contact.disclosure.org_name).to be true + expect(@contact.disclosure.email).to be true + expect(@contact.disclosure.phone).to be false + expect(@contact.disclosure.fax).to be false + expect(@contact.disclosure.address).to be false + end + + it 'should have custom disclosure' do + @contact = Fabricate(:contact, disclosure: Fabricate(:contact_disclosure)) + expect(@contact.disclosure.name).to be true + expect(@contact.disclosure.org_name).to be true + expect(@contact.disclosure.email).to be true + expect(@contact.disclosure.phone).to be true + expect(@contact.disclosure.fax).to be true + expect(@contact.disclosure.address).to be true + end end context 'with callbacks' do diff --git a/spec/support/general.rb b/spec/support/general.rb index 99de8a409..03b3bbd03 100644 --- a/spec/support/general.rb +++ b/spec/support/general.rb @@ -12,6 +12,15 @@ module General Setting.transfer_wait_time = 0 end + + def create_disclosure_settings + Setting.disclosure_name = true + Setting.disclosure_org_name = true + Setting.disclosure_email = true + Setting.disclosure_phone = false + Setting.disclosure_fax = false + Setting.disclosure_address = false + end end RSpec.configure do |c|