diff --git a/app/controllers/admin/registrars_controller.rb b/app/controllers/admin/registrars_controller.rb index 34eb49598..c45911309 100644 --- a/app/controllers/admin/registrars_controller.rb +++ b/app/controllers/admin/registrars_controller.rb @@ -19,17 +19,15 @@ module Admin def create @registrar = Registrar.new(registrar_params) - begin + if @registrar.valid? @registrar.transaction do @registrar.save! @registrar.accounts.create!(account_type: Account::CASH, currency: 'EUR') end - flash[:notice] = t('.created') - redirect_to [:admin, @registrar] - rescue ActiveRecord::RecordInvalid - flash.now[:alert] = t('.not_created') - render 'new' + redirect_to [:admin, @registrar], notice: t('.created') + else + render :new end end @@ -38,22 +36,15 @@ module Admin def update if @registrar.update(registrar_params) - flash[:notice] = t('.updated') - redirect_to [:admin, @registrar] + redirect_to [:admin, @registrar], notice: t('.updated') else - flash.now[:alert] = t('.not_updated') - render 'edit' + render :edit end end def destroy - if @registrar.destroy - flash[:notice] = I18n.t('registrar_deleted') - redirect_to admin_registrars_path - else - flash.now[:alert] = I18n.t('failed_to_delete_registrar') - render 'show' - end + @registrar.destroy! + redirect_to admin_registrars_url, notice: t('.deleted') end private diff --git a/app/models/registrar.rb b/app/models/registrar.rb index 181ddab18..1d5c4eba3 100644 --- a/app/models/registrar.rb +++ b/app/models/registrar.rb @@ -24,7 +24,7 @@ class Registrar < ActiveRecord::Base has_many :api_users, dependent: :restrict_with_error has_many :messages has_many :invoices, foreign_key: 'buyer_id' - has_many :accounts + has_many :accounts, dependent: :destroy has_many :nameservers, through: :domains has_many :whois_records has_many :white_ips, dependent: :destroy @@ -39,38 +39,11 @@ class Registrar < ActiveRecord::Base validates :vat_rate, presence: true, if: 'foreign_vat_payer? && vat_no.blank?' validates :vat_rate, absence: true, if: 'foreign_vat_payer? && vat_no?' validates :vat_rate, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 99 }, allow_nil: true - validate :forbidden_codes + validate :forbid_special_code attribute :vat_rate, VATRateType.new after_initialize :set_defaults - - def forbidden_codes - return true unless ['CID'].include? code - errors.add(:code, I18n.t(:forbidden_code)) - false - end - before_validation :generate_iso_11649_reference_no - def generate_iso_11649_reference_no - return if reference_no.present? - - loop do - base = nil - loop do - base = SecureRandom.random_number.to_s.last(8) - break if base.to_i != 0 && base.length == 8 - end - - control_base = (base + '2715' + '00').to_i - reminder = control_base % 97 - check_digits = 98 - reminder - - check_digits = check_digits < 10 ? "0#{check_digits}" : check_digits.to_s - - self.reference_no = "RF#{check_digits}#{base}" - break unless self.class.exists?(reference_no: reference_no) - end - end validates :email, :billing_email, email_format: { message: :invalid }, @@ -211,6 +184,31 @@ class Registrar < ActiveRecord::Base self.language = Setting.default_language unless language end + def forbid_special_code + errors.add(:code, :forbidden) if code == 'CID' + end + + def generate_iso_11649_reference_no + return if reference_no.present? + + loop do + base = nil + loop do + base = SecureRandom.random_number.to_s.last(8) + break if base.to_i != 0 && base.length == 8 + end + + control_base = (base + '2715' + '00').to_i + reminder = control_base % 97 + check_digits = 98 - reminder + + check_digits = check_digits < 10 ? "0#{check_digits}" : check_digits.to_s + + self.reference_no = "RF#{check_digits}#{base}" + break unless self.class.exists?(reference_no: reference_no) + end + end + def local_vat_payer? country == Registry.instance.legal_address_country end diff --git a/app/views/admin/registrars/_billing.html.erb b/app/views/admin/registrars/_billing.html.erb new file mode 100644 index 000000000..f3960233e --- /dev/null +++ b/app/views/admin/registrars/_billing.html.erb @@ -0,0 +1,17 @@ +
+
+ <%= t '.header' %> +
+
+
+
<%= Registrar.human_attribute_name :vat_no %>
+
<%= registrar.vat_no %>
+ +
<%= Registrar.human_attribute_name :accounting_customer_code %>
+
<%= registrar.accounting_customer_code %>
+ +
<%= Registrar.human_attribute_name :billing_email %>
+
<%= registrar.billing_email %>
+
+
+
diff --git a/app/views/admin/registrars/_form.html.erb b/app/views/admin/registrars/_form.html.erb index 65a5351ad..71c4fb68f 100644 --- a/app/views/admin/registrars/_form.html.erb +++ b/app/views/admin/registrars/_form.html.erb @@ -1,5 +1,6 @@ <%= form_for([:admin, @registrar], html: { class: 'form-horizontal' }) do |f| %> - <%= render 'shared/full_errors', object: @registrar %> + <%= render 'form_errors', target: @registrar %> +
@@ -133,7 +134,9 @@ <%= f.label :code %>
- <%= f.text_field :code, required: f.object.new_record?, class: 'form-control', disabled: !f.object.new_record? %> + <%= f.text_field :code, required: f.object.new_record?, + disabled: f.object.persisted?, + class: 'form-control' %>
diff --git a/app/views/admin/registrars/edit.html.erb b/app/views/admin/registrars/edit.html.erb index 71d6bd882..205ba6b28 100644 --- a/app/views/admin/registrars/edit.html.erb +++ b/app/views/admin/registrars/edit.html.erb @@ -1,5 +1,10 @@ -<% content_for :actions do %> - <%= link_to(t(:back_to_registrar), [:admin, @registrar], class: 'btn btn-default') %> -<% end %> -<%= render 'shared/title', name: "#{t(:edit)}: #{@registrar.name}" %> + + + + <%= render 'form' %> diff --git a/app/views/admin/registrars/index.html.erb b/app/views/admin/registrars/index.html.erb index 5533a6f07..49bf7eae8 100644 --- a/app/views/admin/registrars/index.html.erb +++ b/app/views/admin/registrars/index.html.erb @@ -1,7 +1,15 @@ -<% content_for :actions do %> - <%= link_to(t('.new_btn'), new_admin_registrar_path, class: 'btn btn-primary') %> -<% end %> -<%= render 'shared/title', name: t(:registrars) %> + +
diff --git a/app/views/admin/registrars/new.html.erb b/app/views/admin/registrars/new.html.erb index 70154d217..e813bdd57 100644 --- a/app/views/admin/registrars/new.html.erb +++ b/app/views/admin/registrars/new.html.erb @@ -1,2 +1,9 @@ -<%= render 'shared/title', name: t(:new_registrar) %> + + + + <%= render 'form' %> diff --git a/app/views/admin/registrars/show.html.erb b/app/views/admin/registrars/show.html.erb index c09602985..ef75e4a64 100644 --- a/app/views/admin/registrars/show.html.erb +++ b/app/views/admin/registrars/show.html.erb @@ -1,15 +1,31 @@ <% registrar = RegistrarPresenter.new(registrar: @registrar, view: self) %> -<% content_for :actions do %> - <%= link_to(t(:edit), edit_admin_registrar_path(@registrar), class: 'btn btn-primary') %> - <%= link_to(t(:delete), admin_registrar_path(@registrar), method: :delete, data: { confirm: t(:are_you_sure) }, class: 'btn btn-danger') %> -<% end %> -<% content_for :page_name do %> - <%= @registrar.name %> - <% if @registrar.test_registrar? %> - (test) - <% end %> -<% end %> -<%= render 'shared/title', name: @registrar.name %> + + + + + <% if @registrar.errors.any? %> <% @registrar.errors.each do |attr, err| %> <%= err %> @@ -41,12 +57,6 @@
<%= @registrar.reg_no %>
-
- <%= t(:vat_no) %> -
-
- <%= @registrar.vat_no %> -
<%= t(:reference_no) %>
@@ -71,12 +81,6 @@
<%= @registrar.website %>
-
- <%= Registrar.human_attribute_name :accounting_customer_code %> -
-
- <%= @registrar.accounting_customer_code %> -
@@ -120,21 +124,16 @@
<%= @registrar.billing_address %>
-
- <%= t(:billing_email) %> -
-
- <%= @registrar.billing_email %> -
+ <%= render 'billing', registrar: @registrar %> <%= render 'admin/registrars/show/preferences', registrar: registrar %>
-
+
<%= t('.api_users') %> @@ -174,7 +173,7 @@
-
+
<%= t(:white_ips) %> diff --git a/app/views/registrant/registrars/show.haml b/app/views/registrant/registrars/show.haml index e0da73ee3..6d4aa9e79 100644 --- a/app/views/registrant/registrars/show.haml +++ b/app/views/registrant/registrars/show.haml @@ -19,7 +19,7 @@ %dt= t(:reg_no) %dd= @registrar.reg_no - %dt= t(:vat_no) + %dt= Registrar.human_attribute_name :vat_no %dd= @registrar.vat_no %dt= t(:id) diff --git a/app/views/registrar/invoices/partials/_seller.haml b/app/views/registrar/invoices/partials/_seller.haml index 0008c2f13..9c5387e16 100644 --- a/app/views/registrar/invoices/partials/_seller.haml +++ b/app/views/registrar/invoices/partials/_seller.haml @@ -16,7 +16,7 @@ %dt= t(:swift) %dd= @invoice.seller_swift - %dt= t(:vat_no) + %dt= Registrar.human_attribute_name :vat_no %dd= @invoice.seller_vat_no %dt= t(:address) diff --git a/app/views/registrar/invoices/pdf.haml b/app/views/registrar/invoices/pdf.haml index 1622613f5..6f92c4a8a 100644 --- a/app/views/registrar/invoices/pdf.haml +++ b/app/views/registrar/invoices/pdf.haml @@ -261,7 +261,7 @@ %br = "#{t('reg_no')} #{@invoice.seller_reg_no}" %br - = "#{t('vat_no')} #{@invoice.seller_vat_no}" + = "#{Registrar.human_attribute_name :vat_no} #{@invoice.seller_vat_no}" .col-md-3.left = @invoice.seller_phone diff --git a/config/locales/admin/registrars.en.yml b/config/locales/admin/registrars.en.yml index 3d269f64b..5d212f219 100644 --- a/config/locales/admin/registrars.en.yml +++ b/config/locales/admin/registrars.en.yml @@ -2,9 +2,16 @@ en: admin: registrars: index: + header: Registrars new_btn: New registrar + new: + header: New registrar + show: + edit_btn: Edit + delete_btn: Delete + delete_btn_confirm: Are you sure you want delete registrar? new_api_use_btn: New API user active: Active api_users: API users @@ -12,13 +19,20 @@ en: preferences: header: Preferences + edit: + header: Edit registrar + + billing: + header: Billing + create: created: Registrar has been successfully created - not_created: Unable to create registrar update: updated: Registrar has been successfully updated - not_updated: Unable to update registrar + + destroy: + deleted: Registrar has been successfully deleted form: misc: Miscellaneous diff --git a/config/locales/en.yml b/config/locales/en.yml index 6feb4c353..f2d08e7f0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -199,7 +199,6 @@ en: alg: 'Algorithm' public_key: 'Public key' registrar: - billing_email: 'Billing e-mail' phone: 'Contact phone' email: 'Contact e-mail' state: 'State / Province' @@ -315,13 +314,7 @@ en: edit_statuses: 'Edit statuses' history: 'History' - new_registrar: 'New registrar' - registrar_details: 'Registrar details' - vat_no: 'VAT no' - edit_registrar: 'Edit registrar' back_to_registrar: 'Back to registrar' - registrar_deleted: 'Registrar deleted' - failed_to_delete_registrar: 'Failed to delete registrar' users: 'Users' user_details: 'User details' @@ -652,7 +645,6 @@ en: due_date_until: 'Due date until' minimum_total: 'Minimum total' maximum_total: 'Maximum total' - forbidden_code: 'is forbidden to use' unimplemented_object_service: 'Unimplemented object service' contact_email_update_subject: 'Teie domeenide kontakt epostiaadress on muutunud / Contact e-mail addresses of your domains have changed' object_status_prohibits_operation: 'Object status prohibits operation' @@ -782,4 +774,5 @@ en: unit: € attributes: + vat_no: VAT number vat_rate: VAT rate diff --git a/config/locales/registrars.en.yml b/config/locales/registrars.en.yml new file mode 100644 index 000000000..60cb9d5c5 --- /dev/null +++ b/config/locales/registrars.en.yml @@ -0,0 +1,8 @@ +en: + activerecord: + errors: + models: + registrar: + attributes: + code: + forbidden: is forbidden diff --git a/db/migrate/20180309053424_add_registrars_unique_constraints.rb b/db/migrate/20180309053424_add_registrars_unique_constraints.rb new file mode 100644 index 000000000..1c2d3c1b8 --- /dev/null +++ b/db/migrate/20180309053424_add_registrars_unique_constraints.rb @@ -0,0 +1,19 @@ +class AddRegistrarsUniqueConstraints < ActiveRecord::Migration + def up + execute <<-SQL + ALTER TABLE registrars ADD CONSTRAINT unique_name UNIQUE (name); + ALTER TABLE registrars ADD CONSTRAINT unique_reg_no UNIQUE (reg_no); + ALTER TABLE registrars ADD CONSTRAINT unique_reference_no UNIQUE (reference_no); + ALTER TABLE registrars ADD CONSTRAINT unique_code UNIQUE (code); + SQL + end + + def down + execute <<-SQL + ALTER TABLE registrars DROP CONSTRAINT unique_name; + ALTER TABLE registrars DROP CONSTRAINT unique_reg_no; + ALTER TABLE registrars DROP CONSTRAINT unique_reference_no; + ALTER TABLE registrars DROP CONSTRAINT unique_code; + SQL + end +end diff --git a/db/migrate/20180309053921_remove_registrars_indexes.rb b/db/migrate/20180309053921_remove_registrars_indexes.rb new file mode 100644 index 000000000..0613d9fc6 --- /dev/null +++ b/db/migrate/20180309053921_remove_registrars_indexes.rb @@ -0,0 +1,6 @@ +class RemoveRegistrarsIndexes < ActiveRecord::Migration + def change + remove_index :registrars, name: :index_registrars_on_code + remove_index :registrars, name: :index_registrars_on_legacy_id + end +end diff --git a/db/migrate/20180309054510_add_registrars_not_null_constraints.rb b/db/migrate/20180309054510_add_registrars_not_null_constraints.rb new file mode 100644 index 000000000..33d464356 --- /dev/null +++ b/db/migrate/20180309054510_add_registrars_not_null_constraints.rb @@ -0,0 +1,9 @@ +class AddRegistrarsNotNullConstraints < ActiveRecord::Migration + def change + change_column_null :registrars, :name, false + change_column_null :registrars, :reg_no, false + change_column_null :registrars, :country_code, false + change_column_null :registrars, :email, false + change_column_null :registrars, :code, false + end +end diff --git a/db/structure.sql b/db/structure.sql index fbbb4a7d0..7c78da73d 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2136,8 +2136,8 @@ ALTER SEQUENCE registrant_verifications_id_seq OWNED BY registrant_verifications CREATE TABLE registrars ( id integer NOT NULL, - name character varying, - reg_no character varying, + name character varying NOT NULL, + reg_no character varying NOT NULL, vat_no character varying, billing_address character varying, created_at timestamp without time zone, @@ -2145,14 +2145,14 @@ CREATE TABLE registrars ( creator_str character varying, updator_str character varying, phone character varying, - email character varying, + email character varying NOT NULL, billing_email character varying, - country_code character varying, + country_code character varying NOT NULL, state character varying, city character varying, street character varying, zip character varying, - code character varying, + code character varying NOT NULL, website character varying, accounting_customer_code character varying NOT NULL, legacy_id integer, @@ -3244,6 +3244,14 @@ ALTER TABLE ONLY settings ADD CONSTRAINT settings_pkey PRIMARY KEY (id); +-- +-- Name: unique_code; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY registrars + ADD CONSTRAINT unique_code UNIQUE (code); + + -- -- Name: unique_contact_code; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -3252,6 +3260,30 @@ ALTER TABLE ONLY contacts ADD CONSTRAINT unique_contact_code UNIQUE (code); +-- +-- Name: unique_name; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY registrars + ADD CONSTRAINT unique_name UNIQUE (name); + + +-- +-- Name: unique_reference_no; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY registrars + ADD CONSTRAINT unique_reference_no UNIQUE (reference_no); + + +-- +-- Name: unique_reg_no; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY registrars + ADD CONSTRAINT unique_reg_no UNIQUE (reg_no); + + -- -- Name: unique_session_id; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -3854,20 +3886,6 @@ CREATE INDEX index_registrant_verifications_on_created_at ON registrant_verifica CREATE INDEX index_registrant_verifications_on_domain_id ON registrant_verifications USING btree (domain_id); --- --- Name: index_registrars_on_code; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX index_registrars_on_code ON registrars USING btree (code); - - --- --- Name: index_registrars_on_legacy_id; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX index_registrars_on_legacy_id ON registrars USING btree (legacy_id); - - -- -- Name: index_settings_on_thing_type_and_thing_id_and_var; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -4688,3 +4706,9 @@ INSERT INTO schema_migrations (version) VALUES ('20180306183540'); INSERT INTO schema_migrations (version) VALUES ('20180306183549'); +INSERT INTO schema_migrations (version) VALUES ('20180309053424'); + +INSERT INTO schema_migrations (version) VALUES ('20180309053921'); + +INSERT INTO schema_migrations (version) VALUES ('20180309054510'); + diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake index 6c4be1e53..0d309b539 100644 --- a/lib/tasks/import.rake +++ b/lib/tasks/import.rake @@ -100,7 +100,7 @@ namespace :import do puts "-----> Generating reference numbers" Registrar.all.each do |x| - x.generate_iso_11649_reference_no + x.send(:generate_iso_11649_reference_no) x.save(validate: false) end diff --git a/spec/models/registrar_spec.rb b/spec/models/registrar_spec.rb deleted file mode 100644 index 301d59bcb..000000000 --- a/spec/models/registrar_spec.rb +++ /dev/null @@ -1,117 +0,0 @@ -require 'rails_helper' - -describe Registrar do - context 'with invalid attribute' do - before :all do - @registrar = Registrar.new - end - - it 'is not valid' do - @registrar.valid? - @registrar.errors.full_messages.should include(*[ - 'Contact e-mail is missing', - 'Name is missing', - 'Reg no is missing', - 'Code is missing' - ]) - end - - it 'returns an error with invalid email' do - @registrar.email = 'bla' - @registrar.billing_email = 'bla' - - @registrar.valid? - @registrar.errors[:email].should == ['is invalid'] - @registrar.errors[:billing_email].should == ['is invalid'] - end - - it 'should not have valid code' do - @registrar.code.should == nil - end - - it 'should generate reference number' do - @registrar.generate_iso_11649_reference_no - @registrar.reference_no.should_not be_blank - @registrar.reference_no.last(10).to_i.should_not == 0 - end - end - - context 'with valid attributes' do - before :all do - @registrar = create(:registrar) - end - - it 'should be valid' do - @registrar.valid? - @registrar.errors.full_messages.should match_array([]) - end - - it 'should be valid twice' do - @registrar = create(:registrar) - @registrar.valid? - @registrar.errors.full_messages.should match_array([]) - end - - it 'should remove blank from code' do - registrar = build(:registrar, code: 'with blank') - registrar.valid? - registrar.errors.full_messages.should match_array([ - ]) - registrar.code.should == 'WITHBLANK' - end - - it 'should remove colon from code' do - registrar = build(:registrar, code: 'with colon:and:blank') - registrar.valid? - registrar.errors.full_messages.should match_array([ - ]) - registrar.code.should == 'WITHCOLONANDBLANK' - end - - it 'should allow dot in code' do - registrar = build(:registrar, code: 'with.dot') - registrar.valid? - registrar.errors.full_messages.should match_array([ - ]) - registrar.code.should == 'WITH.DOT' - end - - it 'should have one version' do - with_versioning do - @registrar.versions.should == [] - @registrar.name = 'New name' - @registrar.save - @registrar.errors.full_messages.should match_array([]) - @registrar.versions.size.should == 1 - end - end - - it 'should return full address' do - registrar = described_class.new(street: 'Street 999', city: 'Town', state: 'County', zip: 'Postal') - registrar.address.should == 'Street 999, Town, County, Postal' - end - - it 'should not be able to change code' do - registrar = create(:registrar, code: 'TEST') - registrar.code = 'new-code' - expect(registrar.code).to eq('TEST') - end - - it 'should be able to issue a prepayment invoice' do - Setting.days_to_keep_invoices_active = 30 - create(:registrar, name: 'EIS', reg_no: '90010019') - @registrar.issue_prepayment_invoice(200, 'add some money') - @registrar.invoices.count.should == 1 - i = @registrar.invoices.first - i.sum.should == BigDecimal.new('240.0') - i.due_date.should be_within(0.1).of((Time.zone.now + 30.days).end_of_day) - i.description.should == 'add some money' - end - - it 'should not allaw to use CID as code for leagcy reasons' do - registrar = build(:registrar, code: 'CID') - registrar.valid? - registrar.errors.full_messages.should == ['Code is forbidden to use'] - end - end -end diff --git a/spec/requests/admin/registrars/update_spec.rb b/spec/requests/admin/registrars/update_spec.rb deleted file mode 100644 index 7bffb99d0..000000000 --- a/spec/requests/admin/registrars/update_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'admin registrar update' do - before :example do - sign_in_to_admin_area - end - - it 'updates website' do - registrar = create(:registrar, website: 'test') - - patch admin_registrar_path(registrar), registrar: attributes_for(:registrar, website: 'new-website') - registrar.reload - - expect(registrar.website).to eq('new-website') - end - - it 'updates email' do - registrar = create(:registrar, email: 'test@test.com') - - patch admin_registrar_path(registrar), registrar: attributes_for(:registrar, email: 'new-test@test.com') - registrar.reload - - expect(registrar.email).to eq('new-test@test.com') - end - - it 'updates billing email' do - registrar = create(:registrar, billing_email: 'test@test.com') - - patch admin_registrar_path(registrar), registrar: attributes_for(:registrar, billing_email: 'new-test@test.com') - registrar.reload - - expect(registrar.billing_email).to eq('new-test@test.com') - end - - it 'redirects to :show' do - registrar = create(:registrar) - - patch admin_registrar_path(registrar), { registrar: attributes_for(:registrar) } - - expect(response).to redirect_to admin_registrar_path(registrar) - end -end diff --git a/spec/routing/admin/registrars_routing_spec.rb b/spec/routing/admin/registrars_routing_spec.rb deleted file mode 100644 index 14ec765e9..000000000 --- a/spec/routing/admin/registrars_routing_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require 'rails_helper' - -RSpec.describe Admin::RegistrarsController do - describe 'routing' do - it 'routes to #index' do - expect(get: '/admin/registrars').to route_to('admin/registrars#index') - end - - it 'routes to #new' do - expect(get: '/admin/registrars/new').to route_to('admin/registrars#new') - end - - it 'routes to #show' do - expect(get: '/admin/registrars/1').to route_to('admin/registrars#show', id: '1') - end - - it 'routes to #edit' do - expect(get: '/admin/registrars/1/edit').to route_to('admin/registrars#edit', id: '1') - end - - it 'routes to #create' do - expect(post: '/admin/registrars').to route_to('admin/registrars#create') - end - - it 'routes to #update' do - expect(patch: '/admin/registrars/1').to route_to('admin/registrars#update', id: '1') - end - - it 'routes to #destroy' do - expect(delete: '/admin/registrars/1').to route_to('admin/registrars#destroy', id: '1') - end - end -end diff --git a/spec/views/admin/registrars/_form.html.erb_spec.rb b/spec/views/admin/registrars/_form.html.erb_spec.rb deleted file mode 100644 index 83b727a30..000000000 --- a/spec/views/admin/registrars/_form.html.erb_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'admin/registrars/_form' do - let(:registrar) { build_stubbed(:registrar) } - - before :example do - assign(:registrar, registrar) - stub_template 'shared/_full_errors' => '' - - without_partial_double_verification do - allow(view).to receive(:available_languages).and_return({}) - end - end - - it 'has website' do - render - expect(rendered).to have_css('[name="registrar[website]"]') - end -end diff --git a/spec/views/admin/registrars/show.haml_spec.rb b/spec/views/admin/registrars/show.haml_spec.rb deleted file mode 100644 index 4def10e8c..000000000 --- a/spec/views/admin/registrars/show.haml_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'admin/registrars/show' do - let(:registrar) { build_stubbed(:registrar, website: 'test website') } - - before :example do - assign(:registrar, registrar) - stub_template 'shared/_title' => '' - - without_partial_double_verification do - allow(view).to receive(:available_languages).and_return({}) - end - end - - it 'has website' do - render - expect(rendered).to have_text('test website') - end -end diff --git a/test/controllers/admin/registrars/update_test.rb b/test/controllers/admin/registrars/update_test.rb deleted file mode 100644 index 2c996ef44..000000000 --- a/test/controllers/admin/registrars/update_test.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'test_helper' - -class RegistrarsControllerTest < ActionDispatch::IntegrationTest - def setup - login_as users(:admin) - @registrar = registrars(:bestnames) - end - - def test_updates_website - patch admin_registrar_path(@registrar), registrar: @registrar.attributes.merge(website: 'new.example.com') - @registrar.reload - - assert_equal 'new.example.com', @registrar.website - end - - def test_updates_email - patch admin_registrar_path(@registrar), registrar: @registrar.attributes.merge(email: 'new@example.com') - @registrar.reload - - assert_equal 'new@example.com', @registrar.email - end - - def test_updates_billing_email - patch admin_registrar_path(@registrar), - registrar: @registrar.attributes.merge(billing_email: 'new-billing@example.com') - @registrar.reload - - assert_equal 'new-billing@example.com', @registrar.billing_email - end -end diff --git a/test/fixtures/accounts.yml b/test/fixtures/accounts.yml index ea51ff7eb..a7060c249 100644 --- a/test/fixtures/accounts.yml +++ b/test/fixtures/accounts.yml @@ -3,3 +3,9 @@ cash: balance: 100 currency: EUR registrar: bestnames + +not_in_use_cash: + account_type: cash + balance: 0 + currency: EUR + registrar: not_in_use diff --git a/test/fixtures/registrars.yml b/test/fixtures/registrars.yml index 0026f323b..b0cc371a7 100644 --- a/test/fixtures/registrars.yml +++ b/test/fixtures/registrars.yml @@ -3,6 +3,10 @@ bestnames: reg_no: 1234 code: bestnames email: info@bestnames.test + street: Main Street + zip: 12345 + city: New York + state: New York country_code: US accounting_customer_code: bestnames language: en @@ -16,3 +20,12 @@ goodnames: country_code: US accounting_customer_code: goodnames language: en + +not_in_use: + name: any + reg_no: any + code: any + email: any@example.com + country_code: US + accounting_customer_code: any + language: en diff --git a/test/integration/admin/registrars/delete_test.rb b/test/integration/admin/registrars/delete_test.rb new file mode 100644 index 000000000..22e561664 --- /dev/null +++ b/test/integration/admin/registrars/delete_test.rb @@ -0,0 +1,18 @@ +require 'test_helper' + +class AdminAreaDeleteRegistrarTest < ActionDispatch::IntegrationTest + def setup + login_as users(:admin) + end + + def test_can_be_deleted_if_not_in_use + visit admin_registrar_url(registrars(:not_in_use)) + + assert_difference 'Registrar.count', -1 do + click_link_or_button 'Delete' + end + + assert_current_path admin_registrars_path + assert_text 'Registrar has been successfully deleted' + end +end diff --git a/test/integration/admin/registrars/edit_registrar_test.rb b/test/integration/admin/registrars/edit_registrar_test.rb deleted file mode 100644 index ada794032..000000000 --- a/test/integration/admin/registrars/edit_registrar_test.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'test_helper' - -class EditRegistrarTest < ActionDispatch::IntegrationTest - def setup - login_as users(:admin) - @registrar = registrars(:bestnames) - end - - def test_updates_registrar - visit admin_registrar_path(@registrar) - click_link_or_button 'Edit' - click_link_or_button 'Update registrar' - - assert_current_path admin_registrar_path(@registrar) - assert_text 'Registrar has been successfully updated' - end -end diff --git a/test/integration/admin/registrars/edit_test.rb b/test/integration/admin/registrars/edit_test.rb new file mode 100644 index 000000000..af420b179 --- /dev/null +++ b/test/integration/admin/registrars/edit_test.rb @@ -0,0 +1,69 @@ +require 'test_helper' + +class AdminAreaEditRegistrarTest < ActionDispatch::IntegrationTest + def setup + login_as users(:admin) + @registrar = registrars(:bestnames) + end + + def test_attributes_update + visit admin_registrar_path(@registrar) + click_link_or_button 'Edit' + + fill_in 'Name', with: 'new name' + fill_in 'Reg no', with: '4727673' + fill_in 'Contact phone', with: '2570937' + fill_in 'Website', with: 'http://new.example.com' + fill_in 'Contact e-mail', with: 'new@example.com' + + fill_in 'Street', with: 'new street' + fill_in 'Zip', with: 'new zip' + fill_in 'City', with: 'new city' + fill_in 'State / Province', with: 'new state' + select 'Germany', from: 'Country' + + fill_in 'VAT number', with: '2386449' + fill_in 'Accounting customer code', with: '866477' + fill_in 'Billing email', with: 'new-billing@example.com' + + select 'Estonian', from: 'Language' + click_link_or_button 'Update registrar' + + @registrar.reload + assert_equal 'new name', @registrar.name + assert_equal '4727673', @registrar.reg_no + assert_equal '2570937', @registrar.phone + assert_equal 'http://new.example.com', @registrar.website + assert_equal 'new@example.com', @registrar.email + + assert_equal 'new street', @registrar.street + assert_equal 'new zip', @registrar.zip + assert_equal 'new city', @registrar.city + assert_equal 'new state', @registrar.state + assert_equal Country.new('DE'), @registrar.country + + assert_equal '2386449', @registrar.vat_no + assert_equal '866477', @registrar.accounting_customer_code + assert_equal 'new-billing@example.com', @registrar.billing_email + + assert_equal 'et', @registrar.language + assert_current_path admin_registrar_path(@registrar) + assert_text 'Registrar has been successfully updated' + end + + def test_code_cannot_be_changed + visit admin_registrar_path(@registrar) + click_link_or_button 'Edit' + assert_no_field 'Code' + end + + def test_fails_gracefully + visit admin_registrar_path(@registrar) + click_link_or_button 'Edit' + fill_in 'Name', with: 'Good Names' + click_link_or_button 'Update registrar' + + assert_field 'Name', with: 'Good Names' + assert_text 'Name has already been taken' + end +end diff --git a/test/integration/admin/registrars/new_registrar_test.rb b/test/integration/admin/registrars/new_registrar_test.rb deleted file mode 100644 index 33deea9e8..000000000 --- a/test/integration/admin/registrars/new_registrar_test.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'test_helper' - -class NewRegistrarTest < ActionDispatch::IntegrationTest - def setup - login_as users(:admin) - end - - def test_creates_registrar - visit admin_registrars_path - click_link_or_button 'New registrar' - - fill_in 'registrar[name]', with: 'John Doe' - fill_in 'registrar[reg_no]', with: '1234567' - fill_in 'registrar[email]', with: 'test@test.com' - fill_in 'registrar[code]', with: 'test' - fill_in 'registrar[accounting_customer_code]', with: 'test' - click_link_or_button 'Create registrar' - - assert_current_path admin_registrar_path(Registrar.last) - assert_text 'Registrar has been successfully created' - assert_text 'John Doe' - end -end diff --git a/test/integration/admin/registrars/new_test.rb b/test/integration/admin/registrars/new_test.rb new file mode 100644 index 000000000..61a7a43be --- /dev/null +++ b/test/integration/admin/registrars/new_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class AdminAreaNewRegistrarTest < ActionDispatch::IntegrationTest + def setup + login_as users(:admin) + end + + def test_new_registrar_creation_with_required_params + visit admin_registrars_url + click_link_or_button 'New registrar' + + fill_in 'Name', with: 'Brand new names' + fill_in 'Reg no', with: '55555555' + fill_in 'Contact e-mail', with: 'test@example.com' + fill_in 'Accounting customer code', with: 'test' + fill_in 'Code', with: 'test' + + assert_difference 'Registrar.count' do + click_link_or_button 'Create registrar' + end + + assert_current_path admin_registrar_path(Registrar.last) + assert_text 'Registrar has been successfully created' + end + + def test_fails_gracefully + visit admin_registrars_url + click_link_or_button 'New registrar' + + fill_in 'Name', with: 'Best Names' + fill_in 'Reg no', with: '55555555' + fill_in 'Contact e-mail', with: 'test@example.com' + fill_in 'Accounting customer code', with: 'test' + fill_in 'Code', with: 'test' + + assert_no_difference 'Registrar.count' do + click_link_or_button 'Create registrar' + end + assert_field 'Name', with: 'Best Names' + assert_text 'Name has already been taken' + end + + def test_pre_populated_default_language + Setting.default_language = 'en' + visit admin_registrars_url + click_link_or_button 'New registrar' + assert_field 'Language', with: 'en' + end +end diff --git a/test/models/registrar/code_test.rb b/test/models/registrar/code_test.rb new file mode 100644 index 000000000..7b5188878 --- /dev/null +++ b/test/models/registrar/code_test.rb @@ -0,0 +1,29 @@ +require 'test_helper' + +class RegistrarCodeTest < ActiveSupport::TestCase + def setup + @registrar = registrars(:bestnames).dup + end + + def test_registrar_is_invalid_without_code + @registrar.code = '' + assert @registrar.invalid? + end + + def test_special_code_validation + @registrar.code = 'CID' + assert @registrar.invalid? + assert_includes @registrar.errors.full_messages, 'Code is forbidden' + end + + def test_cannot_be_changed_once_registrar_is_created + registrar = registrars(:bestnames) + registrar.update!(code: 'new-code') + refute_equal 'new-code', registrar.code + end + + def test_normalization + @registrar.code = 'with spaces:and:colon.' + assert_equal 'WITHSPACESANDCOLON.', @registrar.code + end +end diff --git a/test/models/registrar/delete_test.rb b/test/models/registrar/delete_test.rb new file mode 100644 index 000000000..2020c76dc --- /dev/null +++ b/test/models/registrar/delete_test.rb @@ -0,0 +1,37 @@ +require 'test_helper' + +class DeleteRegistrarTest < ActiveSupport::TestCase + def setup + @registrar = registrars(:not_in_use) + end + + def test_can_be_deleted_if_not_in_use + assert_difference 'Registrar.count', -1 do + @registrar.destroy + end + end + + def test_cannot_be_deleted_if_has_at_least_one_user + users(:api_bestnames).update!(registrar: @registrar) + + assert_no_difference 'Registrar.count' do + @registrar.destroy + end + end + + def test_cannot_be_deleted_if_has_at_least_one_contact + contacts(:john).update!(registrar: @registrar) + + assert_no_difference 'Registrar.count' do + @registrar.destroy + end + end + + def test_cannot_be_deleted_if_has_at_least_one_domain + domains(:shop).update!(registrar: @registrar) + + assert_no_difference 'Registrar.count' do + @registrar.destroy + end + end +end diff --git a/test/models/registrar_test.rb b/test/models/registrar_test.rb index 057c34f62..12d5be633 100644 --- a/test/models/registrar_test.rb +++ b/test/models/registrar_test.rb @@ -9,9 +9,23 @@ class RegistrarTest < ActiveSupport::TestCase assert @registrar.valid? end + def test_invalid_without_name + @registrar.name = '' + assert @registrar.invalid? + end + + def test_invalid_without_reg_no + @registrar.reg_no = '' + assert @registrar.invalid? + end + + def test_invalid_without_email + @registrar.email = '' + assert @registrar.invalid? + end + def test_rejects_absent_accounting_customer_code @registrar.accounting_customer_code = nil - @registrar.validate assert @registrar.invalid? end @@ -20,9 +34,8 @@ class RegistrarTest < ActiveSupport::TestCase assert @registrar.invalid? end - def test_requires_language - @registrar.language = nil - @registrar.validate + def test_invalid_without_language + @registrar.language = '' assert @registrar.invalid? end @@ -38,65 +51,12 @@ class RegistrarTest < ActiveSupport::TestCase assert_equal 'de', registrar.language end - def test_rejects_vat_no_when_local_vat_payer - Registry.instance.stub(:legal_address_country, Country.new('US')) do - @registrar.vat_no = 'US1' - @registrar.validate - assert @registrar.invalid? - end + def test_full_address + assert_equal 'Main Street, New York, New York, 12345', @registrar.address end - def test_rejects_vat_rate_when_local_vat_payer - Registry.instance.stub(:legal_address_country, Country.new('US')) do - @registrar.vat_rate = 20 - @registrar.validate - assert @registrar.invalid? - end - end - - def test_rejects_negative_vat_rate - @registrar.vat_rate = -1 + def test_reference_number_generation @registrar.validate - assert @registrar.invalid? - end - - def test_rejects_vat_rate_greater_than_max - @registrar.vat_rate = 100 - @registrar.validate - assert @registrar.invalid? - end - - def test_requires_vat_rate_when_foreign_vat_payer_without_number - Registry.instance.stub(:legal_address_country, Country.new('GB')) do - @registrar.vat_no = nil - @registrar.validate - assert @registrar.invalid? - end - end - - def test_rejects_vat_rate_when_foreign_vat_payer_with_number - Registry.instance.stub(:legal_address_country, Country.new('GB')) do - @registrar.vat_no = 'US1' - @registrar.vat_rate = 1 - @registrar.validate - assert @registrar.invalid? - end - end - - def test_serializes_and_deserializes_vat_rate - valid_attributes = registrars(:bestnames).attributes.except('id').merge({ name: 'uniq1', - reg_no: 'uniq1', - code: 'uniq1', - country_code: 'GB' }) - registrar = Registrar.new(valid_attributes) - registrar.vat_rate = 55 - registrar.save! - registrar.reload - assert_equal 55, registrar.vat_rate - end - - def test_treats_empty_vat_rate_as_absent - @registrar.vat_rate = '' - assert_nil @registrar.vat_rate + refute_empty @registrar.reference_no end end