
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
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

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
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

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
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