# require 'rails_helper'
# require 'support/devise'
# require 'webmock/rspec'
# include Rails.application.routes.url_helpers

# RSpec.describe SubscriptionsController, type: :controller do
#   before do
#     WebMock.disable_net_connect!(allow_localhost: true)

#     # Need to stub .save on StripeObject, but this doesn't seem to work
#     #Stripe::StripeObject.any_instance.stub(:save).and_return(true)

#     # Stub Stripe::Customer.create
#     stub_request(:post, "https://api.stripe.com/v1/customers")
#       .with(body: { email: "email1@example.com" })
#       .to_return(status: 200, body: {id: 'stripe-id'}.to_json, headers: {})

#     # Stub Stripe::Customer.retrieve
#     stub_request(:get, "https://api.stripe.com/v1/customers/stripe-id")
#       .to_return(
#         status: 200,
#         body: {
#           id: 'stripe-id',
#           sources: {
#             total_count: 0,
#             data: []
#           },
#           subscriptions: {
#             total_count: 1,
#             data: [Stripe::StripeObject.new]
#           }
#         }.to_json,
#         headers: {}
#       )

#     # Stub downgrading subscription to starter
#     stub_request(:post, "https://api.stripe.com/v1/subscriptions")
#       .with(body: { customer: "stripe-id", plan: 'starter' })
#       .to_return(status: 200, body: {id: 'stripe-id'}.to_json, headers: {})

#     # Stub updating subscription to premium
#     stub_request(:post, "https://api.stripe.com/v1/subscriptions")
#       .with(body: { customer: "stripe-id", plan: 'premium' })
#       .to_return(status: 200, body: {id: 'stripe-id'}.to_json, headers: {})

#     @request.env['devise.mapping'] = Devise.mappings[:user]
#     @user = create(:user)
#     @user.update(stripe_customer_id: 'stripe-id')
#     sign_in @user

#     @free_plan = BillingPlan.create(
#       name: 'Starter',
#       stripe_plan_id: 'starter',
#       monthly_cents: 0, # $0.00/mo
#       available: true,

#       # Content creation and other permissions:
#       universe_limit: 5,
#       allows_core_content: true,
#       allows_extended_content: false,
#       allows_collective_content: false,
#       allows_collaboration: false,
#       bonus_bandwidth_kb: 123155
#     )

#     @beta_plan = BillingPlan.create(
#       name: 'Early Adopters',
#       stripe_plan_id: 'early-adopters',
#       monthly_cents: 0, # $0.00/mo
#       available: true,

#       # Content creation and other permissions:
#       universe_limit: 5,
#       allows_core_content: true,
#       allows_extended_content: false,
#       allows_collective_content: false,
#       allows_collaboration: false,
#       bonus_bandwidth_kb: 123155
#     )

#     @premium_plan = BillingPlan.create(
#       name: 'Premium',
#       stripe_plan_id: 'premium',
#       monthly_cents: 900,
#       available: true,
#       universe_limit: 5,
#       allows_core_content: true,
#       allows_extended_content: true,
#       allows_collective_content: true,
#       allows_collaboration: true,
#       bonus_bandwidth_kb: 0
#     )

#     @premium_annual_plan = BillingPlan.create(
#       name: 'Premium (annual)',
#       stripe_plan_id: 'premium-annual',
#       monthly_cents: 700,
#       available: true,
#       universe_limit: 5,
#       allows_core_content: true,
#       allows_extended_content: true,
#       allows_collective_content: true,
#       allows_collaboration: true,
#       bonus_bandwidth_kb: 123155
#     )
#   end

#   describe "User with no plan (fallback to Starter) tries to upgrade" do
#     it "redirects to payment method form if they don't have a payment method saved" do
#       expect(@user.active_subscriptions).to eq([])
#       post :change, params: { stripe_plan_id: 'premium' }
#       expect(subject).to redirect_to action: :information, plan: 'premium'
#     end
#   end

#   describe "User on Starter" do
#     before do
#       # Create a Starter subscription for the user
#       @user.update(selected_billing_plan_id: @free_plan.id)
#     end

#     it "redirects to payment method form if they don't have a payment method saved" do
#       post :change, params: { stripe_plan_id: 'premium' }
#       expect(subject).to redirect_to action: :information, plan: 'premium'
#     end

#     it "allows upgrading to Premium when they have a payment method saved" do
#       # Re-stub Stripe::Customer.retrieve to include a payment method (source)
#       stub_request(:get, "https://api.stripe.com/v1/customers/stripe-id")
#         .to_return(
#           status: 200,
#           body: {
#             id: 'stripe-id',
#             sources: {
#               total_count: 1,
#               data: [Stripe::StripeObject.new]
#             },
#             subscriptions: {
#               total_count: 1,
#               data: [Stripe::StripeObject.new]
#             }
#           }.to_json,
#           headers: {}
#         )

#       expect(@user.selected_billing_plan_id).to eq(@free_plan.id)
#       expect(@user.active_billing_plans).not_to eq([@premium_plan])

#       post :change, params: { stripe_plan_id: 'premium' }

#       @user.reload
#       expect(@user.selected_billing_plan_id).to eq(@premium_plan.id)
#       expect(@user.active_billing_plans).to eq([@premium_plan])
#     end

#     describe "Starter Permissions" do
#       before do
#         @user.update(selected_billing_plan_id: @free_plan.id)
#       end

#       it "allows Starter users to create core content types" do
#         expect(@user.can_create?(Character)).to eq(true)
#         expect(@user.can_create?(Location)).to eq(true)
#         expect(@user.can_create?(Item)).to eq(true)
#       end

#       it "doesn't allow Starter users to create extended content types" do
#         expect(@user.can_create?(Creature)).to eq(false)
#         expect(@user.can_create?(Race)).to eq(false)
#         expect(@user.can_create?(Religion)).to eq(false)
#         expect(@user.can_create?(Group)).to eq(false)
#         expect(@user.can_create?(Magic)).to eq(false)
#         expect(@user.can_create?(Language)).to eq(false)
#         expect(@user.can_create?(Flora)).to eq(false)
#       end

#       it "doesn't allow Starter users to create collective content types" do
#         expect(@user.can_create?(Scene)).to eq(false)
#       end
#     end
#   end

#   describe "User on Premium" do
#     before do
#       # Create a premium subscription for the user
#       @user.update(selected_billing_plan_id: @premium_plan.id)
#     end

#     it "allows downgrading to Starter" do
#       # Downgrade to Starter
#       post :change, params: { stripe_plan_id: 'starter' }

#       @user.reload
#       expect(@user.selected_billing_plan_id).to eq(@free_plan.id)
#       expect(@user.active_billing_plans).to eq([@free_plan])
#       expect(@user.active_subscriptions.map(&:billing_plan_id)).to eq([@free_plan.id])
#     end

#     describe "Premium Permissions" do
#       it "allows Premium users to create core content types" do
#         @user.update(selected_billing_plan_id: 4)
#         expect(@user.can_create?(Character)).to eq(true)
#         expect(@user.can_create?(Location)).to eq(true)
#         expect(@user.can_create?(Item)).to eq(true)
#       end

#       it "allows Premium users to create extended content types" do
#         @user.update(selected_billing_plan_id: 4)
#         expect(@user.can_create?(Creature)).to eq(true)
#         expect(@user.can_create?(Race)).to eq(true)
#         expect(@user.can_create?(Religion)).to eq(true)
#         expect(@user.can_create?(Group)).to eq(true)
#         expect(@user.can_create?(Magic)).to eq(true)
#         expect(@user.can_create?(Language)).to eq(true)
#         expect(@user.can_create?(Flora)).to eq(true)
#       end

#       it "allows Premium users to create collective content types" do
#         @user.update(selected_billing_plan_id: 4)
#         expect(@user.can_create?(Scene)).to eq(true)
#       end
#     end
#   end

#   describe "Upload storage adjustments" do
#     before do
#       @user.active_subscriptions.create(billing_plan: @free_plan, start_date: Time.now - 5.days, end_date: Time.now + 5.days)
#       @user.update(selected_billing_plan_id: @free_plan.id)
#     end

#     it 'grants storage space to a user after upgrading' do
#       @user.update(upload_bandwidth_kb: 100)
#       post :change, params: { stripe_plan_id: 'premium' }
#       expect(@user.upload_bandwidth_kb).to eq(100 + @premium_plan.bonus_bandwidth_kb)
#     end

#     it 'decreases storage space for a user after downgrading' do
#       @user.update(upload_bandwidth_kb: 100)
#       post :change, params: { stripe_plan_id: 'starter' }
#       expect(@user.upload_bandwidth_kb).to eq(100 - @premium_plan.bonus_bandwidth_kb)
#     end

#     it 'does not adjust storage space when going premium --> premium' do
#       @user.update(upload_bandwidth_kb: 101)
#       @user.update(selected_billing_plan_id: @premium_plan.id)
#       post :change, params: { stripe_plan_id: @premium_annual_plan.stripe_plan_id }
#       expect(@user.upload_bandwidth_kb).to eq(101)
#     end

#     it 'does not adjust storage space if no plan change is made' do
#       @user.update(upload_bandwidth_kb: 101)
#       @user.update(selected_billing_plan_id: @premium_annual_plan.stripe_plan_id)
#       post :change, params: { stripe_plan_id: @premium_plan.stripe_plan_id }
#       expect(@user.upload_bandwidth_kb).to eq(101)
#     end
#   end
# end
