From 35267820f9cfbf580dbf7b43d405a7c63157d75b Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 23 May 2017 17:23:05 +0300 Subject: [PATCH 01/11] Do not allow to permanently remove a zone #522 --- app/controllers/admin/dns/zones_controller.rb | 6 ------ app/views/admin/dns/zones/edit.html.erb | 13 +------------ config/locales/admin/dns/zones.en.yml | 5 ----- config/routes.rb | 2 +- spec/features/admin/dns/zones/delete_spec.rb | 16 ---------------- spec/requests/admin/dns/zones/destroy_spec.rb | 18 ------------------ 6 files changed, 2 insertions(+), 58 deletions(-) delete mode 100644 spec/features/admin/dns/zones/delete_spec.rb delete mode 100644 spec/requests/admin/dns/zones/destroy_spec.rb diff --git a/app/controllers/admin/dns/zones_controller.rb b/app/controllers/admin/dns/zones_controller.rb index 10e432520..9d5041fb5 100644 --- a/app/controllers/admin/dns/zones_controller.rb +++ b/app/controllers/admin/dns/zones_controller.rb @@ -36,12 +36,6 @@ module Admin end end - def destroy - @zone.destroy! - flash[:notice] = t('.destroyed') - redirect_to_index - end - private def load_zone diff --git a/app/views/admin/dns/zones/edit.html.erb b/app/views/admin/dns/zones/edit.html.erb index 645a77197..fc37f984b 100644 --- a/app/views/admin/dns/zones/edit.html.erb +++ b/app/views/admin/dns/zones/edit.html.erb @@ -3,18 +3,7 @@ <%= render 'form', zone: @zone %> diff --git a/config/locales/admin/dns/zones.en.yml b/config/locales/admin/dns/zones.en.yml index 08897a93b..6397c61ff 100644 --- a/config/locales/admin/dns/zones.en.yml +++ b/config/locales/admin/dns/zones.en.yml @@ -15,15 +15,10 @@ en: edit: title: Edit zone - delete_btn: Delete - delete_btn_confirm: Are you sure you want to delete zone? update: updated: Zone has been updated - destroy: - destroyed: Zone has been deleted - form: create_btn: Create zone update_btn: Update zone diff --git a/config/routes.rb b/config/routes.rb index b808f1a24..3cba3234a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -163,7 +163,7 @@ Rails.application.routes.draw do namespace :admin do resources :keyrelays resources :zonefiles - resources :zones, controller: 'dns/zones', except: %i[show] + resources :zones, controller: 'dns/zones', except: %i[show destroy] resources :legal_documents resources :keyrelays resources :prices, controller: 'billing/prices', except: %i[show] diff --git a/spec/features/admin/dns/zones/delete_spec.rb b/spec/features/admin/dns/zones/delete_spec.rb deleted file mode 100644 index 4cf0e5f28..000000000 --- a/spec/features/admin/dns/zones/delete_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'rails_helper' - -RSpec.feature 'Deleting zone in admin area', settings: false do - given!(:zone) { create(:zone) } - - background do - sign_in_to_admin_area - end - - scenario 'deletes zone' do - visit edit_admin_zone_url(zone) - click_link_or_button t('admin.dns.zones.edit.delete_btn') - - expect(page).to have_text(t('admin.dns.zones.destroy.destroyed')) - end -end diff --git a/spec/requests/admin/dns/zones/destroy_spec.rb b/spec/requests/admin/dns/zones/destroy_spec.rb deleted file mode 100644 index 4d2c714bc..000000000 --- a/spec/requests/admin/dns/zones/destroy_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'admin zone destroy', settings: false do - let!(:zone) { create(:zone) } - - before :example do - sign_in_to_admin_area - end - - it 'deletes zone' do - expect { delete admin_zone_path(zone) }.to change { DNS::Zone.count }.from(1).to(0) - end - - it 'redirects to :index' do - delete admin_zone_path(zone) - expect(response).to redirect_to admin_zones_url - end -end From 7d94273a5ed3518b6b719e783a136b7a0c364d7a Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 23 May 2017 17:31:32 +0300 Subject: [PATCH 02/11] Do not allow to permanently remove a price #522 --- .../admin/billing/prices_controller.rb | 6 ----- app/views/admin/billing/prices/edit.html.erb | 13 ++--------- config/locales/admin/billing/prices.en.yml | 5 ---- config/routes.rb | 2 +- .../admin/billing/prices/delete_spec.rb | 23 ------------------- .../admin/billing/prices/destroy_spec.rb | 18 --------------- 6 files changed, 3 insertions(+), 64 deletions(-) delete mode 100644 spec/features/admin/billing/prices/delete_spec.rb delete mode 100644 spec/requests/admin/billing/prices/destroy_spec.rb diff --git a/app/controllers/admin/billing/prices_controller.rb b/app/controllers/admin/billing/prices_controller.rb index f66d3351b..009502030 100644 --- a/app/controllers/admin/billing/prices_controller.rb +++ b/app/controllers/admin/billing/prices_controller.rb @@ -41,12 +41,6 @@ module Admin end end - def destroy - @price.destroy! - flash[:notice] = t('.destroyed') - redirect_to_index - end - private def load_price diff --git a/app/views/admin/billing/prices/edit.html.erb b/app/views/admin/billing/prices/edit.html.erb index 75d82814f..fca70f371 100644 --- a/app/views/admin/billing/prices/edit.html.erb +++ b/app/views/admin/billing/prices/edit.html.erb @@ -3,17 +3,8 @@ +<%= render 'search_form', search: @search %> + <% if @prices.present? %> diff --git a/config/locales/admin/billing/prices.en.yml b/config/locales/admin/billing/prices.en.yml index d4e4f5174..12f16f3f3 100644 --- a/config/locales/admin/billing/prices.en.yml +++ b/config/locales/admin/billing/prices.en.yml @@ -15,10 +15,19 @@ en: edit: title: Edit price + expire_btn: Expire + expire_btn_confirm: Are you sure you want to expire price? update: updated: Price has been updated + expire: + expired: Price has been expired + form: create_btn: Create price update_btn: Update price + + search_form: + search_btn: Search + reset_btn: Reset diff --git a/config/routes.rb b/config/routes.rb index 9eed77059..e9fb61989 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -166,7 +166,13 @@ Rails.application.routes.draw do resources :zones, controller: 'dns/zones', except: %i[show destroy] resources :legal_documents resources :keyrelays - resources :prices, controller: 'billing/prices', except: %i[show destroy] + + resources :prices, controller: 'billing/prices', except: %i[show destroy] do + member do + patch :expire + end + end + resources :mail_templates resources :account_activities diff --git a/spec/factories/billing/price.rb b/spec/factories/billing/price.rb index 52860bd14..6700368ae 100644 --- a/spec/factories/billing/price.rb +++ b/spec/factories/billing/price.rb @@ -6,5 +6,13 @@ FactoryGirl.define do duration '1 year' operation_category Billing::Price.operation_categories.first zone + + factory :unexpired_price do + expire_time { Time.zone.now + 1.day } + end + + factory :expired_price do + expire_time { Time.zone.now - 1.day } + end end end diff --git a/spec/features/admin/billing/prices/edit_spec.rb b/spec/features/admin/billing/prices/edit_spec.rb index 6c567b5ca..f6c777bf4 100644 --- a/spec/features/admin/billing/prices/edit_spec.rb +++ b/spec/features/admin/billing/prices/edit_spec.rb @@ -1,24 +1,22 @@ require 'rails_helper' RSpec.feature 'Editing price in admin area', settings: false do - given!(:price) { create(:price) } + given!(:price) { create(:unexpired_price) } background do sign_in_to_admin_area end scenario 'updates price' do - visit admin_prices_url + visit admin_prices_path open_form submit_form expect(page).to have_text(t('admin.billing.prices.update.updated')) end - private - def open_form - click_link_or_button 'admin-edit-price-btn' + find('.edit-price-btn').click end def submit_form diff --git a/spec/features/admin/billing/prices/expire_spec.rb b/spec/features/admin/billing/prices/expire_spec.rb new file mode 100644 index 000000000..5713e607a --- /dev/null +++ b/spec/features/admin/billing/prices/expire_spec.rb @@ -0,0 +1,25 @@ +require 'rails_helper' + +RSpec.feature 'Expiring price in admin area', settings: false do + given!(:price) { create(:unexpired_price) } + + background do + sign_in_to_admin_area + end + + scenario 'expires price' do + visit admin_prices_path + open_edit_form + expire + + expect(page).to have_text(t('admin.billing.prices.expire.expired')) + end + + def open_edit_form + find('.edit-price-btn').click + end + + def expire + click_link_or_button t('admin.billing.prices.edit.expire_btn') + end +end diff --git a/spec/features/admin/billing/prices/list_spec.rb b/spec/features/admin/billing/prices/list_spec.rb new file mode 100644 index 000000000..a5f63b57f --- /dev/null +++ b/spec/features/admin/billing/prices/list_spec.rb @@ -0,0 +1,33 @@ +require 'rails_helper' + +RSpec.feature 'Viewing prices in admin area', settings: false do + given!(:unexpired_price) { create(:unexpired_price) } + given!(:expired_price) { create(:expired_price) } + + background do + sign_in_to_admin_area + end + + describe 'search' do + context 'when validity is not selected' do + scenario 'shows unexpired prices' do + visit admin_prices_path + expect(page).to have_css('.price', count: 1) + end + end + + context 'when validity is given' do + scenario 'filters by given validity' do + visit admin_prices_path + select 'unexpired', from: 'search_validity' + submit_search_form + + expect(page).to have_css('.price', count: 1) + end + end + + def submit_search_form + find('.price-search-form-search-btn').click + end + end +end diff --git a/spec/features/admin/billing/prices/new_spec.rb b/spec/features/admin/billing/prices/new_spec.rb index ddbbac57b..27c56ffb6 100644 --- a/spec/features/admin/billing/prices/new_spec.rb +++ b/spec/features/admin/billing/prices/new_spec.rb @@ -16,8 +16,6 @@ RSpec.feature 'New price in admin area', settings: false do expect(page).to have_text(t('admin.billing.prices.create.created')) end - private - def open_list click_link_or_button t('admin.menu.prices') end diff --git a/spec/models/billing/price_spec.rb b/spec/models/billing/price_spec.rb index f9d6c8fc8..489971478 100644 --- a/spec/models/billing/price_spec.rb +++ b/spec/models/billing/price_spec.rb @@ -3,6 +3,7 @@ require 'rails_helper' RSpec.describe Billing::Price do it { is_expected.to monetize(:price) } it { is_expected.to be_versioned } + it { is_expected.to alias_attribute(:expire_time, :valid_to) } it 'should have one version' do with_versioning do diff --git a/spec/models/concerns/billing/price/expirable_spec.rb b/spec/models/concerns/billing/price/expirable_spec.rb new file mode 100644 index 000000000..c9eb1a78e --- /dev/null +++ b/spec/models/concerns/billing/price/expirable_spec.rb @@ -0,0 +1,69 @@ +require 'rails_helper' + +RSpec.describe Billing::Price do + describe '::unexpired' do + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + + create(:price, id: 1, expire_time: Time.zone.parse('04.07.2010 23:59')) + create(:price, id: 2, expire_time: Time.zone.parse('05.07.2010 00:00')) + create(:price, id: 3, expire_time: Time.zone.parse('05.07.2010 00:01')) + end + + it 'returns prices with expire time in the future ' do + expect(described_class.unexpired.ids).to eq([2, 3]) + end + end + + describe '::expired' do + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + + create(:price, id: 1, expire_time: Time.zone.parse('04.07.2010 23:59')) + create(:price, id: 2, expire_time: Time.zone.parse('05.07.2010 00:00')) + create(:price, id: 3, expire_time: Time.zone.parse('05.07.2010 00:01')) + end + + it 'returns prices with expire time in the past ' do + expect(described_class.expired.ids).to eq([1]) + end + end + + describe '#expire', db: false do + let(:price) { described_class.new(expire_time: Time.zone.parse('06.07.2010')) } + + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + end + + it 'expires price' do + expect { price.expire }.to change { price.expired? }.from(false).to(true) + end + end + + describe '#expired?', db: false do + subject(:expired) { domain.expired? } + + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + end + + context 'when expire time is in the past' do + let(:domain) { described_class.new(expire_time: Time.zone.parse('04.07.2010 23:59')) } + + specify { expect(expired).to be true } + end + + context 'when expire time is now' do + let(:domain) { described_class.new(expire_time: Time.zone.parse('05.07.2010 00:00')) } + + specify { expect(expired).to be false } + end + + context 'when expire time is in the future' do + let(:domain) { described_class.new(expire_time: Time.zone.parse('05.07.2010 00:01')) } + + specify { expect(expired).to be false } + end + end +end diff --git a/spec/requests/admin/billing/prices/expire_spec.rb b/spec/requests/admin/billing/prices/expire_spec.rb new file mode 100644 index 000000000..b182b3143 --- /dev/null +++ b/spec/requests/admin/billing/prices/expire_spec.rb @@ -0,0 +1,22 @@ +require 'rails_helper' + +RSpec.describe 'admin price expire', settings: false do + before :example do + sign_in_to_admin_area + end + + it 'expires price' do + price = create(:unexpired_price) + + expect { patch expire_admin_price_path(price); price.reload } + .to change { price.expired? }.from(false).to(true) + end + + it 'redirects to :index' do + price = create(:unexpired_price) + + patch expire_admin_price_path(price) + + expect(response).to redirect_to admin_prices_url + end +end From bfb3b43cda8a1f013014aa1aefff10d7017a84cb Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 26 May 2017 08:42:15 +0300 Subject: [PATCH 06/11] Update webmock gem --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ea08f79a2..50b0a05db 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -215,7 +215,7 @@ GEM haml (>= 4.0.6, < 5.0) html2haml (>= 1.0.1) railties (>= 4.0.1) - hashdiff (0.3.2) + hashdiff (0.3.4) hashie (3.5.5) hashie-forbidden_attributes (0.1.1) hashie (>= 3.0) @@ -478,7 +478,7 @@ GEM wasabi (3.5.0) httpi (~> 2.0) nokogiri (>= 1.4.2) - webmock (2.3.2) + webmock (3.0.1) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff From 433f14dd1c37d07e24a16863f3bff40274c5a650 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 26 May 2017 08:42:59 +0300 Subject: [PATCH 07/11] Update database_cleaner gem --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 50b0a05db..8356cec3a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -165,7 +165,7 @@ GEM daemons-rails (1.2.1) daemons multi_json (~> 1.0) - database_cleaner (1.5.3) + database_cleaner (1.6.1) deep_cloneable (2.1.1) activerecord (>= 3.1.0, < 5.0.0) descendants_tracker (0.0.4) From f76e1259fcba6acaa483b347ab394bf262091fd6 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 3 Jun 2017 23:12:16 +0300 Subject: [PATCH 08/11] Consider nil in price expire time as effective #522 --- .../admin/billing/prices_controller.rb | 19 ++++-- app/models/billing/price.rb | 42 ++++++++---- .../concerns/billing/price/expirable.rb | 4 -- .../billing/prices/_search_form.html.erb | 5 +- spec/factories/billing/price.rb | 2 +- .../admin/billing/prices/edit_spec.rb | 2 +- .../admin/billing/prices/expire_spec.rb | 2 +- .../admin/billing/prices/list_spec.rb | 12 ++-- spec/models/billing/price_spec.rb | 65 ++++++++++++++----- .../concerns/billing/price/expirable_spec.rb | 14 ---- .../admin/billing/prices/expire_spec.rb | 4 +- 11 files changed, 106 insertions(+), 65 deletions(-) diff --git a/app/controllers/admin/billing/prices_controller.rb b/app/controllers/admin/billing/prices_controller.rb index 041f55b1e..8b79d6eb5 100644 --- a/app/controllers/admin/billing/prices_controller.rb +++ b/app/controllers/admin/billing/prices_controller.rb @@ -6,18 +6,19 @@ module Admin helper_method :zones helper_method :operation_categories helper_method :durations + helper_method :statuses def index @search = OpenStruct.new(search_params) - unless @search.validity - @search.validity = 'unexpired' + unless @search.status + @search.status = default_status end prices = ::Billing::Price.all - if @search.validity.present? - prices = ::Billing::Price.send(@search.validity) + if @search.status.present? + prices = ::Billing::Price.send(@search.status) end @q = prices.search(params[:q]) @@ -81,7 +82,7 @@ module Admin def search_params allowed_params = %i[ - validity + status ] params.fetch(:search, {}).permit(*allowed_params) end @@ -102,6 +103,14 @@ module Admin durations = ::Billing::Price::durations durations.collect { |duration| [duration.sub('mon', 'month'), duration] } end + + def statuses + ::Billing::Price.statuses + end + + def default_status + 'effective' + end end end end diff --git a/app/models/billing/price.rb b/app/models/billing/price.rb index e5cddd76c..fd8dc2275 100644 --- a/app/models/billing/price.rb +++ b/app/models/billing/price.rb @@ -12,6 +12,7 @@ module Billing validates :operation_category, inclusion: { in: Proc.new { |price| price.class.operation_categories } } validates :duration, inclusion: { in: Proc.new { |price| price.class.durations } } + alias_attribute :effect_time, :valid_from alias_attribute :expire_time, :valid_to monetize :price_cents, allow_nil: true, numericality: { greater_than_or_equal_to: 0 } after_initialize :init_values @@ -22,22 +23,37 @@ module Billing def self.durations [ - '3 mons', - '6 mons', - '9 mons', - '1 year', - '2 years', - '3 years', - '4 years', - '5 years', - '6 years', - '7 years', - '8 years', - '9 years', - '10 years', + '3 mons', + '6 mons', + '9 mons', + '1 year', + '2 years', + '3 years', + '4 years', + '5 years', + '6 years', + '7 years', + '8 years', + '9 years', + '10 years', ] end + def self.statuses + %w[pending effective expired] + end + + def self.pending + where("#{attribute_alias(:effect_time)} > ?", Time.zone.now) + end + + def self.effective + condition = "#{attribute_alias(:effect_time)} <= :now " \ + " AND (#{attribute_alias(:expire_time)} >= :now" \ + " OR #{attribute_alias(:expire_time)} IS NULL)" + where(condition, now: Time.zone.now) + end + def self.valid where('valid_from <= ? AND (valid_to >= ? OR valid_to IS NULL)', Time.zone.now.end_of_day, Time.zone.now.beginning_of_day) diff --git a/app/models/concerns/billing/price/expirable.rb b/app/models/concerns/billing/price/expirable.rb index c51bdff92..c0e05832a 100644 --- a/app/models/concerns/billing/price/expirable.rb +++ b/app/models/concerns/billing/price/expirable.rb @@ -2,10 +2,6 @@ module Concerns::Billing::Price::Expirable extend ActiveSupport::Concern class_methods do - def unexpired - where("#{attribute_alias(:expire_time)} >= ?", Time.zone.now) - end - def expired where("#{attribute_alias(:expire_time)} < ?", Time.zone.now) end diff --git a/app/views/admin/billing/prices/_search_form.html.erb b/app/views/admin/billing/prices/_search_form.html.erb index e538ebf84..27ba0ca05 100644 --- a/app/views/admin/billing/prices/_search_form.html.erb +++ b/app/views/admin/billing/prices/_search_form.html.erb @@ -1,10 +1,9 @@ <%= form_for :search, url: admin_prices_path, method: :get, html: { class: 'form-horizontal' } do |f| %>
- <%= f.label :validity, class: 'col-sm-2 control-label' %> + <%= f.label :status, class: 'col-sm-2 control-label' %>
- <%= f.select :validity, options_for_select(%w[unexpired expired], search.validity), - { include_blank: true }, + <%= f.select :status, options_for_select(statuses, search.status), { include_blank: true }, class: 'form-control' %>
diff --git a/spec/factories/billing/price.rb b/spec/factories/billing/price.rb index 6700368ae..b7d49653d 100644 --- a/spec/factories/billing/price.rb +++ b/spec/factories/billing/price.rb @@ -7,7 +7,7 @@ FactoryGirl.define do operation_category Billing::Price.operation_categories.first zone - factory :unexpired_price do + factory :effective_price do expire_time { Time.zone.now + 1.day } end diff --git a/spec/features/admin/billing/prices/edit_spec.rb b/spec/features/admin/billing/prices/edit_spec.rb index f6c777bf4..8ef87b9a0 100644 --- a/spec/features/admin/billing/prices/edit_spec.rb +++ b/spec/features/admin/billing/prices/edit_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.feature 'Editing price in admin area', settings: false do - given!(:price) { create(:unexpired_price) } + given!(:price) { create(:effective_price) } background do sign_in_to_admin_area diff --git a/spec/features/admin/billing/prices/expire_spec.rb b/spec/features/admin/billing/prices/expire_spec.rb index 5713e607a..9a835f09c 100644 --- a/spec/features/admin/billing/prices/expire_spec.rb +++ b/spec/features/admin/billing/prices/expire_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.feature 'Expiring price in admin area', settings: false do - given!(:price) { create(:unexpired_price) } + given!(:price) { create(:effective_price) } background do sign_in_to_admin_area diff --git a/spec/features/admin/billing/prices/list_spec.rb b/spec/features/admin/billing/prices/list_spec.rb index a5f63b57f..d6551f8ac 100644 --- a/spec/features/admin/billing/prices/list_spec.rb +++ b/spec/features/admin/billing/prices/list_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.feature 'Viewing prices in admin area', settings: false do - given!(:unexpired_price) { create(:unexpired_price) } + given!(:effective_price) { create(:effective_price) } given!(:expired_price) { create(:expired_price) } background do @@ -9,17 +9,17 @@ RSpec.feature 'Viewing prices in admin area', settings: false do end describe 'search' do - context 'when validity is not selected' do - scenario 'shows unexpired prices' do + context 'when status is not selected' do + scenario 'shows effective prices' do visit admin_prices_path expect(page).to have_css('.price', count: 1) end end - context 'when validity is given' do - scenario 'filters by given validity' do + context 'when status is given' do + scenario 'filters by given status' do visit admin_prices_path - select 'unexpired', from: 'search_validity' + select 'effective', from: 'search_status' submit_search_form expect(page).to have_css('.price', count: 1) diff --git a/spec/models/billing/price_spec.rb b/spec/models/billing/price_spec.rb index 489971478..744f2be26 100644 --- a/spec/models/billing/price_spec.rb +++ b/spec/models/billing/price_spec.rb @@ -3,6 +3,7 @@ require 'rails_helper' RSpec.describe Billing::Price do it { is_expected.to monetize(:price) } it { is_expected.to be_versioned } + it { is_expected.to alias_attribute(:effect_time, :valid_from) } it { is_expected.to alias_attribute(:expire_time, :valid_to) } it 'should have one version' do @@ -14,34 +15,68 @@ RSpec.describe Billing::Price do end describe '::operation_categories', db: false do - it 'returns available operation categories' do + it 'returns operation categories' do categories = %w[create renew] expect(described_class.operation_categories).to eq(categories) end end describe '::durations', db: false do - it 'returns available durations' do + it 'returns durations' do durations = [ - '3 mons', - '6 mons', - '9 mons', - '1 year', - '2 years', - '3 years', - '4 years', - '5 years', - '6 years', - '7 years', - '8 years', - '9 years', - '10 years', + '3 mons', + '6 mons', + '9 mons', + '1 year', + '2 years', + '3 years', + '4 years', + '5 years', + '6 years', + '7 years', + '8 years', + '9 years', + '10 years', ] expect(described_class.durations).to eq(durations) end end + describe '::statuses', db: false do + it 'returns statuses' do + expect(described_class.statuses).to eq(%w[pending effective expired]) + end + end + + describe '::pending' do + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + + create(:price, id: 1, effect_time: Time.zone.parse('05.07.2010 00:00')) + create(:price, id: 2, effect_time: Time.zone.parse('05.07.2010 00:01')) + end + + it 'returns pending' do + expect(described_class.pending.ids).to eq([2]) + end + end + + describe '::effective' do + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + + create(:price, id: 1, effect_time: '05.07.2010 00:01', expire_time: '05.07.2010 00:02') + create(:price, id: 2, effect_time: '05.07.2010 00:00', expire_time: '05.07.2010 00:01') + create(:price, id: 3, effect_time: '05.07.2010 00:00', expire_time: nil) + create(:price, id: 4, effect_time: '04.07.2010', expire_time: '04.07.2010 23:59') + end + + it 'returns effective' do + expect(described_class.effective.ids).to eq([2, 3]) + end + end + describe 'zone validation', db: false do subject(:price) { described_class.new } diff --git a/spec/models/concerns/billing/price/expirable_spec.rb b/spec/models/concerns/billing/price/expirable_spec.rb index c9eb1a78e..2180af432 100644 --- a/spec/models/concerns/billing/price/expirable_spec.rb +++ b/spec/models/concerns/billing/price/expirable_spec.rb @@ -1,20 +1,6 @@ require 'rails_helper' RSpec.describe Billing::Price do - describe '::unexpired' do - before :example do - travel_to Time.zone.parse('05.07.2010 00:00') - - create(:price, id: 1, expire_time: Time.zone.parse('04.07.2010 23:59')) - create(:price, id: 2, expire_time: Time.zone.parse('05.07.2010 00:00')) - create(:price, id: 3, expire_time: Time.zone.parse('05.07.2010 00:01')) - end - - it 'returns prices with expire time in the future ' do - expect(described_class.unexpired.ids).to eq([2, 3]) - end - end - describe '::expired' do before :example do travel_to Time.zone.parse('05.07.2010 00:00') diff --git a/spec/requests/admin/billing/prices/expire_spec.rb b/spec/requests/admin/billing/prices/expire_spec.rb index b182b3143..79612bbc9 100644 --- a/spec/requests/admin/billing/prices/expire_spec.rb +++ b/spec/requests/admin/billing/prices/expire_spec.rb @@ -6,14 +6,14 @@ RSpec.describe 'admin price expire', settings: false do end it 'expires price' do - price = create(:unexpired_price) + price = create(:effective_price) expect { patch expire_admin_price_path(price); price.reload } .to change { price.expired? }.from(false).to(true) end it 'redirects to :index' do - price = create(:unexpired_price) + price = create(:effective_price) patch expire_admin_price_path(price) From f3e790b4817279df9c967016746adaebc9c081f7 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 5 Jun 2017 01:32:33 +0300 Subject: [PATCH 09/11] Refactor price statuses #522 --- app/models/billing/price.rb | 30 +++++++++++++-------------- spec/models/billing/price_spec.rb | 34 +++++++++++++++---------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/app/models/billing/price.rb b/app/models/billing/price.rb index fd8dc2275..2475363b4 100644 --- a/app/models/billing/price.rb +++ b/app/models/billing/price.rb @@ -23,27 +23,27 @@ module Billing def self.durations [ - '3 mons', - '6 mons', - '9 mons', - '1 year', - '2 years', - '3 years', - '4 years', - '5 years', - '6 years', - '7 years', - '8 years', - '9 years', - '10 years', + '3 mons', + '6 mons', + '9 mons', + '1 year', + '2 years', + '3 years', + '4 years', + '5 years', + '6 years', + '7 years', + '8 years', + '9 years', + '10 years', ] end def self.statuses - %w[pending effective expired] + %w[upcoming effective expired] end - def self.pending + def self.upcoming where("#{attribute_alias(:effect_time)} > ?", Time.zone.now) end diff --git a/spec/models/billing/price_spec.rb b/spec/models/billing/price_spec.rb index 744f2be26..7ee2277cc 100644 --- a/spec/models/billing/price_spec.rb +++ b/spec/models/billing/price_spec.rb @@ -24,19 +24,19 @@ RSpec.describe Billing::Price do describe '::durations', db: false do it 'returns durations' do durations = [ - '3 mons', - '6 mons', - '9 mons', - '1 year', - '2 years', - '3 years', - '4 years', - '5 years', - '6 years', - '7 years', - '8 years', - '9 years', - '10 years', + '3 mons', + '6 mons', + '9 mons', + '1 year', + '2 years', + '3 years', + '4 years', + '5 years', + '6 years', + '7 years', + '8 years', + '9 years', + '10 years', ] expect(described_class.durations).to eq(durations) @@ -45,11 +45,11 @@ RSpec.describe Billing::Price do describe '::statuses', db: false do it 'returns statuses' do - expect(described_class.statuses).to eq(%w[pending effective expired]) + expect(described_class.statuses).to eq(%w[upcoming effective expired]) end end - describe '::pending' do + describe '::upcoming' do before :example do travel_to Time.zone.parse('05.07.2010 00:00') @@ -57,8 +57,8 @@ RSpec.describe Billing::Price do create(:price, id: 2, effect_time: Time.zone.parse('05.07.2010 00:01')) end - it 'returns pending' do - expect(described_class.pending.ids).to eq([2]) + it 'returns upcoming' do + expect(described_class.upcoming.ids).to eq([2]) end end From 2886cb582d59ec5a5ddbddb7a53e8c464fd8ac24 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 13 Jun 2017 02:41:22 +0300 Subject: [PATCH 10/11] Improve price search form UI #522 --- app/controllers/admin/billing/prices_controller.rb | 12 ++++++------ app/views/admin/billing/prices/_search_form.html.erb | 2 +- config/locales/admin/billing/prices.en.yml | 1 + spec/features/admin/billing/prices/list_spec.rb | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/controllers/admin/billing/prices_controller.rb b/app/controllers/admin/billing/prices_controller.rb index 8b79d6eb5..a9862b113 100644 --- a/app/controllers/admin/billing/prices_controller.rb +++ b/app/controllers/admin/billing/prices_controller.rb @@ -8,11 +8,15 @@ module Admin helper_method :durations helper_method :statuses + def self.default_status + 'effective' + end + def index @search = OpenStruct.new(search_params) unless @search.status - @search.status = default_status + @search.status = self.class.default_status end prices = ::Billing::Price.all @@ -105,11 +109,7 @@ module Admin end def statuses - ::Billing::Price.statuses - end - - def default_status - 'effective' + ::Billing::Price.statuses.map { |status| [status.capitalize, status] } end end end diff --git a/app/views/admin/billing/prices/_search_form.html.erb b/app/views/admin/billing/prices/_search_form.html.erb index 27ba0ca05..070243de1 100644 --- a/app/views/admin/billing/prices/_search_form.html.erb +++ b/app/views/admin/billing/prices/_search_form.html.erb @@ -3,7 +3,7 @@ <%= f.label :status, class: 'col-sm-2 control-label' %>
- <%= f.select :status, options_for_select(statuses, search.status), { include_blank: true }, + <%= f.select :status, options_for_select(statuses, search.status), { include_blank: t('.any') }, class: 'form-control' %>
diff --git a/config/locales/admin/billing/prices.en.yml b/config/locales/admin/billing/prices.en.yml index 12f16f3f3..17898e6b7 100644 --- a/config/locales/admin/billing/prices.en.yml +++ b/config/locales/admin/billing/prices.en.yml @@ -29,5 +29,6 @@ en: update_btn: Update price search_form: + any: Any search_btn: Search reset_btn: Reset diff --git a/spec/features/admin/billing/prices/list_spec.rb b/spec/features/admin/billing/prices/list_spec.rb index d6551f8ac..95ebcb975 100644 --- a/spec/features/admin/billing/prices/list_spec.rb +++ b/spec/features/admin/billing/prices/list_spec.rb @@ -19,7 +19,7 @@ RSpec.feature 'Viewing prices in admin area', settings: false do context 'when status is given' do scenario 'filters by given status' do visit admin_prices_path - select 'effective', from: 'search_status' + select Admin::Billing::PricesController.default_status.capitalize, from: 'search_status' submit_search_form expect(page).to have_css('.price', count: 1) From 19eb8f90700e821c97965af4c93c4ed2e7dc0efe Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 13 Jun 2017 13:39:57 +0300 Subject: [PATCH 11/11] Improve price search form UI #522 --- app/views/admin/billing/prices/_search_form.html.erb | 2 +- config/locales/admin/billing/prices.en.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/admin/billing/prices/_search_form.html.erb b/app/views/admin/billing/prices/_search_form.html.erb index 070243de1..898cf9602 100644 --- a/app/views/admin/billing/prices/_search_form.html.erb +++ b/app/views/admin/billing/prices/_search_form.html.erb @@ -3,7 +3,7 @@ <%= f.label :status, class: 'col-sm-2 control-label' %>
- <%= f.select :status, options_for_select(statuses, search.status), { include_blank: t('.any') }, + <%= f.select :status, options_for_select(statuses, search.status), { include_blank: t('.all') }, class: 'form-control' %>
diff --git a/config/locales/admin/billing/prices.en.yml b/config/locales/admin/billing/prices.en.yml index 17898e6b7..65e658fbb 100644 --- a/config/locales/admin/billing/prices.en.yml +++ b/config/locales/admin/billing/prices.en.yml @@ -29,6 +29,6 @@ en: update_btn: Update price search_form: - any: Any + all: All search_btn: Search reset_btn: Reset