1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-02-19 13:54:25 +01:00

implements a service to handle subscription extension after reservation, comes with tests

This commit is contained in:
Nicolas Florentin 2016-04-07 17:55:36 +02:00
parent 7748d601f8
commit 8c3f2d2862
2 changed files with 76 additions and 0 deletions

View File

@ -0,0 +1,26 @@
class SubscriptionExtensionAfterReservation
attr_accessor :user, :reservation
def initialize(reservation)
@user, @reservation = reservation.user, reservation
end
def extend_subscription_if_eligible
extend_subscription if eligible_to_extension?
end
def eligible_to_extension?
return false unless reservation.reservable_type == 'Training'
return false if user.reservations.where(reservable_type: 'Training').count != 1
return false unless user.subscription
return false if user.subscription.is_expired?
return false unless user.subscribed_plan.is_rolling
return true
end
def extend_subscription
user.subscription.update_columns(
expired_at: reservation.slots.first.start_at + user.subscribed_plan.duration
)
end
end

View File

@ -0,0 +1,50 @@
require 'test_helper'
class SubscriptionExtensionAfterReservationTest < ActiveSupport::TestCase
setup do
@machine = Machine.find(6)
@training = Training.find(2)
@plan = Plan.find(3)
@plan.update!(is_rolling: true)
@user = User.joins(:subscriptions).find_by(subscriptions: { plan: @plan })
@user.reservations.destroy_all # ensure no reservations
@availability = @machine.availabilities.first
slot = Slot.new(start_at: @availability.start_at, end_at: @availability.end_at, availability_id: @availability.id)
@reservation_machine = Reservation.new(user: @user, reservable: @machine, slots: [slot])
@reservation_training = Reservation.new(user: @user, reservable: @training, slots: [slot])
@reservation_training.save!
end
test "is eligible for extension because all conditions are met by default (test setup)" do
assert SubscriptionExtensionAfterReservation.new(@reservation_training).eligible_to_extension?
end
test "not eligible if reservable is a machine" do
@reservation_machine.save!
refute SubscriptionExtensionAfterReservation.new(@reservation_machine).eligible_to_extension?
end
test "not eligible if user doesn't have subscription" do
@user.subscriptions.destroy_all
refute SubscriptionExtensionAfterReservation.new(@reservation_training).eligible_to_extension?
end
test "not eligible if subscription is expired" do
@user.subscription.update!(expired_at: 10.years.ago)
refute SubscriptionExtensionAfterReservation.new(@reservation_training).eligible_to_extension?
end
test "not eligible if plan attribute 'is_rolling' is false/nil" do
@plan.update!(is_rolling: false)
refute SubscriptionExtensionAfterReservation.new(@reservation_training).eligible_to_extension?
end
test "method extend_subscription" do
SubscriptionExtensionAfterReservation.new(@reservation_training).extend_subscription
assert_equal @reservation_training.slots.first.start_at + @plan.duration, @user.subscription.expired_at
end
end