Skip to content

Instantly share code, notes, and snippets.

@NilsonLima
Last active July 3, 2020 21:12
Show Gist options
  • Save NilsonLima/ad5486e907254360f467dea4b851fad4 to your computer and use it in GitHub Desktop.
Save NilsonLima/ad5486e907254360f467dea4b851fad4 to your computer and use it in GitHub Desktop.

Mudança de plano

Diagrama de execução

change.rb

class Smartphone::Contract::Change < BaseInteraction  
  def call
    return unless valid_interaction?  
    persist_models!
    change_certificate
  end
  
  def valid_interaction?
    not_suspended?
      && invoices_settled?
      && previous_attributes_valid?
      && new_attributes_valid?
      && suspended_subscription.success?
  end
    
  def not_suspended?
    # 
  end
  
  def invoices_settled?
    #
  end
  
  def previous_attributes_valid?
    #
  end
  
  def new_attributes_valid?
    #
  end
  
  def suspended_subscription
    #
  end
  
  def change_certificate
    #
  end
  
  def persist_models!
    #
  end
end

change_test.rb

require "test_helper"

class Smartphone::Contract::ChangeTest < ActiveSupport::TestCase
  setup do
    @smartphone_contract = smartphone_contracts(:base_contract)
    @params = { id: @smartphone_contract[:id], ... }
  end
  
  subject { Smartphone::Contract::Change }
  
  context "suspended" do    
    should "fail" do
      #
    end
  end
  
  context "not suspended" do
    context "has pending invoices" do
      should "fail" do
        #
      end
    end
    
    context "hasn't pending invoices" do
      context "previous attributes are invalid" do
        should "fail" do
          #
        end
      end
        
      context "previous attributes are valid" do
        context "new attributes are invalid" do
          should "fail" do
            #
          end
        end
    
        context "new attributes are valid" do
          context "not suspendable" do
            should "fail" do
              #
            end
          end
      
          context "suspendable" do
            context "certificate changing" do
              should "fail if operation fails" do
                #
              end
          
              context "happy path" do
                should "return success if operation succeeds" do
                  #
                end
              end
            end
          end
        end 
      end
    end
  end
end

Mudança de aparelho

Diagrama de execução

change_device.rb

class Smartphone::Contract::ChangeDevice < BaseInteraction  
  def call
    return unless valid_interaction? 
    persist_models!
    return unless changed_certificate.success?
    check_imei_async
    notify_user
  end
  
  def valid_interaction?
    not_suspended?
      && invoices_settled?
      && current_device_misatch_previous?
      && previous_attributes_valid?
      && new_attributes_valid?
      && suspended_subscription.success?
  end
    
  def not_suspended?
    # 
  end
  
  def invoices_settled?
    #
  end
  
  def current_device_misatch_previous?
    #
  end
  
  def previous_attributes_valid?
    #
  end
  
  def new_attributes_valid?
    #
  end
  
  def suspended_subscription
    #
  end
  
  def changed_certificate
    #
  end
  
  def check_imei_async
    #
  end
  
  def notify_user
    #
  end
  
  def persist_models!
    #
  end
end

change_device_test.rb

require "test_helper"

class Smartphone::Contract::ChangeDeviceTest < ActiveSupport::TestCase
  setup do
    @smartphone_contract = smartphone_contracts(:base_contract)
    @params = { id: @smartphone_contract[:id], imei: '...', imei_secondary: '...', ... }
  end
  
  subject { Smartphone::Contract::ChangeDevice }
  
  context "suspended" do    
    should "fail" do
      #
    end
  end
  
  context "not suspended" do
    context "current device match previous" do
      should "fail" do
        #
      end
    end
    
    context "current device mismatch previous" do
      context "has pending invoices" do
        should "fail" do
          #
        end
      end

      context "hasn't pending invoices" do
        context "previous attributes are invalid" do
          should "fail" do
            #
          end
        end

        context "previvous attributes are valid" do
          context "new attributes are invalid" do
            should "fail" do
              #
            end
          end
          
          context "new attributes are valid" do
            context "not suspendable" do
              should "fail" do
                #
              end
            end

            context "suspendable" do
              context "certificate changing" do
                should "fail if operation fails" do
                  #
                end
            
                context "happy path" do
                  should "return success if operation succeeds" do
                    #
                  end
                end
              end
            end
          end
        end
      end
    end
  end
end

Cancelamento

Diagrama de execução

cancel.rb

class Smartphone::Contract::Cancel < BaseInteraction
  def call
    return unless valid_interaction?
    if can_cancel_certificate?
      return if local_certificate_canceled.success?
      enqueue_cancel_remote_job
    end
    persist_model!
    nofity_user
  end
  
  def valid_interaction?
    cancelable? && suspended_subscription.success?
  end
  
  def cancelable?
    #
  end
  
  def suspended_subscription
    #
  end
  
  def can_cancel_certificate?
    #
  end
  
  def local_certificate_canceled
    #
  end
  
  def enqueue_cancel_remote_job
    #
  end
  
  def persist_model!
    #
  end
  
  def notify_user
    #
  end
end

cancel_test.rb

require "test_helper"

class Smartphone::Contract::CancelTest < ActiveSupport::TestCase
  setup do
    @smartphone_contract = smartphone_contracts(:base_contract)
    @params = { id: @smartphone_contract[:id], ... }
  end
  
  subject { Smartphone::Contract::Cancel }
  
  context "uncancelable" do
    should "fail" do
      #
    end
  end
  
  context "cancelable" do
    context "not suspendable" do
      should "fail" do
        #
      end
    end
    
    context "suspendable" do
      context "can't cancel certficate" do
        context "happy path" do
          should "return success" do
            #
          end
        end
      end
      
      context "can cancel certificate" do
        context "locally uncancelable" do
          should "fail" do
            #
          end
        end
        
        context "locally cancelable" do
          context "happy path" do
            should "return success" do
              #
            end
          end
        end
      end
    end
  end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment