diff options
author | Alessandro Desantis <desa.alessandro@gmail.com> | 2020-09-24 14:23:54 +0200 |
---|---|---|
committer | Alessandro Desantis <desa.alessandro@gmail.com> | 2020-09-25 11:52:52 +0200 |
commit | a98ab3aeefca1b679376b6e05b91f5a516f8d802 (patch) | |
tree | 74312a78db6d2948d9d6129c9823c82195ea9072 | |
parent | c2ff76ed6f1b9aa377f566d7d98e743446919c0a (diff) |
Fix coding style violations
79 files changed, 534 insertions, 347 deletions
diff --git a/.rubocop.yml b/.rubocop.yml index 544964e..4714d8d 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,4 +1,4 @@ +inherit_from: .rubocop_todo.yml + require: - solidus_dev_support/rubocop - -inherit_from: .rubocop_todo.yml diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index cdaa6a2..4edc2f5 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,156 +1,152 @@ -Capybara/CurrentPathExpectation: - Enabled: false - -Capybara/FeatureMethods: - Enabled: false - -Layout/AlignHash: - Enabled: false - -Layout/ElseAlignment: - Enabled: false - -Layout/EmptyLineAfterGuardClause: - Enabled: false - -Layout/EndAlignment: - Enabled: false - -Layout/IndentationWidth: - Enabled: false - -Layout/IndentFirstHashElement: - Enabled: false - -Layout/MultilineMethodCallIndentation: - Enabled: false - +# This configuration was generated by +# `rubocop --auto-gen-config` +# on 2020-09-24 12:23:52 UTC using RuboCop version 0.91.1. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 3 Lint/AmbiguousBlockAssociation: - Enabled: false - -Lint/BooleanSymbol: - Enabled: false - -Metrics/LineLength: - Enabled: true - Max: 160 - + Exclude: + - 'spec/controllers/spree/admin/subscriptions_controller_spec.rb' + - 'spec/services/solidus_subscriptions/checkout_spec.rb' + +# Offense count: 1 +Lint/MissingSuper: + Exclude: + - 'app/services/solidus_subscriptions/user_mismatch_error.rb' + +# Offense count: 1 +# Configuration parameters: EnforcedStyleForLeadingUnderscores. +# SupportedStylesForLeadingUnderscores: disallowed, required, optional Naming/MemoizedInstanceVariableName: - Enabled: false - -Rails/ApplicationJob: - Enabled: false - -Rails/ApplicationRecord: - Enabled: false - -Rails/Delegate: - Enabled: false - -Rails/DynamicFindBy: - Enabled: false - -Rails/HasManyOrHasOneDependent: - Enabled: false - -Rails/HttpStatus: - Enabled: false - -Rails/ReflectionClassName: - Enabled: false - -Rails/ReversibleMigration: - Enabled: false - -Rails/SafeNavigation: - Enabled: false - -Rails/SkipsModelValidations: - Enabled: false + Exclude: + - 'lib/solidus_subscriptions/processor.rb' +# Offense count: 1 RSpec/AnyInstance: - Enabled: false + Exclude: + - 'spec/jobs/solidus_subscriptions/process_installments_job_spec.rb' +# Offense count: 46 +# Configuration parameters: Prefixes. +# Prefixes: when, with, without RSpec/ContextWording: - Enabled: false - -RSpec/LetSetup: - Enabled: false - -RSpec/EmptyLineAfterExample: - Enabled: false - -RSpec/EmptyLineAfterFinalLet: - Enabled: false - -RSpec/EmptyLineAfterHook: - Enabled: false - -RSpec/EmptyLineAfterSubject: - Enabled: false - -RSpec/ExpectChange: - Enabled: false - + Exclude: + - 'spec/controllers/solidus_subscriptions/api/v1/line_items_controller_spec.rb' + - 'spec/controllers/spree/admin/subscriptions_controller_spec.rb' + - 'spec/lib/solidus_subscriptions/ability_spec.rb' + - 'spec/lib/solidus_subscriptions/processor_spec.rb' + - 'spec/models/solidus_subscriptions/installment_detail_spec.rb' + - 'spec/models/solidus_subscriptions/installment_spec.rb' + - 'spec/models/solidus_subscriptions/line_item_spec.rb' + - 'spec/models/solidus_subscriptions/subscription_spec.rb' + - 'spec/services/solidus_subscriptions/checkout_spec.rb' + - 'spec/services/solidus_subscriptions/line_item_builder_spec.rb' + - 'spec/services/solidus_subscriptions/order_builder_spec.rb' + +# Offense count: 2 +# Configuration parameters: CustomTransform, IgnoreMethods, SpecSuffixOnly. RSpec/FilePath: - Enabled: false - -RSpec/ImplicitExpect: - Enabled: false + Exclude: + - 'spec/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscrptions_spec.rb' + - 'spec/decorators/models/solidus_subscriptions/spree/user/have_many_subscriptions.rb' +# Offense count: 1 +# Configuration parameters: AssignmentOnly. RSpec/InstanceVariable: - Enabled: false - -RSpec/LeadingSubject: - Enabled: false - -RSpec/LetBeforeExamples: - Enabled: false + Exclude: + - 'spec/services/solidus_subscriptions/checkout_spec.rb' +# Offense count: 18 +RSpec/LetSetup: + Exclude: + - 'spec/controllers/solidus_subscriptions/api/v1/subscriptions_controller_spec.rb' + - 'spec/decorators/controllers/solidus_subscriptions/spree/orders_controller/create_subscription_line_items_spec.rb' + - 'spec/lib/solidus_subscriptions/processor_spec.rb' + - 'spec/services/solidus_subscriptions/checkout_spec.rb' + - 'spec/services/solidus_subscriptions/line_item_builder_spec.rb' + +# Offense count: 8 +# Configuration parameters: EnforcedStyle. +# SupportedStyles: have_received, receive RSpec/MessageSpies: - Enabled: false + Exclude: + - 'spec/services/solidus_subscriptions/failure_dispatcher_spec.rb' + - 'spec/services/solidus_subscriptions/out_of_stock_dispatcher_spec.rb' + - 'spec/services/solidus_subscriptions/payment_failed_dispatcher_spec.rb' + - 'spec/services/solidus_subscriptions/success_dispatcher_spec.rb' +# Offense count: 2 RSpec/MultipleExpectations: - Enabled: false + Max: 2 +# Offense count: 27 +# Configuration parameters: AllowSubject. +RSpec/MultipleMemoizedHelpers: + Max: 14 + +# Offense count: 90 +# Configuration parameters: IgnoreSharedExamples. RSpec/NamedSubject: Enabled: false +# Offense count: 11 RSpec/NestedGroups: - Enabled: false - -RSpec/NotToNot: - Enabled: false - -RSpec/PredicateMatcher: - Enabled: false + Max: 4 -RSpec/ScatteredLet: - Enabled: false - -Style/BracesAroundHashParameters: - Enabled: false +# Offense count: 4 +# Configuration parameters: Include. +# Include: app/models/**/*.rb +Rails/HasManyOrHasOneDependent: + Exclude: + - 'app/models/solidus_subscriptions/installment.rb' + - 'app/models/solidus_subscriptions/subscription.rb' -Style/ClassAndModuleChildren: - Enabled: false +# Offense count: 2 +# Configuration parameters: Include. +# Include: db/migrate/*.rb +Rails/ReversibleMigration: + Exclude: + - 'db/migrate/20160922164101_add_interval_length_and_units_to_subscription_line_items.rb' + - 'db/migrate/20170106224713_change_line_item_max_installments_to_end_date.rb' +# Offense count: 5 +# Configuration parameters: ForbiddenMethods, AllowedMethods. +# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all +Rails/SkipsModelValidations: + Exclude: + - 'app/services/solidus_subscriptions/failure_dispatcher.rb' + - 'app/services/solidus_subscriptions/order_builder.rb' + - 'app/services/solidus_subscriptions/payment_failed_dispatcher.rb' + - 'spec/services/solidus_subscriptions/checkout_spec.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions. +# SupportedStyles: assign_to_condition, assign_inside_condition Style/ConditionalAssignment: - Enabled: false - -Style/FrozenStringLiteralComment: - Enabled: false + Exclude: + - 'app/controllers/spree/admin/subscriptions_controller.rb' +# Offense count: 4 +# Configuration parameters: MinBodyLength. Style/GuardClause: - Enabled: false - -Style/MutableConstant: - Enabled: false + Exclude: + - 'app/models/solidus_subscriptions/subscription.rb' +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle. +# SupportedStyles: compact, exploded Style/RaiseArgs: - Enabled: false - -Style/RegexpLiteral: - Enabled: false - -Style/SymbolProc: - Enabled: false + Exclude: + - 'app/services/solidus_subscriptions/checkout.rb' + +# Offense count: 11 +# Cop supports --auto-correct. +# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. +# URISchemes: http, https +Layout/LineLength: + Max: 290 diff --git a/app/controllers/solidus_subscriptions/api/v1/line_items_controller.rb b/app/controllers/solidus_subscriptions/api/v1/line_items_controller.rb index 3ef1ef0..1ca466d 100644 --- a/app/controllers/solidus_subscriptions/api/v1/line_items_controller.rb +++ b/app/controllers/solidus_subscriptions/api/v1/line_items_controller.rb @@ -1,35 +1,43 @@ -class SolidusSubscriptions::Api::V1::LineItemsController < Spree::Api::BaseController - before_action :load_line_item, only: [:update, :destroy] - wrap_parameters :subscription_line_item - - def update - authorize! :crud, @line_item, @order - if @line_item.update(line_item_params) - render json: @line_item.to_json - else - render json: @line_item.errors.to_json, status: 422 - end - end +# frozen_string_literal: true - def destroy - authorize! :crud, @line_item, @order - return render json: {}, status: 400 if @line_item.order.complete? +module SolidusSubscriptions + module Api + module V1 + class LineItemsController < Spree::Api::BaseController + before_action :load_line_item, only: [:update, :destroy] + wrap_parameters :subscription_line_item - @line_item.destroy! - @line_item.order.recalculate + def update + authorize! :crud, @line_item, @order + if @line_item.update(line_item_params) + render json: @line_item.to_json + else + render json: @line_item.errors.to_json, status: :unprocessable_entity + end + end - render json: @line_item.to_json - end + def destroy + authorize! :crud, @line_item, @order + return render json: {}, status: :bad_request if @line_item.order.complete? - private + @line_item.destroy! + @line_item.order.recalculate - def line_item_params - params.require(:subscription_line_item).permit( - SolidusSubscriptions::PermittedAttributes.subscription_line_item_attributes - [:subscribable_id] - ) - end + render json: @line_item.to_json + end - def load_line_item - @line_item = SolidusSubscriptions::LineItem.find(params[:id]) + private + + def line_item_params + params.require(:subscription_line_item).permit( + SolidusSubscriptions::PermittedAttributes.subscription_line_item_attributes - [:subscribable_id] + ) + end + + def load_line_item + @line_item = SolidusSubscriptions::LineItem.find(params[:id]) + end + end + end end end diff --git a/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb b/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb index 8c37c25..eac8ac5 100644 --- a/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb +++ b/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb @@ -1,50 +1,58 @@ -class SolidusSubscriptions::Api::V1::SubscriptionsController < Spree::Api::BaseController - before_action :load_subscription, only: [:cancel, :update, :skip] - - protect_from_forgery unless: -> { request.format.json? } - - def update - if @subscription.update(subscription_params) - render json: @subscription.to_json(include: [:line_items, :shipping_address, :billing_address]) - else - render json: @subscription.errors.to_json, status: 422 - end - end - - def skip - if @subscription.skip - render json: @subscription.to_json - else - render json: @subscription.errors.to_json, status: 422 - end - end - - def cancel - if @subscription.cancel - render json: @subscription.to_json - else - render json: @subscription.errors.to_json, status: 422 +# frozen_string_literal: true + +module SolidusSubscriptions + module Api + module V1 + class SubscriptionsController < Spree::Api::BaseController + before_action :load_subscription, only: [:cancel, :update, :skip] + + protect_from_forgery unless: -> { request.format.json? } + + def update + if @subscription.update(subscription_params) + render json: @subscription.to_json(include: [:line_items, :shipping_address, :billing_address]) + else + render json: @subscription.errors.to_json, status: :unprocessable_entity + end + end + + def skip + if @subscription.skip + render json: @subscription.to_json + else + render json: @subscription.errors.to_json, status: :unprocessable_entity + end + end + + def cancel + if @subscription.cancel + render json: @subscription.to_json + else + render json: @subscription.errors.to_json, status: :unprocessable_entity + end + end + + private + + def load_subscription + @subscription = current_api_user.subscriptions.find(params[:id]) + end + + def subscription_params + params.require(:subscription).permit( + :interval_units, + :interval_length, + :end_date, + line_items_attributes: line_item_attributes, + shipping_address_attributes: Spree::PermittedAttributes.address_attributes, + billing_address_attributes: Spree::PermittedAttributes.address_attributes, + ) + end + + def line_item_attributes + SolidusSubscriptions.configuration.subscription_line_item_attributes - [:subscribable_id] + [:id] + end + end end end - - private - - def load_subscription - @subscription = current_api_user.subscriptions.find(params[:id]) - end - - def subscription_params - params.require(:subscription).permit( - :interval_units, - :interval_length, - :end_date, - line_items_attributes: line_item_attributes, - shipping_address_attributes: Spree::PermittedAttributes.address_attributes, - billing_address_attributes: Spree::PermittedAttributes.address_attributes, - ) - end - - def line_item_attributes - SolidusSubscriptions.configuration.subscription_line_item_attributes - [:subscribable_id] + [:id] - end end diff --git a/app/controllers/spree/admin/installments_controller.rb b/app/controllers/spree/admin/installments_controller.rb index e687746..97e6f4a 100644 --- a/app/controllers/spree/admin/installments_controller.rb +++ b/app/controllers/spree/admin/installments_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Spree module Admin class InstallmentsController < ResourceController @@ -9,8 +11,8 @@ module Spree @search = collection.ransack((params[:q] || {}).reverse_merge(s: 'created_at desc')) @installments = @search.result(distinct: true). - page(params[:page]). - per(params[:per_page] || Spree::Config[:orders_per_page]) + page(params[:page]). + per(params[:per_page] || Spree::Config[:orders_per_page]) end private diff --git a/app/controllers/spree/admin/subscription_events_controller.rb b/app/controllers/spree/admin/subscription_events_controller.rb index ad86887..71fa6f0 100644 --- a/app/controllers/spree/admin/subscription_events_controller.rb +++ b/app/controllers/spree/admin/subscription_events_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Spree module Admin class SubscriptionEventsController < ResourceController @@ -9,8 +11,8 @@ module Spree @search = collection.ransack((params[:q] || {}).reverse_merge(s: 'created_at desc')) @subscription_events = @search.result(distinct: true). - page(params[:page]). - per(params[:per_page] || 20) + page(params[:page]). + per(params[:per_page] || 20) end private diff --git a/app/controllers/spree/admin/subscriptions_controller.rb b/app/controllers/spree/admin/subscriptions_controller.rb index 596516d..cde63a0 100644 --- a/app/controllers/spree/admin/subscriptions_controller.rb +++ b/app/controllers/spree/admin/subscriptions_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Spree module Admin class SubscriptionsController < ResourceController @@ -5,12 +7,12 @@ module Spree def index @search = SolidusSubscriptions::Subscription. - accessible_by(current_ability, :index).ransack(params[:q]) + accessible_by(current_ability, :index).ransack(params[:q]) @subscriptions = @search.result(distinct: true). - includes(:line_items, :user). - page(params[:page]). - per(params[:per_page] || Spree::Config[:orders_per_page]) + includes(:line_items, :user). + page(params[:page]). + per(params[:per_page] || Spree::Config[:orders_per_page]) end def new @@ -29,9 +31,9 @@ module Spree if @subscription.payment_method&.source_required? @subscription.payment_source = @subscription - .payment_method - .payment_source_class - .find_by(id: params[:subscription][:payment_source_id]) + .payment_method + .payment_source_class + .find_by(id: params[:subscription][:payment_source_id]) else @subscription.payment_source = nil end @@ -45,11 +47,11 @@ module Spree @subscription.cancel end - if @subscription.errors.none? - notice = I18n.t('spree.admin.subscriptions.successfully_canceled') - else - notice = @subscription.errors.full_messages.to_sentence - end + notice = if @subscription.errors.none? + I18n.t('spree.admin.subscriptions.successfully_canceled') + else + @subscription.errors.full_messages.to_sentence + end redirect_back(fallback_location: spree.admin_subscriptions_path, notice: notice) end @@ -57,11 +59,11 @@ module Spree def activate @subscription.activate - if @subscription.errors.none? - notice = I18n.t('spree.admin.subscriptions.successfully_activated') - else - notice = @subscription.errors.full_messages.to_sentence - end + notice = if @subscription.errors.none? + I18n.t('spree.admin.subscriptions.successfully_activated') + else + @subscription.errors.full_messages.to_sentence + end redirect_back(fallback_location: spree.admin_subscriptions_path, notice: notice) end diff --git a/app/decorators/controllers/solidus_subscriptions/spree/api/line_items_controller/create_subscription_line_items.rb b/app/decorators/controllers/solidus_subscriptions/spree/api/line_items_controller/create_subscription_line_items.rb index d24de49..7872a2a 100644 --- a/app/decorators/controllers/solidus_subscriptions/spree/api/line_items_controller/create_subscription_line_items.rb +++ b/app/decorators/controllers/solidus_subscriptions/spree/api/line_items_controller/create_subscription_line_items.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Create new subscription line items associated to the current order, when # a line item is added to the cart which includes subscription_line_item # params. diff --git a/app/decorators/controllers/solidus_subscriptions/spree/orders_controller/create_subscription_line_items.rb b/app/decorators/controllers/solidus_subscriptions/spree/orders_controller/create_subscription_line_items.rb index 5925089..6b39b4c 100644 --- a/app/decorators/controllers/solidus_subscriptions/spree/orders_controller/create_subscription_line_items.rb +++ b/app/decorators/controllers/solidus_subscriptions/spree/orders_controller/create_subscription_line_items.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Create new subscription line items associated to the current order, when # a line item is added to the cart which includes subscription_line_item # params. diff --git a/app/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association.rb b/app/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association.rb index 2faead3..ccb483f 100644 --- a/app/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association.rb +++ b/app/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Each Spree::LineItem can have multiple subscription_line_items. This # allows a cart to represent multiple subscriptions to the same item in # the same order. diff --git a/app/decorators/models/solidus_subscriptions/spree/order/after_create.rb b/app/decorators/models/solidus_subscriptions/spree/order/after_create.rb index 234929a..c67cb96 100644 --- a/app/decorators/models/solidus_subscriptions/spree/order/after_create.rb +++ b/app/decorators/models/solidus_subscriptions/spree/order/after_create.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions module Spree module Order diff --git a/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb b/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb index 6117c35..568e5a8 100644 --- a/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb +++ b/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Once an order is finalized its subscriptions line items should be converted # into active subscriptions. This hooks into Spree::Order#finalize! and # passes all subscription_line_items present on the order to the Subscription diff --git a/app/decorators/models/solidus_subscriptions/spree/order/subscription_line_items_association.rb b/app/decorators/models/solidus_subscriptions/spree/order/subscription_line_items_association.rb index 1d6fde4..3b48225 100644 --- a/app/decorators/models/solidus_subscriptions/spree/order/subscription_line_items_association.rb +++ b/app/decorators/models/solidus_subscriptions/spree/order/subscription_line_items_association.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Spree::Orders may contain many subscription_line_items. When the order is # finalized these subscription_line_items are converted into subscritpions. # The order needs to be able to get a list of associated subscription_line_items diff --git a/app/decorators/models/solidus_subscriptions/spree/product/delegate_subscribable.rb b/app/decorators/models/solidus_subscriptions/spree/product/delegate_subscribable.rb index cdabb7f..740b9d8 100644 --- a/app/decorators/models/solidus_subscriptions/spree/product/delegate_subscribable.rb +++ b/app/decorators/models/solidus_subscriptions/spree/product/delegate_subscribable.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions module Spree module Product diff --git a/app/decorators/models/solidus_subscriptions/spree/user/have_many_subscriptions.rb b/app/decorators/models/solidus_subscriptions/spree/user/have_many_subscriptions.rb index 1d5524f..561e5a1 100644 --- a/app/decorators/models/solidus_subscriptions/spree/user/have_many_subscriptions.rb +++ b/app/decorators/models/solidus_subscriptions/spree/user/have_many_subscriptions.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Spree::Users maintain a list of the subscriptions associated with them module SolidusSubscriptions module Spree diff --git a/app/decorators/models/solidus_subscriptions/spree/variant/variant_pretty_name.rb b/app/decorators/models/solidus_subscriptions/spree/variant/variant_pretty_name.rb index 9b2a5f8..671dcbe 100644 --- a/app/decorators/models/solidus_subscriptions/spree/variant/variant_pretty_name.rb +++ b/app/decorators/models/solidus_subscriptions/spree/variant/variant_pretty_name.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions module Spree module Variant diff --git a/app/jobs/solidus_subscriptions/process_installments_job.rb b/app/jobs/solidus_subscriptions/process_installments_job.rb index 6048ee6..e7e1f63 100644 --- a/app/jobs/solidus_subscriptions/process_installments_job.rb +++ b/app/jobs/solidus_subscriptions/process_installments_job.rb @@ -1,22 +1,24 @@ +# frozen_string_literal: true + # This job is responsible for creating a consolidated installment from a # list of installments and processing it. module SolidusSubscriptions - class ProcessInstallmentsJob < ActiveJob::Base - queue_as SolidusSubscriptions.configuration.processing_queue + class ProcessInstallmentsJob < ApplicationJob + queue_as SolidusSubscriptions.configuration.processing_queue - # Process a collection of installments - # - # @param installment_ids [Array<Integer>] The ids of the - # installments to be processed together and fulfilled by the same order - # - # @return [Spree::Order] The order which fulfills the list of installments - def perform(installment_ids) - return if installment_ids.empty? + # Process a collection of installments + # + # @param installment_ids [Array<Integer>] The ids of the + # installments to be processed together and fulfilled by the same order + # + # @return [Spree::Order] The order which fulfills the list of installments + def perform(installment_ids) + return if installment_ids.empty? - installments = SolidusSubscriptions::Installment.where(id: installment_ids). - includes(subscription: [:line_items, :user]) - Checkout.new(installments).process - end + installments = SolidusSubscriptions::Installment.where(id: installment_ids). + includes(subscription: [:line_items, :user]) + Checkout.new(installments).process + end end end diff --git a/app/models/solidus_subscriptions/installment.rb b/app/models/solidus_subscriptions/installment.rb index c5b4f6c..33146e6 100644 --- a/app/models/solidus_subscriptions/installment.rb +++ b/app/models/solidus_subscriptions/installment.rb @@ -1,8 +1,10 @@ +# frozen_string_literal: true + # This class represents a single iteration of a subscription. It is fulfilled # by a completed order and maintains an association which tracks all attempts # successful or otherwise at fulfilling this installment module SolidusSubscriptions - class Installment < ActiveRecord::Base + class Installment < ApplicationRecord has_many :details, class_name: 'SolidusSubscriptions::InstallmentDetail' belongs_to( :subscription, @@ -30,9 +32,7 @@ module SolidusSubscriptions # object # # @return [SolidusSubscriptions::LineItemBuilder] - def line_item_builder - subscription.line_item_builder - end + delegate :line_item_builder, to: :subscription # Mark this installment as out of stock. # @@ -92,7 +92,7 @@ module SolidusSubscriptions # # @return [Boolean] def fulfilled? - details.where(success: true).exists? + details.exists?(success: true) end # Returns the state of this fulfillment @@ -127,6 +127,7 @@ module SolidusSubscriptions def next_actionable_date return if SolidusSubscriptions.configuration.reprocessing_interval.nil? + (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute end end diff --git a/app/models/solidus_subscriptions/installment_detail.rb b/app/models/solidus_subscriptions/installment_detail.rb index cfd4e70..cf5df73 100644 --- a/app/models/solidus_subscriptions/installment_detail.rb +++ b/app/models/solidus_subscriptions/installment_detail.rb @@ -1,7 +1,9 @@ +# frozen_string_literal: true + # This class represents a single attempt to fulfill an installment. It will # indicate the result of that attempt. module SolidusSubscriptions - class InstallmentDetail < ActiveRecord::Base + class InstallmentDetail < ApplicationRecord belongs_to( :installment, class_name: 'SolidusSubscriptions::Installment', diff --git a/app/models/solidus_subscriptions/interval.rb b/app/models/solidus_subscriptions/interval.rb index 6c747cf..909ee0a 100644 --- a/app/models/solidus_subscriptions/interval.rb +++ b/app/models/solidus_subscriptions/interval.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This module is intended to be included into any active record # model which needs to be aware of how intervals are stored and # calculated in the db. diff --git a/app/models/solidus_subscriptions/line_item.rb b/app/models/solidus_subscriptions/line_item.rb index bd424fd..46b0a0e 100644 --- a/app/models/solidus_subscriptions/line_item.rb +++ b/app/models/solidus_subscriptions/line_item.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # The LineItem class is responsible for associating Line items to subscriptions. # It tracks the following values: # # [Spree::LineItem] :spree_line_item The spree object which created this instance @@ -15,7 +17,7 @@ # # [Integer] :installments How many subscription orders should be placed module SolidusSubscriptions - class LineItem < ActiveRecord::Base + class LineItem < ApplicationRecord include Interval belongs_to( @@ -32,7 +34,7 @@ module SolidusSubscriptions optional: true ) - validates :subscribable_id, presence: :true + validates :subscribable_id, presence: true validates :quantity, numericality: { greater_than: 0 } validates :interval_length, numericality: { greater_than: 0 }, unless: -> { subscription } diff --git a/app/models/solidus_subscriptions/subscription.rb b/app/models/solidus_subscriptions/subscription.rb index 3eb449a..bd8f688 100644 --- a/app/models/solidus_subscriptions/subscription.rb +++ b/app/models/solidus_subscriptions/subscription.rb @@ -1,11 +1,13 @@ +# frozen_string_literal: true + # The subscription class is responsible for grouping together the # information required for the system to place a subscriptions order on # behalf of a specific user. module SolidusSubscriptions - class Subscription < ActiveRecord::Base + class Subscription < ApplicationRecord include Interval - PROCESSING_STATES = [:pending, :failed, :success] + PROCESSING_STATES = [:pending, :failed, :success].freeze belongs_to :user, class_name: "::#{::Spree.user_class}" has_many :line_items, class_name: 'SolidusSubscriptions::LineItem', inverse_of: :subscription @@ -17,7 +19,7 @@ module SolidusSubscriptions belongs_to :payment_method, class_name: '::Spree::PaymentMethod', optional: true belongs_to :payment_source, polymorphic: true, optional: true - validates :user, presence: :true + validates :user, presence: true validates :skip_count, :successive_skip_count, presence: true, numericality: { greater_than_or_equal_to: 0 } validates :interval_length, numericality: { greater_than: 0 } validates :payment_method, presence: true, if: -> { payment_source } @@ -28,8 +30,8 @@ module SolidusSubscriptions accepts_nested_attributes_for :line_items, allow_destroy: true, reject_if: ->(p) { p[:quantity].blank? } before_validation :set_payment_method - before_update :update_actionable_date_if_interval_changed after_create :track_creation_event + before_update :update_actionable_date_if_interval_changed # Find all subscriptions that are "actionable"; that is, ones that have an # actionable_date in the past and are not invalid or canceled. @@ -56,7 +58,7 @@ module SolidusSubscriptions when :pending includes(:installments).where(solidus_subscriptions_installments: { id: nil }) else - raise ArgumentError.new("state must be one of: :success, :failed, :pending") + raise ArgumentError, "state must be one of: :success, :failed, :pending" end end) @@ -93,7 +95,7 @@ module SolidusSubscriptions state_machine :state, initial: :active do event :cancel do transition [:active, :pending_cancellation] => :canceled, - if: ->(subscription) { subscription.can_be_canceled? } + if: ->(subscription) { subscription.can_be_canceled? } transition active: :pending_cancellation end @@ -102,7 +104,7 @@ module SolidusSubscriptions event :deactivate do transition active: :inactive, - if: ->(subscription) { subscription.can_be_deactivated? } + if: ->(subscription) { subscription.can_be_deactivated? } end event :activate do @@ -133,6 +135,7 @@ module SolidusSubscriptions # pending cancellation will still be processed. def can_be_canceled? return true if actionable_date.nil? + (actionable_date - SolidusSubscriptions.configuration.minimum_cancellation_notice).future? end @@ -168,6 +171,7 @@ module SolidusSubscriptions # eligible to be processed. def next_actionable_date return nil unless active? + new_date = (actionable_date || Time.zone.now) (new_date + interval).beginning_of_minute end @@ -200,6 +204,7 @@ module SolidusSubscriptions # if the last installment was fulfilled. def processing_state return 'pending' if installments.empty? + installments.last.fulfilled? ? 'success' : 'failed' end @@ -244,10 +249,10 @@ module SolidusSubscriptions def update_actionable_date_if_interval_changed if persisted? && (interval_length_previously_changed? || interval_units_previously_changed?) base_date = if installments.any? - installments.last.created_at - else - created_at - end + installments.last.created_at + else + created_at + end new_date = interval.since(base_date) diff --git a/app/models/solidus_subscriptions/subscription_event.rb b/app/models/solidus_subscriptions/subscription_event.rb index 93552fd..8476470 100644 --- a/app/models/solidus_subscriptions/subscription_event.rb +++ b/app/models/solidus_subscriptions/subscription_event.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions class SubscriptionEvent < ApplicationRecord belongs_to :subscription, class_name: 'SolidusSubscriptions::Subscription', inverse_of: :events diff --git a/app/models/solidus_subscriptions/subscription_order_promotion_rule.rb b/app/models/solidus_subscriptions/subscription_order_promotion_rule.rb index b78b96a..17d280e 100644 --- a/app/models/solidus_subscriptions/subscription_order_promotion_rule.rb +++ b/app/models/solidus_subscriptions/subscription_order_promotion_rule.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions class SubscriptionOrderPromotionRule < ::Spree::PromotionRule # Promotion can be applied to an entire order. Will only be true diff --git a/app/models/solidus_subscriptions/subscription_promotion_rule.rb b/app/models/solidus_subscriptions/subscription_promotion_rule.rb index 9a76136..fd99979 100644 --- a/app/models/solidus_subscriptions/subscription_promotion_rule.rb +++ b/app/models/solidus_subscriptions/subscription_promotion_rule.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions class SubscriptionPromotionRule < ::Spree::PromotionRule # Promotion can be applied to an entire order. Will only be true diff --git a/app/overrides/views/admin_subscribable_product_checkbox.rb b/app/overrides/views/admin_subscribable_product_checkbox.rb index 221ed1d..aafa2ef 100644 --- a/app/overrides/views/admin_subscribable_product_checkbox.rb +++ b/app/overrides/views/admin_subscribable_product_checkbox.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + Deface::Override.new( virtual_path: "spree/admin/products/_form", name: "solidus_subscriptions_product_subscribable_checkbox", diff --git a/app/overrides/views/admin_subscribable_variant_checkbox.rb b/app/overrides/views/admin_subscribable_variant_checkbox.rb index afd44b7..744fee5 100644 --- a/app/overrides/views/admin_subscribable_variant_checkbox.rb +++ b/app/overrides/views/admin_subscribable_variant_checkbox.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + Deface::Override.new( virtual_path: "spree/admin/variants/_form", name: "solidus_subscriptions_variant_subscribable_checkbox", diff --git a/app/overrides/views/admin_subscriptions_menu_link.rb b/app/overrides/views/admin_subscriptions_menu_link.rb index d709590..aaffe33 100644 --- a/app/overrides/views/admin_subscriptions_menu_link.rb +++ b/app/overrides/views/admin_subscriptions_menu_link.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + if !Spree::Backend::Config.respond_to?(:menu_items) Deface::Override.new( virtual_path: 'spree/admin/shared/_menu', diff --git a/app/overrides/views/subscription_line_item_fields.rb b/app/overrides/views/subscription_line_item_fields.rb index 5870c0c..a076026 100644 --- a/app/overrides/views/subscription_line_item_fields.rb +++ b/app/overrides/views/subscription_line_item_fields.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + Deface::Override.new( virtual_path: "spree/products/_cart_form", name: "subscription_line_item_fields", diff --git a/app/services/solidus_subscriptions/checkout.rb b/app/services/solidus_subscriptions/checkout.rb index 244cb0b..6116502 100644 --- a/app/services/solidus_subscriptions/checkout.rb +++ b/app/services/solidus_subscriptions/checkout.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This class takes a collection of installments and populates a new spree # order with the correct contents based on the subscriptions associated to the # intallments. This is to group together subscriptions being @@ -104,6 +106,7 @@ module SolidusSubscriptions end return if installments.empty? + order_builder.add_line_items(order_line_items) end diff --git a/app/services/solidus_subscriptions/dispatcher.rb b/app/services/solidus_subscriptions/dispatcher.rb index f52745d..b2162c0 100644 --- a/app/services/solidus_subscriptions/dispatcher.rb +++ b/app/services/solidus_subscriptions/dispatcher.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions class Dispatcher attr_reader :installments, :order diff --git a/app/services/solidus_subscriptions/failure_dispatcher.rb b/app/services/solidus_subscriptions/failure_dispatcher.rb index 72d47f9..4fdb828 100644 --- a/app/services/solidus_subscriptions/failure_dispatcher.rb +++ b/app/services/solidus_subscriptions/failure_dispatcher.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # A handler for behaviour that should happen after installments are marked as # failures module SolidusSubscriptions diff --git a/app/services/solidus_subscriptions/line_item_builder.rb b/app/services/solidus_subscriptions/line_item_builder.rb index b288629..1d3ea9b 100644 --- a/app/services/solidus_subscriptions/line_item_builder.rb +++ b/app/services/solidus_subscriptions/line_item_builder.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This class is responsible for taking SubscriptionLineItems and building # them into Spree::LineItems which can be added to an order module SolidusSubscriptions @@ -22,7 +24,7 @@ module SolidusSubscriptions line_items = subscription_line_items.map do |subscription_line_item| variant = subscribables.fetch(subscription_line_item.subscribable_id) - raise UnsubscribableError.new(variant) unless variant.subscribable? + raise UnsubscribableError, variant unless variant.subscribable? next unless variant.can_supply?(subscription_line_item.quantity) ::Spree::LineItem.new(variant: variant, quantity: subscription_line_item.quantity) diff --git a/app/services/solidus_subscriptions/order_builder.rb b/app/services/solidus_subscriptions/order_builder.rb index 30cf8a2..a577e98 100644 --- a/app/services/solidus_subscriptions/order_builder.rb +++ b/app/services/solidus_subscriptions/order_builder.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This class is responsible for adding line items to order without going # through order contents. module SolidusSubscriptions diff --git a/app/services/solidus_subscriptions/out_of_stock_dispatcher.rb b/app/services/solidus_subscriptions/out_of_stock_dispatcher.rb index 811e8eb..b9c181e 100644 --- a/app/services/solidus_subscriptions/out_of_stock_dispatcher.rb +++ b/app/services/solidus_subscriptions/out_of_stock_dispatcher.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This service class is intended to provide callback behaviour to handle # the case where an installment cannot be processed due to lack of stock. module SolidusSubscriptions diff --git a/app/services/solidus_subscriptions/payment_failed_dispatcher.rb b/app/services/solidus_subscriptions/payment_failed_dispatcher.rb index 172758e..d404db0 100644 --- a/app/services/solidus_subscriptions/payment_failed_dispatcher.rb +++ b/app/services/solidus_subscriptions/payment_failed_dispatcher.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This service class is intended to provide callback behaviour to handle # the case where a subscription order cannot be processed because a payment # failed diff --git a/app/services/solidus_subscriptions/subscription_generator.rb b/app/services/solidus_subscriptions/subscription_generator.rb index cf3743f..8153912 100644 --- a/app/services/solidus_subscriptions/subscription_generator.rb +++ b/app/services/solidus_subscriptions/subscription_generator.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This module is responsible for taking SolidusSubscriptions::LineItem # objects and creating SolidusSubscriptions::Subscription Objects module SolidusSubscriptions @@ -47,7 +49,7 @@ module SolidusSubscriptions subscription_line_items.group_by do |li| subscription_configuration(li) end. - values + values end private diff --git a/app/services/solidus_subscriptions/subscription_line_item_builder.rb b/app/services/solidus_subscriptions/subscription_line_item_builder.rb index 19660c4..7354102 100644 --- a/app/services/solidus_subscriptions/subscription_line_item_builder.rb +++ b/app/services/solidus_subscriptions/subscription_line_item_builder.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions module SubscriptionLineItemBuilder private diff --git a/app/services/solidus_subscriptions/success_dispatcher.rb b/app/services/solidus_subscriptions/success_dispatcher.rb index 3335222..ea4a8d3 100644 --- a/app/services/solidus_subscriptions/success_dispatcher.rb +++ b/app/services/solidus_subscriptions/success_dispatcher.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This service class is intended to provide callback behaviour to handle # an installment successfully being processed module SolidusSubscriptions diff --git a/app/services/solidus_subscriptions/unsubscribable_error.rb b/app/services/solidus_subscriptions/unsubscribable_error.rb index 3785983..b7e431f 100644 --- a/app/services/solidus_subscriptions/unsubscribable_error.rb +++ b/app/services/solidus_subscriptions/unsubscribable_error.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This error should be raised if a user attempts to subscribe to a item which # is not subscribable module SolidusSubscriptions diff --git a/app/services/solidus_subscriptions/user_mismatch_error.rb b/app/services/solidus_subscriptions/user_mismatch_error.rb index c3bf513..1d227ca 100644 --- a/app/services/solidus_subscriptions/user_mismatch_error.rb +++ b/app/services/solidus_subscriptions/user_mismatch_error.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions class UserMismatchError < StandardError def initialize(installments) diff --git a/lib/solidus_subscriptions/ability.rb b/lib/solidus_subscriptions/ability.rb index 38699cd..6ce4b2d 100644 --- a/lib/solidus_subscriptions/ability.rb +++ b/lib/solidus_subscriptions/ability.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SolidusSubscriptions class Ability include CanCan::Ability diff --git a/lib/solidus_subscriptions/configuration.rb b/lib/solidus_subscriptions/configuration.rb index d128198..7743295 100644 --- a/lib/solidus_subscriptions/configuration.rb +++ b/lib/solidus_subscriptions/configuration.rb @@ -1,52 +1,52 @@ +# frozen_string_literal: true + module SolidusSubscriptions class Configuration - attr_writer :success_dispatcher_class + attr_accessor :maximum_total_skips + + attr_writer( + :success_dispatcher_class, :failure_dispatcher_class, :payment_failed_dispatcher_class, + :out_of_stock_dispatcher, :maximum_successive_skips, :reprocessing_interval, + :minimum_cancellation_notice, :processing_queue, :subscription_line_item_attributes, + :subscription_attributes, + ) + def success_dispatcher_class @success_dispatcher_class ||= 'SolidusSubscriptions::SuccessDispatcher' @success_dispatcher_class.constantize end - attr_writer :failure_dispatcher_class def failure_dispatcher_class @failure_dispatcher_class ||= 'SolidusSubscriptions::FailureDispatcher' @failure_dispatcher_class.constantize end - attr_writer :payment_failed_dispatcher_class def payment_failed_dispatcher_class @payment_failed_dispatcher_class ||= 'SolidusSubscriptions::PaymentFailedDispatcher' @payment_failed_dispatcher_class.constantize end - attr_writer :out_of_stock_dispatcher def out_of_stock_dispatcher_class @out_of_stock_dispatcher_class ||= 'SolidusSubscriptions::OutOfStockDispatcher' @out_of_stock_dispatcher_class.constantize end - attr_writer :maximum_successive_skips def maximum_successive_skips @maximum_successive_skips ||= 1 end - attr_accessor :maximum_total_skips - - attr_writer :reprocessing_interval def reprocessing_interval @reprocessing_interval ||= 1.day end - attr_writer :minimum_cancellation_notice def minimum_cancellation_notice @minimum_cancellation_notice ||= 1.day end - attr_writer :processing_queue def processing_queue @processing_queue ||= :default end - attr_writer :subscription_line_item_attributes def subscription_line_item_attributes @subscription_line_item_attributes ||= [ :quantity, @@ -57,15 +57,14 @@ module SolidusSubscriptions ] end - attr_writer :subscription_attributes def subscription_attributes @subscription_attributes ||= [ :interval_length, :interval_units, :end_date, :actionable_date, - shipping_address_attributes: Spree::PermittedAttributes.address_attributes, - billing_address_attributes: Spree::PermittedAttributes.address_attributes, + { shipping_address_attributes: Spree::PermittedAttributes.address_attributes, + billing_address_attributes: Spree::PermittedAttributes.address_attributes }, ] end end diff --git a/lib/solidus_subscriptions/engine.rb b/lib/solidus_subscriptions/engine.rb index 0f18d95..ad43db3 100644 --- a/lib/solidus_subscriptions/engine.rb +++ b/lib/solidus_subscriptions/engine.rb @@ -37,6 +37,7 @@ module SolidusSubscriptions initializer 'solidus_subscriptions.configure_backend' do next unless ::Spree::Backend::Config.respond_to?(:menu_items) + ::Spree::Backend::Config.configure do |config| config.menu_items << config.class::MenuItem.new( [:subscriptions], diff --git a/lib/solidus_subscriptions/permitted_attributes.rb b/lib/solidus_subscriptions/permitted_attributes.rb index f689e90..d9ec072 100644 --- a/lib/solidus_subscriptions/permitted_attributes.rb +++ b/lib/solidus_subscriptions/permitted_attributes.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This module is responsible for managing what attributes can be updated # through the api. It also overrides Spree::Permitted attributes to allow the # solidus api to accept nested params for subscription models as well diff --git a/lib/solidus_subscriptions/processor.rb b/lib/solidus_subscriptions/processor.rb index be8a2f5..817d957 100644 --- a/lib/solidus_subscriptions/processor.rb +++ b/lib/solidus_subscriptions/processor.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This class is responsible for finding subscriptions and installments # which need to be processed. It will group them together by user and attempts # to process them together. Subscriptions will also be grouped by their @@ -61,7 +63,7 @@ module SolidusSubscriptions [i.subscription.shipping_address_id, i.subscription.billing_address_id] end - installemts_by_address_and_user.values.each do |grouped_installments| + installemts_by_address_and_user.each_value do |grouped_installments| ProcessInstallmentsJob.perform_later grouped_installments.map(&:id) end end @@ -71,18 +73,18 @@ module SolidusSubscriptions def subscriptions_by_id @subscriptions_by_id ||= Subscription. - actionable. - includes(:line_items, :user). - where(user_id: user_ids). - group_by(&:user_id) + actionable. + includes(:line_items, :user). + where(user_id: user_ids). + group_by(&:user_id) end def retry_installments @failed_installments ||= Installment. - actionable. - includes(:subscription). - where(solidus_subscriptions_subscriptions: { user_id: user_ids }). - group_by { |i| i.subscription.user_id } + actionable. + includes(:subscription). + where(solidus_subscriptions_subscriptions: { user_id: user_ids }). + group_by { |i| i.subscription.user_id } end def installments(user) diff --git a/lib/solidus_subscriptions/testing_support/factories.rb b/lib/solidus_subscriptions/testing_support/factories.rb index 8423e0d..c19a785 100644 --- a/lib/solidus_subscriptions/testing_support/factories.rb +++ b/lib/solidus_subscriptions/testing_support/factories.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'factory_bot' require 'spree/testing_support/factories' diff --git a/lib/solidus_subscriptions/testing_support/factories/installment_detail_factory.rb b/lib/solidus_subscriptions/testing_support/factories/installment_detail_factory.rb index 6f90bf7..6910c0f 100644 --- a/lib/solidus_subscriptions/testing_support/factories/installment_detail_factory.rb +++ b/lib/solidus_subscriptions/testing_support/factories/installment_detail_factory.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + FactoryBot.define do factory :installment_detail, class: 'SolidusSubscriptions::InstallmentDetail' do installment diff --git a/lib/solidus_subscriptions/testing_support/factories/installment_factory.rb b/lib/solidus_subscriptions/testing_support/factories/installment_factory.rb index 9914019..2eb5069 100644 --- a/lib/solidus_subscriptions/testing_support/factories/installment_factory.rb +++ b/lib/solidus_subscriptions/testing_support/factories/installment_factory.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + FactoryBot.define do factory :installment, class: 'SolidusSubscriptions::Installment' do transient { diff --git a/lib/solidus_subscriptions/testing_support/factories/line_item_factory.rb b/lib/solidus_subscriptions/testing_support/factories/line_item_factory.rb index 51926a6..8d454d6 100644 --- a/lib/solidus_subscriptions/testing_support/factories/line_item_factory.rb +++ b/lib/solidus_subscriptions/testing_support/factories/line_item_factory.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + FactoryBot.define do factory :subscription_line_item, class: 'SolidusSubscriptions::LineItem' do subscribable_id { create(:variant, subscribable: true).id } diff --git a/lib/solidus_subscriptions/testing_support/factories/spree/line_item_factory.rb b/lib/solidus_subscriptions/testing_support/factories/spree/line_item_factory.rb index c9d1012..c0dcf1e 100644 --- a/lib/solidus_subscriptions/testing_support/factories/spree/line_item_factory.rb +++ b/lib/solidus_subscriptions/testing_support/factories/spree/line_item_factory.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + FactoryBot.modify do factory :line_item do trait :with_subscription_line_items do diff --git a/lib/solidus_subscriptions/testing_support/factories/spree/order_factory.rb b/lib/solidus_subscriptions/testing_support/factories/spree/order_factory.rb index 3eca360..ed51e3f 100644 --- a/lib/solidus_subscriptions/testing_support/factories/spree/order_factory.rb +++ b/lib/solidus_subscriptions/testing_support/factories/spree/order_factory.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + FactoryBot.modify do factory :order do trait :with_subscription_line_items do diff --git a/lib/solidus_subscriptions/testing_support/factories/spree_modification_factory.rb b/lib/solidus_subscriptions/testing_support/factories/spree_modification_factory.rb index 39e0e46..9870d85 100644 --- a/lib/solidus_subscriptions/testing_support/factories/spree_modification_factory.rb +++ b/lib/solidus_subscriptions/testing_support/factories/spree_modification_factory.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + FactoryBot.modify do factory :user do trait :subscription_user do diff --git a/lib/solidus_subscriptions/testing_support/factories/subscription_event_factory.rb b/lib/solidus_subscriptions/testing_support/factories/subscription_event_factory.rb index 0158e2e..8504037 100644 --- a/lib/solidus_subscriptions/testing_support/factories/subscription_event_factory.rb +++ b/lib/solidus_subscriptions/testing_support/factories/subscription_event_factory.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + FactoryBot.define do factory :subscription_event, class: 'SolidusSubscriptions::SubscriptionEvent' do subscription diff --git a/lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb b/lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb index 8660b13..2898d36 100644 --- a/lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb +++ b/lib/solidus_subscriptions/testing_support/factories/subscription_factory.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + FactoryBot.define do factory :subscription, class: 'SolidusSubscriptions::Subscription' do store diff --git a/lib/tasks/process_subscriptions.rake b/lib/tasks/process_subscriptions.rake index 154b434..1da05ec 100644 --- a/lib/tasks/process_subscriptions.rake +++ b/lib/tasks/process_subscriptions.rake @@ -1,3 +1,5 @@ +# frozen_string_literal: true + namespace :solidus_subscriptions do desc 'Create orders for actionable subscriptions' task process: :environment do diff --git a/spec/controllers/solidus_subscriptions/api/v1/line_items_controller_spec.rb b/spec/controllers/solidus_subscriptions/api/v1/line_items_controller_spec.rb index b570bca..bf8ac5f 100644 --- a/spec/controllers/solidus_subscriptions/api/v1/line_items_controller_spec.rb +++ b/spec/controllers/solidus_subscriptions/api/v1/line_items_controller_spec.rb @@ -4,11 +4,13 @@ RSpec.describe SolidusSubscriptions::Api::V1::LineItemsController, type: :contro routes { SolidusSubscriptions::Engine.routes } let!(:user) { create(:user) } - before { user.generate_spree_api_key! } - let(:line) { create :subscription_line_item, order: order } + before { user.generate_spree_api_key! } + describe "#update" do + subject { post :update, params: params } + let(:params) do { id: line.id, @@ -17,7 +19,6 @@ RSpec.describe SolidusSubscriptions::Api::V1::LineItemsController, type: :contro format: :json } end - subject { post :update, params: params } context 'guest user' do let(:order) { create :order } @@ -36,6 +37,7 @@ RSpec.describe SolidusSubscriptions::Api::V1::LineItemsController, type: :contro let(:json_body) { JSON.parse(subject.body) } it { is_expected.to be_successful } + it "returns the updated record" do expect(json_body["quantity"]).to eq 21 end @@ -62,6 +64,7 @@ RSpec.describe SolidusSubscriptions::Api::V1::LineItemsController, type: :contro let(:json_body) { JSON.parse(subject.body) } it { is_expected.to be_successful } + it "returns the updated record" do expect(json_body["quantity"]).to eq 21 end @@ -83,11 +86,14 @@ RSpec.describe SolidusSubscriptions::Api::V1::LineItemsController, type: :contro context "when the order belongs to someone else" do let(:order) { create :order, user: create(:user) } + it { is_expected.to be_unauthorized } end end describe "#destroy" do + subject { delete :destroy, params: params } + let(:params) { { id: line.id, @@ -96,20 +102,22 @@ RSpec.describe SolidusSubscriptions::Api::V1::LineItemsController, type: :contro format: :json } } - subject { delete :destroy, params: params } context "when the order is not ours" do let(:order) { create :order, user: create(:user) } + it { is_expected.to be_unauthorized } end context "when the order is finalised" do let(:order) { create :completed_order_with_totals, user: user } + it { is_expected.to be_bad_request } end context "when the order is ours and incomplete" do let(:order) { create :order, user: user } + it { is_expected.to be_successful } end end diff --git a/spec/controllers/solidus_subscriptions/api/v1/subscriptions_controller_spec.rb b/spec/controllers/solidus_subscriptions/api/v1/subscriptions_controller_spec.rb index 163f089..90dd089 100644 --- a/spec/controllers/solidus_subscriptions/api/v1/subscriptions_controller_spec.rb +++ b/spec/controllers/solidus_subscriptions/api/v1/subscriptions_controller_spec.rb @@ -4,6 +4,7 @@ RSpec.describe SolidusSubscriptions::Api::V1::SubscriptionsController, type: :co routes { SolidusSubscriptions::Engine.routes } let!(:user) { create :user } + before { user.generate_spree_api_key! } shared_examples "an authenticated subscription" do @@ -22,17 +23,20 @@ RSpec.describe SolidusSubscriptions::Api::V1::SubscriptionsController, type: :co context "when the subscription belongs to someone else" do let!(:subscription) { create :subscription, user: create(:user) } + it { is_expected.to be_not_found } end context 'when the subscription is canceled' do let!(:subscription) { create :subscription, user: user, state: 'canceled' } + it { is_expected.to be_unprocessable } end end describe 'PATCH :update' do subject { patch :update, params: params } + let(:params) do { id: subscription.id, @@ -75,6 +79,7 @@ RSpec.describe SolidusSubscriptions::Api::V1::SubscriptionsController, type: :co context 'when the subscription belongs to the user' do let!(:subscription) { create :subscription, :with_line_item, user: user } + it { is_expected.to be_successful } context 'when the params are not valid' do @@ -93,21 +98,24 @@ RSpec.describe SolidusSubscriptions::Api::V1::SubscriptionsController, type: :co context 'when the subscription belongs to someone else' do let!(:subscription) { create :subscription, :with_line_item, user: create(:user) } + it { is_expected.to be_not_found } end end describe "POST :skip" do - let(:params) { { id: subscription.id, token: user.spree_api_key } } subject { post :skip, params: params } + let(:params) { { id: subscription.id, token: user.spree_api_key } } + it_behaves_like "an authenticated subscription" end describe "POST :cancel" do - let(:params) { { id: subscription.id, token: user.spree_api_key } } subject { post :cancel, params: params } + let(:params) { { id: subscription.id, token: user.spree_api_key } } + it_behaves_like "an authenticated subscription" end end diff --git a/spec/controllers/spree/admin/subscriptions_controller_spec.rb b/spec/controllers/spree/admin/subscriptions_controller_spec.rb index d4de33c..7626efd 100644 --- a/spec/controllers/spree/admin/subscriptions_controller_spec.rb +++ b/spec/controllers/spree/admin/subscriptions_controller_spec.rb @@ -61,6 +61,7 @@ RSpec.describe Spree::Admin::SubscriptionsController, type: :request do describe 'POST cancel' do subject { delete spree.cancel_admin_subscription_path(subscription) } + context 'the subscription can be canceled' do let(:subscription) { create :subscription, :actionable } @@ -87,7 +88,7 @@ RSpec.describe Spree::Admin::SubscriptionsController, type: :request do end it 'cancels the subscription' do - expect { subject }.to_not change { subscription.reload.state } + expect { subject }.not_to change { subscription.reload.state } end end end @@ -121,7 +122,7 @@ RSpec.describe Spree::Admin::SubscriptionsController, type: :request do end it 'cancels the subscription' do - expect { subject }.to_not change { subscription.reload.state } + expect { subject }.not_to change { subscription.reload.state } end end end diff --git a/spec/controllers/spree/api/users_controller_spec.rb b/spec/controllers/spree/api/users_controller_spec.rb index 3acbcc7..0155498 100644 --- a/spec/controllers/spree/api/users_controller_spec.rb +++ b/spec/controllers/spree/api/users_controller_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Spree::Api::UsersController, type: :controller do routes { Spree::Core::Engine.routes } let!(:user) do - create(:user) { |user| user.generate_spree_api_key }.tap(&:save) + create(:user, &:generate_spree_api_key).tap(&:save) end let!(:subscription) { create :subscription, :with_line_item, user: user } diff --git a/spec/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association_spec.rb b/spec/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association_spec.rb index 1674c5e..a0d58d5 100644 --- a/spec/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association_spec.rb +++ b/spec/decorators/models/solidus_subscriptions/spree/line_item/subscription_line_items_association_spec.rb @@ -2,6 +2,7 @@ require 'spec_helper' RSpec.describe SolidusSubscriptions::Spree::LineItem::SubscriptionLineItemsAssociation, type: :model do subject { Spree::LineItem.new } + it { is_expected.to have_many :subscription_line_items } it { is_expected.to accept_nested_attributes_for :subscription_line_items } end diff --git a/spec/features/admin_link_spec.rb b/spec/features/admin_link_spec.rb index 8ec1176..53b30bc 100644 --- a/spec/features/admin_link_spec.rb +++ b/spec/features/admin_link_spec.rb @@ -1,11 +1,11 @@ require 'spec_helper' -RSpec.feature 'Subscriptions admin link', type: :feature do +RSpec.describe 'Subscriptions admin link', type: :feature do stub_authorization! - scenario 'Navigating to the subscriptions backend' do + it 'Navigating to the subscriptions backend' do visit '/admin' click_on "Subscriptions" - expect(page.current_path).to match /admin\/subscriptions/ + expect(page).to have_current_path %r{admin/subscriptions} end end diff --git a/spec/lib/solidus_subscriptions/ability_spec.rb b/spec/lib/solidus_subscriptions/ability_spec.rb index 5e2903d..f27c15c 100644 --- a/spec/lib/solidus_subscriptions/ability_spec.rb +++ b/spec/lib/solidus_subscriptions/ability_spec.rb @@ -13,7 +13,7 @@ RSpec.describe SolidusSubscriptions::Ability do create :subscription_line_item, order: order end - it { should be_able_to :crud, line_item, order } + it { is_expected.to be_able_to :crud, line_item, order } end context 'doesnt own the order' do @@ -24,30 +24,31 @@ RSpec.describe SolidusSubscriptions::Ability do create :subscription_line_item, order: order end - it { should_not be_able_to :crud, line_item, another_order } + it { is_expected.not_to be_able_to :crud, line_item, another_order } end context 'the user owns a subscription' do let(:subscription) { create :subscription, user: user } - it { should be_able_to :crud, subscription } - it { should be_able_to :skip, subscription } - it { should be_able_to :cancel, subscription } + + it { is_expected.to be_able_to :crud, subscription } + it { is_expected.to be_able_to :skip, subscription } + it { is_expected.to be_able_to :cancel, subscription } end context 'the doesnt own a subscription' do let(:another_user) { create :user } let(:subscription) { create :subscription, user: another_user } - it { should_not be_able_to :crud, subscription } - it { should_not be_able_to :skip, subscription } - it { should_not be_able_to :cancel, subscription } + it { is_expected.not_to be_able_to :crud, subscription } + it { is_expected.not_to be_able_to :skip, subscription } + it { is_expected.not_to be_able_to :cancel, subscription } end end context 'the user is an admin' do let(:user) { create :admin_user } - it { should be_able_to :manage, SolidusSubscriptions::Subscription } - it { should be_able_to :manage, SolidusSubscriptions::LineItem } + it { is_expected.to be_able_to :manage, SolidusSubscriptions::Subscription } + it { is_expected.to be_able_to :manage, SolidusSubscriptions::LineItem } end end diff --git a/spec/lib/solidus_subscriptions/processor_spec.rb b/spec/lib/solidus_subscriptions/processor_spec.rb index 96ac9f9..b70d501 100644 --- a/spec/lib/solidus_subscriptions/processor_spec.rb +++ b/spec/lib/solidus_subscriptions/processor_spec.rb @@ -121,11 +121,13 @@ RSpec.describe SolidusSubscriptions::Processor, :checkout do describe '.run' do subject { described_class.run } + it_behaves_like 'a subscription order' end describe '#build_jobs' do subject { described_class.new([user]).build_jobs } + it_behaves_like 'a subscription order' end end diff --git a/spec/models/solidus_subscriptions/installment_detail_spec.rb b/spec/models/solidus_subscriptions/installment_detail_spec.rb index d645057..53f0b53 100644 --- a/spec/models/solidus_subscriptions/installment_detail_spec.rb +++ b/spec/models/solidus_subscriptions/installment_detail_spec.rb @@ -8,11 +8,13 @@ RSpec.describe SolidusSubscriptions::InstallmentDetail, type: :model do context 'the detail was successful' do let(:success) { true } + it { is_expected.to be_falsy } end context 'the detail was not successfuly' do let(:success) { false } + it { is_expected.to be_truthy } end end diff --git a/spec/models/solidus_subscriptions/installment_spec.rb b/spec/models/solidus_subscriptions/installment_spec.rb index c09d949..0928c3c 100644 --- a/spec/models/solidus_subscriptions/installment_spec.rb +++ b/spec/models/solidus_subscriptions/installment_spec.rb @@ -1,10 +1,10 @@ require 'spec_helper' RSpec.describe SolidusSubscriptions::Installment, type: :model do - it { is_expected.to validate_presence_of :subscription } - let(:installment) { create :installment } + it { is_expected.to validate_presence_of :subscription } + describe '#line_item_builder' do subject { installment.line_item_builder } @@ -22,7 +22,8 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do end it { is_expected.to be_a SolidusSubscriptions::InstallmentDetail } - it { is_expected.to_not be_successful } + it { is_expected.not_to be_successful } + it 'has the correct message' do expect(subject).to have_attributes( message: I18n.t('solidus_subscriptions.installment_details.out_of_stock') @@ -46,7 +47,7 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do it 'removes any actionable date if any' do expect { subject }. - to change { installment.actionable_date }. + to change(installment, :actionable_date). from(actionable_date).to(nil) end @@ -67,6 +68,7 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do describe '#failed!' do subject { installment.failed!(order) } + let(:order) { create :order } let(:expected_date) do @@ -74,7 +76,8 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do end it { is_expected.to be_a SolidusSubscriptions::InstallmentDetail } - it { is_expected.to_not be_successful } + it { is_expected.not_to be_successful } + it 'has the correct message' do expect(subject).to have_attributes( message: I18n.t('solidus_subscriptions.installment_details.failed'), @@ -103,30 +106,36 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do describe '#unfulfilled?' do subject { installment.unfulfilled? } + let(:installment) { create(:installment, details: details) } context 'the installment has an associated successful detail' do let(:details) { create_list :installment_detail, 1, success: true } + it { is_expected.to be_falsy } end context 'the installment has no associated successful detail' do let(:details) { create_list :installment_detail, 1 } + it { is_expected.to be_truthy } end end describe '#fulfilled' do subject { installment.fulfilled? } + let(:installment) { create(:installment, details: details) } context 'the installment has an associated completed order' do let(:details) { create_list :installment_detail, 1, success: true } + it { is_expected.to be_truthy } end context 'the installment has no associated completed order' do let(:details) { create_list :installment_detail, 1 } + it { is_expected.to be_falsy } end end @@ -141,7 +150,8 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do end it { is_expected.to be_a SolidusSubscriptions::InstallmentDetail } - it { is_expected.to_not be_successful } + it { is_expected.not_to be_successful } + it 'has the correct message' do expect(subject).to have_attributes( order: order, diff --git a/spec/models/solidus_subscriptions/line_item_spec.rb b/spec/models/solidus_subscriptions/line_item_spec.rb index 26fa757..7312b33 100644 --- a/spec/models/solidus_subscriptions/line_item_spec.rb +++ b/spec/models/solidus_subscriptions/line_item_spec.rb @@ -49,16 +49,19 @@ RSpec.describe SolidusSubscriptions::LineItem, type: :model do end describe "#interval" do + subject { line_item.interval } + let(:line_item) { create :subscription_line_item, :with_subscription } + before do Timecop.freeze(Date.parse("2016-09-22")) line_item.subscription.update!(actionable_date: Date.current) end - after { Timecop.return } - subject { line_item.interval } + after { Timecop.return } it { is_expected.to be_a ActiveSupport::Duration } + it "calculates the duration correctly" do expect(subject.from_now).to eq Date.parse("2016-10-22") end @@ -68,6 +71,7 @@ RSpec.describe SolidusSubscriptions::LineItem, type: :model do subject { line_item.as_json } around { |e| Timecop.freeze { e.run } } + let(:line_item) { create(:subscription_line_item, :with_subscription) } let(:expected_hash) do diff --git a/spec/models/solidus_subscriptions/subscription_spec.rb b/spec/models/solidus_subscriptions/subscription_spec.rb index 38b430c..54a1cba 100644 --- a/spec/models/solidus_subscriptions/subscription_spec.rb +++ b/spec/models/solidus_subscriptions/subscription_spec.rb @@ -50,7 +50,7 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do it 'is canceled' do subject - expect(subscription.canceled?).to be_truthy + expect(subscription).to be_canceled end it 'creates a subscription_canceled event' do @@ -64,7 +64,7 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do it 'is pending cancelation' do subject - expect(subscription.pending_cancellation?).to be_truthy + expect(subscription).to be_pending_cancellation end it 'creates a subscription_canceled event' do @@ -105,11 +105,12 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do context 'when the successive skips have been exceeded' do let(:successive_skips) { 1 } + it { is_expected.to be_falsy } it 'adds errors to the subscription' do subject - expect(subscription.errors[:successive_skip_count]).to_not be_empty + expect(subscription.errors[:successive_skip_count]).not_to be_empty end it 'does not create an event' do @@ -119,11 +120,12 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do context 'when the total skips have been exceeded' do let(:total_skips) { 1 } + it { is_expected.to be_falsy } it 'adds errors to the subscription' do subject - expect(subscription.errors[:skip_count]).to_not be_empty + expect(subscription.errors[:skip_count]).not_to be_empty end it 'does not create an event' do @@ -158,7 +160,7 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do it 'is inactive' do subject - expect(subscription.inactive?).to be_truthy + expect(subscription).to be_inactive end it 'creates a subscription_deactivated event' do @@ -236,6 +238,7 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do context "when the subscription is not active" do let(:subscription) { build_stubbed :subscription, :with_line_item, state: :canceled } + it { is_expected.to be_nil } end end @@ -263,27 +266,27 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do end describe ".actionable" do + subject { described_class.actionable } + let!(:past_subscription) { create :subscription, actionable_date: 2.days.ago } let!(:future_subscription) { create :subscription, actionable_date: 1.month.from_now } let!(:inactive_subscription) { create :subscription, state: "inactive", actionable_date: 7.days.ago } let!(:canceled_subscription) { create :subscription, state: "canceled", actionable_date: 4.days.ago } - subject { described_class.actionable } - it "returns subscriptions that have an actionable date in the past" do expect(subject).to include past_subscription end it "does not include future subscriptions" do - expect(subject).to_not include future_subscription + expect(subject).not_to include future_subscription end it "does not include inactive subscriptions" do - expect(subject).to_not include inactive_subscription + expect(subject).not_to include inactive_subscription end it "does not include canceled subscriptions" do - expect(subject).to_not include canceled_subscription + expect(subject).not_to include canceled_subscription end end @@ -302,6 +305,7 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do context 'when the subscription has never been processed' do let(:subscription) { build_stubbed :subscription } + it { is_expected.to eq 'pending' } end @@ -337,6 +341,7 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do describe '.ransackable_scopes' do subject { described_class.ransackable_scopes } + it { is_expected.to match_array [:in_processing_state] } end @@ -349,16 +354,19 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do context 'successfull subscriptions' do let(:state) { :success } + it { is_expected.to match_array success_subs } end context 'failed subscriptions' do let(:state) { :failed } + it { is_expected.to match_array failed_subs } end context 'new subscriptions' do let(:state) { :pending } + it { is_expected.to match_array new_subs } end @@ -373,6 +381,7 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do describe '.processing_states' do subject { described_class.processing_states } + it { is_expected.to match_array [:pending, :success, :failed] } end diff --git a/spec/requests/solidus_subscriptions/api/v1/subscriptions_spec.rb b/spec/requests/solidus_subscriptions/api/v1/subscriptions_spec.rb index 6167081..bab7b23 100644 --- a/spec/requests/solidus_subscriptions/api/v1/subscriptions_spec.rb +++ b/spec/requests/solidus_subscriptions/api/v1/subscriptions_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe "Subscription endpoints", type: :request do let(:json_resp) { JSON.parse(response.body) } let(:user) { create :user } + before { user.generate_spree_api_key! } describe "#cancel" do @@ -30,10 +31,11 @@ RSpec.describe "Subscription endpoints", type: :request do describe "#skip" do let(:subscription) { create :subscription, :with_line_item, actionable_date: 1.day.from_now, user: user } + let(:expected_date) { "2016-10-27T00:00:00.000Z" } + before { Timecop.freeze(Date.parse("2016-09-26")) } - after { Timecop.return } - let(:expected_date) { "2016-10-27T00:00:00.000Z" } + after { Timecop.return } it "returns the updated record", :aggregate_failures do post solidus_subscriptions.skip_api_v1_subscription_path(subscription), params: { token: user.spree_api_key } diff --git a/spec/services/solidus_subscriptions/checkout_spec.rb b/spec/services/solidus_subscriptions/checkout_spec.rb index aee7129..bd66bbc 100644 --- a/spec/services/solidus_subscriptions/checkout_spec.rb +++ b/spec/services/solidus_subscriptions/checkout_spec.rb @@ -30,6 +30,7 @@ RSpec.describe SolidusSubscriptions::Checkout do context 'initialized with installments belonging to multiple users' do subject { checkout } + let(:installments) { build_stubbed_list :installment, 2 } it 'raises an error' do @@ -40,10 +41,12 @@ RSpec.describe SolidusSubscriptions::Checkout do describe '#process', :checkout do subject(:order) { checkout.process } + let(:subscription_line_item) { installments.first.subscription.line_items.first } shared_examples 'a completed checkout' do it { is_expected.to be_a Spree::Order } + let(:total) { 49.98 } let(:quantity) { installments.length } @@ -108,7 +111,7 @@ RSpec.describe SolidusSubscriptions::Checkout do it { is_expected.to be_nil } it 'creates no order' do - expect { subject }.to_not change { Spree::Order.count } + expect { subject }.not_to change { Spree::Order.count } end end @@ -140,6 +143,7 @@ RSpec.describe SolidusSubscriptions::Checkout do context 'the variant is out of stock' do let(:subscription_line_item) { installments.last.subscription.line_items.first } + let(:expected_date) { (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute } # Remove stock for 1 variant in the consolidated installment before do @@ -148,13 +152,11 @@ RSpec.describe SolidusSubscriptions::Checkout do variant.stock_items.update_all(count_on_hand: 0, backorderable: false) end - let(:expected_date) { (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute } - it 'creates a failed installment detail' do subject detail = installments.first.details.last - expect(detail).to_not be_successful + expect(detail).not_to be_successful expect(detail.message). to eq I18n.t('solidus_subscriptions.installment_details.out_of_stock') end @@ -253,9 +255,10 @@ RSpec.describe SolidusSubscriptions::Checkout do end context 'the user has store credit' do - it_behaves_like 'a completed checkout' - let!(:store_credit_payment_method) { create :store_credit_payment_method } let!(:store_credit) { create :store_credit, user: subscription_user } + let!(:store_credit_payment_method) { create :store_credit_payment_method } + + it_behaves_like 'a completed checkout' it 'has a valid store credit payment' do expect(order.payments.valid.store_credits).to be_present @@ -263,8 +266,6 @@ RSpec.describe SolidusSubscriptions::Checkout do end context 'the subscription has a shipping address' do - it_behaves_like 'a completed checkout' - let(:shipping_address) { create :address } let(:installment_traits) do { subscription_traits: [{ @@ -274,6 +275,9 @@ RSpec.describe SolidusSubscriptions::Checkout do }] } end + let(:shipping_address) { create :address } + + it_behaves_like 'a completed checkout' it 'ships to the subscription address' do expect(subject.ship_address).to eq shipping_address @@ -281,8 +285,6 @@ RSpec.describe SolidusSubscriptions::Checkout do end context 'the subscription has a billing address' do - it_behaves_like 'a completed checkout' - let(:billing_address) { create :address } let(:installment_traits) do { subscription_traits: [{ @@ -292,6 +294,9 @@ RSpec.describe SolidusSubscriptions::Checkout do }] } end + let(:billing_address) { create :address } + + it_behaves_like 'a completed checkout' it 'bills to the subscription address' do expect(subject.bill_address).to eq billing_address @@ -299,8 +304,6 @@ RSpec.describe SolidusSubscriptions::Checkout do end context 'the subscription has a payment method' do - it_behaves_like 'a completed checkout' - let(:payment_method) { create :check_payment_method } let(:installment_traits) do { subscription_traits: [{ @@ -310,6 +313,9 @@ RSpec.describe SolidusSubscriptions::Checkout do }] } end + let(:payment_method) { create :check_payment_method } + + it_behaves_like 'a completed checkout' it 'pays with the payment method' do expect(subject.payments.valid.first.payment_method).to eq payment_method @@ -317,9 +323,6 @@ RSpec.describe SolidusSubscriptions::Checkout do end context 'the subscription has a payment method and a source' do - it_behaves_like 'a completed checkout' - let(:payment_method) { create :credit_card_payment_method } - let(:payment_source) { create :credit_card, payment_method: payment_method, user: subscription_user } let(:installment_traits) do { subscription_traits: [{ @@ -330,6 +333,10 @@ RSpec.describe SolidusSubscriptions::Checkout do }] } end + let(:payment_source) { create :credit_card, payment_method: payment_method, user: subscription_user } + let(:payment_method) { create :credit_card_payment_method } + + it_behaves_like 'a completed checkout' it 'pays with the payment method' do expect(subject.payments.valid.first.payment_method).to eq payment_method @@ -361,6 +368,7 @@ RSpec.describe SolidusSubscriptions::Checkout do describe '#order' do subject { checkout.order } + let(:user) { installments.first.subscription.user } it { is_expected.to be_a Spree::Order } diff --git a/spec/services/solidus_subscriptions/failure_dispatcher_spec.rb b/spec/services/solidus_subscriptions/failure_dispatcher_spec.rb index c24508a..47a1463 100644 --- a/spec/services/solidus_subscriptions/failure_dispatcher_spec.rb +++ b/spec/services/solidus_subscriptions/failure_dispatcher_spec.rb @@ -23,7 +23,7 @@ RSpec.describe SolidusSubscriptions::FailureDispatcher do if Spree.solidus_gem_version > Gem::Version.new('2.10') skip 'Orders in cart state cannot be canceled starting from Solidus 2.11' end - expect { subject }.to change { order.state }.to 'canceled' + expect { subject }.to change(order, :state).to 'canceled' end end end diff --git a/spec/services/solidus_subscriptions/line_item_builder_spec.rb b/spec/services/solidus_subscriptions/line_item_builder_spec.rb index b05c34a..96ca027 100644 --- a/spec/services/solidus_subscriptions/line_item_builder_spec.rb +++ b/spec/services/solidus_subscriptions/line_item_builder_spec.rb @@ -10,6 +10,7 @@ RSpec.describe SolidusSubscriptions::LineItemBuilder do describe '#spree_line_items' do subject { builder.spree_line_items } + let(:expected_attributes) do { variant_id: subscription_line_item.subscribable_id, @@ -36,6 +37,7 @@ RSpec.describe SolidusSubscriptions::LineItemBuilder do context 'the variant is out of stock' do before { create :stock_location, backorderable_default: false } + it { is_expected.to be_empty } end end diff --git a/spec/services/solidus_subscriptions/order_builder_spec.rb b/spec/services/solidus_subscriptions/order_builder_spec.rb index 07f5d3b..3463bd1 100644 --- a/spec/services/solidus_subscriptions/order_builder_spec.rb +++ b/spec/services/solidus_subscriptions/order_builder_spec.rb @@ -36,8 +36,8 @@ RSpec.describe SolidusSubscriptions::OrderBuilder do context 'the line item already exists on the order' do let(:line_items_attributes) do [{ - variant: variant, - quantity: 3 + variant: variant, + quantity: 3 }] end diff --git a/spec/services/solidus_subscriptions/out_of_stock_dispatcher_spec.rb b/spec/services/solidus_subscriptions/out_of_stock_dispatcher_spec.rb index 5108d2f..6a1de74 100644 --- a/spec/services/solidus_subscriptions/out_of_stock_dispatcher_spec.rb +++ b/spec/services/solidus_subscriptions/out_of_stock_dispatcher_spec.rb @@ -6,6 +6,7 @@ RSpec.describe SolidusSubscriptions::OutOfStockDispatcher do describe 'initialization' do subject { dispatcher } + it { is_expected.to be_a described_class } end diff --git a/spec/services/solidus_subscriptions/payment_failed_dispatcher_spec.rb b/spec/services/solidus_subscriptions/payment_failed_dispatcher_spec.rb index 3c3f0b7..a8986b2 100644 --- a/spec/services/solidus_subscriptions/payment_failed_dispatcher_spec.rb +++ b/spec/services/solidus_subscriptions/payment_failed_dispatcher_spec.rb @@ -7,6 +7,7 @@ RSpec.describe SolidusSubscriptions::PaymentFailedDispatcher do describe 'initialization' do subject { dispatcher } + it { is_expected.to be_a described_class } end @@ -27,7 +28,7 @@ RSpec.describe SolidusSubscriptions::PaymentFailedDispatcher do if Spree.solidus_gem_version > Gem::Version.new('2.10') skip 'Orders in cart state cannot be canceled starting from Solidus 2.11' end - expect { subject }.to change { order.state }.to 'canceled' + expect { subject }.to change(order, :state).to 'canceled' end end end diff --git a/spec/services/solidus_subscriptions/subscription_order_promotion_rule_spec.rb b/spec/services/solidus_subscriptions/subscription_order_promotion_rule_spec.rb index 847ab0c..bacbef2 100644 --- a/spec/services/solidus_subscriptions/subscription_order_promotion_rule_spec.rb +++ b/spec/services/solidus_subscriptions/subscription_order_promotion_rule_spec.rb @@ -8,11 +8,13 @@ RSpec.describe SolidusSubscriptions::SubscriptionOrderPromotionRule do context 'when the promotable is a Spree::Order' do let(:promotable) { build_stubbed :order } + it { is_expected.to be_truthy } end context 'when the promotable is not a Spree::Order' do let(:promotable) { build_stubbed :line_item } + it { is_expected.to be_falsy } end end @@ -22,11 +24,13 @@ RSpec.describe SolidusSubscriptions::SubscriptionOrderPromotionRule do context 'when the order fulfills a subscription installment' do let(:order) { create(:order, subscription_order: true) } + it { is_expected.to be_truthy } end context 'when the order contains does not fulfill a subscription installment' do let(:order) { create(:order) } + it { is_expected.to be_falsy } end end diff --git a/spec/services/solidus_subscriptions/subscription_promotion_rule_spec.rb b/spec/services/solidus_subscriptions/subscription_promotion_rule_spec.rb index 9bd2dd2..f4c65cc 100644 --- a/spec/services/solidus_subscriptions/subscription_promotion_rule_spec.rb +++ b/spec/services/solidus_subscriptions/subscription_promotion_rule_spec.rb @@ -8,26 +8,31 @@ RSpec.describe SolidusSubscriptions::SubscriptionPromotionRule do context 'when the promotable is a Spree::Order' do let(:promotable) { build_stubbed :order } + it { is_expected.to be_truthy } end context 'when the promotable is not a Spree::Order' do let(:promotable) { build_stubbed :line_item } + it { is_expected.to be_falsy } end end describe '#eligible?' do subject { rule.eligible? order } + let(:order) { create(:order, line_items: line_items) } context 'when the order contains a line item with a subscription' do let(:line_items) { build_list(:line_item, 1, :with_subscription_line_items) } + it { is_expected.to be_truthy } end context 'when the order does not contain a line item with a subscription' do let(:line_items) { build_list(:line_item, 1) } + it { is_expected.to be_falsy } end end @@ -37,11 +42,13 @@ RSpec.describe SolidusSubscriptions::SubscriptionPromotionRule do context 'when the line item has a subscription' do let(:line_item) { build_stubbed(:line_item, :with_subscription_line_items) } + it { is_expected.to be_truthy } end context 'when the line item has no subscription' do let(:line_item) { build_stubbed :line_item } + it { is_expected.to be_falsy } end end diff --git a/spec/services/solidus_subscriptions/success_dispatcher_spec.rb b/spec/services/solidus_subscriptions/success_dispatcher_spec.rb index ef7d255..2185e0c 100644 --- a/spec/services/solidus_subscriptions/success_dispatcher_spec.rb +++ b/spec/services/solidus_subscriptions/success_dispatcher_spec.rb @@ -6,6 +6,7 @@ RSpec.describe SolidusSubscriptions::SuccessDispatcher do describe 'initialization' do subject { dispatcher } + it { is_expected.to be_a described_class } end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4087c5b..b1657e9 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -19,7 +19,7 @@ require 'solidus_dev_support/rspec/feature_helper' Dir["#{__dir__}/support/**/*.rb"].sort.each { |f| require f } # Requires factories defined in lib/solidus_subscriptions/factories.rb -require 'solidus_subscriptions/factories' +require 'solidus_subscriptions/testing_support/factories' RSpec.configure do |config| config.infer_spec_type_from_file_location! |