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:
parent
7748d601f8
commit
8c3f2d2862
26
app/services/subscription_extension_after_reservation.rb
Normal file
26
app/services/subscription_extension_after_reservation.rb
Normal 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
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user