From 415f109d8f7b6226f1c0d1e1f5b6577778eb70b1 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 18 Aug 2014 14:54:46 +0300 Subject: [PATCH] Dynamic validations example --- app/models/domain.rb | 6 +- app/models/setting_group.rb | 7 ++ spec/epp/domain_spec.rb | 5 +- spec/fabricators/setting_group_fabricator.rb | 8 ++ spec/features/setting_management_spec.rb | 2 +- spec/models/contact_spec.rb | 6 +- spec/models/domain_spec.rb | 89 ++++++++++---------- 7 files changed, 75 insertions(+), 48 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index eb6de0f13..a3775a244 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -127,8 +127,10 @@ class Domain < ActiveRecord::Base ### VALIDATIONS ### def validate_nameservers_count - unless nameservers.length.between?(1, 13) - errors.add(:nameservers, :out_of_range, {min: 1, max: 13}) + sg = SettingGroup.find_by(code: SettingGroup::DOMAIN_VALIDATION_CODE) + min, max = sg.get(:ns_min_count).to_i, sg.get(:ns_max_count).to_i + unless nameservers.length.between?(min, max) + errors.add(:nameservers, :out_of_range, {min: min, max: max}) end end diff --git a/app/models/setting_group.rb b/app/models/setting_group.rb index 914cd5b32..0435677f8 100644 --- a/app/models/setting_group.rb +++ b/app/models/setting_group.rb @@ -2,4 +2,11 @@ class SettingGroup < ActiveRecord::Base has_many :settings accepts_nested_attributes_for :settings + + DOMAIN_VALIDATION_CODE = 'domain_validation' + + def get(key) + s = settings.find_by(code: key.to_s) + s.try(:value) + end end diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index f03b095d2..87d5a5f60 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -4,7 +4,10 @@ describe 'EPP Domain', epp: true do let(:server) { server = Epp::Server.new({server: 'localhost', tag: 'gitlab', password: 'ghyt9e4fu', port: 701}) } context 'with valid user' do - before(:each) { Fabricate(:epp_user) } + before(:each) do + Fabricate(:epp_user) + Fabricate(:domain_validation_setting_group) + end it 'returns error if contact does not exists' do Fabricate(:contact, code: 'jd1234') diff --git a/spec/fabricators/setting_group_fabricator.rb b/spec/fabricators/setting_group_fabricator.rb index 953dfe490..0a05b7125 100644 --- a/spec/fabricators/setting_group_fabricator.rb +++ b/spec/fabricators/setting_group_fabricator.rb @@ -5,3 +5,11 @@ Fabricator(:setting_group) do Fabricate(:setting, code: 'ns_max_count', value: 13) ]} end + +Fabricator(:domain_validation_setting_group, from: :setting_group) do + code 'domain_validation' + settings { [ + Fabricate(:setting, code: 'ns_min_count', value: 1), + Fabricate(:setting, code: 'ns_max_count', value: 13) + ]} +end diff --git a/spec/features/setting_management_spec.rb b/spec/features/setting_management_spec.rb index decf5622a..fc962e088 100644 --- a/spec/features/setting_management_spec.rb +++ b/spec/features/setting_management_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' feature 'Setting management' do - background { Fabricate(:setting_group) } + background { Fabricate(:domain_validation_setting_group) } scenario 'User changes a setting', js: true do visit root_path diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb index bfa3d61b5..2d37e63af 100644 --- a/spec/models/contact_spec.rb +++ b/spec/models/contact_spec.rb @@ -51,7 +51,11 @@ describe Contact, '#get_relation' do end describe Contact, '#has_relation' do - before(:each) { Fabricate(:domain) } + before(:each) do + Fabricate(:domain_validation_setting_group) + Fabricate(:domain) + end + it 'should return false if no relation' do expect(Contact.last.has_relation(:chewbacca)).to eq false end diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index fd2278fa9..244fe75c1 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -7,55 +7,58 @@ describe Domain do it { should have_many(:tech_contacts) } it { should have_many(:admin_contacts) } - it 'validates domain name' do - d = Fabricate(:domain) - expect(d.name).to_not be_nil + context 'with sufficient settings' do + before(:each) { Fabricate(:domain_validation_setting_group) } - invalid = ['a.ee', "#{'a' * 64}.ee", 'ab.eu', 'test.ab.ee', '-test.ee', '-test-.ee', 'test-.ee', 'te--st.ee', 'õ.pri.ee', 'test.com', 'www.ab.ee', 'test.eu', ' .ee', 'a b.ee', 'Ž .ee', 'test.edu.ee'] + it 'validates domain name' do + d = Fabricate(:domain) + expect(d.name).to_not be_nil - invalid.each do |x| - expect(Fabricate.build(:domain, name: x).valid?).to be false + invalid = ['a.ee', "#{'a' * 64}.ee", 'ab.eu', 'test.ab.ee', '-test.ee', '-test-.ee', 'test-.ee', 'te--st.ee', 'õ.pri.ee', 'test.com', 'www.ab.ee', 'test.eu', ' .ee', 'a b.ee', 'Ž .ee', 'test.edu.ee'] + + invalid.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be false + end + + valid = ['ab.ee', "#{'a' * 63}.ee", 'te-s-t.ee', 'jäääär.ee', 'päike.pri.ee', 'õigus.com.ee', 'õäöü.fie.ee', 'test.med.ee', 'žä.ee', ' ŽŠ.ee '] + + valid.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be true + end + + invalid_punycode = ['xn--geaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-4we.pri.ee'] + + invalid_punycode.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be false + end + + valid_punycode = ['xn--ge-uia.pri.ee', 'xn--geaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-9te.pri.ee'] + + valid_punycode.each do |x| + expect(Fabricate.build(:domain, name: x).valid?).to be true + end + + d = Domain.new + expect(d.valid?).to be false + + expect(d.errors.messages).to match_array({ + name: ['is missing'], + period: ['is not a number'], + owner_contact: ["Registrant is missing"], + admin_contacts: ["Admin contact is missing"], + nameservers: ["Nameservers count must be between 1-13"] + }) end - valid = ['ab.ee', "#{'a' * 63}.ee", 'te-s-t.ee', 'jäääär.ee', 'päike.pri.ee', 'õigus.com.ee', 'õäöü.fie.ee', 'test.med.ee', 'žä.ee', ' ŽŠ.ee '] - - valid.each do |x| - expect(Fabricate.build(:domain, name: x).valid?).to be true + it 'does not create a reserved domain' do + Fabricate(:reserved_domain) + expect(Fabricate.build(:domain, name: '1162.ee').valid?).to be false end - invalid_punycode = ['xn--geaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-4we.pri.ee'] - - invalid_punycode.each do |x| - expect(Fabricate.build(:domain, name: x).valid?).to be false + it 'validates period' do + expect(Fabricate.build(:domain, period: 0).valid?).to be false + expect(Fabricate.build(:domain, period: 4).valid?).to be false + expect(Fabricate.build(:domain, period: 3).valid?).to be true end - - valid_punycode = ['xn--ge-uia.pri.ee', 'xn--geaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-9te.pri.ee'] - - valid_punycode.each do |x| - expect(Fabricate.build(:domain, name: x).valid?).to be true - end - - d = Domain.new - expect(d.valid?).to be false - - expect(d.errors.messages).to match_array({ - name: ['is missing'], - period: ['is not a number'], - owner_contact: ["Registrant is missing"], - admin_contacts: ["Admin contact is missing"], - nameservers: ["Nameservers count must be between 1-13"] - }) end - - it 'does not create a reserved domain' do - Fabricate(:reserved_domain) - expect(Fabricate.build(:domain, name: '1162.ee').valid?).to be false - end - - it 'validates period' do - expect(Fabricate.build(:domain, period: 0).valid?).to be false - expect(Fabricate.build(:domain, period: 4).valid?).to be false - expect(Fabricate.build(:domain, period: 3).valid?).to be true - end - end