mirror of
https://github.com/discourse/discourse-subscriptions.git
synced 2025-03-09 13:42:17 +00:00
Building off the foundation of using the Prices API, this PR adds the ability to create a one-time purchase plan for any product, which then can add a user to the specified plan group. Some things to be aware of: One-time purchases cannot have trials. One-time purchases use the Invoice API instead of Subscriptions. Invoices are created then charged immediately. Users should receive emails for these invoices directly from Stripe just like subscriptions.
148 lines
5.2 KiB
Ruby
148 lines
5.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
module DiscourseSubscriptions
|
|
module Admin
|
|
RSpec.describe PlansController do
|
|
it 'is a subclass of AdminController' do
|
|
expect(DiscourseSubscriptions::Admin::PlansController < ::Admin::AdminController).to eq(true)
|
|
end
|
|
|
|
context 'not authenticated' do
|
|
describe "index" do
|
|
it "does not get the plans" do
|
|
::Stripe::Price.expects(:list).never
|
|
get "/s/admin/plans.json"
|
|
end
|
|
|
|
it "not ok" do
|
|
get "/s/admin/plans.json"
|
|
expect(response.status).to eq 403
|
|
end
|
|
end
|
|
|
|
describe "create" do
|
|
it "does not create a plan" do
|
|
::Stripe::Price.expects(:create).never
|
|
post "/s/admin/plans.json", params: { name: 'Rick Astley', amount: 1, interval: 'week' }
|
|
end
|
|
|
|
it "is not ok" do
|
|
post "/s/admin/plans.json", params: { name: 'Rick Astley', amount: 1, interval: 'week' }
|
|
expect(response.status).to eq 403
|
|
end
|
|
end
|
|
|
|
describe "show" do
|
|
it "does not show the plan" do
|
|
::Stripe::Price.expects(:retrieve).never
|
|
get "/s/admin/plans/plan_12345.json"
|
|
end
|
|
|
|
it "is not ok" do
|
|
get "/s/admin/plans/plan_12345.json"
|
|
expect(response.status).to eq 403
|
|
end
|
|
end
|
|
|
|
describe "update" do
|
|
it "does not update a plan" do
|
|
::Stripe::Price.expects(:update).never
|
|
delete "/s/admin/plans/plan_12345.json"
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'authenticated' do
|
|
let(:admin) { Fabricate(:admin) }
|
|
|
|
before { sign_in(admin) }
|
|
|
|
describe "index" do
|
|
it "lists the plans" do
|
|
::Stripe::Price.expects(:list).with(nil)
|
|
get "/s/admin/plans.json"
|
|
end
|
|
|
|
it "lists the plans for the product" do
|
|
::Stripe::Price.expects(:list).with(product: 'prod_id123')
|
|
get "/s/admin/plans.json", params: { product_id: 'prod_id123' }
|
|
end
|
|
end
|
|
|
|
describe "show" do
|
|
it "shows a plan" do
|
|
::Stripe::Price.expects(:retrieve).with('plan_12345').returns(currency: 'aud')
|
|
get "/s/admin/plans/plan_12345.json"
|
|
expect(response.status).to eq 200
|
|
end
|
|
|
|
it "upcases the currency" do
|
|
::Stripe::Price.expects(:retrieve).with('plan_12345').returns(currency: 'aud')
|
|
get "/s/admin/plans/plan_12345.json"
|
|
expect(response.parsed_body["currency"]).to eq 'AUD'
|
|
end
|
|
end
|
|
|
|
describe "create" do
|
|
it "creates a plan with a nickname" do
|
|
::Stripe::Price.expects(:create).with(has_entry(:nickname, 'Veg'))
|
|
post "/s/admin/plans.json", params: { nickname: 'Veg', metadata: { group_name: '' } }
|
|
end
|
|
|
|
it "creates a plan with a currency" do
|
|
::Stripe::Price.expects(:create).with(has_entry(:currency, 'AUD'))
|
|
post "/s/admin/plans.json", params: { currency: 'AUD', metadata: { group_name: '' } }
|
|
end
|
|
|
|
it "creates a plan with an interval" do
|
|
::Stripe::Price.expects(:create).with(has_entry(recurring: { interval: 'week' }))
|
|
post "/s/admin/plans.json", params: { type: 'recurring', interval: 'week', metadata: { group_name: '' } }
|
|
end
|
|
|
|
it "creates a plan as a one-time purchase" do
|
|
::Stripe::Price.expects(:create).with(Not(has_key(:recurring)))
|
|
post "/s/admin/plans.json", params: { metadata: { group_name: '' } }
|
|
end
|
|
|
|
it "creates a plan with an amount" do
|
|
::Stripe::Price.expects(:create).with(has_entry(:unit_amount, '102'))
|
|
post "/s/admin/plans.json", params: { amount: '102', metadata: { group_name: '' } }
|
|
end
|
|
|
|
it "creates a plan with a product" do
|
|
::Stripe::Price.expects(:create).with(has_entry(product: 'prod_walterwhite'))
|
|
post "/s/admin/plans.json", params: { product: 'prod_walterwhite', metadata: { group_name: '' } }
|
|
end
|
|
|
|
it "creates a plan with an active status" do
|
|
::Stripe::Price.expects(:create).with(has_entry(:active, 'false'))
|
|
post "/s/admin/plans.json", params: { active: 'false', metadata: { group_name: '' } }
|
|
end
|
|
|
|
# TODO: Need to fix the metadata tests
|
|
# I think mocha has issues with the metadata fields here.
|
|
|
|
#it 'has metadata' do
|
|
# ::Stripe::Price.expects(:create).with(has_entry(:group_name, "discourse-user-group-name"))
|
|
# post "/s/admin/plans.json", params: { amount: "100", metadata: { group_name: 'discourse-user-group-name' } }
|
|
#end
|
|
|
|
#it "creates a plan with a trial period" do
|
|
# ::Stripe::Price.expects(:create).with(has_entry(trial_period_days: '14'))
|
|
# post "/s/admin/plans.json", params: { trial_period_days: '14' }
|
|
#end
|
|
end
|
|
|
|
describe "update" do
|
|
it "updates a plan" do
|
|
::Stripe::Price.expects(:update)
|
|
patch "/s/admin/plans/plan_12345.json", params: { trial_period_days: '14', metadata: { group_name: 'discourse-user-group-name' } }
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|