discourse-subscriptions/spec/requests/user/subscriptions_controller_sp...

193 lines
5.3 KiB
Ruby
Raw Normal View History

2019-10-31 22:43:09 -04:00
# frozen_string_literal: true
require 'rails_helper'
module DiscoursePatrons
RSpec.describe User::SubscriptionsController do
it 'is a subclass of ApplicationController' do
expect(DiscoursePatrons::User::SubscriptionsController < ::ApplicationController).to eq(true)
end
context "not authenticated" do
it "does not get the subscriptions" do
::Stripe::Customer.expects(:list).never
get "/patrons/user/subscriptions.json"
end
2019-11-04 00:37:21 -05:00
it "does not destroy a subscription" do
::Stripe::Subscription.expects(:delete).never
patch "/patrons/user/subscriptions/sub_12345.json"
end
2019-10-31 22:43:09 -04:00
end
context "authenticated" do
let(:user) { Fabricate(:user, email: 'beanie@example.com') }
before do
sign_in(user)
end
describe "index" do
let(:plans) do
{
data: [
{
id: "plan_1",
product: { name: 'ACME Subscriptions' },
},
{
id: "plan_2",
product: { name: 'ACME Other Subscriptions' },
}
]
}
end
2019-10-31 22:43:09 -04:00
let(:customers) do
{
data: [{
id: "cus_23456",
subscriptions: {
data: [
{ id: "sub_1234", plan: { id: "plan_1" } },
{ id: "sub_4567", plan: { id: "plan_2" } }
]
2019-10-31 22:43:09 -04:00
},
}]
}
end
it "gets subscriptions" do
::Stripe::Plan.expects(:list).with(
expand: ['data.product']
).returns(plans)
2019-10-31 22:43:09 -04:00
::Stripe::Customer.expects(:list).with(
email: user.email,
expand: ['data.subscriptions']
).returns(customers)
get "/patrons/user/subscriptions.json"
subscription = JSON.parse(response.body).first
expect(subscription).to eq(
"id" => "sub_1234",
"plan" => { "id" => "plan_1" },
"product" => { "name" => "ACME Subscriptions" }
)
2019-10-31 22:43:09 -04:00
end
end
2019-11-04 00:37:21 -05:00
describe "delete" do
2019-11-25 19:09:54 -05:00
before do
# Users can have more than one customer id
Customer.create(user_id: user.id, customer_id: 'customer_id_1', product_id: 'p_1')
2019-11-28 16:15:46 -05:00
Customer.create(user_id: user.id, customer_id: 'customer_id_1', product_id: 'p_2')
Customer.create(user_id: user.id, customer_id: 'customer_id_2', product_id: 'p_2')
2019-11-11 20:43:23 -05:00
end
2019-11-28 16:15:46 -05:00
it "does not delete a subscription when the customer is wrong" do
::Stripe::Subscription
.expects(:retrieve)
.with('sub_12345')
.returns(
plan: { product: 'p_1' },
customer: 'wrong_id'
)
::Stripe::Subscription
.expects(:delete)
.never
expect {
delete "/patrons/user/subscriptions/sub_12345.json"
}.not_to change { DiscoursePatrons::Customer.count }
expect(response.status).to eq 422
end
it "does not deletes the subscription when the product is wrong" do
::Stripe::Subscription
.expects(:retrieve)
.with('sub_12345')
.returns(
plan: { product: 'p_wrong' },
customer: 'customer_id_2'
)
::Stripe::Subscription
.expects(:delete)
.never
expect {
delete "/patrons/user/subscriptions/sub_12345.json"
}.not_to change { DiscoursePatrons::Customer.count }
2019-11-25 19:09:54 -05:00
expect(response.status).to eq 422
end
2019-11-11 20:43:23 -05:00
2019-11-28 16:15:46 -05:00
it "deletes the first subscription product 1" do
::Stripe::Subscription
.expects(:retrieve)
.with('sub_12345')
.returns(
plan: { product: 'p_1' },
customer: 'customer_id_1'
)
::Stripe::Subscription
.expects(:delete)
.with('sub_12345')
expect {
delete "/patrons/user/subscriptions/sub_12345.json"
}.to change { DiscoursePatrons::Customer.count }.by(-1)
expect(response.status).to eq 200
end
it "deletes the first subscription product 2" do
::Stripe::Subscription
.expects(:retrieve)
.with('sub_12345')
.returns(
plan: { product: 'p_2' },
customer: 'customer_id_1'
)
::Stripe::Subscription
.expects(:delete)
.with('sub_12345')
expect {
delete "/patrons/user/subscriptions/sub_12345.json"
}.to change { DiscoursePatrons::Customer.count }.by(-1)
2019-11-25 19:09:54 -05:00
expect(response.status).to eq 200
end
2019-11-11 20:43:23 -05:00
2019-11-25 19:09:54 -05:00
it "deletes the second subscription" do
2019-11-28 16:15:46 -05:00
::Stripe::Subscription
.expects(:retrieve)
.with('sub_12345')
.returns(
plan: { product: 'p_2' },
customer: 'customer_id_2'
)
::Stripe::Subscription
.expects(:delete)
.with('sub_12345')
expect {
delete "/patrons/user/subscriptions/sub_12345.json"
}.to change { DiscoursePatrons::Customer.count }.by(-1)
2019-11-25 19:09:54 -05:00
expect(response.status).to eq 200
2019-11-04 00:37:21 -05:00
end
end
2019-10-31 22:43:09 -04:00
end
end
end