From 72a37f3b08752eb0c8cb81fccd7cdf6ea6cd9669 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 29 Sep 2014 11:54:24 +0300 Subject: [PATCH] Add some tests for domain transfer --- app/controllers/client/contacts_controller.rb | 3 +- .../client/domain_transfers_controller.rb | 36 +++++++------ app/controllers/sessions_controller.rb | 1 + app/models/ability.rb | 1 + app/models/domain_transfer.rb | 16 ++++++ app/views/client/domain_transfers/new.haml | 4 +- app/views/layouts/application.haml | 8 +-- app/views/layouts/client.haml | 12 ++--- app/views/layouts/login.haml | 1 + config/locales/en.yml | 9 ++-- db/seeds.rb | 1 + spec/features/domain_transfer_spec.rb | 52 +++++++++++++++++++ spec/rails_helper.rb | 3 -- spec/support/feature.rb | 12 +++++ 14 files changed, 120 insertions(+), 39 deletions(-) create mode 100644 spec/features/domain_transfer_spec.rb create mode 100644 spec/support/feature.rb diff --git a/app/controllers/client/contacts_controller.rb b/app/controllers/client/contacts_controller.rb index 8775c2270..d72ab8f35 100644 --- a/app/controllers/client/contacts_controller.rb +++ b/app/controllers/client/contacts_controller.rb @@ -2,8 +2,7 @@ class Client::ContactsController < ClientController before_action :set_contact, only: [:show, :destroy, :edit, :update] def index - @q = Contact.search(params[:q]) if current_user.admin? - @q = current_user.registrar.contacts.search(params[:q]) unless current_user.admin? + @q = Contact.search(params[:q]) @contacts = @q.result.page(params[:page]) end diff --git a/app/controllers/client/domain_transfers_controller.rb b/app/controllers/client/domain_transfers_controller.rb index 2c6b61377..a50b8f1b2 100644 --- a/app/controllers/client/domain_transfers_controller.rb +++ b/app/controllers/client/domain_transfers_controller.rb @@ -7,14 +7,27 @@ class Client::DomainTransfersController < ClientController end def create - @domain_transfer = @domain.pending_transfer || @domain.domain_transfers.build(domain_transfer_params) - if can? :read, @domain_transfer - @domain_transfer.save - flash[:notice] = I18n.t('shared.domain_transfer_requested') if @domain.registrar != current_registrar + @domain_transfer = @domain.pending_transfer + + if @domain_transfer + if can? :read, @domain_transfer + flash[:notice] = I18n.t('shared.domain_transfer_requested') if @domain.registrar != current_registrar + redirect_to [:client, @domain_transfer] and return + else + flash.now[:alert] = I18n.t('shared.other_registrar_has_already_requested_to_transfer_this_domain') + render 'new' and return + end + end + + @domain_transfer = @domain.domain_transfers.create(domain_transfer_params) + @domain_transfer.approve_as_server if SettingGroup.domain_general.setting(:transfer_wait_time).value.to_i == 0 + + if @domain_transfer.approved? + flash[:notice] = I18n.t('shared.domain_transfer_approved') redirect_to [:client, @domain_transfer] else - flash.now[:alert] = I18n.t('shared.other_registrar_has_already_requested_to_transfer_this_domain') - render 'new' + flash[:notice] = I18n.t('shared.domain_transfer_requested') + redirect_to [:client, @domain_transfer] end end @@ -36,21 +49,12 @@ class Client::DomainTransfersController < ClientController end def domain_transfer_params - ret = { + { status: DomainTransfer::PENDING, transfer_requested_at: Time.zone.now, transfer_to: current_registrar, transfer_from: @domain.registrar } - - wait_time = SettingGroup.domain_general.setting(:transfer_wait_time).value.to_i - - if wait_time == 0 - ret[:status] = DomainTransfer::SERVER_APPROVED - ret[:transferred_at] = Time.zone.now - end - - ret end def set_domain diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 4d121fe26..8af49734a 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -5,6 +5,7 @@ class SessionsController < Devise::SessionsController # if Rails.env.development? || Rails.env.test? @user = User.find_by(username: 'gitlab') if params[:gitlab] @user = User.find_by(username: 'zone') if params[:zone] + @user = User.find_by(username: 'elkdata') if params[:elkdata] session[:current_user_registrar_id] = Registrar.first.id if @user.admin? diff --git a/app/models/ability.rb b/app/models/ability.rb index fbc8a2d70..43f5b3090 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -14,6 +14,7 @@ class Ability elsif user.persisted? can :manage, Domain, registrar_id: user.registrar.id can :read, DomainTransfer, transfer_to_id: user.registrar.id + can :read, DomainTransfer, transfer_from_id: user.registrar.id can :approve_as_client, DomainTransfer, transfer_from_id: user.registrar.id, status: DomainTransfer::PENDING end # Define abilities for the passed in user here. For example: diff --git a/app/models/domain_transfer.rb b/app/models/domain_transfer.rb index e3de62f4e..62cc8896a 100644 --- a/app/models/domain_transfer.rb +++ b/app/models/domain_transfer.rb @@ -11,6 +11,10 @@ class DomainTransfer < ActiveRecord::Base SERVER_APPROVED = 'serverApproved' SERVER_CANCELLED = 'serverCancelled' + def approved? + status == CLIENT_APPROVED || status == SERVER_APPROVED + end + def transfer_confirm_time wait_time = SettingGroup.domain_general.setting(:transfer_wait_time).value.to_i transfer_requested_at + wait_time.hours @@ -27,4 +31,16 @@ class DomainTransfer < ActiveRecord::Base domain.save(validate: false) end end + + def approve_as_server + transaction do + self.status = DomainTransfer::SERVER_APPROVED + self.transferred_at = Time.zone.now + save + + domain.generate_auth_info + domain.registrar = transfer_to + domain.save(validate: false) + end + end end diff --git a/app/views/client/domain_transfers/new.haml b/app/views/client/domain_transfers/new.haml index b5099fa66..88a7af37a 100644 --- a/app/views/client/domain_transfers/new.haml +++ b/app/views/client/domain_transfers/new.haml @@ -12,8 +12,8 @@ .row .col-md-6 .form-group - = label_tag :domain_pw + = label_tag :domain_pw, t('shared.domain_pw') = text_field_tag(:domain_pw, params[:domain_pw], class: 'form-control') .row .col-md-12.text-right - = button_tag(t('shared.save'), class: 'btn btn-primary', name: 'request') + = button_tag(t('shared.request_domain_transfer'), class: 'btn btn-primary', name: 'request') diff --git a/app/views/layouts/application.haml b/app/views/layouts/application.haml index 3a8ebc14d..397d3c93e 100644 --- a/app/views/layouts/application.haml +++ b/app/views/layouts/application.haml @@ -12,7 +12,7 @@ %title Eesti Interneti SA %body / Static navbar - .navbar.navbar-default.navbar-static-top{role: "navigation"} + .navbar.navbar-inverse.navbar-static-top{role: "navigation"} .container .navbar-header %button.navbar-toggle{"data-target" => ".navbar-collapse", "data-toggle" => "collapse", type: "button"} @@ -23,16 +23,12 @@ = link_to APP_CONFIG['app_name'], root_path, class: 'navbar-brand' .navbar-collapse.collapse %ul.nav.navbar-nav - %li - = link_to t('shared.dashboard'), root_path - %li - = link_to t('shared.registrars'), admin_registrars_path %li = link_to t('shared.domains'), admin_domains_path %li = link_to t('shared.contacts'), admin_contacts_path %li - = link_to t('shared.eedirekt'), client_domains_path + = link_to t('shared.registrars'), admin_registrars_path %li.dropdown %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} = t('shared.settings') diff --git a/app/views/layouts/client.haml b/app/views/layouts/client.haml index 6b8087748..38dfaaec8 100644 --- a/app/views/layouts/client.haml +++ b/app/views/layouts/client.haml @@ -12,7 +12,7 @@ %title= t('shared.eedirekt') %body / Static navbar - .navbar.navbar-inverse.navbar-static-top{role: "navigation"} + .navbar.navbar-default.navbar-static-top{role: "navigation"} .container .navbar-header %button.navbar-toggle{"data-target" => ".navbar-collapse", "data-toggle" => "collapse", type: "button"} @@ -23,7 +23,8 @@ = link_to t('shared.eedirekt'), client_domains_path, class: 'navbar-brand' .navbar-collapse.collapse %ul.nav.navbar-nav - %li.dropdown.active + - active_class = ['client/domains', 'client/domain_transfers'].include?(params[:controller]) ? 'active' :nil + %li.dropdown{class: active_class} %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} = t('shared.domains') %span.caret @@ -33,16 +34,16 @@ %li = link_to t('shared.transfer_domain'), new_client_domain_transfer_path - %li.dropdown + - active_class = ['client/contacts'].include?(params[:controller]) ? 'active' :nil + %li.dropdown{class: active_class} %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} = t('shared.contacts') %span.caret %ul.dropdown-menu{role: "menu"} %li = link_to t('shared.contact_list'), client_contacts_path + %ul.nav.navbar-nav.navbar-right - if current_user.admin? - %li - = link_to 'Admin', admin_root_path %li.dropdown %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} = current_registrar @@ -52,7 +53,6 @@ - next if x == current_registrar %li = link_to x, switch_registrar_sessions_path(registrar_id: x) - %ul.nav.navbar-nav.navbar-right %li= link_to t('shared.log_out'), '/logout' / /.nav-collapse .container diff --git a/app/views/layouts/login.haml b/app/views/layouts/login.haml index 3970bab79..8946e07fa 100644 --- a/app/views/layouts/login.haml +++ b/app/views/layouts/login.haml @@ -23,3 +23,4 @@ / TODO: Refactor this when ID card login is done = button_to 'ID card (gitlab)', 'sessions', class: 'btn btn-lg btn-primary btn-block', name: 'gitlab' = button_to 'ID card (zone)', 'sessions', class: 'btn btn-lg btn-primary btn-block', name: 'zone' + = button_to 'ID card (elkdata)', 'sessions', class: 'btn btn-lg btn-primary btn-block', name: 'elkdata' diff --git a/config/locales/en.yml b/config/locales/en.yml index f08369524..00308afc8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -188,7 +188,6 @@ en: action: 'Action' edit: 'Edit' save: 'Save' - dashboard: 'Dashboard' log_out: 'Log out' system: 'System' settings: 'Settings' @@ -277,22 +276,23 @@ en: failed_to_update_setting: 'Failed to update setting' status: 'Status' eedirekt: 'EEDirekt' + domain_transfer_requested: 'Domain transfer requested!' domain_transfer_approved: 'Domain transfer approved!' failed_to_approve_domain_transfer: 'Failed to approve domain transfer' approve: 'Approve' domain_already_belongs_to_the_querying_registrar: 'Domain already belongs to the querying registrar' other_registrar_has_already_requested_to_transfer_this_domain: 'Other registrar has already requested to transfer this domain.' - transfer: 'Transfer' transfer_domain: 'Transfer domain' - failed_to_request_domain_transfer: 'Failed to request domain transfer' + failed_to_request_domain_transfer: 'Failed to request domain transfer' #not used atm domain_transfer: 'Domain transfer' + request_domain_transfer: 'Request domain transfer' domain_valid_to: 'Domain valid to' transfer_requested_at: 'Transfer requested at' transfer_from: 'Transfer from' transferred_at: 'Transferred at' transfer_confirm_time: 'Transfer confirm time' - request_domain_transfer: 'Request domain transfer' + password_invalid: 'Password invalid!' domain_was_not_found: 'Domain was not found!' domain_list: 'Domain list' @@ -301,3 +301,4 @@ en: edit_statuses: 'Edit statuses' contact_list: 'Contact list' create_new_contact: 'Create new contact' + domain_pw: 'Domain password' diff --git a/db/seeds.rb b/db/seeds.rb index 7b4c8cb61..481c6ab49 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -26,3 +26,4 @@ EppUser.where(username: 'elkdata', password: '8932iods', active: true, registrar User.where(username: 'gitlab', password: '12345', email: 'enquiries@gitlab.eu', admin: true, identity_code: '37810013855').first_or_create User.where(username: 'zone', password: '54321', email: 'info-info@zone.ee', admin: false, identity_code: '37810010085', registrar_id: zone.id).first_or_create +User.where(username: 'elkdata', password: '32154', email: 'info-info@elkdata.ee', admin: false, identity_code: '37810010727', registrar_id: elkdata.id).first_or_create diff --git a/spec/features/domain_transfer_spec.rb b/spec/features/domain_transfer_spec.rb new file mode 100644 index 000000000..57eafb568 --- /dev/null +++ b/spec/features/domain_transfer_spec.rb @@ -0,0 +1,52 @@ +require 'rails_helper' + +feature 'Domain transfer', type: :feature do + let(:elkdata) { Fabricate(:registrar, { name: 'Elkdata', reg_no: '123' }) } + let(:zone) { Fabricate(:registrar) } + let(:zone_user) { Fabricate(:user, registrar: zone, username: 'zone', admin: false) } + let(:elkdata_user) { Fabricate(:user, registrar: elkdata, username: 'elkdata', admin: false) } + + background do + Fabricate(:domain_validation_setting_group) + Fabricate(:domain_general_setting_group) + Fabricate(:domain, registrar: zone) + end + + scenario 'when registrar requests transfer on own domain', js: true do + sign_in zone_user + click_on 'Domains' + click_on 'Transfer domain' + + fill_in 'Domain name', with: 'false' + click_on 'Request domain transfer' + expect(page).to have_text('Domain was not found!') + + d = Domain.first + fill_in 'Domain name', with: d.name + click_on 'Request domain transfer' + expect(page).to have_text('Password invalid!') + + fill_in 'Domain password', with: d.auth_info + click_on 'Request domain transfer' + + expect(page).to have_text('Domain already belongs to the querying registrar') + end + + scenario 'when other registrar requests transfer' do + sign_in elkdata_user + d = Domain.first + visit client_domains_path + expect(page).to_not have_link(d.name) + + visit new_client_domain_transfer_path + fill_in 'Domain name', with: d.name + fill_in 'Domain password', with: d.auth_info + click_on 'Request domain transfer' + + expect(page).to have_text('Domain transfer approved!') + expect(page).to have_text('serverApproved') + + visit client_domains_path + expect(page).to have_link(d.name) + end +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index cb28f9908..6a878e510 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -20,9 +20,6 @@ Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } ActiveRecord::Migration.maintain_test_schema! RSpec.configure do |config| - # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures - config.fixture_path = "#{::Rails.root}/spec/fixtures" - # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false # instead of true. diff --git a/spec/support/feature.rb b/spec/support/feature.rb new file mode 100644 index 000000000..9c4c59c78 --- /dev/null +++ b/spec/support/feature.rb @@ -0,0 +1,12 @@ +module Feature + def sign_in(user) + visit root_path + click_on 'ID card (gitlab)' if user.username == 'gitlab' + click_on 'ID card (zone)' if user.username == 'zone' + click_on 'ID card (elkdata)' if user.username == 'elkdata' + end +end + +RSpec.configure do |c| + c.include Feature, type: :feature +end