docbrown/spec/requests/pro_memberships_spec.rb
Maykon Menezes ef1eb8d412 Refactor/user bust cache job (#5563)
* Refactor/user bust cache job

* Remove bust cache job old spec
2020-01-20 13:46:15 -05:00

183 lines
5.6 KiB
Ruby

require "rails_helper"
RSpec.describe "Pro Memberships", type: :request do
describe "GET /pro" do
it "returns Pro landing page" do
get pro_membership_path
expect(response.body).to include("Like a Pro")
end
end
describe "POST /pro" do
let(:user) { create(:user) }
context "when the user is not logged in" do
it "redirects to the sign up page" do
post pro_membership_path
expect(response).to redirect_to(sign_up_path)
end
end
context "when the user is logged in and already has a pro memberships" do
before do
sign_in user
end
it "does not authorize creation if it has an active membership" do
create(:pro_membership, user: user)
expect do
post pro_membership_path
end.to raise_error(Pundit::NotAuthorizedError)
end
it "does not authorize creation if it has an expired membership" do
Timecop.freeze(Time.current) do
membership = create(:pro_membership, user: user)
membership.expire!
expect do
post pro_membership_path
end.to raise_error(Pundit::NotAuthorizedError)
end
end
it "does not authorize creation if the user as a pro role" do
user.add_role(:pro)
expect do
post pro_membership_path
end.to raise_error(Pundit::NotAuthorizedError)
end
end
context "when the user is logged in without a pro membership and enough credits" do
before do
sign_in user
create_list(:credit, ProMembership::MONTHLY_COST, user: user)
end
it "creates an active pro membership" do
expect do
post pro_membership_path
end.to change(ProMembership, :count).by(1)
expect(user.reload.pro_membership.active?).to be(true)
end
it "buys the pro membership with the correct amount of credits" do
expect do
post pro_membership_path
end.to change(user.credits.spent, :count).by(ProMembership::MONTHLY_COST)
end
it "enqueues a job to populate the history" do
sidekiq_assert_enqueued_with(
job: ProMemberships::PopulateHistoryWorker,
args: [user.id],
queue: "medium_priority",
) do
post pro_membership_path
end
end
it "enqueues a job to bust the user's cache" do
ActiveJob::Base.queue_adapter.enqueued_jobs.clear # make sure it hasn't been previously queued
sidekiq_assert_enqueued_with(job: Users::BustCacheWorker, args: [user.id]) do
post pro_membership_path
end
end
it "enqueues a job to bust the user's articles caches" do
sidekiq_assert_enqueued_with(
job: Users::ResaveArticlesWorker,
args: [user.id],
queue: "medium_priority",
) do
post pro_membership_path
end
end
it "adds the user to the pro members channel" do
create(:chat_channel, channel_type: "invite_only", slug: "pro-members")
post pro_membership_path
expect(user.reload.chat_channels.exists?(slug: "pro-members")).to be(true)
end
it "redirects to the pro membership settings page with a notice" do
post pro_membership_path
expect(response).to redirect_to(user_settings_path("pro-membership"))
expect(flash[:settings_notice]).to eq("You are now a Pro!")
end
end
context "when the user is logged in without a pro membership and not enough credits" do
before do
sign_in user
end
it "does not create an active pro membership" do
expect do
post pro_membership_path
end.to change(ProMembership, :count).by(0)
end
it "does not subtract credits" do
expect do
post pro_membership_path
end.to change(user.credits.spent, :count).by(0)
end
it "redirects to the pro membership settings page with an error message" do
post pro_membership_path
expect(response).to redirect_to(user_settings_path("pro-membership"))
expect(flash[:error]).to eq("You don't have enough credits!")
end
end
end
describe "PUT /pro" do
let(:user) { create(:user) }
context "when the user is not logged in" do
it "redirects to the sign up page" do
put pro_membership_path
expect(response).to redirect_to(sign_up_path)
end
end
context "when the user is logged in without a pro membership" do
before do
sign_in user
end
it "does not authorize the operation" do
expect do
put pro_membership_path
end.to raise_error(Pundit::NotAuthorizedError)
end
end
context "when the user is logged in with a pro membership" do
before do
sign_in user
end
it "works correctly" do
create(:pro_membership, user: user)
put pro_membership_path, params: { pro_membership: { auto_recharge: true } }
expect(flash[:settings_notice]).to eq("Your membership has been updated!")
expect(response).to redirect_to(user_settings_path("pro-membership"))
end
it "activates auto recharge" do
pro_membership = create(:pro_membership, user: user)
put pro_membership_path, params: { pro_membership: { auto_recharge: true } }
expect(pro_membership.reload.auto_recharge).to be(true)
end
it "deactivates auto recharge" do
pro_membership = create(:pro_membership, user: user, auto_recharge: true)
put pro_membership_path, params: { pro_membership: { auto_recharge: false } }
expect(pro_membership.reload.auto_recharge).to be(false)
end
end
end
end