diff --git a/lib/desugaring.rb b/lib/desugaring.rb index 8d52908..c0c3f5a 100644 --- a/lib/desugaring.rb +++ b/lib/desugaring.rb @@ -20,8 +20,10 @@ def all_the_sugar(recipients, event, message) # # Copy the contents of the previous method here and remove this sugar. # - def desugared_poetry(recipients, event, message) - implement_me! + def desugared_poetry recipients, event, message + mail message, + to: recipients.map(&:email), + subject: "You’re invited to #{event.title} on #{event.date}" end # Ruby allows you to pass arguments identified by name instead of just by position. They are really just @@ -35,8 +37,9 @@ def desugared_poetry(recipients, event, message) # # Copy the contents of the previous method here and remove this sugar. # - def desugared_named_args(recipients, event, message) - implement_me! + def desugared_poetry recipients, event, message + mail message, {to: recipients.map(&:email), + subject: "You’re invited to #{event.title} on #{event.date}"} end # Ruby’s general syntax for hashes is `{key => value, key => value, ...}`. Because it is so common to use @@ -50,8 +53,9 @@ def desugared_named_args(recipients, event, message) # # Copy the contents of the previous method here and remove this sugar. # - def desugared_symbol_keys(recipients, event, message) - implement_me! + def desugared_poetry recipients, event, message + mail message, {:to => recipients.map(&:email), + :subject => "You’re invited to #{event.title} on #{event.date}"} end # You may be wondering how `map(&:email)` works. When you precede the last argument of a method call with @@ -69,8 +73,9 @@ def desugared_symbol_keys(recipients, event, message) # # Copy the contents of the previous method here and remove this sugar. # - def desugared_attr_proc(recipients, event, message) - implement_me! + def desugared_poetry recipients, event, message + mail message, {:to => recipients.map{|x| x.email}, + :subject => "You’re invited to #{event.title} on #{event.date}"} end # You may recall from the Ruby koans that when you put `#{something}` in a `"`-delimited string, Ruby will @@ -87,8 +92,9 @@ def desugared_attr_proc(recipients, event, message) # # Copy the contents of the previous method here and remove this sugar. # - def desugared_interpolation(recipients, event, message) - implement_me! + def desugared_poetry recipients, event, message + mail message, {:to => recipients.map{|x| x.email}, + :subject => "You’re invited to " + (event.title).to_s + " on " + (event.date).to_s} end # Ruby tracks local variables lexically at compile time. Wherever you say `x = y`, the compiler assumes that @@ -109,8 +115,9 @@ def desugared_interpolation(recipients, event, message) # Copy the contents of the previous method here and remove this sugar. # (Think: which names are local variables, and which are not?) # - def desugared_implicit_self(recipients, event, message) - implement_me! + def desugared_poetry recipients, event, message + self.mail message, {:to => recipients.map{|x| x.email}, + :subject => "You’re invited to " + (event.title).to_s + " on " + (event.date).to_s} end # In Ruby, unlike Python, there are no properties distinct from method calls. When you say `x.y`, you are @@ -130,8 +137,9 @@ def desugared_implicit_self(recipients, event, message) # At this point, you should have code that looks remarkably like Javascript. Not _exactly_ like it, # but structurally quite similar! # - def desugared_implicit_parens(recipients, event, message) - implement_me! + def desugared_poetry recipients, event, message + self.mail(message, {:to => recipients.map{|x| x.email()}, + :subject => "You’re invited to " + (event.title()).to_s() + " on " + (event.date()).to_s()}) end # In Ruby, every value is an object and every action is a method call. That includes operators. A binary @@ -152,9 +160,12 @@ def desugared_implicit_parens(recipients, event, message) # P.P.P.S. For full credit on this one, note that addition is left-associative: the things on the left # get added before the things on the right. (a + b + c) means ((a + b) + c), NOT (a + (b + c)). # - def desugared_operators(recipients, event, message) - implement_me! - end + def desugared_poetry recipients, event, message + self.mail(message,{:to => recipients.map{|x| x.email()}, + :subject => "You’re invited to ".+( (event.title()).to_s().+( " on ".+( (event.date()).to_s() ) ) ) + } + ) + end # Compare that to the version at the top. # diff --git a/lib/retail_transaction.rb b/lib/retail_transaction.rb index 1bfa0e3..545e1f0 100644 --- a/lib/retail_transaction.rb +++ b/lib/retail_transaction.rb @@ -39,6 +39,7 @@ def paid? state :processing_payment state :payment_declined state :settled + state :refunded event :check_out do transitions from: :ringing_up, to: :collecting_payment, @@ -61,5 +62,9 @@ def paid? event :payment_declined do transitions from: :processing_payment, to: :payment_declined end + + event :refund do + transitions from: :settled, to: :refunded + end end end diff --git a/test/retail_transaction_test.rb b/test/retail_transaction_test.rb index 823cbfe..72a327d 100644 --- a/test/retail_transaction_test.rb +++ b/test/retail_transaction_test.rb @@ -15,7 +15,7 @@ end it "starts out empty" do - assert_equal true, tx.empty? + assert_equal true, tx.empty? end it "cannot check out if no items" do @@ -64,6 +64,11 @@ assert_equal false, tx.collecting_payment? assert_equal true, tx.processing_payment? end + + it "cannot refund payment" do + assert_invalid_transition { tx.refund! } + end + end describe "processing payment" do @@ -103,6 +108,10 @@ assert_equal false, tx.settled? assert_equal true, tx.payment_declined? end + + it "cannot be refunded" do + assert_invalid_transition { tx.refund! } + end end describe "with declined payment" do @@ -152,5 +161,30 @@ it "cannot be reopened" do assert_invalid_transition { tx.reopen! } end + + it "can be refunded" do + tx.refund! + assert_equal false, tx.settled? + assert_equal true, tx.refunded? + end + end + + describe "refunded purchase" do + before(:each) do + tx.add_item("bobcat") + tx.check_out! + tx.payment_info = "15 cents and a nail" + tx.process_payment! + tx.payment_authorized! + tx.refund! + end + + it "cannot be refunded again" do + assert_invalid_transition { tx.refund! } + end + + it "cannot be reopened" do + assert_invalid_transition { tx.reopen! } + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index a343433..383ebf7 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -8,8 +8,8 @@ # To see full test names when running tests: # -# require "minitest/reporters" -# Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new +require "minitest/reporters" +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new module Minitest::Assertions def assert_invalid_transition