diff --git a/plugin.rb b/plugin.rb index 1fceda1..e89b868 100644 --- a/plugin.rb +++ b/plugin.rb @@ -148,7 +148,6 @@ after_initialize do Site.preloaded_category_custom_fields << key if Site.respond_to? :preloaded_category_custom_fields end - add_to_serializer(:basic_category, :donations_cause) { object.donations_cause } add_to_serializer(:basic_category, :donations_total) { object.donations_total } add_to_serializer(:basic_category, :include_donations_total?) { object.donations_show_amounts } diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 728c153..21a632e 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -44,267 +44,27 @@ module DiscourseDonations stub_request(:get, "https://api.stripe.com/v1/plans").to_return(status: 200, body: plans) stub_request(:post, "https://api.stripe.com/v1/plans").to_return(status: 200, body: plans) - products = { - "object": "list", - "url": "/v1/products", - "has_more": false, - "data": [ - { - "id": "prod_FhGJ7clA2xMxGI", - "object": "product", - "active": true, - "attributes": [], - "caption": "null", - "created": 1566862775, - "deactivate_on": [], - "description": "null", - "images": [], - "livemode": false, - "metadata": {}, - "name": "Sapphire Personal", - "package_dimensions": "null", - "shippable": "null", - "statement_descriptor": "null", - "type": "service", - "unit_label": "null", - "updated": 1566862775, - "url": "null" - }, - ] - } + products = Fabricate(:stripe_products).to_json - stub_request(:get, "https://api.stripe.com/v1/products?type=service").to_return(status: 200, body: products.to_json) - stub_request(:post, "https://api.stripe.com/v1/products").to_return(status: 200, body: products.to_json) + stub_request(:get, "https://api.stripe.com/v1/products?type=service").to_return(status: 200, body: products) + stub_request(:post, "https://api.stripe.com/v1/products").to_return(status: 200, body: products) stub_request(:post, "https://api.stripe.com/v1/customers").to_return(status: 200, body: customer) - subscription = { - "id": "sub_8epEF0PuRhmltU", - "object": "subscription", - "application_fee_percent": "null", - "billing": "charge_automatically", - "billing_cycle_anchor": 1466202990, - "billing_thresholds": "null", - "cancel_at": "null", - "cancel_at_period_end": false, - "canceled_at": 1517528245, - "collection_method": "charge_automatically", - "created": 1466202990, - "current_period_end": 1518906990, - "current_period_start": 1516228590, - "customer": "cus_FhHJDzf0OxYtb8", - "days_until_due": "null", - "default_payment_method": "null", - "default_source": "null", - "default_tax_rates": [], - "discount": "null", - "ended_at": 1517528245, - "items": { - "object": "list", - "data": [ - { - "id": "si_18NVZi2eZvKYlo2CUtBNGL9x", - "object": "subscription_item", - "billing_thresholds": "null", - "created": 1466202990, - "metadata": {}, - "plan": { - "id": "ivory-freelance-040", - "object": "plan", - "active": true, - "aggregate_usage": "null", - "amount": 999, - "amount_decimal": "999", - "billing_scheme": "per_unit", - "created": 1466202980, - "currency": "usd", - "interval": "month", - "interval_count": 1, - "livemode": false, - "metadata": {}, - "nickname": "null", - "product": "prod_BUthVRQ7KdFfa7", - "tiers": "null", - "tiers_mode": "null", - "transform_usage": "null", - "trial_period_days": "null", - "usage_type": "licensed" - }, - "quantity": 1, - "subscription": "sub_8epEF0PuRhmltU", - "tax_rates": [] - } - ], - "has_more": false, - "total_count": 1, - "url": "/v1/subscription_items?subscription=sub_8epEF0PuRhmltU" - }, - "latest_invoice": "null", - "livemode": false, - "metadata": {}, - "pending_setup_intent": "null", - "plan": { - "id": "ivory-freelance-040", - "object": "plan", - "active": true, - "aggregate_usage": "null", - "amount": 999, - "amount_decimal": "999", - "billing_scheme": "per_unit", - "created": 1466202980, - "currency": "usd", - "interval": "month", - "interval_count": 1, - "livemode": false, - "metadata": {}, - "nickname": "null", - "product": "prod_BUthVRQ7KdFfa7", - "tiers": "null", - "tiers_mode": "null", - "transform_usage": "null", - "trial_period_days": "null", - "usage_type": "licensed" - }, - "quantity": 1, - "schedule": "null", - "start": 1466202990, - "start_date": 1466202990, - "status": "active", - "tax_percent": "null", - "trial_end": "null", - "trial_start": "null" - } + subscription = Fabricate(:stripe_subscription).to_json - stub_request(:post, "https://api.stripe.com/v1/subscriptions").to_return(status: 200, body: subscription.to_json) + stub_request(:post, "https://api.stripe.com/v1/subscriptions").to_return(status: 200, body: subscription) - invoices = { - "object": "list", - "url": "/v1/invoices", - "has_more": false, - "data": [ - { - "id": "in_1Cc9wc2eZvKYlo2ClBzJbDQz", - "object": "invoice", - "account_country": "US", - "account_name": "Stripe.com", - "amount_due": 20, - "amount_paid": 0, - "amount_remaining": 20, - "application_fee_amount": "null", - "attempt_count": 0, - "attempted": false, - "auto_advance": false, - "billing": "send_invoice", - "billing_reason": "subscription_update", - "charge": "null", - "collection_method": "send_invoice", - "created": 1528800106, - "currency": "usd", - "custom_fields": "null", - "customer": "cus_FhHJDzf0OxYtb8", - "customer_address": "null", - "customer_email": "ziad+123@elysian.team", - "customer_name": "null", - "customer_phone": "null", - "customer_shipping": "null", - "customer_tax_exempt": "none", - "customer_tax_ids": [], - "default_payment_method": "null", - "default_source": "null", - "default_tax_rates": [], - "description": "null", - "discount": "null", - "due_date": 1529059306, - "ending_balance": "null", - "footer": "null", - "hosted_invoice_url": "null", - "invoice_pdf": "null", - "lines": { - "data": [ - { - "id": "sli_42e8bf79bec714", - "object": "line_item", - "amount": 999, - "currency": "usd", - "description": "1 × Ivory Freelance (at $9.99 / month)", - "discountable": true, - "livemode": false, - "metadata": {}, - "period": { - "end": 1521326190, - "start": 1518906990 - }, - "plan": { - "id": "ivory-freelance-040", - "object": "plan", - "active": true, - "aggregate_usage": "null", - "amount": 999, - "amount_decimal": "999", - "billing_scheme": "per_unit", - "created": 1466202980, - "currency": "usd", - "interval": "month", - "interval_count": 1, - "livemode": false, - "metadata": {}, - "nickname": "null", - "product": "prod_BUthVRQ7KdFfa7", - "tiers": "null", - "tiers_mode": "null", - "transform_usage": "null", - "trial_period_days": "null", - "usage_type": "licensed" - }, - "proration": false, - "quantity": 1, - "subscription": "sub_8epEF0PuRhmltU", - "subscription_item": "si_18NVZi2eZvKYlo2CUtBNGL9x", - "tax_amounts": [], - "tax_rates": [], - "type": "subscription" - } - ], - "has_more": false, - "object": "list", - "url": "/v1/invoices/in_1Cc9wc2eZvKYlo2ClBzJbDQz/lines" - }, - "livemode": false, - "metadata": {}, - "next_payment_attempt": "null", - "number": "8B36FE9-0005", - "paid": false, - "payment_intent": "null", - "period_end": 1528800106, - "period_start": 1528800106, - "post_payment_credit_notes_amount": 0, - "pre_payment_credit_notes_amount": 0, - "receipt_number": "null", - "starting_balance": 10, - "statement_descriptor": "null", - "status": "draft", - "status_transitions": { - "finalized_at": "null", - "marked_uncollectible_at": "null", - "paid_at": "null", - "voided_at": "null" - }, - "subscription": "sub_D2ECXpuEnnXkWU", - "subtotal": 10, - "tax": "null", - "tax_percent": "null", - "total": 10, - "total_tax_amounts": [], - "webhooks_delivered_at": 1528800106 - }, - ] - } + invoices = Fabricate(:stripe_invoices).to_json stub_request(:get, "https://api.stripe.com/v1/invoices?customer=cus_FhHJDzf0OxYtb8&subscription=sub_8epEF0PuRhmltU") - .to_return(status: 200, body: invoices.to_json) + .to_return(status: 200, body: invoices) post :create, params: { email: 'foobar@example.com' }, format: :json - expect(body['messages'][0]).to end_with(I18n.t('donations.payment.success')) - expect(response).to have_http_status(200) + + aggregate_failures do + expect(response).to have_http_status(200) + expect(body['messages'][0]).to end_with(I18n.t('donations.payment.success')) + end end it 'does not expect a username or email if accounts are not being created' do diff --git a/spec/fabricators/invoices_fabricator.rb b/spec/fabricators/invoices_fabricator.rb new file mode 100644 index 0000000..6d8630e --- /dev/null +++ b/spec/fabricators/invoices_fabricator.rb @@ -0,0 +1,127 @@ + +Fabricator(:stripe_invoices, from: "DiscourseDonations::StripeResponse") do + response = { + "object": "list", + "url": "/v1/invoices", + "has_more": false, + "data": [ + { + "id": "in_1Cc9wc2eZvKYlo2ClBzJbDQz", + "object": "invoice", + "account_country": "US", + "account_name": "Stripe.com", + "amount_due": 20, + "amount_paid": 0, + "amount_remaining": 20, + "application_fee_amount": "null", + "attempt_count": 0, + "attempted": false, + "auto_advance": false, + "billing": "send_invoice", + "billing_reason": "subscription_update", + "charge": "null", + "collection_method": "send_invoice", + "created": 1528800106, + "currency": "usd", + "custom_fields": "null", + "customer": "cus_FhHJDzf0OxYtb8", + "customer_address": "null", + "customer_email": "ziad+123@elysian.team", + "customer_name": "null", + "customer_phone": "null", + "customer_shipping": "null", + "customer_tax_exempt": "none", + "customer_tax_ids": [], + "default_payment_method": "null", + "default_source": "null", + "default_tax_rates": [], + "description": "null", + "discount": "null", + "due_date": 1529059306, + "ending_balance": "null", + "footer": "null", + "hosted_invoice_url": "null", + "invoice_pdf": "null", + "lines": { + "data": [ + { + "id": "sli_42e8bf79bec714", + "object": "line_item", + "amount": 999, + "currency": "usd", + "description": "1 × Ivory Freelance (at $9.99 / month)", + "discountable": true, + "livemode": false, + "metadata": {}, + "period": { + "end": 1521326190, + "start": 1518906990 + }, + "plan": { + "id": "ivory-freelance-040", + "object": "plan", + "active": true, + "aggregate_usage": "null", + "amount": 999, + "amount_decimal": "999", + "billing_scheme": "per_unit", + "created": 1466202980, + "currency": "usd", + "interval": "month", + "interval_count": 1, + "livemode": false, + "metadata": {}, + "nickname": "null", + "product": "prod_BUthVRQ7KdFfa7", + "tiers": "null", + "tiers_mode": "null", + "transform_usage": "null", + "trial_period_days": "null", + "usage_type": "licensed" + }, + "proration": false, + "quantity": 1, + "subscription": "sub_8epEF0PuRhmltU", + "subscription_item": "si_18NVZi2eZvKYlo2CUtBNGL9x", + "tax_amounts": [], + "tax_rates": [], + "type": "subscription" + } + ], + "has_more": false, + "object": "list", + "url": "/v1/invoices/in_1Cc9wc2eZvKYlo2ClBzJbDQz/lines" + }, + "livemode": false, + "metadata": {}, + "next_payment_attempt": "null", + "number": "8B36FE9-0005", + "paid": false, + "payment_intent": "null", + "period_end": 1528800106, + "period_start": 1528800106, + "post_payment_credit_notes_amount": 0, + "pre_payment_credit_notes_amount": 0, + "receipt_number": "null", + "starting_balance": 10, + "statement_descriptor": "null", + "status": "draft", + "status_transitions": { + "finalized_at": "null", + "marked_uncollectible_at": "null", + "paid_at": "null", + "voided_at": "null" + }, + "subscription": "sub_D2ECXpuEnnXkWU", + "subtotal": 10, + "tax": "null", + "tax_percent": "null", + "total": 10, + "total_tax_amounts": [], + "webhooks_delivered_at": 1528800106 + }, + ] + }.to_json + + to_json response +end diff --git a/spec/fabricators/products_fabricator.rb b/spec/fabricators/products_fabricator.rb new file mode 100644 index 0000000..6da49a4 --- /dev/null +++ b/spec/fabricators/products_fabricator.rb @@ -0,0 +1,33 @@ + +Fabricator(:stripe_products, from: "DiscourseDonations::StripeResponse") do + response = { + "object": "list", + "url": "/v1/products", + "has_more": false, + "data": [ + { + "id": "prod_FhGJ7clA2xMxGI", + "object": "product", + "active": true, + "attributes": [], + "caption": "null", + "created": 1566862775, + "deactivate_on": [], + "description": "null", + "images": [], + "livemode": false, + "metadata": {}, + "name": "Sapphire Personal", + "package_dimensions": "null", + "shippable": "null", + "statement_descriptor": "null", + "type": "service", + "unit_label": "null", + "updated": 1566862775, + "url": "null" + }, + ] + }.to_json + + to_json response +end diff --git a/spec/fabricators/subscription_fabricator.rb b/spec/fabricators/subscription_fabricator.rb new file mode 100644 index 0000000..c6d76b8 --- /dev/null +++ b/spec/fabricators/subscription_fabricator.rb @@ -0,0 +1,101 @@ + +Fabricator(:stripe_subscription, from: "DiscourseDonations::StripeResponse") do + response = { + "id": "sub_8epEF0PuRhmltU", + "object": "subscription", + "application_fee_percent": "null", + "billing": "charge_automatically", + "billing_cycle_anchor": 1466202990, + "billing_thresholds": "null", + "cancel_at": "null", + "cancel_at_period_end": false, + "canceled_at": 1517528245, + "collection_method": "charge_automatically", + "created": 1466202990, + "current_period_end": 1518906990, + "current_period_start": 1516228590, + "customer": "cus_FhHJDzf0OxYtb8", + "days_until_due": "null", + "default_payment_method": "null", + "default_source": "null", + "default_tax_rates": [], + "discount": "null", + "ended_at": 1517528245, + "items": { + "object": "list", + "data": [ + { + "id": "si_18NVZi2eZvKYlo2CUtBNGL9x", + "object": "subscription_item", + "billing_thresholds": "null", + "created": 1466202990, + "metadata": {}, + "plan": { + "id": "ivory-freelance-040", + "object": "plan", + "active": true, + "aggregate_usage": "null", + "amount": 999, + "amount_decimal": "999", + "billing_scheme": "per_unit", + "created": 1466202980, + "currency": "usd", + "interval": "month", + "interval_count": 1, + "livemode": false, + "metadata": {}, + "nickname": "null", + "product": "prod_BUthVRQ7KdFfa7", + "tiers": "null", + "tiers_mode": "null", + "transform_usage": "null", + "trial_period_days": "null", + "usage_type": "licensed" + }, + "quantity": 1, + "subscription": "sub_8epEF0PuRhmltU", + "tax_rates": [] + } + ], + "has_more": false, + "total_count": 1, + "url": "/v1/subscription_items?subscription=sub_8epEF0PuRhmltU" + }, + "latest_invoice": "null", + "livemode": false, + "metadata": {}, + "pending_setup_intent": "null", + "plan": { + "id": "ivory-freelance-040", + "object": "plan", + "active": true, + "aggregate_usage": "null", + "amount": 999, + "amount_decimal": "999", + "billing_scheme": "per_unit", + "created": 1466202980, + "currency": "usd", + "interval": "month", + "interval_count": 1, + "livemode": false, + "metadata": {}, + "nickname": "null", + "product": "prod_BUthVRQ7KdFfa7", + "tiers": "null", + "tiers_mode": "null", + "transform_usage": "null", + "trial_period_days": "null", + "usage_type": "licensed" + }, + "quantity": 1, + "schedule": "null", + "start": 1466202990, + "start_date": 1466202990, + "status": "active", + "tax_percent": "null", + "trial_end": "null", + "trial_start": "null" + }.to_json + + to_json response +end diff --git a/spec/jobs/regular/donation_user_spec.rb b/spec/jobs/regular/donation_user_spec.rb index 27fd75b..cdaef35 100644 --- a/spec/jobs/regular/donation_user_spec.rb +++ b/spec/jobs/regular/donation_user_spec.rb @@ -9,7 +9,7 @@ RSpec.describe Jobs::DonationUser, type: :job do it 'creates a new user with no rewards' do aggregate_failures do - expect{ subject.execute(args) }.to change{ User.count }.by(1) + expect { subject.execute(args) }.to change { User.count }.by(1) user = User.find_by_email(args[:email]) expect(user.badges).to be_empty expect(user.groups).to be_empty diff --git a/spec/plugin_helper.rb b/spec/plugin_helper.rb index 88bec3b..763463e 100644 --- a/spec/plugin_helper.rb +++ b/spec/plugin_helper.rb @@ -1,4 +1,7 @@ -require_relative './fabricators/stripe_response.rb' require_relative './fabricators/customer_fabricator.rb' +require_relative './fabricators/invoices_fabricator.rb' require_relative './fabricators/plans_fabricator.rb' +require_relative './fabricators/products_fabricator.rb' +require_relative './fabricators/stripe_response.rb' +require_relative './fabricators/subscription_response.rb' diff --git a/spec/services/discourse_donations/stripe_spec.rb b/spec/services/discourse_donations/stripe_spec.rb index c2f5ec0..5cc1b36 100644 --- a/spec/services/discourse_donations/stripe_spec.rb +++ b/spec/services/discourse_donations/stripe_spec.rb @@ -25,7 +25,6 @@ module DiscourseDonations source: nil ).returns(customer) - ::Stripe::Customer.expects(:list) subject.subscribe(params)