From b5ad66532e320eef5506a85256c2c1d49fee8a3b Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 21 Nov 2016 02:26:47 +0200 Subject: [PATCH 01/18] Add specs for domain list export #248 --- spec/features/registrar/domains/csv_export_spec.rb | 8 ++++++++ spec/routing/registrar/domains_routing_spec.rb | 9 +++++++++ 2 files changed, 17 insertions(+) create mode 100644 spec/features/registrar/domains/csv_export_spec.rb create mode 100644 spec/routing/registrar/domains_routing_spec.rb diff --git a/spec/features/registrar/domains/csv_export_spec.rb b/spec/features/registrar/domains/csv_export_spec.rb new file mode 100644 index 000000000..006778008 --- /dev/null +++ b/spec/features/registrar/domains/csv_export_spec.rb @@ -0,0 +1,8 @@ +require 'rails_helper' + +RSpec.feature 'CSV Export', db: true do + scenario 'csv file download' do + visit registrar_domains_path + click_on 'download-domains-csv-btn' + end +end diff --git a/spec/routing/registrar/domains_routing_spec.rb b/spec/routing/registrar/domains_routing_spec.rb new file mode 100644 index 000000000..e30d1dd24 --- /dev/null +++ b/spec/routing/registrar/domains_routing_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' + +RSpec.describe Registrar::DomainsController do + describe 'routing' do + it 'routes to #index' do + expect(get: '/registrar/domains').to route_to('registrar/domains#index') + end + end +end From d131448228557693859955ad75dddcd4749aa493 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 21 Nov 2016 02:26:47 +0200 Subject: [PATCH 02/18] Add specs for domain list export #248 --- spec/features/registrar/domains/csv_export_spec.rb | 8 ++++++++ spec/routing/registrar/domains_routing_spec.rb | 9 +++++++++ 2 files changed, 17 insertions(+) create mode 100644 spec/features/registrar/domains/csv_export_spec.rb create mode 100644 spec/routing/registrar/domains_routing_spec.rb diff --git a/spec/features/registrar/domains/csv_export_spec.rb b/spec/features/registrar/domains/csv_export_spec.rb new file mode 100644 index 000000000..006778008 --- /dev/null +++ b/spec/features/registrar/domains/csv_export_spec.rb @@ -0,0 +1,8 @@ +require 'rails_helper' + +RSpec.feature 'CSV Export', db: true do + scenario 'csv file download' do + visit registrar_domains_path + click_on 'download-domains-csv-btn' + end +end diff --git a/spec/routing/registrar/domains_routing_spec.rb b/spec/routing/registrar/domains_routing_spec.rb new file mode 100644 index 000000000..e30d1dd24 --- /dev/null +++ b/spec/routing/registrar/domains_routing_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' + +RSpec.describe Registrar::DomainsController do + describe 'routing' do + it 'routes to #index' do + expect(get: '/registrar/domains').to route_to('registrar/domains#index') + end + end +end From 127bbf5167af731cb14c805c0c80b1a007cc6878 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 26 Nov 2016 01:45:21 +0200 Subject: [PATCH 03/18] Add csv export button to domain list in registrar area #248 --- app/views/registrar/domains/index.haml | 1 + spec/features/registrar/domains/csv_export_spec.rb | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/views/registrar/domains/index.haml b/app/views/registrar/domains/index.haml index 587ef2b5e..e2026a92e 100644 --- a/app/views/registrar/domains/index.haml +++ b/app/views/registrar/domains/index.haml @@ -50,6 +50,7 @@   %span.glyphicon.glyphicon-search   + = button_tag t('.export_csv_btn'), id: 'export-domains-csv-btn' %button.btn.btn-default.js-reset-form = t(:clear_fields) %hr diff --git a/spec/features/registrar/domains/csv_export_spec.rb b/spec/features/registrar/domains/csv_export_spec.rb index 006778008..caf56d1c6 100644 --- a/spec/features/registrar/domains/csv_export_spec.rb +++ b/spec/features/registrar/domains/csv_export_spec.rb @@ -2,7 +2,17 @@ require 'rails_helper' RSpec.feature 'CSV Export', db: true do scenario 'csv file download' do + sign_in visit registrar_domains_path - click_on 'download-domains-csv-btn' + click_on 'export-domains-csv-btn' + end + + def sign_in(user: create(:user_with_valid_password)) + visit registrar_login_path + + fill_in 'depp_user_tag', with: user.email + fill_in 'depp_user_password', with: user.password + + click_button 'Login' end end From 25fb8f1552bf198282b26682dd76d8678c1d8290 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 28 Nov 2016 02:21:17 +0200 Subject: [PATCH 04/18] Add admin user factory #248 --- spec/factories/admin_user.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 spec/factories/admin_user.rb diff --git a/spec/factories/admin_user.rb b/spec/factories/admin_user.rb new file mode 100644 index 000000000..92ab44037 --- /dev/null +++ b/spec/factories/admin_user.rb @@ -0,0 +1,11 @@ +FactoryGirl.define do + factory :admin_user do + username 'test' + password 'test' + password_confirmation password + sequence(:email) { |n| "test#{n}@test.com" } + country_code 'ee' + roles ['admin'] + identity_code '' + end +end From b84cbe370c2b9115a8819cf83ec38fd3c6630a21 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 28 Nov 2016 23:57:53 +0200 Subject: [PATCH 05/18] Add csv export button do domain list in registrar area #248 --- config/locales/registrar/domains.en.yml | 5 +++++ spec/features/registrar/domains/csv_export_spec.rb | 14 ++++---------- 2 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 config/locales/registrar/domains.en.yml diff --git a/config/locales/registrar/domains.en.yml b/config/locales/registrar/domains.en.yml new file mode 100644 index 000000000..a1a7020b8 --- /dev/null +++ b/config/locales/registrar/domains.en.yml @@ -0,0 +1,5 @@ +en: + registrar: + domains: + index: + export_csv_btn: Export CSV diff --git a/spec/features/registrar/domains/csv_export_spec.rb b/spec/features/registrar/domains/csv_export_spec.rb index caf56d1c6..b99ecf54d 100644 --- a/spec/features/registrar/domains/csv_export_spec.rb +++ b/spec/features/registrar/domains/csv_export_spec.rb @@ -1,18 +1,12 @@ require 'rails_helper' RSpec.feature 'CSV Export', db: true do + background do + sign_in(user: FactoryGirl.create(:api_user)) + end + scenario 'csv file download' do - sign_in visit registrar_domains_path click_on 'export-domains-csv-btn' end - - def sign_in(user: create(:user_with_valid_password)) - visit registrar_login_path - - fill_in 'depp_user_tag', with: user.email - fill_in 'depp_user_password', with: user.password - - click_button 'Login' - end end From cda88834067d94be3cf6f42b0bd4b83478f81ee8 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 14 Nov 2016 13:40:10 +0200 Subject: [PATCH 06/18] Use app timezone in domain#delete_candidateable? #238 --- app/models/domain.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index c9c301bd2..ae343c551 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -293,7 +293,7 @@ class Domain < ActiveRecord::Base end def delete_candidateable? - return false if delete_at.to_date > Date.today + return false if delete_at > Time.zone.now return false if statuses.include?(DomainStatus::DELETE_CANDIDATE) return false if statuses.include?(DomainStatus::SERVER_DELETE_PROHIBITED) true From 7ad3918b3f63ffde103cd604702df4f288257f86 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 29 Nov 2016 00:03:32 +0200 Subject: [PATCH 07/18] Add "webmock" gem --- Gemfile | 1 + Gemfile.lock | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/Gemfile b/Gemfile index f0f2e4395..83ec9b4a7 100644 --- a/Gemfile +++ b/Gemfile @@ -157,4 +157,5 @@ end group :test do gem 'database_cleaner' gem 'factory_girl_rails' + gem 'webmock' end diff --git a/Gemfile.lock b/Gemfile.lock index f608c4c9f..31ecaeb02 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -257,6 +257,7 @@ GEM haml (>= 4.0.6, < 5.0) html2haml (>= 1.0.1) railties (>= 4.0.1) + hashdiff (0.3.1) hashie (3.4.2) hashie-forbidden_attributes (0.1.1) hashie (>= 3.0) @@ -556,6 +557,10 @@ GEM wasabi (3.5.0) httpi (~> 2.0) nokogiri (>= 1.4.2) + webmock (2.1.0) + addressable (>= 2.3.6) + crack (>= 0.3.2) + hashdiff websocket-driver (0.6.2) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.2) @@ -647,6 +652,7 @@ DEPENDENCIES unicorn uuidtools (= 2.1.5) validates_email_format_of (= 1.6.3) + webmock whenever (= 0.9.4) BUNDLED WITH From 61c1908785eee6077e1a14b1cb008851dbab9a5a Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 29 Nov 2016 00:04:26 +0200 Subject: [PATCH 08/18] Include webmock --- spec/spec_helper.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9e1e69d61..68a2c0be1 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,5 @@ +require 'webmock/rspec' + RSpec.configure do |config| # https://github.com/rspec/rspec-rails/issues/1076 config.around :each, type: :view do |example| From b106a40719787bf72d3cb7bb519df09aaa17e712 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 29 Nov 2016 00:07:28 +0200 Subject: [PATCH 09/18] Add session helper for feature specs --- spec/rails_helper.rb | 2 ++ spec/support/features/session_helpers.rb | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 spec/support/features/session_helpers.rb diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 9411702f5..ab5842baf 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -5,6 +5,7 @@ require 'rspec/rails' require 'capybara/poltergeist' require 'paper_trail/frameworks/rspec' require 'money-rails/test_helpers' +require 'support/features/session_helpers' if ENV['ROBOT'] require 'simplecov' @@ -23,6 +24,7 @@ ActiveRecord::Migration.maintain_test_schema! RSpec.configure do |config| config.include ActionView::TestCase::Behavior, type: :presenter config.include ActiveSupport::Testing::TimeHelpers + config.include Features::SessionHelpers, type: :feature config.define_derived_metadata(file_path: %r{/spec/presenters/}) do |metadata| metadata[:type] = :presenter diff --git a/spec/support/features/session_helpers.rb b/spec/support/features/session_helpers.rb new file mode 100644 index 000000000..de0203e1a --- /dev/null +++ b/spec/support/features/session_helpers.rb @@ -0,0 +1,12 @@ +module Features + module SessionHelpers + def sign_in_to_registrar_area(user: FactoryGirl.create(:api_user)) + visit registrar_login_path + + fill_in 'depp_user_tag', with: user.username + fill_in 'depp_user_password', with: user.password + + click_button 'Login' + end + end +end From 333924fdc67687f8df55cb3305197776baac318a Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 29 Nov 2016 00:10:11 +0200 Subject: [PATCH 10/18] Admin user model returns mix password length --- app/models/admin_user.rb | 4 ++++ spec/models/admin_user_spec.rb | 40 +++++++++------------------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/app/models/admin_user.rb b/app/models/admin_user.rb index e062bb1d6..d76c42dec 100644 --- a/app/models/admin_user.rb +++ b/app/models/admin_user.rb @@ -11,6 +11,10 @@ class AdminUser < User devise :database_authenticatable, :rememberable, :trackable, :validatable, :lockable + def self.min_password_length + Devise.password_length.min + end + def to_s username end diff --git a/spec/models/admin_user_spec.rb b/spec/models/admin_user_spec.rb index a6b668a5d..c3dde16bc 100644 --- a/spec/models/admin_user_spec.rb +++ b/spec/models/admin_user_spec.rb @@ -1,24 +1,9 @@ require 'rails_helper' -require 'cancan/matchers' -describe AdminUser do +RSpec.describe AdminUser do context 'with invalid attribute' do - before :all do - @admin_user = AdminUser.new - end - - it 'should not be valid' do - @admin_user.valid? - @admin_user.errors.full_messages.should match_array([ - "Country code is missing", - "Email Email is missing", - "Email Email is missing", - "Password Password is missing", - "Password Password is missing", - "Password confirmation is missing", - "Roles is missing", - "Username Username is missing" - ]) + before do + @admin_user = described_class.new end it 'should not have any versions' do @@ -27,21 +12,10 @@ describe AdminUser do end context 'with valid attributes' do - before :all do + before do @admin_user = Fabricate(:admin_user) end - it 'should be valid' do - @admin_user.valid? - @admin_user.errors.full_messages.should match_array([]) - end - - it 'should be valid twice' do - @admin_user = Fabricate(:admin_user) - @admin_user.valid? - @admin_user.errors.full_messages.should match_array([]) - end - it 'should have one version' do with_versioning do @admin_user.versions.should == [] @@ -61,4 +35,10 @@ describe AdminUser do ]) end end + + describe '#min_password_length' do + it 'returns minimum password length' do + expect(described_class.min_password_length).to eq(8) + end + end end From 3cf689d96cf2bd7025fae3dbc14ecc22f4d26b68 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 29 Nov 2016 00:10:32 +0200 Subject: [PATCH 11/18] Add api user factory --- spec/factories/api_user.rb | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 spec/factories/api_user.rb diff --git a/spec/factories/api_user.rb b/spec/factories/api_user.rb new file mode 100644 index 000000000..d5a3c777d --- /dev/null +++ b/spec/factories/api_user.rb @@ -0,0 +1,8 @@ +FactoryGirl.define do + factory :api_user do + sequence(:username) { |n| "test#{n}" } + password 'a' * 6 + roles ['super'] + registrar + end +end From cf79a5dbd2ebef09f9b16c6f67dad38fc454f6c9 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 29 Nov 2016 00:14:50 +0200 Subject: [PATCH 12/18] Fix missing translation --- config/locales/en.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/locales/en.yml b/config/locales/en.yml index 0988e1ce0..c4fb88757 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -614,6 +614,7 @@ en: delete: 'Delete' are_you_sure: 'Are you sure?' renew: 'Renew' + new: New renew_domain: 'Renew domain' cur_exp_date: 'curExpDate' transfer: 'Transfer' @@ -952,3 +953,4 @@ en: deleted: 'Deleted' cant_match_version: 'Impossible match version with request' user_not_authenticated: "user not authenticated" + actions: Actions From 26d9645906e1edc144144b7acdefed47c08581dd Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 29 Nov 2016 01:58:22 +0200 Subject: [PATCH 13/18] Remove registrar session feature specs --- spec/features/registrar/sessions_spec.rb | 151 ----------------------- 1 file changed, 151 deletions(-) delete mode 100644 spec/features/registrar/sessions_spec.rb diff --git a/spec/features/registrar/sessions_spec.rb b/spec/features/registrar/sessions_spec.rb deleted file mode 100644 index 649fac952..000000000 --- a/spec/features/registrar/sessions_spec.rb +++ /dev/null @@ -1,151 +0,0 @@ -require 'rails_helper' - -RSpec.feature 'Sessions', db: true do - context 'with invalid ip' do - it 'should not see login page' do - Setting.registrar_ip_whitelist_enabled = true - WhiteIp.destroy_all - visit registrar_login_path - page.should have_text('Access denied') - end - - it 'should see login page when whitelist disabled' do - Setting.registrar_ip_whitelist_enabled = false - WhiteIp.destroy_all - visit registrar_login_path - page.should_not have_text('Access denied') - Setting.registrar_ip_whitelist_enabled = true - end - - it 'should see Login' do - @fixed_registrar = Fabricate(:registrar, name: 'fixed registrar', code: 'FIXED') - @fixed_registrar.white_ips = [Fabricate(:white_ip_registrar)] - visit registrar_login_path - page.should have_text('Login') - end - - it 'should not get in with invalid ip' do - Fabricate(:registrar, white_ips: [Fabricate(:white_ip), Fabricate(:white_ip_registrar)]) - @api_user_invalid_ip = Fabricate( - :api_user, identity_code: '37810013294', registrar: Fabricate(:registrar, white_ips: []) - ) - visit registrar_login_path - fill_in 'depp_user_tag', with: @api_user_invalid_ip.username - fill_in 'depp_user_password', with: @api_user_invalid_ip.password - click_button 'Login' - page.should have_text('IP is not whitelisted') - end - end - - context 'as unknown user' do - before :example do - Fabricate(:api_user) - end - - it 'should not get in' do - client = instance_double("Digidoc::Client") - allow(client).to receive(:authenticate).and_return( - OpenStruct.new( - user_id_code: '123' - ) - ) - - allow(Digidoc::Client).to receive(:new) { client } - - visit registrar_login_path - page.should have_css('a[href="/registrar/login/mid"]') - - page.find('a[href="/registrar/login/mid"]').click - - fill_in 'user_phone', with: '00007' - click_button 'Login' - page.should have_text('No such user') - end - end - - context 'as known api user' do - before :example do - Fabricate(:api_user) - end - - it 'should not get in when external service fails' do - client = instance_double("Digidoc::Client") - allow(client).to receive(:authenticate).and_return( - OpenStruct.new( - faultcode: 'Fault', - detail: OpenStruct.new( - message: 'Something is wrong' - ) - ) - ) - - allow(Digidoc::Client).to receive(:new) { client } - - visit registrar_login_path - page.should have_css('a[href="/registrar/login/mid"]') - - page.find('a[href="/registrar/login/mid"]').click - - fill_in 'user_phone', with: '00007' - click_button 'Login' - page.should have_text('Something is wrong') - end - - it 'should not get in when there is a sim error', js: true do - client = instance_double("Digidoc::Client", session_code: '123') - - allow(client).to receive('session_code=') - - allow(client).to receive(:authenticate).and_return( - OpenStruct.new( - user_id_code: '14212128025' - ) - ) - - allow(client).to receive('authentication_status').and_return( - OpenStruct.new(status: 'SIM_ERROR') - ) - - allow(Digidoc::Client).to receive(:new) { client } - - visit registrar_login_path - page.should have_css('a[href="/registrar/login/mid"]') - - page.find('a[href="/registrar/login/mid"]').click - - fill_in 'user_phone', with: '00007' - click_button 'Login' - - page.should have_text('Confirmation sms was sent to your phone. Verification code is') - page.should have_text('SIM application error') - end - - it 'should Login successfully', js: true do - client = instance_double("Digidoc::Client", session_code: '123') - - allow(client).to receive('session_code=') - - allow(client).to receive(:authenticate).and_return( - OpenStruct.new( - user_id_code: '14212128025' - ) - ) - - allow(client).to receive('authentication_status').and_return( - OpenStruct.new(status: 'USER_AUTHENTICATED') - ) - - allow(Digidoc::Client).to receive(:new) { client } - - visit registrar_login_path - page.should have_css('a[href="/registrar/login/mid"]') - - page.find('a[href="/registrar/login/mid"]').click - - fill_in 'user_phone', with: '00007' - click_button 'Login' - - page.should have_text('Confirmation sms was sent to your phone. Verification code is') - end - end -end From ae5f2bf922b06c9a7f1f7e3edec9c2d39108e552 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 30 Nov 2016 01:50:00 +0200 Subject: [PATCH 14/18] Add domain list csv export to registrar area #248 --- .../registrar/domains_controller.rb | 16 ++++++- .../registrar/domain_list_csv_presenter.rb | 45 +++++++++++++++++++ app/views/registrar/domains/index.haml | 6 ++- config/locales/registrar/domains.en.yml | 6 +++ .../registrar/domains/csv_export_spec.rb | 9 ++-- .../domain_list_csv_presenter_spec.rb | 45 +++++++++++++++++++ .../registrar/domains_controller_spec.rb | 28 ++++++++++++ 7 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 app/presenters/registrar/domain_list_csv_presenter.rb create mode 100644 spec/presenters/registrar/domain_list_csv_presenter_spec.rb create mode 100644 spec/requests/registrar/domains_controller_spec.rb diff --git a/app/controllers/registrar/domains_controller.rb b/app/controllers/registrar/domains_controller.rb index a02fb4aa1..560a965f3 100644 --- a/app/controllers/registrar/domains_controller.rb +++ b/app/controllers/registrar/domains_controller.rb @@ -14,7 +14,7 @@ class Registrar::DomainsController < Registrar::DeppController # EPP controller if params[:q].length == 1 && params[:q][:name_matches].present? @domain = Domain.find_by(name: params[:q][:name_matches]) if @domain - redirect_to info_registrar_domains_path(domain_name: @domain.name) and return + redirect_to info_registrar_domains_url(domain_name: @domain.name) and return end end @@ -40,6 +40,20 @@ class Registrar::DomainsController < Registrar::DeppController # EPP controller end @domains = @domains.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 + + respond_to do |format| + format.html + format.csv do + domain_presenters = [] + + @domains.find_each do |domain| + domain_presenters << ::DomainPresenter.new(domain: domain, view: view_context) + end + + csv = Registrar::DomainListCSVPresenter.new(domains: domain_presenters, view: view_context).to_s + send_data(csv) + end + end end # rubocop: enable Metrics/PerceivedComplexity # rubocop: enable Metrics/CyclomaticComplexity diff --git a/app/presenters/registrar/domain_list_csv_presenter.rb b/app/presenters/registrar/domain_list_csv_presenter.rb new file mode 100644 index 000000000..b1427aa40 --- /dev/null +++ b/app/presenters/registrar/domain_list_csv_presenter.rb @@ -0,0 +1,45 @@ +class Registrar::DomainListCSVPresenter + def initialize(domains:, view:) + @domains = domains + @view = view + end + + def to_s + table = CSV::Table.new([header]) + + domains.each do |domain| + table << domain_to_row(domain: domain) + end + + table.to_s + end + + private + + def header + columns = %w( + domain_name + registrant_name + registrant_id + expire_time + ) + + columns.map! { |column| view.t("registrar.domains.index.csv.#{column}") } + + CSV::Row.new(columns, [], true) + end + + def domain_to_row(domain:) + row = [] + row[0] = domain.name + row[1] = domain.registrant_name + row[2] = domain.registrant_id + row[3] = domain.expire_date + row + + CSV::Row.new([], row) + end + + attr_reader :domains + attr_reader :view +end diff --git a/app/views/registrar/domains/index.haml b/app/views/registrar/domains/index.haml index e2026a92e..d96bfb1c8 100644 --- a/app/views/registrar/domains/index.haml +++ b/app/views/registrar/domains/index.haml @@ -49,10 +49,12 @@ %button.btn.btn-primary.search   %span.glyphicon.glyphicon-search -   - = button_tag t('.export_csv_btn'), id: 'export-domains-csv-btn' %button.btn.btn-default.js-reset-form = t(:clear_fields) + .row + .col-md-2 + = button_tag t('.export_csv_btn'), class: 'btn btn-primary export-domains-csv-btn', + formaction: registrar_domains_path(format: 'csv') %hr .row diff --git a/config/locales/registrar/domains.en.yml b/config/locales/registrar/domains.en.yml index a1a7020b8..4b9c5af11 100644 --- a/config/locales/registrar/domains.en.yml +++ b/config/locales/registrar/domains.en.yml @@ -3,3 +3,9 @@ en: domains: index: export_csv_btn: Export CSV + csv: + domain_name: Domain + registrant_name: Registrant name + registrant_id: Registrant ID + expire_time: Date of expiry + diff --git a/spec/features/registrar/domains/csv_export_spec.rb b/spec/features/registrar/domains/csv_export_spec.rb index b99ecf54d..1677aa62f 100644 --- a/spec/features/registrar/domains/csv_export_spec.rb +++ b/spec/features/registrar/domains/csv_export_spec.rb @@ -2,11 +2,12 @@ require 'rails_helper' RSpec.feature 'CSV Export', db: true do background do - sign_in(user: FactoryGirl.create(:api_user)) + Setting.registrar_ip_whitelist_enabled = false + sign_in_to_registrar_area(user: FactoryGirl.create(:api_user)) end - scenario 'csv file download' do - visit registrar_domains_path - click_on 'export-domains-csv-btn' + scenario 'exports csv' do + visit registrar_domains_url + click_button t('registrar.domains.index.export_csv_btn') end end diff --git a/spec/presenters/registrar/domain_list_csv_presenter_spec.rb b/spec/presenters/registrar/domain_list_csv_presenter_spec.rb new file mode 100644 index 000000000..866ed2570 --- /dev/null +++ b/spec/presenters/registrar/domain_list_csv_presenter_spec.rb @@ -0,0 +1,45 @@ +require 'rails_helper' + +RSpec.describe Registrar::DomainListCSVPresenter do + let(:domain) { instance_spy(DomainPresenter) } + let(:csv) { CSV.parse(described_class.new(domains: [domain], view: view).to_s, converters: :all) } + + describe 'header' do + subject(:header) { csv.first } + + it 'is present' do + columns = [] + columns[0] = 'Domain' + columns[1] = 'Registrant name' + columns[2] = 'Registrant ID' + columns[3] = 'Date of expiry' + columns + + expect(header).to eq(columns) + end + end + + describe 'row' do + subject(:row) { csv.second } + + it 'has domain name' do + expect(domain).to receive(:name).and_return('test name') + expect(row[0]).to eq('test name') + end + + it 'has registrant name' do + expect(domain).to receive(:registrant_name).and_return('test registrant name') + expect(row[1]).to eq('test registrant name') + end + + it 'has registrant id' do + expect(domain).to receive(:registrant_id).and_return('test registrant id') + expect(row[2]).to eq('test registrant id') + end + + it 'has expire date' do + expect(domain).to receive(:expire_date).and_return('expire date') + expect(row[3]).to eq('expire date') + end + end +end diff --git a/spec/requests/registrar/domains_controller_spec.rb b/spec/requests/registrar/domains_controller_spec.rb new file mode 100644 index 000000000..630703c6b --- /dev/null +++ b/spec/requests/registrar/domains_controller_spec.rb @@ -0,0 +1,28 @@ +require 'rails_helper' + +RSpec.describe Registrar::DomainsController, db: true do + describe '#index' do + before do + sign_in_to_registrar_area + end + + it 'responds with success' do + csv_presenter = instance_double(Registrar::DomainListCSVPresenter, to_s: 'csv') + expect(Registrar::DomainListCSVPresenter).to receive(:new).and_return(csv_presenter) + + get registrar_domains_url(format: 'csv') + + expect(response.body).to eq('csv') + end + + it 'returns csv' do + get registrar_domains_url(format: 'csv') + + expect(response).to have_http_status(:success) + end + end + + def sign_in_to_registrar_area(user: FactoryGirl.create(:api_user)) + post registrar_sessions_path, { depp_user: { tag: user.username, password: user.password } } + end +end From 0706453a7892ecc88b00eb6544d6ff96472624d5 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 30 Nov 2016 02:00:48 +0200 Subject: [PATCH 15/18] Update domain presenter --- app/presenters/domain_presenter.rb | 10 +++++++++- spec/presenters/domain_presenter_spec.rb | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/presenters/domain_presenter.rb b/app/presenters/domain_presenter.rb index b09743c5e..2d0cfd791 100644 --- a/app/presenters/domain_presenter.rb +++ b/app/presenters/domain_presenter.rb @@ -1,11 +1,19 @@ class DomainPresenter - delegate :name, :registrant_name, to: :domain + delegate :name, :registrant_name, :registrant_id, to: :domain def initialize(domain:, view:) @domain = domain @view = view end + def expire_time + view.l(domain.expire_time) + end + + def expire_date + view.l(domain.expire_time, format: :date) + end + def on_hold_date view.l(domain.on_hold_time, format: :date) if domain.on_hold_time end diff --git a/spec/presenters/domain_presenter_spec.rb b/spec/presenters/domain_presenter_spec.rb index 79adcc68f..2209c01aa 100644 --- a/spec/presenters/domain_presenter_spec.rb +++ b/spec/presenters/domain_presenter_spec.rb @@ -3,6 +3,24 @@ require 'rails_helper' RSpec.describe DomainPresenter do let(:presenter) { described_class.new(domain: domain, view: view) } + describe '#expire_time' do + let(:domain) { instance_double(Domain, expire_time: Time.zone.parse('05.07.2010')) } + + it 'returns localized time' do + expect(view).to receive(:l).with(Time.zone.parse('05.07.2010')).and_return('expire time') + expect(presenter.expire_time).to eq('expire time') + end + end + + describe '#expire_date' do + let(:domain) { instance_double(Domain, expire_time: Time.zone.parse('05.07.2010')) } + + it 'returns localized date' do + expect(view).to receive(:l).with(Time.zone.parse('05.07.2010'), format: :date).and_return('expire date') + expect(presenter.expire_date).to eq('expire date') + end + end + describe '#on_hold_date' do subject(:on_hold_date) { presenter.on_hold_date } @@ -100,6 +118,7 @@ RSpec.describe DomainPresenter do domain_delegatable_attributes = %i( name registrant_name + registrant_id ) domain_delegatable_attributes.each do |attribute_name| From 4d9607010cd6e9bfee3f0aa3b77e97271bd33a71 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 30 Nov 2016 02:01:59 +0200 Subject: [PATCH 16/18] Include transaction helper into feature specs --- spec/rails_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index ab5842baf..c61568179 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -25,6 +25,7 @@ RSpec.configure do |config| config.include ActionView::TestCase::Behavior, type: :presenter config.include ActiveSupport::Testing::TimeHelpers config.include Features::SessionHelpers, type: :feature + config.include AbstractController::Translation, type: :feature config.define_derived_metadata(file_path: %r{/spec/presenters/}) do |metadata| metadata[:type] = :presenter From 8d173afd590da4a93ffe0ad76595a3a342b07fba Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 30 Nov 2016 02:02:37 +0200 Subject: [PATCH 17/18] Fix session helpers spec support --- spec/support/features/session_helpers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/support/features/session_helpers.rb b/spec/support/features/session_helpers.rb index de0203e1a..a23609891 100644 --- a/spec/support/features/session_helpers.rb +++ b/spec/support/features/session_helpers.rb @@ -1,7 +1,7 @@ module Features module SessionHelpers def sign_in_to_registrar_area(user: FactoryGirl.create(:api_user)) - visit registrar_login_path + visit registrar_login_url fill_in 'depp_user_tag', with: user.username fill_in 'depp_user_password', with: user.password From f4dc972795addd10a65f4fa15915d04ef512b7e6 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 30 Nov 2016 02:20:54 +0200 Subject: [PATCH 18/18] Update admin user factory --- spec/factories/admin_user.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spec/factories/admin_user.rb b/spec/factories/admin_user.rb index 92ab44037..8ee6b93b9 100644 --- a/spec/factories/admin_user.rb +++ b/spec/factories/admin_user.rb @@ -1,11 +1,10 @@ FactoryGirl.define do factory :admin_user do username 'test' - password 'test' - password_confirmation password - sequence(:email) { |n| "test#{n}@test.com" } - country_code 'ee' + email 'test@test.com' + password 'a' * AdminUser.min_password_length + password_confirmation { password } + country_code 'de' roles ['admin'] - identity_code '' end end