Add price expiration

#522
This commit is contained in:
Artur Beljajev 2017-05-25 19:17:11 +03:00
parent 3741e2d2a3
commit 58ae53b1e6
17 changed files with 264 additions and 13 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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