diff --git a/1.3.2' b/1.3.2' new file mode 100644 index 0000000..e69de29 diff --git a/Gemfile.lock b/Gemfile.lock index 8c1dbb3..858d89f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -23,6 +23,7 @@ GEM PLATFORMS ruby + x64-mingw32 DEPENDENCIES aasm! diff --git a/lib/desugaring.rb b/lib/desugaring.rb index 8d52908..62481a5 100644 --- a/lib/desugaring.rb +++ b/lib/desugaring.rb @@ -1,9 +1,11 @@ module DesugaringExercises + # ’ not the same as ' + def all_the_sugar(recipients, event, message) mail message, - to: recipients.map(&:email), - subject: "You’re invited to #{event.title} on #{event.date}" + to: recipients.map(&:email), + subject: "You’re invited to #{event.title} on #{event.date}" end # Ruby allows you to pass arguments to a method without using parentheses. Ruby programmers lovingly @@ -21,7 +23,9 @@ 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! + 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 @@ -36,7 +40,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! + 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 @@ -51,7 +57,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! + 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 @@ -70,7 +78,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! + 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 @@ -88,7 +98,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! + 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 @@ -110,7 +122,9 @@ def desugared_interpolation(recipients, event, message) # (Think: which names are local variables, and which are not?) # def desugared_implicit_self(recipients, event, message) - implement_me! + 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 @@ -131,7 +145,9 @@ def desugared_implicit_self(recipients, event, message) # but structurally quite similar! # def desugared_implicit_parens(recipients, event, message) - implement_me! + 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 @@ -153,7 +169,7 @@ def desugared_implicit_parens(recipients, event, message) # 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! + 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..5153eb5 100644 --- a/test/retail_transaction_test.rb +++ b/test/retail_transaction_test.rb @@ -103,6 +103,11 @@ assert_equal false, tx.settled? assert_equal true, tx.payment_declined? end + + # No. 2 - ensure can't be refunded + it "cannot be refunded" do + assert_invalid_transition{ tx.refund! } + end end describe "with declined payment" do @@ -114,6 +119,11 @@ tx.payment_declined! end + # No. 2 - ensure can't be refunded + it "cannot be refunded" do + assert_invalid_transition{ tx.refund! } + end + it "cannot add more items" do assert_raises do tx.add_item("half a slice of bologna") @@ -149,8 +159,36 @@ tx.payment_authorized! end + # Settled cannot be reopened + it "cannot be reopened" do + assert_invalid_transition { tx.reopen! } + end + + # No. 1: check if can be refunded? + it "can be refunded" do + tx.refund! + assert_equal false, tx.settled? + assert_equal true, tx.refunded? + end + end + + describe "refunded" do # No 3. describe group for orders already refunded/in refund state + # No. 4 Cannot be refunded for second time + it "cannot be refunded a second time" do + assert_invalid_transition {tx. refund! } + end + + # No. 5 Refunded cannot be reopened, same as settled it "cannot be reopened" do assert_invalid_transition { tx.reopen! } end + end + + # Refund tests + # 1. Test that ensures a settled order can be refunded + # 2. Add tests to one or two other states that ensure they cannot be refunded + # 3. New describe group for orders that are already refunded + # 4. Test transactions cannot be refunded a second time + # 5. Test a refunded order cannot be reopened end diff --git a/test/test_helper.rb b/test/test_helper.rb index a343433..296289d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -8,8 +8,9 @@ # To see full test names when running tests: # -# require "minitest/reporters" -# Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new +# only helpful for retail transaction tests/dedbolt +#require "minitest/reporters" +#Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new module Minitest::Assertions def assert_invalid_transition