2019-10-13 18:52:43 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'rails_helper'
|
|
|
|
|
|
|
|
module DiscoursePatrons
|
|
|
|
RSpec.describe SubscriptionsController do
|
2019-10-28 20:43:32 -04:00
|
|
|
context "not authenticated" do
|
2019-10-29 23:19:43 -04:00
|
|
|
it "does not get the subscriptions" do
|
|
|
|
::Stripe::Customer.expects(:list).never
|
|
|
|
get "/patrons/subscriptions.json"
|
|
|
|
end
|
|
|
|
|
2019-10-28 20:43:32 -04:00
|
|
|
it "does not create a subscription" do
|
|
|
|
::Stripe::Plan.expects(:retrieve).never
|
|
|
|
::Stripe::Subscription.expects(:create).never
|
|
|
|
post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' }
|
|
|
|
end
|
2019-10-28 23:35:07 -04:00
|
|
|
|
|
|
|
it "does not destroy a subscription" do
|
|
|
|
::Stripe::Subscription.expects(:delete).never
|
|
|
|
patch "/patrons/subscriptions/sub_12345.json"
|
|
|
|
end
|
2019-10-28 20:43:32 -04:00
|
|
|
end
|
|
|
|
|
2019-10-16 21:07:06 -04:00
|
|
|
context "authenticated" do
|
2019-10-13 18:52:43 -04:00
|
|
|
let(:user) { Fabricate(:user, email: 'hello.2@example.com') }
|
|
|
|
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
|
|
|
|
2019-10-28 20:43:32 -04:00
|
|
|
describe "index" do
|
2019-10-29 23:19:43 -04:00
|
|
|
let(:customers) do
|
|
|
|
{
|
|
|
|
data: [{
|
|
|
|
id: "cus_23456",
|
|
|
|
subscriptions: {
|
|
|
|
data: [{ id: "sub_1234" }, { id: "sub_4567" }]
|
|
|
|
},
|
|
|
|
}]
|
|
|
|
}
|
2019-10-28 20:43:32 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "gets subscriptions" do
|
2019-10-29 23:19:43 -04:00
|
|
|
::Stripe::Customer.expects(:list).with(
|
|
|
|
email: user.email,
|
|
|
|
expand: ['data.subscriptions']
|
|
|
|
).returns(customers)
|
|
|
|
|
2019-10-28 20:43:32 -04:00
|
|
|
get "/patrons/subscriptions.json"
|
2019-10-29 23:19:43 -04:00
|
|
|
|
2019-10-30 19:01:41 -04:00
|
|
|
expect(JSON.parse(response.body)).to eq([{ "id" => "sub_1234" }, { "id" => "sub_4567" }])
|
2019-10-28 20:43:32 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-10-16 21:07:06 -04:00
|
|
|
describe "create" do
|
2019-10-23 20:37:20 -04:00
|
|
|
it "creates a subscription" do
|
|
|
|
::Stripe::Plan.expects(:retrieve).returns(metadata: { group_name: 'awesome' })
|
|
|
|
::Stripe::Subscription.expects(:create).with(
|
|
|
|
customer: 'cus_1234',
|
|
|
|
items: [ plan: 'plan_1234' ]
|
|
|
|
)
|
|
|
|
post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' }
|
2019-10-16 21:07:06 -04:00
|
|
|
end
|
2019-10-27 23:48:59 -04:00
|
|
|
|
|
|
|
it "creates a customer" do
|
|
|
|
::Stripe::Plan.expects(:retrieve).returns(metadata: {})
|
|
|
|
::Stripe::Subscription.expects(:create).returns(status: 'active')
|
|
|
|
|
|
|
|
expect {
|
|
|
|
post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' }
|
|
|
|
}.to change { DiscoursePatrons::Customer.count }
|
|
|
|
end
|
2019-10-28 23:15:13 -04:00
|
|
|
|
|
|
|
it "does not create a customer id one existeth" do
|
|
|
|
::Stripe::Plan.expects(:retrieve).returns(metadata: {})
|
|
|
|
::Stripe::Subscription.expects(:create).returns(status: 'active')
|
|
|
|
DiscoursePatrons::Customer.create(user_id: user.id, customer_id: 'cus_1234')
|
|
|
|
|
|
|
|
DiscoursePatrons::Customer.expects(:create).never
|
|
|
|
post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' }
|
|
|
|
end
|
2019-10-13 18:52:43 -04:00
|
|
|
end
|
2019-10-13 20:47:49 -04:00
|
|
|
|
2019-10-16 21:07:06 -04:00
|
|
|
describe "user groups" do
|
2019-10-23 20:37:20 -04:00
|
|
|
let(:group_name) { 'group-123' }
|
|
|
|
let(:group) { Fabricate(:group, name: group_name) }
|
2019-10-16 21:07:06 -04:00
|
|
|
|
2019-10-23 20:52:31 -04:00
|
|
|
context "unauthorized group" do
|
2019-10-24 00:48:03 -04:00
|
|
|
before do
|
|
|
|
::Stripe::Subscription.expects(:create).returns(status: 'active')
|
|
|
|
end
|
|
|
|
|
2019-10-23 20:52:31 -04:00
|
|
|
it "does not add the user to the admins group" do
|
|
|
|
::Stripe::Plan.expects(:retrieve).returns(metadata: { group_name: 'admins' })
|
|
|
|
post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' }
|
|
|
|
expect(user.admin).to eq false
|
|
|
|
end
|
2019-10-24 00:48:03 -04:00
|
|
|
|
|
|
|
it "does not add the user to other group" do
|
|
|
|
::Stripe::Plan.expects(:retrieve).returns(metadata: { group_name: 'other' })
|
|
|
|
post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' }
|
|
|
|
expect(user.groups).to be_empty
|
|
|
|
end
|
2019-10-23 20:52:31 -04:00
|
|
|
end
|
|
|
|
|
2019-10-23 20:37:20 -04:00
|
|
|
context "plan has group in metadata" do
|
|
|
|
before do
|
|
|
|
::Stripe::Plan.expects(:retrieve).returns(metadata: { group_name: group_name })
|
|
|
|
end
|
2019-10-16 21:07:06 -04:00
|
|
|
|
2019-10-23 20:52:31 -04:00
|
|
|
it "does not add the user to the group when subscription fails" do
|
2019-10-23 20:37:20 -04:00
|
|
|
::Stripe::Subscription.expects(:create).returns(status: 'failed')
|
2019-10-16 21:07:06 -04:00
|
|
|
|
2019-10-23 20:37:20 -04:00
|
|
|
expect {
|
|
|
|
post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' }
|
|
|
|
}.not_to change { group.users.count }
|
2019-10-24 00:48:03 -04:00
|
|
|
|
|
|
|
expect(user.groups).to be_empty
|
2019-10-23 20:37:20 -04:00
|
|
|
end
|
2019-10-16 21:07:06 -04:00
|
|
|
|
2019-10-23 20:37:20 -04:00
|
|
|
it "adds the user to the group when the subscription is active" do
|
|
|
|
::Stripe::Subscription.expects(:create).returns(status: 'active')
|
|
|
|
|
|
|
|
expect {
|
|
|
|
post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' }
|
|
|
|
}.to change { group.users.count }
|
2019-10-24 00:48:03 -04:00
|
|
|
|
|
|
|
expect(user.groups).not_to be_empty
|
2019-10-23 20:37:20 -04:00
|
|
|
end
|
2019-10-16 21:07:06 -04:00
|
|
|
|
2019-10-23 20:37:20 -04:00
|
|
|
it "adds the user to the group when the subscription is trialing" do
|
|
|
|
::Stripe::Subscription.expects(:create).returns(status: 'trialing')
|
2019-10-16 21:07:06 -04:00
|
|
|
|
2019-10-23 20:37:20 -04:00
|
|
|
expect {
|
|
|
|
post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' }
|
|
|
|
}.to change { group.users.count }
|
2019-10-24 00:48:03 -04:00
|
|
|
|
|
|
|
expect(user.groups).not_to be_empty
|
2019-10-23 20:37:20 -04:00
|
|
|
end
|
2019-10-16 21:07:06 -04:00
|
|
|
end
|
2019-10-13 20:47:49 -04:00
|
|
|
end
|
2019-10-28 23:35:07 -04:00
|
|
|
|
|
|
|
describe "delete" do
|
|
|
|
it "deletes a subscription" do
|
|
|
|
::Stripe::Subscription.expects(:delete).with('sub_12345')
|
2019-10-29 23:19:43 -04:00
|
|
|
delete "/patrons/subscriptions/sub_12345.json"
|
2019-10-28 23:35:07 -04:00
|
|
|
end
|
|
|
|
end
|
2019-10-13 18:52:43 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|