docbrown/spec/models/pro_membership_spec.rb
2019-10-02 13:04:43 -04:00

138 lines
4.2 KiB
Ruby

require "rails_helper"
RSpec.describe ProMembership, type: :model do
it { is_expected.to belong_to(:user) }
it { is_expected.to validate_presence_of(:user) }
it { is_expected.to validate_presence_of(:status) }
it { is_expected.to validate_presence_of(:expires_at).on(:save) }
it { is_expected.to validate_presence_of(:expiration_notifications_count) }
it { is_expected.to validate_inclusion_of(:status).in_array(ProMembership::STATUSES) }
it { is_expected.to have_db_index(:status) }
it { is_expected.to have_db_index(:expires_at) }
describe "constants" do
it "has the correct values for constants" do
expect(ProMembership::STATUSES).to eq(%w[active expired])
expect(ProMembership::MONTHLY_COST).to eq(5)
expect(ProMembership::MONTHLY_COST_USD).to eq(25)
end
end
describe "defaults" do
it "has the correct defaults" do
pm = described_class.new
expect(pm.status).to eq("active")
expect(pm.expires_at).to be(nil)
expect(pm.expiration_notification_at).to be(nil)
expect(pm.expiration_notifications_count).to eq(0)
expect(pm.auto_recharge).to be(false)
end
end
describe "creation" do
it "sets expires_at to a month from now" do
Timecop.freeze(Time.current) do
pm = described_class.create!(user: create(:user))
expect(pm.expires_at.to_i).to eq(1.month.from_now.to_i)
end
end
end
describe "#expired?" do
it "returns false if expires_at is in the future" do
Timecop.freeze(Time.current) do
pm = build(:pro_membership, expires_at: 5.seconds.from_now)
expect(pm.expired?).to be(false)
end
end
it "returns true if expires_at is in the past" do
Timecop.freeze(Time.current) do
pm = build(:pro_membership, expires_at: 5.seconds.ago)
expect(pm.expired?).to be(true)
end
end
end
describe "#active?" do
it "returns true if expires_at is in the future" do
Timecop.freeze(Time.current) do
pm = build(:pro_membership, expires_at: 5.seconds.from_now)
expect(pm.active?).to be(true)
end
end
it "returns false if expires_at is in the past" do
Timecop.freeze(Time.current) do
pm = build(:pro_membership, expires_at: 5.seconds.ago)
expect(pm.active?).to be(false)
end
end
end
describe "#expire!" do
let(:pro_membership) { create(:pro_membership) }
it "sets expires_at to the current time" do
Timecop.freeze(Time.current) do
pro_membership.expire!
expect(pro_membership.reload.expires_at.to_i).to eq(Time.current.to_i)
end
end
it "sets status to expired" do
Timecop.freeze(Time.current) do
pro_membership.expire!
expect(pro_membership.reload.status).to eq("expired")
end
end
it "makes the membership expired" do
Timecop.freeze(Time.current) do
pro_membership.expire!
expect(pro_membership.reload.expired?).to be(true)
end
end
end
describe "#renew!" do
let(:pro_membership) { create(:pro_membership) }
it "sets expires_at to a month from now" do
Timecop.freeze(Time.current) do
pro_membership.renew!
expect(pro_membership.reload.expires_at.to_i).to eq(1.month.from_now.to_i)
end
end
it "sets status to active" do
Timecop.freeze(Time.current) do
pro_membership.renew!
expect(pro_membership.reload.status).to eq("active")
end
end
it "sets expiration_notification_at to nil" do
Timecop.freeze(Time.current) do
pro_membership.update_column(:expiration_notification_at, Time.current)
pro_membership.renew!
expect(pro_membership.reload.expiration_notification_at).to be(nil)
end
end
it "sets expiration_notifications_count to 0" do
Timecop.freeze(Time.current) do
pro_membership.update_column(:expiration_notifications_count, 1)
pro_membership.renew!
expect(pro_membership.reload.expiration_notifications_count).to eq(0)
end
end
it "makes the membership active" do
Timecop.freeze(Time.current) do
pro_membership.renew!
expect(pro_membership.reload.active?).to be(true)
end
end
end
end