From c53eb59701599212db6d49dbe1766f4e278fd35e Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Fri, 29 Apr 2022 22:01:58 +0100 Subject: [PATCH 01/23] Add and test using twilio --- .gitignore | 1 + Gemfile | 1 + Gemfile.lock | 36 ++++++++++++++++++++++++++++++++++++ lib/text.rb | 18 ++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 lib/text.rb diff --git a/.gitignore b/.gitignore index d1a1edf06f..f7ee7a7a6c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ # Local cache of Rubocop remote config .rubocop-* +twilio.env diff --git a/Gemfile b/Gemfile index 35de4a7f0e..ef92586078 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,7 @@ group :test do gem 'rspec' gem 'simplecov', require: false, group: :test gem 'simplecov-console', require: false, group: :test + gem 'twilio-ruby' end group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index 66064703c7..753d63cb51 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,9 +5,39 @@ GEM ast (2.4.2) diff-lcs (1.4.4) docile (1.4.0) + faraday (1.10.0) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.3) + multipart-post (>= 1.2, < 3) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + jwt (2.3.0) + mini_portile2 (2.8.0) + multipart-post (2.1.1) + nokogiri (1.13.4) + mini_portile2 (~> 2.8.0) + racc (~> 1.4) parallel (1.20.1) parser (3.0.2.0) ast (~> 2.4.1) + racc (1.6.0) rainbow (3.0.0) regexp_parser (2.1.1) rexml (3.2.5) @@ -36,6 +66,7 @@ GEM rubocop-ast (1.11.0) parser (>= 3.0.1.1) ruby-progressbar (1.11.0) + ruby2_keywords (0.0.5) simplecov (0.21.2) docile (~> 1.1) simplecov-html (~> 0.11) @@ -48,6 +79,10 @@ GEM simplecov_json_formatter (0.1.3) terminal-table (3.0.1) unicode-display_width (>= 1.1.1, < 3) + twilio-ruby (5.66.2) + faraday (>= 0.9, < 2.0) + jwt (>= 1.5, <= 2.5) + nokogiri (>= 1.6, < 2.0) unicode-display_width (2.0.0) PLATFORMS @@ -58,6 +93,7 @@ DEPENDENCIES rubocop (= 1.20) simplecov simplecov-console + twilio-ruby RUBY VERSION ruby 3.0.2p107 diff --git a/lib/text.rb b/lib/text.rb new file mode 100644 index 0000000000..6ffebb1acf --- /dev/null +++ b/lib/text.rb @@ -0,0 +1,18 @@ +require 'twilio-ruby' + +class Text + ACCOUNT_SID = ENV['TWILIO_ACCOUNT_SID'] + AUTH_TOKEN = ENV['TWILIO_AUTH_TOKEN'] + FROM_NUMBER = ENV['FROM_NUMBER'] + TO_NUMBER = ENV['TO_NUMBER'] + + def initialize(message_body) + @client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) + + message = @client.messages.create( + body: message_body, + from: FROM_NUMBER, + to: TO_NUMBER + ) + end +end From 10529a7fec4468e9025f4fc2de1ef3dfbd4c6b92 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 06:17:17 +0100 Subject: [PATCH 02/23] Add ability to see_menu --- lib/takeaway.rb | 13 +++++++++++++ spec/spec_helper.rb | 3 +++ spec/takeaway_spec.rb | 10 ++++++++++ 3 files changed, 26 insertions(+) create mode 100644 lib/takeaway.rb create mode 100644 spec/takeaway_spec.rb diff --git a/lib/takeaway.rb b/lib/takeaway.rb new file mode 100644 index 0000000000..e97f9754c0 --- /dev/null +++ b/lib/takeaway.rb @@ -0,0 +1,13 @@ +class Takeaway + def initialize(menu) + @menu = menu + end + + def see_menu + menu + end + + private + + attr_reader :menu +end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 252747d899..0a940cc9b3 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -15,3 +15,6 @@ puts "\e[33mTry it now! Just run: rubocop\e[0m" end end + +require 'text' +require 'takeaway' \ No newline at end of file diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb new file mode 100644 index 0000000000..cf007c1871 --- /dev/null +++ b/spec/takeaway_spec.rb @@ -0,0 +1,10 @@ +describe Takeaway do + let(:menu) { double('Menu') } + + describe '#see_menu' do + it 'should return menu' do + takeaway = Takeaway.new(menu) + expect(takeaway.see_menu).to eq(menu) + end + end +end \ No newline at end of file From 010b192659a4e16b5b5a96c32d3a38a8ba88b826 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 06:36:39 +0100 Subject: [PATCH 03/23] Add diagram --- diagram.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 diagram.md diff --git a/diagram.md b/diagram.md new file mode 100644 index 0000000000..3c5775d779 --- /dev/null +++ b/diagram.md @@ -0,0 +1,70 @@ +# Diagram + +``` +Takeaway + @menu Menu + @current_order Order + + view_menu + should return Menu + + add_to_order(items) + should create a new Order + + when at least one item is provided + when all the items match dishes on the Menu + should change current_order selected_items by at least 1 + + when not all the items match dishes on the Menu + should raise error + + when no items are not provided + should raise error + + place_order + when current_order and selected_items are not empty + should change current_order order_complete from false to true + should instruct Text to send_text + + when current_order selected_items are empty + should raise error + +Order + @selected_items [] + @order_total_price 0.00 + @order_complete false + @order_placed_time Time + + check_order_total_matches_item_total + when selected_items are not empty + should return list of selected_items, prices and order_total_price + + when selected_items are empty + should raise error + +Menu + @dishes_menu [{ name: “”, price: 0.00, available: true}] + + display_available_dishes + when dishes_menu contains available dishes + should return list of available dishes names and prices + + when dishes_menu is empty + should raise error + + import_dishes + when dishes are not empty + should change dishes_menu by at least 1 + + when dishes are empty + should raise error + +Text + ORDER_CONFIRMATION_MESSAGE + + @client Twilio::REST::Client + @message_body “” + + send_text + should instruct client with message_body and order_placed_time +``` \ No newline at end of file From c4e17a619a5bf201816a19e0910b944a31730dca Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 10:00:59 +0100 Subject: [PATCH 04/23] Add menu ability to display dishes --- lib/menu.rb | 34 ++++++++++++++++++++++++++++++++++ spec/menu_spec.rb | 25 +++++++++++++++++++++++++ spec/spec_helper.rb | 3 ++- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 lib/menu.rb create mode 100644 spec/menu_spec.rb diff --git a/lib/menu.rb b/lib/menu.rb new file mode 100644 index 0000000000..c6855f6ad5 --- /dev/null +++ b/lib/menu.rb @@ -0,0 +1,34 @@ +class Menu + attr_reader :available_dishes + + def initialize + @dishes = [ + { name: 'pizza', price: 9.50 ,available: true }, + { name: 'pasta', price: 8.20 ,available: true }, + { name: 'tiramisu', price: 4.50 ,available: false } + ] + @available_dishes = filter_dishes_by_available + end + + def display_available_dishes + display_dishes = [] + + available_dishes.each do |dish| + name = dish[:name] + price = dish[:price] + + display_dishes << [name, price] + end + + display_dishes + end + + private + + attr_accessor :dishes + attr_writer :available_dishes + + def filter_dishes_by_available + self.available_dishes = dishes.select { |dish| dish[:available] == true} + end +end diff --git a/spec/menu_spec.rb b/spec/menu_spec.rb new file mode 100644 index 0000000000..7ae559a089 --- /dev/null +++ b/spec/menu_spec.rb @@ -0,0 +1,25 @@ +describe Menu do + subject(:menu) { Menu.new } + + describe '#available_dishes' do + context 'when menu contains some available and some unavailable dishes' do + it 'should only return available dishes' do + expect(menu.available_dishes).to include(hash_including(:name, :price, available: true)) + end + end + end + + describe '#display_available_dishes' do + let(:available_dishes) { [ + { name: 'pizza', price: 9.50 }, + { name: 'pasta', price: 8.20 }, + ] } + + it 'should return available dish names and prices' do + expect(menu.display_available_dishes).to contain_exactly( + ['pizza', 9.50], + ['pasta', 8.20] + ) + end + end +end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 0a940cc9b3..9a0c855268 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -17,4 +17,5 @@ end require 'text' -require 'takeaway' \ No newline at end of file +require 'takeaway' +require 'menu' \ No newline at end of file From 7d9a8193aa93894c7f70b9a6ef81f3b1f031015a Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 13:31:14 +0100 Subject: [PATCH 05/23] Add interaction with Menu class --- lib/takeaway.rb | 10 ++++++---- spec/takeaway_spec.rb | 17 ++++++++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/takeaway.rb b/lib/takeaway.rb index e97f9754c0..7de2806614 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -1,13 +1,15 @@ class Takeaway - def initialize(menu) + attr_reader :menu, :current_order + + def initialize(menu = Menu.new) @menu = menu end - def see_menu - menu + def display_menu + menu.display_available_dishes end private - attr_reader :menu + end \ No newline at end of file diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index cf007c1871..2ca123c23c 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -1,10 +1,17 @@ describe Takeaway do - let(:menu) { double('Menu') } + let(:menu) { instance_double('Menu') } + subject(:takeaway) { Takeaway.new(menu)} - describe '#see_menu' do - it 'should return menu' do - takeaway = Takeaway.new(menu) - expect(takeaway.see_menu).to eq(menu) + describe '#display_menu' do + it 'should instruct Menu to return available dishes' do + expect(menu).to receive(:display_available_dishes) + takeaway.display_menu + end + end + + describe '#add_to_order' do + it 'should create a new order' do + expect(takeaway.current_order).to be_instance_of Order end end end \ No newline at end of file From 0ba4cd9190500ace03be4ddd6f5f877ece882e73 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 13:38:23 +0100 Subject: [PATCH 06/23] Add ability to create order in takeaway --- diagram.md | 4 ++-- lib/order.rb | 3 +++ lib/takeaway.rb | 6 +++++- spec/order_spec.rb | 0 spec/spec_helper.rb | 3 ++- spec/takeaway_spec.rb | 2 +- 6 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 lib/order.rb create mode 100644 spec/order_spec.rb diff --git a/diagram.md b/diagram.md index 3c5775d779..feedf3d3f4 100644 --- a/diagram.md +++ b/diagram.md @@ -5,8 +5,8 @@ Takeaway @menu Menu @current_order Order - view_menu - should return Menu + display_menu + should instruct Menu to display available dishes add_to_order(items) should create a new Order diff --git a/lib/order.rb b/lib/order.rb new file mode 100644 index 0000000000..0f7b8d6621 --- /dev/null +++ b/lib/order.rb @@ -0,0 +1,3 @@ +class Order + +end \ No newline at end of file diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 7de2806614..8a6dbfdb84 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -9,7 +9,11 @@ def display_menu menu.display_available_dishes end - private + def add_to_order + self.current_order = Order.new + end + private + attr_writer :current_order end \ No newline at end of file diff --git a/spec/order_spec.rb b/spec/order_spec.rb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9a0c855268..80f29f6c37 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -18,4 +18,5 @@ require 'text' require 'takeaway' -require 'menu' \ No newline at end of file +require 'menu' +require 'order' \ No newline at end of file diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index 2ca123c23c..780e8006c3 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -11,7 +11,7 @@ describe '#add_to_order' do it 'should create a new order' do - expect(takeaway.current_order).to be_instance_of Order + expect { takeaway.add_to_order }.to change(takeaway, :current_order).from(nil).to(be_an_instance_of Order) end end end \ No newline at end of file From 5fea51e12b5a0c579f53f6139856896a7d9e8167 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 14:28:35 +0100 Subject: [PATCH 07/23] Add add to basket behaviour for Order --- diagram.md | 17 ++++++++++------- lib/order.rb | 12 +++++++++++- spec/order_spec.rb | 10 ++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/diagram.md b/diagram.md index feedf3d3f4..ffc75cb99c 100644 --- a/diagram.md +++ b/diagram.md @@ -13,7 +13,7 @@ Takeaway when at least one item is provided when all the items match dishes on the Menu - should change current_order selected_items by at least 1 + should change current_order basket by at least 1 when not all the items match dishes on the Menu should raise error @@ -22,24 +22,27 @@ Takeaway should raise error place_order - when current_order and selected_items are not empty + when current_order and basket are not empty should change current_order order_complete from false to true should instruct Text to send_text - when current_order selected_items are empty + when current_order basket are empty should raise error Order - @selected_items [] + @basket [] @order_total_price 0.00 @order_complete false @order_placed_time Time + add_to_basket + should change basket by number of dishes + check_order_total_matches_item_total - when selected_items are not empty - should return list of selected_items, prices and order_total_price + when basket are not empty + should return list of basket, prices and order_total_price - when selected_items are empty + when basket are empty should raise error Menu diff --git a/lib/order.rb b/lib/order.rb index 0f7b8d6621..a9a265edb8 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -1,3 +1,13 @@ class Order + attr_reader :basket -end \ No newline at end of file + def initialize + @basket = [] + end + + def add_to_basket(dishes) + dishes.each { |dish| basket << dish } + puts "basket = #{basket}" + end + +end diff --git a/spec/order_spec.rb b/spec/order_spec.rb index e69de29bb2..7a8cf99299 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -0,0 +1,10 @@ +describe Order do + subject(:order) { Order.new } + + describe 'add_to_basket' do + it 'should change basket by dishes chosen' do + dishes = ['pizza', 'pasta'] + expect { order.add_to_basket(dishes) }.to change { order.basket.length }.by(dishes.length) + end + end +end From aee76f38aad6f3d602e7c55707c4e038c28c5ef8 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 15:41:56 +0100 Subject: [PATCH 08/23] Add behaviour for Takeaway to instruct Order to add dishes to basket --- diagram.md | 16 +++++++--------- lib/order.rb | 1 - lib/takeaway.rb | 9 +++++---- lib/text.rb | 30 +++++++++++++++--------------- spec/order_spec.rb | 3 ++- spec/spec_helper.rb | 10 ++-------- spec/takeaway_spec.rb | 13 ++++++++----- 7 files changed, 39 insertions(+), 43 deletions(-) diff --git a/diagram.md b/diagram.md index ffc75cb99c..9a5508acbd 100644 --- a/diagram.md +++ b/diagram.md @@ -8,17 +8,15 @@ Takeaway display_menu should instruct Menu to display available dishes - add_to_order(items) - should create a new Order + add_to_order(dishes) + when at least one item is chosen + when all the dishes match dishes on the Menu + should change current_order basket by at least 1 - when at least one item is provided - when all the items match dishes on the Menu - should change current_order basket by at least 1 + when not all the dishes match dishes on the Menu + should raise error - when not all the items match dishes on the Menu - should raise error - - when no items are not provided + when no dishes are not provided should raise error place_order diff --git a/lib/order.rb b/lib/order.rb index a9a265edb8..b4a6bacaf1 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -7,7 +7,6 @@ def initialize def add_to_basket(dishes) dishes.each { |dish| basket << dish } - puts "basket = #{basket}" end end diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 8a6dbfdb84..a0115bb958 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -1,19 +1,20 @@ class Takeaway attr_reader :menu, :current_order - def initialize(menu = Menu.new) + def initialize(menu = Menu.new, current_order = Order.new) @menu = menu + @current_order = current_order end def display_menu menu.display_available_dishes end - def add_to_order - self.current_order = Order.new + def add_to_order(dishes) + current_order.add_to_basket(dishes) end private - attr_writer :current_order + # attr_writer :current_order end \ No newline at end of file diff --git a/lib/text.rb b/lib/text.rb index 6ffebb1acf..9c79769c41 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -1,18 +1,18 @@ -require 'twilio-ruby' +# require 'twilio-ruby' -class Text - ACCOUNT_SID = ENV['TWILIO_ACCOUNT_SID'] - AUTH_TOKEN = ENV['TWILIO_AUTH_TOKEN'] - FROM_NUMBER = ENV['FROM_NUMBER'] - TO_NUMBER = ENV['TO_NUMBER'] +# class Text +# ACCOUNT_SID = ENV['TWILIO_ACCOUNT_SID'] +# AUTH_TOKEN = ENV['TWILIO_AUTH_TOKEN'] +# FROM_NUMBER = ENV['FROM_NUMBER'] +# TO_NUMBER = ENV['TO_NUMBER'] - def initialize(message_body) - @client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) +# def initialize(message_body) +# @client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) - message = @client.messages.create( - body: message_body, - from: FROM_NUMBER, - to: TO_NUMBER - ) - end -end +# message = @client.messages.create( +# body: message_body, +# from: FROM_NUMBER, +# to: TO_NUMBER +# ) +# end +# end diff --git a/spec/order_spec.rb b/spec/order_spec.rb index 7a8cf99299..0dbd558acf 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -4,7 +4,8 @@ describe 'add_to_basket' do it 'should change basket by dishes chosen' do dishes = ['pizza', 'pasta'] - expect { order.add_to_basket(dishes) }.to change { order.basket.length }.by(dishes.length) + expect { order.add_to_basket(dishes) }.to change { + order.basket.length }.by(dishes.length) end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 80f29f6c37..1d0681d4dc 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -6,14 +6,8 @@ # Want a nice code coverage website? Uncomment this next line! # SimpleCov::Formatter::HTMLFormatter ]) -SimpleCov.start - -RSpec.configure do |config| - config.after(:suite) do - puts - puts "\e[33mHave you considered running rubocop? It will help you improve your code!\e[0m" - puts "\e[33mTry it now! Just run: rubocop\e[0m" - end +SimpleCov.start do + add_filter 'spec' end require 'text' diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index 780e8006c3..cfa03bf343 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -1,6 +1,7 @@ describe Takeaway do - let(:menu) { instance_double('Menu') } - subject(:takeaway) { Takeaway.new(menu)} + let(:menu) { instance_double('Menu', :display_available_dishes) } + let(:order) { instance_double('Order', :add_to_basket) } + subject(:takeaway) { Takeaway.new(menu, order)} describe '#display_menu' do it 'should instruct Menu to return available dishes' do @@ -10,8 +11,10 @@ end describe '#add_to_order' do - it 'should create a new order' do - expect { takeaway.add_to_order }.to change(takeaway, :current_order).from(nil).to(be_an_instance_of Order) + it 'should instruct Order to add dishes to basket' do + expect(order).to receive(:add_to_basket) + dishes = ['pizza', 'pasta'] + takeaway.add_to_order(dishes) end end -end \ No newline at end of file +end From 6597650d7490ca2549b780dfb4ce8e95055db9a4 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 16:43:42 +0100 Subject: [PATCH 09/23] Add place_order behaviour --- diagram.md | 2 +- lib/order.rb | 11 ++++++++++- lib/takeaway.rb | 12 +++++++----- lib/text.rb | 36 +++++++++++++++++++++--------------- spec/spec_helper.rb | 10 ++++++++++ spec/takeaway_spec.rb | 30 +++++++++++++++++++++++++----- 6 files changed, 74 insertions(+), 27 deletions(-) diff --git a/diagram.md b/diagram.md index 9a5508acbd..e9b4948434 100644 --- a/diagram.md +++ b/diagram.md @@ -11,7 +11,7 @@ Takeaway add_to_order(dishes) when at least one item is chosen when all the dishes match dishes on the Menu - should change current_order basket by at least 1 + should instruct when not all the dishes match dishes on the Menu should raise error diff --git a/lib/order.rb b/lib/order.rb index b4a6bacaf1..d7fbebe9ae 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -1,12 +1,21 @@ class Order - attr_reader :basket + attr_reader :basket, :complete_status def initialize @basket = [] + @complete_status = false end def add_to_basket(dishes) dishes.each { |dish| basket << dish } end + + def complete_order + self.complete_status = true + end + + private + + attr_writer :complete_status end diff --git a/lib/takeaway.rb b/lib/takeaway.rb index a0115bb958..0c254fcef8 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -1,9 +1,10 @@ class Takeaway - attr_reader :menu, :current_order + attr_reader :menu, :current_order, :text - def initialize(menu = Menu.new, current_order = Order.new) + def initialize(menu = Menu.new, current_order = Order.new, text = Text.new) @menu = menu @current_order = current_order + @text = text end def display_menu @@ -14,7 +15,8 @@ def add_to_order(dishes) current_order.add_to_basket(dishes) end - private - - # attr_writer :current_order + def place_order + current_order.complete_order + text.send_completion_message + end end \ No newline at end of file diff --git a/lib/text.rb b/lib/text.rb index 9c79769c41..c4f341d577 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -1,18 +1,24 @@ -# require 'twilio-ruby' +require 'twilio-ruby' -# class Text -# ACCOUNT_SID = ENV['TWILIO_ACCOUNT_SID'] -# AUTH_TOKEN = ENV['TWILIO_AUTH_TOKEN'] -# FROM_NUMBER = ENV['FROM_NUMBER'] -# TO_NUMBER = ENV['TO_NUMBER'] +class Text + ACCOUNT_SID = ENV['TWILIO_ACCOUNT_SID'] + AUTH_TOKEN = ENV['TWILIO_AUTH_TOKEN'] + FROM_NUMBER = ENV['FROM_NUMBER'] + TO_NUMBER = ENV['TO_NUMBER'] -# def initialize(message_body) -# @client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) + def initialize + @client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) + end -# message = @client.messages.create( -# body: message_body, -# from: FROM_NUMBER, -# to: TO_NUMBER -# ) -# end -# end + def send_completion_message + message = client.messages.create( + body: message_body + time, + from: FROM_NUMBER, + to: TO_NUMBER + ) + end + + private + + attr_reader :client +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 1d0681d4dc..1a6b2e805f 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -10,6 +10,16 @@ add_filter 'spec' end +module FormatterOverrides + def example_pending(_) + end + + def dump_pending(_) + end +end + +RSpec::Core::Formatters::DocumentationFormatter.prepend FormatterOverrides + require 'text' require 'takeaway' require 'menu' diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index cfa03bf343..f486e52720 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -1,20 +1,40 @@ describe Takeaway do - let(:menu) { instance_double('Menu', :display_available_dishes) } - let(:order) { instance_double('Order', :add_to_basket) } - subject(:takeaway) { Takeaway.new(menu, order)} + let(:menu) { instance_double('Menu') } + let(:order) { instance_double('Order') } + let(:text) { instance_double('Text') } + + subject(:takeaway) { Takeaway.new(menu, order, text) } describe '#display_menu' do - it 'should instruct Menu to return available dishes' do + it 'should instruct menu to return available dishes' do expect(menu).to receive(:display_available_dishes) takeaway.display_menu end end describe '#add_to_order' do - it 'should instruct Order to add dishes to basket' do + it 'should instruct current_order to add dishes to basket' do expect(order).to receive(:add_to_basket) dishes = ['pizza', 'pasta'] takeaway.add_to_order(dishes) end end + + describe '#place_order' do + it 'should instruct current_order to complete' do + allow(order).to receive(:complete_order) + allow(text).to receive(:send_completion_message) + + expect(order).to receive(:complete_order) + takeaway.place_order + end + + it 'should instruct text to send_completion_message' do + allow(order).to receive(:complete_order) + allow(text).to receive(:send_completion_message) + + expect(text).to receive(:send_completion_message) + takeaway.place_order + end + end end From ef186babbcf444701a9d07282faa0e6ee972d823 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 16:49:00 +0100 Subject: [PATCH 10/23] refactor menu spec --- spec/menu_spec.rb | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/spec/menu_spec.rb b/spec/menu_spec.rb index 7ae559a089..3f087b2f49 100644 --- a/spec/menu_spec.rb +++ b/spec/menu_spec.rb @@ -1,25 +1,23 @@ describe Menu do subject(:menu) { Menu.new } - describe '#available_dishes' do - context 'when menu contains some available and some unavailable dishes' do - it 'should only return available dishes' do - expect(menu.available_dishes).to include(hash_including(:name, :price, available: true)) - end + describe '#display_available_dishes' do + it 'should only return available dishes' do + expect(menu.available_dishes).to include(hash_including(:name, :price, available: true)) end - end - describe '#display_available_dishes' do - let(:available_dishes) { [ - { name: 'pizza', price: 9.50 }, - { name: 'pasta', price: 8.20 }, - ] } + context 'when unavailable dishes have been removed' do + let(:available_dishes) { [ + { name: 'pizza', price: 9.50 }, + { name: 'pasta', price: 8.20 }, + ] } - it 'should return available dish names and prices' do - expect(menu.display_available_dishes).to contain_exactly( - ['pizza', 9.50], - ['pasta', 8.20] - ) + it 'should return available dish names and prices' do + expect(menu.display_available_dishes).to contain_exactly( + ['pizza', 9.50], + ['pasta', 8.20] + ) + end end end end \ No newline at end of file From 5197e8b38851ad15028a7b8872495c35451d87b0 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 17:29:57 +0100 Subject: [PATCH 11/23] Test for sending text --- lib/takeaway.rb | 12 +++++++++--- lib/text.rb | 10 +++++++--- spec/order_spec.rb | 8 +++++++- spec/text_spec.rb | 13 +++++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 spec/text_spec.rb diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 0c254fcef8..1323cfba34 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -1,7 +1,9 @@ class Takeaway - attr_reader :menu, :current_order, :text - - def initialize(menu = Menu.new, current_order = Order.new, text = Text.new) + def initialize( + menu = Menu.new, + current_order = Order.new, + text = Text.new + ) @menu = menu @current_order = current_order @text = text @@ -19,4 +21,8 @@ def place_order current_order.complete_order text.send_completion_message end + + private + + attr_reader :menu, :current_order, :text end \ No newline at end of file diff --git a/lib/text.rb b/lib/text.rb index c4f341d577..9f974ac1d8 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -6,13 +6,17 @@ class Text FROM_NUMBER = ENV['FROM_NUMBER'] TO_NUMBER = ENV['TO_NUMBER'] - def initialize - @client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) + COMPLETION_MESSAGE_BODY = "Thanks for your order! Our chefs are already busy preparing your food, and then it will be on it's way to you in no time. Listen out for the doorbell around " + + def initialize( + client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) + ) + @client = client end def send_completion_message message = client.messages.create( - body: message_body + time, + body: COMPLETION_MESSAGE_BODY, from: FROM_NUMBER, to: TO_NUMBER ) diff --git a/spec/order_spec.rb b/spec/order_spec.rb index 0dbd558acf..6ebe728404 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -1,11 +1,17 @@ describe Order do subject(:order) { Order.new } - describe 'add_to_basket' do + describe '#add_to_basket' do it 'should change basket by dishes chosen' do dishes = ['pizza', 'pasta'] expect { order.add_to_basket(dishes) }.to change { order.basket.length }.by(dishes.length) end end + + describe '#complete_order' do + it 'should change complete_status to completed' do + expect { order.complete_order }.to change { order.complete_status}.from(false).to(true) + end + end end diff --git a/spec/text_spec.rb b/spec/text_spec.rb new file mode 100644 index 0000000000..a972914fe5 --- /dev/null +++ b/spec/text_spec.rb @@ -0,0 +1,13 @@ +describe Text do + let(:client) { instance_double('Client', messages: self)} + subject(:text) { Text.new(client) } + + # client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) + + describe '#send_completion_message' do + it 'should instruct client to send text message' do + expect(client.messages).to receive(:create) + text.send_completion_message + end + end +end \ No newline at end of file From d33825e775e17b8c9a02b015fa1052adcd494609 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sat, 30 Apr 2022 18:47:10 +0100 Subject: [PATCH 12/23] Implement order completion time and expected delivery time --- lib/order.rb | 6 ++++-- lib/takeaway.rb | 15 +++++++++++++-- lib/text.rb | 4 ++-- spec/order_spec.rb | 2 +- spec/takeaway_spec.rb | 7 +++++++ spec/text_spec.rb | 8 +++++--- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/order.rb b/lib/order.rb index d7fbebe9ae..68763a2751 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -4,18 +4,20 @@ class Order def initialize @basket = [] @complete_status = false + @completion_time = nil end def add_to_basket(dishes) dishes.each { |dish| basket << dish } end - def complete_order + def complete_order(completion_time) self.complete_status = true + self.completion_time = completion_time end private - attr_writer :complete_status + attr_writer :complete_status, :completion_time end diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 1323cfba34..9ed7eb3d54 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -1,4 +1,6 @@ class Takeaway + STANDARD_DELIVERY_TIMEFRAME = 3600 + def initialize( menu = Menu.new, current_order = Order.new, @@ -18,11 +20,20 @@ def add_to_order(dishes) end def place_order - current_order.complete_order - text.send_completion_message + current_order.complete_order(completion_time = current_time) + text.send_completion_message(expected_delivery_time = standard_delivery_time) end private attr_reader :menu, :current_order, :text + + def standard_delivery_time + time = current_time + STANDARD_DELIVERY_TIMEFRAME + time.strftime("%H:%M") + end + + def current_time + Time.now + end end \ No newline at end of file diff --git a/lib/text.rb b/lib/text.rb index 9f974ac1d8..aac691d331 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -14,9 +14,9 @@ def initialize( @client = client end - def send_completion_message + def send_completion_message(time) message = client.messages.create( - body: COMPLETION_MESSAGE_BODY, + body: COMPLETION_MESSAGE_BODY + time, from: FROM_NUMBER, to: TO_NUMBER ) diff --git a/spec/order_spec.rb b/spec/order_spec.rb index 6ebe728404..7b89e32c5f 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -11,7 +11,7 @@ describe '#complete_order' do it 'should change complete_status to completed' do - expect { order.complete_order }.to change { order.complete_status}.from(false).to(true) + expect { order.complete_order('time') }.to change { order.complete_status}.from(false).to(true) end end end diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index f486e52720..585f1af550 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -37,4 +37,11 @@ takeaway.place_order end end + + describe '#verify_order_basket_total' do + it 'should instruct current_order to return dishes and prices' + + it 'should return current_order' + + end end diff --git a/spec/text_spec.rb b/spec/text_spec.rb index a972914fe5..0d4b3c0233 100644 --- a/spec/text_spec.rb +++ b/spec/text_spec.rb @@ -2,12 +2,14 @@ let(:client) { instance_double('Client', messages: self)} subject(:text) { Text.new(client) } - # client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) - describe '#send_completion_message' do it 'should instruct client to send text message' do expect(client.messages).to receive(:create) - text.send_completion_message + text.send_completion_message('time') + end + + it 'message should contain expected delivery time' do + expect(text).to respond_to(:send_completion_message).with(1) end end end \ No newline at end of file From d4fb84545785d9b906e98f913efb3f2505e50320 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sun, 1 May 2022 09:12:48 +0100 Subject: [PATCH 13/23] Refactor menu to return dish as hash --- lib/menu.rb | 44 +++++++++++++++++++++++++------------------- spec/menu_spec.rb | 29 +++++++++++++---------------- 2 files changed, 38 insertions(+), 35 deletions(-) diff --git a/lib/menu.rb b/lib/menu.rb index c6855f6ad5..48f7b81a7c 100644 --- a/lib/menu.rb +++ b/lib/menu.rb @@ -1,26 +1,13 @@ class Menu - attr_reader :available_dishes - - def initialize - @dishes = [ - { name: 'pizza', price: 9.50 ,available: true }, - { name: 'pasta', price: 8.20 ,available: true }, - { name: 'tiramisu', price: 4.50 ,available: false } - ] + attr_reader :dishes, :available_dishes + + def initialize(dishes) + @dishes = dishes @available_dishes = filter_dishes_by_available end def display_available_dishes - display_dishes = [] - - available_dishes.each do |dish| - name = dish[:name] - price = dish[:price] - - display_dishes << [name, price] - end - - display_dishes + available_dishes end private @@ -29,6 +16,25 @@ def display_available_dishes attr_writer :available_dishes def filter_dishes_by_available - self.available_dishes = dishes.select { |dish| dish[:available] == true} + self.available_dishes = dishes.select { + |dish| dish[:available] == true } + + format_available_dishes + end + + def format_available_dishes + formatted_available_dishes = {} + + self.available_dishes = available_dishes.each do |dish| + formatted_available_dishes.merge!(dish[:name] => dish[:price]) + end + + formatted_available_dishes end end + +$menu = Menu.new([ + { name: 'pizza', price: 9.50 ,available: true }, + { name: 'pasta', price: 8.20 ,available: true }, + { name: 'tiramisu', price: 4.50 ,available: false } +]) \ No newline at end of file diff --git a/spec/menu_spec.rb b/spec/menu_spec.rb index 3f087b2f49..c763fe532b 100644 --- a/spec/menu_spec.rb +++ b/spec/menu_spec.rb @@ -1,23 +1,20 @@ describe Menu do - subject(:menu) { Menu.new } + subject(:menu) { Menu.new([ + { name: 'pizza', price: 9.50 ,available: true }, + { name: 'pasta', price: 8.20 ,available: true }, + { name: 'tiramisu', price: 4.50 ,available: false } + ]) } describe '#display_available_dishes' do - it 'should only return available dishes' do - expect(menu.available_dishes).to include(hash_including(:name, :price, available: true)) - end - - context 'when unavailable dishes have been removed' do - let(:available_dishes) { [ - { name: 'pizza', price: 9.50 }, - { name: 'pasta', price: 8.20 }, - ] } + context 'when some dishes are unavailable' do + it 'should only return available dish names and prices' do + expect(menu.display_available_dishes).to include("pizza" => 9.5, "pasta" => 8.2) + end - it 'should return available dish names and prices' do - expect(menu.display_available_dishes).to contain_exactly( - ['pizza', 9.50], - ['pasta', 8.20] - ) + it 'should not return unavailable dishes' do + expect(menu.display_available_dishes).not_to include("tiramisu" => 4.5) end end end -end \ No newline at end of file +end + From 235b77af90140a51c96edb6000978b8f3fd36816 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sun, 1 May 2022 11:44:12 +0100 Subject: [PATCH 14/23] Refactor to use represented by hash pair --- lib/order.rb | 16 ++++++++++++---- spec/order_spec.rb | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/lib/order.rb b/lib/order.rb index 68763a2751..885c8e3159 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -2,16 +2,19 @@ class Order attr_reader :basket, :complete_status def initialize - @basket = [] + @basket = [] # [{'pizza': 9.50}, {'pasta': 8.20}] @complete_status = false - @completion_time = nil end - def add_to_basket(dishes) + def add_to_basket(*dishes) dishes.each { |dish| basket << dish } end + def display_basket_and_total # return basket and return basket total + end + def complete_order(completion_time) + basket_empty? self.complete_status = true self.completion_time = completion_time end @@ -19,5 +22,10 @@ def complete_order(completion_time) private attr_writer :complete_status, :completion_time - + + attr_accessor :basket_dishes, :basket_prices, :basket_total + + def basket_empty? + fail "No dishes in basket!" if basket.empty? + end end diff --git a/spec/order_spec.rb b/spec/order_spec.rb index 7b89e32c5f..3c96b690c3 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -1,17 +1,42 @@ describe Order do subject(:order) { Order.new } + dish1 = {'pizza': 9.50} + dish2 = {'pasta': 8.20} describe '#add_to_basket' do - it 'should change basket by dishes chosen' do - dishes = ['pizza', 'pasta'] - expect { order.add_to_basket(dishes) }.to change { - order.basket.length }.by(dishes.length) + it 'should change basket to include dishes' do + order.add_to_basket(dish1, dish2) + expect(order.basket).to include(dish1, dish2) + end + end + + describe '#display_basket_and_total' do + xit 'should return basket dishes and prices and total' do + order.add_to_basket(dish1, dish2) + + expect(order).to receive(:basket_dishes) + order.display_basket_and_total end end describe '#complete_order' do - it 'should change complete_status to completed' do - expect { order.complete_order('time') }.to change { order.complete_status}.from(false).to(true) + context 'when basket contains dishes' do + it 'should change order status to completed' do + order.add_to_basket(dish1, dish2) + + expect { order.complete_order('time') }.to change { + order.complete_status }.from(false).to(true) + end + + it 'should set time order completed' + + it 'should set estimated delivery time' + end + + context 'when basket is empty' do + it 'should return error when basket is empty' do + expect { order.complete_order('time') }.to raise_error "No dishes in basket!" + end end end end From b75551fc14b2d72b984a3bd18763d981693ce699 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sun, 1 May 2022 13:14:05 +0100 Subject: [PATCH 15/23] Add order already complete check --- lib/order.rb | 26 ++++++++++++++++++++------ spec/order_spec.rb | 26 ++++++++++++++------------ 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/lib/order.rb b/lib/order.rb index 885c8e3159..f8d2818109 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -1,19 +1,23 @@ class Order - attr_reader :basket, :complete_status + attr_reader :basket, :complete_status, :basket_total def initialize @basket = [] # [{'pizza': 9.50}, {'pasta': 8.20}] + @basket_total = 0 @complete_status = false end - def add_to_basket(*dishes) + def add_to_basket(dishes) dishes.each { |dish| basket << dish } + calculate_basket_total end - def display_basket_and_total # return basket and return basket total + def display_basket_total + {basket => basket_total} end def complete_order(completion_time) + order_complete? basket_empty? self.complete_status = true self.completion_time = completion_time @@ -21,11 +25,21 @@ def complete_order(completion_time) private - attr_writer :complete_status, :completion_time - - attr_accessor :basket_dishes, :basket_prices, :basket_total + attr_writer :complete_status, :completion_time, :basket_total def basket_empty? fail "No dishes in basket!" if basket.empty? end + + def order_complete? + fail "Order already completed!" if complete_status == true + end + + def calculate_basket_total + prices = [] + basket.each do |item| + prices << item.values[0] + end + self.basket_total = prices.sum + end end diff --git a/spec/order_spec.rb b/spec/order_spec.rb index 3c96b690c3..a1a61c6a93 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -1,29 +1,26 @@ describe Order do subject(:order) { Order.new } - dish1 = {'pizza': 9.50} - dish2 = {'pasta': 8.20} + dishes = [{'pizza': 9.50}, {'pasta': 8.20}] describe '#add_to_basket' do it 'should change basket to include dishes' do - order.add_to_basket(dish1, dish2) - expect(order.basket).to include(dish1, dish2) + order.add_to_basket(dishes) + expect(order.basket).to eq(dishes) end end - describe '#display_basket_and_total' do - xit 'should return basket dishes and prices and total' do - order.add_to_basket(dish1, dish2) - - expect(order).to receive(:basket_dishes) - order.display_basket_and_total + describe '#display_basket_total' do + it 'should return basket dishes and prices and total' do + order.add_to_basket(dishes) + expect(order.display_basket_total).to eq(dishes => 17.70) end end describe '#complete_order' do context 'when basket contains dishes' do + before(:each) { order.add_to_basket(dishes) } + it 'should change order status to completed' do - order.add_to_basket(dish1, dish2) - expect { order.complete_order('time') }.to change { order.complete_status }.from(false).to(true) end @@ -31,6 +28,11 @@ it 'should set time order completed' it 'should set estimated delivery time' + + it 'should not allow a completed order to be completed again' do + allow(order).to receive(:complete_status).and_return(true) + expect { order.complete_order('time') }.to raise_error "Order already completed!" + end end context 'when basket is empty' do From 385e64903a52b8aa5b29d0d87f53b220fffccd7a Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sun, 1 May 2022 13:47:38 +0100 Subject: [PATCH 16/23] Add check order total functionality --- lib/takeaway.rb | 6 +++++- spec/takeaway_spec.rb | 15 ++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 9ed7eb3d54..596cd681bb 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -15,10 +15,14 @@ def display_menu menu.display_available_dishes end - def add_to_order(dishes) + def add_to_order(*dishes) current_order.add_to_basket(dishes) end + def check_order_total + current_order.display_basket_and_total + end + def place_order current_order.complete_order(completion_time = current_time) text.send_completion_message(expected_delivery_time = standard_delivery_time) diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index 585f1af550..5da614a1b1 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -20,6 +20,13 @@ end end + describe '#check_order_total' do + xit 'should instruct current_order to return dishes, prices and total' do + expect(order).to receive(:display_basket_and_total) + takeaway.check_order_total + end + end + describe '#place_order' do it 'should instruct current_order to complete' do allow(order).to receive(:complete_order) @@ -37,11 +44,5 @@ takeaway.place_order end end - - describe '#verify_order_basket_total' do - it 'should instruct current_order to return dishes and prices' - - it 'should return current_order' - - end end + From 6d4b97dd4800db3a8d3b1f1b66e47e757f1bcee7 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sun, 1 May 2022 14:19:31 +0100 Subject: [PATCH 17/23] Latest working version --- lib/menu.rb | 16 ++++++++-------- lib/order.rb | 3 +-- lib/takeaway.rb | 11 +++++++---- lib/text.rb | 26 +++++++++++++++++--------- spec/order_spec.rb | 6 +----- spec/takeaway_spec.rb | 6 +++--- spec/text_spec.rb | 7 ++----- 7 files changed, 39 insertions(+), 36 deletions(-) diff --git a/lib/menu.rb b/lib/menu.rb index 48f7b81a7c..b7c9023aa9 100644 --- a/lib/menu.rb +++ b/lib/menu.rb @@ -1,7 +1,13 @@ class Menu + DEFAULT_DISHES = [ + { name: 'pizza', price: 9.50 ,available: true }, + { name: 'pasta', price: 8.20 ,available: true }, + { name: 'tiramisu', price: 4.50 ,available: false } + ] + attr_reader :dishes, :available_dishes - def initialize(dishes) + def initialize(dishes = DEFAULT_DISHES) @dishes = dishes @available_dishes = filter_dishes_by_available end @@ -31,10 +37,4 @@ def format_available_dishes formatted_available_dishes end -end - -$menu = Menu.new([ - { name: 'pizza', price: 9.50 ,available: true }, - { name: 'pasta', price: 8.20 ,available: true }, - { name: 'tiramisu', price: 4.50 ,available: false } -]) \ No newline at end of file +end \ No newline at end of file diff --git a/lib/order.rb b/lib/order.rb index f8d2818109..d129aa5a8d 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -3,7 +3,6 @@ class Order def initialize @basket = [] # [{'pizza': 9.50}, {'pasta': 8.20}] - @basket_total = 0 @complete_status = false end @@ -12,7 +11,7 @@ def add_to_basket(dishes) calculate_basket_total end - def display_basket_total + def display_basket_and_total {basket => basket_total} end diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 596cd681bb..482236a679 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -15,17 +15,20 @@ def display_menu menu.display_available_dishes end - def add_to_order(*dishes) + def add_to_order(*dishes) # {'pizza': 9.50}, {'pasta': 8.20} current_order.add_to_basket(dishes) end - def check_order_total + def check_order current_order.display_basket_and_total end def place_order - current_order.complete_order(completion_time = current_time) - text.send_completion_message(expected_delivery_time = standard_delivery_time) + current_order.complete_order( + completion_time = current_time) + + text.send_completion_message( + expected_delivery_time = standard_delivery_time) end private diff --git a/lib/text.rb b/lib/text.rb index aac691d331..f3f23fcbce 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -6,23 +6,31 @@ class Text FROM_NUMBER = ENV['FROM_NUMBER'] TO_NUMBER = ENV['TO_NUMBER'] - COMPLETION_MESSAGE_BODY = "Thanks for your order! Our chefs are already busy preparing your food, and then it will be on it's way to you in no time. Listen out for the doorbell around " - def initialize( - client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN) + client = Twilio::REST::Client.new( + ACCOUNT_SID, AUTH_TOKEN) ) @client = client end - def send_completion_message(time) - message = client.messages.create( - body: COMPLETION_MESSAGE_BODY + time, - from: FROM_NUMBER, - to: TO_NUMBER - ) + def send_completion_message(completion_time) + completion_message = "Thanks for your order! + Our chefs are already busy preparing your food, + and then it will be on it's way to you in no time. + Listen out for the doorbell around #{completion_time}" + + send(completion_message) end private attr_reader :client + + def send(message) + new_text = client.messages.create( + body: message, + from: FROM_NUMBER, + to: TO_NUMBER + ) + end end diff --git a/spec/order_spec.rb b/spec/order_spec.rb index a1a61c6a93..7cf980982a 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -12,7 +12,7 @@ describe '#display_basket_total' do it 'should return basket dishes and prices and total' do order.add_to_basket(dishes) - expect(order.display_basket_total).to eq(dishes => 17.70) + expect(order.display_basket_and_total).to eq(dishes => 17.70) end end @@ -25,10 +25,6 @@ order.complete_status }.from(false).to(true) end - it 'should set time order completed' - - it 'should set estimated delivery time' - it 'should not allow a completed order to be completed again' do allow(order).to receive(:complete_status).and_return(true) expect { order.complete_order('time') }.to raise_error "Order already completed!" diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index 5da614a1b1..735b713eab 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -20,10 +20,10 @@ end end - describe '#check_order_total' do - xit 'should instruct current_order to return dishes, prices and total' do + describe '#check_order' do + it 'should instruct current_order to return dishes, prices and total' do expect(order).to receive(:display_basket_and_total) - takeaway.check_order_total + takeaway.check_order end end diff --git a/spec/text_spec.rb b/spec/text_spec.rb index 0d4b3c0233..c5395dcde5 100644 --- a/spec/text_spec.rb +++ b/spec/text_spec.rb @@ -1,5 +1,6 @@ describe Text do let(:client) { instance_double('Client', messages: self)} + subject(:text) { Text.new(client) } describe '#send_completion_message' do @@ -7,9 +8,5 @@ expect(client.messages).to receive(:create) text.send_completion_message('time') end - - it 'message should contain expected delivery time' do - expect(text).to respond_to(:send_completion_message).with(1) - end end -end \ No newline at end of file +end From c31498aea47cb753e40310331d2eed62e1d80a48 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sun, 1 May 2022 14:25:05 +0100 Subject: [PATCH 18/23] Run rubocop to refactor --- lib/menu.rb | 18 +++++++++--------- lib/order.rb | 2 +- lib/takeaway.rb | 2 +- lib/text.rb | 4 ++-- spec/menu_spec.rb | 10 +++++----- spec/order_spec.rb | 5 +++-- spec/spec_helper.rb | 2 +- spec/takeaway_spec.rb | 1 - spec/text_spec.rb | 2 +- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/menu.rb b/lib/menu.rb index b7c9023aa9..6296bf284c 100644 --- a/lib/menu.rb +++ b/lib/menu.rb @@ -1,9 +1,9 @@ class Menu DEFAULT_DISHES = [ - { name: 'pizza', price: 9.50 ,available: true }, - { name: 'pasta', price: 8.20 ,available: true }, - { name: 'tiramisu', price: 4.50 ,available: false } - ] + { name: 'pizza', price: 9.50,available: true }, + { name: 'pasta', price: 8.20,available: true }, + { name: 'tiramisu', price: 4.50,available: false } + ].freeze attr_reader :dishes, :available_dishes @@ -18,12 +18,12 @@ def display_available_dishes private - attr_accessor :dishes - attr_writer :available_dishes + attr_writer :dishes, :available_dishes def filter_dishes_by_available - self.available_dishes = dishes.select { - |dish| dish[:available] == true } + self.available_dishes = dishes.select do + |dish| dish[:available] == true + end format_available_dishes end @@ -37,4 +37,4 @@ def format_available_dishes formatted_available_dishes end -end \ No newline at end of file +end diff --git a/lib/order.rb b/lib/order.rb index d129aa5a8d..54b257dfdc 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -12,7 +12,7 @@ def add_to_basket(dishes) end def display_basket_and_total - {basket => basket_total} + { basket => basket_total } end def complete_order(completion_time) diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 482236a679..2cae5f77d2 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -43,4 +43,4 @@ def standard_delivery_time def current_time Time.now end -end \ No newline at end of file +end diff --git a/lib/text.rb b/lib/text.rb index f3f23fcbce..f0028c695e 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -19,14 +19,14 @@ def send_completion_message(completion_time) and then it will be on it's way to you in no time. Listen out for the doorbell around #{completion_time}" - send(completion_message) + public_send(completion_message) end private attr_reader :client - def send(message) + def public_send(message) new_text = client.messages.create( body: message, from: FROM_NUMBER, diff --git a/spec/menu_spec.rb b/spec/menu_spec.rb index c763fe532b..a7b875ebbd 100644 --- a/spec/menu_spec.rb +++ b/spec/menu_spec.rb @@ -1,9 +1,10 @@ describe Menu do subject(:menu) { Menu.new([ - { name: 'pizza', price: 9.50 ,available: true }, - { name: 'pasta', price: 8.20 ,available: true }, - { name: 'tiramisu', price: 4.50 ,available: false } - ]) } + { name: 'pizza', price: 9.50,available: true }, + { name: 'pasta', price: 8.20,available: true }, + { name: 'tiramisu', price: 4.50,available: false } + ]) + } describe '#display_available_dishes' do context 'when some dishes are unavailable' do @@ -17,4 +18,3 @@ end end end - diff --git a/spec/order_spec.rb b/spec/order_spec.rb index 7cf980982a..93e8c6ec2d 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -1,6 +1,6 @@ describe Order do subject(:order) { Order.new } - dishes = [{'pizza': 9.50}, {'pasta': 8.20}] + dishes = [{ pizza: 9.50 }, { pasta: 8.20 }] describe '#add_to_basket' do it 'should change basket to include dishes' do @@ -22,7 +22,8 @@ it 'should change order status to completed' do expect { order.complete_order('time') }.to change { - order.complete_status }.from(false).to(true) + order.complete_status + }.from(false).to(true) end it 'should not allow a completed order to be completed again' do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 1a6b2e805f..dfa3327def 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -23,4 +23,4 @@ def dump_pending(_) require 'text' require 'takeaway' require 'menu' -require 'order' \ No newline at end of file +require 'order' diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index 735b713eab..0921b48851 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -45,4 +45,3 @@ end end end - diff --git a/spec/text_spec.rb b/spec/text_spec.rb index c5395dcde5..496aaad70c 100644 --- a/spec/text_spec.rb +++ b/spec/text_spec.rb @@ -1,5 +1,5 @@ describe Text do - let(:client) { instance_double('Client', messages: self)} + let(:client) { instance_double('Client', messages: self) } subject(:text) { Text.new(client) } From 9dab09178ad444dec062f496347b85f7bff8d152 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sun, 1 May 2022 14:36:06 +0100 Subject: [PATCH 19/23] Write integration test --- lib/text.rb | 5 +---- spec/integration_spec.rb | 11 +++++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 spec/integration_spec.rb diff --git a/lib/text.rb b/lib/text.rb index f0028c695e..c2fc7bcf4e 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -14,10 +14,7 @@ def initialize( end def send_completion_message(completion_time) - completion_message = "Thanks for your order! - Our chefs are already busy preparing your food, - and then it will be on it's way to you in no time. - Listen out for the doorbell around #{completion_time}" + completion_message = "Thanks for your order! Our chefs are already busy preparing your food, and then it will be on it's way to you in no time. Listen out for the doorbell around #{completion_time}" public_send(completion_message) end diff --git a/spec/integration_spec.rb b/spec/integration_spec.rb new file mode 100644 index 0000000000..b0d3f8506f --- /dev/null +++ b/spec/integration_spec.rb @@ -0,0 +1,11 @@ +describe 'integration test' do + xit 'should not raise error' do + expect { + takeaway = Takeaway.new + takeaway.display_menu + takeaway.add_to_order({pizza: 9.50}) + takeaway.check_order + takeaway.place_order + }.not_to raise_error + end +end \ No newline at end of file From fe28775a62c1837fcc0afc98473fb839561d92f6 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Sun, 1 May 2022 16:08:30 +0100 Subject: [PATCH 20/23] Load dishes from csv --- assets/dishes.csv | 4 ++++ lib/menu.rb | 32 +++++++++++++++++++++----------- lib/text.rb | 5 ++++- spec/integration_spec.rb | 4 ++-- spec/menu_spec.rb | 20 ++++++++++++-------- 5 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 assets/dishes.csv diff --git a/assets/dishes.csv b/assets/dishes.csv new file mode 100644 index 0000000000..2dabfc5d5f --- /dev/null +++ b/assets/dishes.csv @@ -0,0 +1,4 @@ +name, price, available +pizza, 9.50,true +pasta, 8.20,true +tiramisu, 4.50,false \ No newline at end of file diff --git a/lib/menu.rb b/lib/menu.rb index 6296bf284c..37235363c1 100644 --- a/lib/menu.rb +++ b/lib/menu.rb @@ -1,14 +1,12 @@ -class Menu - DEFAULT_DISHES = [ - { name: 'pizza', price: 9.50,available: true }, - { name: 'pasta', price: 8.20,available: true }, - { name: 'tiramisu', price: 4.50,available: false } - ].freeze +require 'csv' +class Menu attr_reader :dishes, :available_dishes - def initialize(dishes = DEFAULT_DISHES) - @dishes = dishes + def initialize(dishes_file = "./assets/dishes.csv") + @dishes = [] + load_dishes(dishes_file) + @available_dishes = filter_dishes_by_available end @@ -20,10 +18,22 @@ def display_available_dishes attr_writer :dishes, :available_dishes + def load_dishes(dishes_file) + CSV.foreach(dishes_file, headers: true, header_converters: :symbol) do |row| + name, price, available = row[:name], row[:price], row[:available] + + @dishes << { name: name.to_sym, price: price.to_f, available: true?(available) } + end + end + + def true?(available) + available == "true" + end + def filter_dishes_by_available - self.available_dishes = dishes.select do - |dish| dish[:available] == true - end + self.available_dishes = dishes.select do |dish| + dish[:available] == true + end format_available_dishes end diff --git a/lib/text.rb b/lib/text.rb index c2fc7bcf4e..22f1dbde7d 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -14,7 +14,10 @@ def initialize( end def send_completion_message(completion_time) - completion_message = "Thanks for your order! Our chefs are already busy preparing your food, and then it will be on it's way to you in no time. Listen out for the doorbell around #{completion_time}" + completion_message = "Thanks for your order!" + + "Our chefs are already busy preparing your food, " + + "and then it will be on it's way to you in no time. " + + "Listen out for the doorbell around #{completion_time}" public_send(completion_message) end diff --git a/spec/integration_spec.rb b/spec/integration_spec.rb index b0d3f8506f..ef1cd26d3e 100644 --- a/spec/integration_spec.rb +++ b/spec/integration_spec.rb @@ -3,9 +3,9 @@ expect { takeaway = Takeaway.new takeaway.display_menu - takeaway.add_to_order({pizza: 9.50}) + takeaway.add_to_order({ pizza: 9.50 }) takeaway.check_order takeaway.place_order }.not_to raise_error end -end \ No newline at end of file +end diff --git a/spec/menu_spec.rb b/spec/menu_spec.rb index a7b875ebbd..f050070233 100644 --- a/spec/menu_spec.rb +++ b/spec/menu_spec.rb @@ -1,19 +1,23 @@ +require 'csv' + describe Menu do - subject(:menu) { Menu.new([ - { name: 'pizza', price: 9.50,available: true }, - { name: 'pasta', price: 8.20,available: true }, - { name: 'tiramisu', price: 4.50,available: false } - ]) - } + subject(:menu) { Menu.new } + + # let(:menu) { double('Menu', :display_available_dishes, :dishes => [ + # { name: 'pizza', price: 9.50,available: true }, + # { name: 'pasta', price: 8.20,available: true }, + # { name: 'tiramisu', price: 4.50,available: false } + # ]) } describe '#display_available_dishes' do + context 'when some dishes are unavailable' do it 'should only return available dish names and prices' do - expect(menu.display_available_dishes).to include("pizza" => 9.5, "pasta" => 8.2) + expect(menu.display_available_dishes).to include(:pizza => 9.5, :pasta => 8.2) end it 'should not return unavailable dishes' do - expect(menu.display_available_dishes).not_to include("tiramisu" => 4.5) + expect(menu.display_available_dishes).not_to include(:tiramisu => 4.5) end end end From 5814093c40d04e3c80001f008b5a2e7d0a70bbe0 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Mon, 2 May 2022 07:29:40 +0100 Subject: [PATCH 21/23] Isolate menu tests with dish spec fiile --- assets/dishes.csv | 4 +++- lib/text.rb | 2 +- spec/dishes_spec.csv | 4 ++++ spec/menu_spec.rb | 8 +------- spec/spec_helper.rb | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 spec/dishes_spec.csv diff --git a/assets/dishes.csv b/assets/dishes.csv index 2dabfc5d5f..465bb54d56 100644 --- a/assets/dishes.csv +++ b/assets/dishes.csv @@ -1,4 +1,6 @@ name, price, available pizza, 9.50,true pasta, 8.20,true -tiramisu, 4.50,false \ No newline at end of file +tiramisu, 4.50,false +calamari, 7.80,true +risotto, 6.90,true \ No newline at end of file diff --git a/lib/text.rb b/lib/text.rb index 22f1dbde7d..bad69f5027 100644 --- a/lib/text.rb +++ b/lib/text.rb @@ -14,7 +14,7 @@ def initialize( end def send_completion_message(completion_time) - completion_message = "Thanks for your order!" + + completion_message = "Thanks for your order! " + "Our chefs are already busy preparing your food, " + "and then it will be on it's way to you in no time. " + "Listen out for the doorbell around #{completion_time}" diff --git a/spec/dishes_spec.csv b/spec/dishes_spec.csv new file mode 100644 index 0000000000..2dabfc5d5f --- /dev/null +++ b/spec/dishes_spec.csv @@ -0,0 +1,4 @@ +name, price, available +pizza, 9.50,true +pasta, 8.20,true +tiramisu, 4.50,false \ No newline at end of file diff --git a/spec/menu_spec.rb b/spec/menu_spec.rb index f050070233..fe04c2ef53 100644 --- a/spec/menu_spec.rb +++ b/spec/menu_spec.rb @@ -1,13 +1,7 @@ require 'csv' describe Menu do - subject(:menu) { Menu.new } - - # let(:menu) { double('Menu', :display_available_dishes, :dishes => [ - # { name: 'pizza', price: 9.50,available: true }, - # { name: 'pasta', price: 8.20,available: true }, - # { name: 'tiramisu', price: 4.50,available: false } - # ]) } + subject(:menu) { Menu.new('./spec/dishes_spec.csv') } describe '#display_available_dishes' do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index dfa3327def..b95610b75e 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -18,7 +18,7 @@ def dump_pending(_) end end -RSpec::Core::Formatters::DocumentationFormatter.prepend FormatterOverrides +# RSpec::Core::Formatters::DocumentationFormatter.prepend FormatterOverrides require 'text' require 'takeaway' From 9b58f622b88bbd669a48d3ae563bbb9c2f9a88ae Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Mon, 2 May 2022 07:54:09 +0100 Subject: [PATCH 22/23] Update README --- Gemfile | 7 ++- Gemfile.lock | 3 + README.md | 130 ++++++++++++++++++++++---------------------- badge.svg | 1 + spec/spec_helper.rb | 14 +++-- 5 files changed, 81 insertions(+), 74 deletions(-) create mode 100644 badge.svg diff --git a/Gemfile b/Gemfile index ef92586078..6eb28c6ec9 100644 --- a/Gemfile +++ b/Gemfile @@ -4,11 +4,12 @@ ruby '3.0.2' group :test do gem 'rspec' - gem 'simplecov', require: false, group: :test - gem 'simplecov-console', require: false, group: :test - gem 'twilio-ruby' + gem 'simplecov', require: false + gem 'simplecov-console', require: false + gem 'simplecov-shields-badge', require: false end group :development, :test do gem 'rubocop', '1.20' + gem 'twilio-ruby' end diff --git a/Gemfile.lock b/Gemfile.lock index 753d63cb51..c71877ace7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -76,6 +76,8 @@ GEM simplecov terminal-table simplecov-html (0.12.3) + simplecov-shields-badge (0.1.0) + simplecov (~> 0.15) simplecov_json_formatter (0.1.3) terminal-table (3.0.1) unicode-display_width (>= 1.1.1, < 3) @@ -93,6 +95,7 @@ DEPENDENCIES rubocop (= 1.20) simplecov simplecov-console + simplecov-shields-badge twilio-ruby RUBY VERSION diff --git a/README.md b/README.md index dbcb154e43..da0c31c8df 100644 --- a/README.md +++ b/README.md @@ -1,83 +1,83 @@ -Takeaway Challenge -================== +# Takeaway + +[![Ruby Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop/rubocop) +[![Coverage](./badge.svg)](https://github.com/lukestorey95/takeaway-challenge) + +This program allows the user to order a takeaway, and receive a confirmation text informing them when to expect delivery. It uses a takeaway controller, order system, menu that loads dishes from a .csv file and TwilioAPI to send the text messages. + +
+ +## Installation + ``` - _________ - r== | | - _ // | M.A. | )))) - |_)//(''''': | | - // \_____:_____.-------D ))))) - // | === | / \ - .:'//. \ \=| \ / .:'':./ ))))) - :' // ': \ \ ''..'--:'-.. ': - '. '' .' \:.....:--'.-'' .' - ':..:' ':..:' - - ``` - -Instructions -------- - -* Feel free to use google, your notes, books, etc. but work on your own -* If you refer to the solution of another coach or student, please put a link to that in your README -* If you have a partial solution, **still check in a partial solution** -* You must submit a pull request to this repo with your code by 9am Monday morning - -Task ------ - -* Fork this repo -* Run the command 'bundle' in the project directory to ensure you have all the gems -* Write a Takeaway program with the following user stories: +$ git clone https://github.com/lukestorey95/takeaway-challenge.git + +$ cd takeaway-challenge +$ bundle + +$ source ./twilio.env ``` -As a customer -So that I can check if I want to order something -I would like to see a list of dishes with prices -As a customer -So that I can order the meal I want -I would like to be able to select some number of several available dishes +
-As a customer -So that I can verify that my order is correct -I would like to check that the total I have been given matches the sum of the various dishes in my order +## Quickstart -As a customer -So that I am reassured that my order will be delivered on time -I would like to receive a text such as "Thank you! Your order was placed and will be delivered before 18:52" after I have ordered ``` +$ irb -* Hints on functionality to implement: - * Ensure you have a list of dishes with prices - * The text should state that the order was placed successfully and that it will be delivered 1 hour from now, e.g. "Thank you! Your order was placed and will be delivered before 18:52". - * The text sending functionality should be implemented using Twilio API. You'll need to register for it. It’s free. - * Use the twilio-ruby gem to access the API - * Use the Gemfile to manage your gems - * Make sure that your Takeaway is thoroughly tested and that you use mocks and/or stubs, as necessary to not to send texts when your tests are run - * However, if your Takeaway is loaded into IRB and the order is placed, the text should actually be sent - * Note that you can only send texts in the same country as you have your account. I.e. if you have a UK account you can only send to UK numbers. +> Dir['./lib/*.rb'].each {|file| require file } -* Advanced! (have a go if you're feeling adventurous): - * Implement the ability to place orders via text message. +> takeaway = Takeaway.new -* A free account on Twilio will only allow you to send texts to "verified" numbers. Use your mobile phone number, don't worry about the customer's mobile phone. +> takeaway.display_menu -> :warning: **WARNING:** think twice before you push your **mobile number** or **Twilio API Key** to a public space like GitHub :eyes: -> -> :key: Now is a great time to think about security and how you can keep your private information secret. You might want to explore environment variables. +> takeaway.add_to_order({ pizza: 9.50 }) -* Finally submit a pull request before Monday at 9am with your solution or partial solution. However much or little amount of code you wrote please please please submit a pull request before Monday at 9am +> takeaway.check_order +> takeaway.place_order +``` -In code review we'll be hoping to see: +
-* All tests passing -* High [Test coverage](https://github.com/makersacademy/course/blob/main/pills/test_coverage.md) (>95% is good) -* The code is elegant: every class has a clear responsibility, methods are short etc. +## Running Tests -Reviewers will potentially be using this [code review rubric](docs/review.md). Referring to this rubric in advance will make the challenge somewhat easier. You should be the judge of how much challenge you want this at this moment. +``` +$ rspec -Notes on Test Coverage ------------------- +# The integration test is pending as running it will public send a text (costs 6p per text) +``` -You can see your [test coverage](https://github.com/makersacademy/course/blob/main/pills/test_coverage.md) when you run your tests. +
+ +## My Process + +1. Break down user stories into objects, attributes and behaviour +2. Feature test and note down errors/expected errors +3. Write failing test that replicates errors +4. Write the minimum code to make test pass +5. Refactor and ensure tests still pass +6. Repeat step 2 and ensure behaviour works as intended + +
+ +## User Stories + +``` +As a customer +So that I can check if I want to order something +I would like to see a list of dishes with prices + +As a customer +So that I can order the meal I want +I would like to be able to select some number of several available dishes + +As a customer +So that I can verify that my order is correct +I would like to check that the total I have been given matches the sum of the various dishes in my order + +As a customer +So that I am reassured that my order will be delivered on time +I would like to receive a text such as "Thank you! Your order was placed and will be delivered before 18:52" after I have ordered +``` \ No newline at end of file diff --git a/badge.svg b/badge.svg new file mode 100644 index 0000000000..b846227899 --- /dev/null +++ b/badge.svg @@ -0,0 +1 @@ +coverage: 100.0%coverage100.0% \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index b95610b75e..282e6374bb 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -8,15 +8,17 @@ ]) SimpleCov.start do add_filter 'spec' + require 'shields_badge' + SimpleCov.formatter = SimpleCov::Formatter::ShieldsBadge end -module FormatterOverrides - def example_pending(_) - end +# module FormatterOverrides +# def example_pending(_) +# end - def dump_pending(_) - end -end +# def dump_pending(_) +# end +# end # RSpec::Core::Formatters::DocumentationFormatter.prepend FormatterOverrides From a6678061f040041bba997e33dd43ef7afa1d47a9 Mon Sep 17 00:00:00 2001 From: Luke Storey Date: Tue, 3 May 2022 11:21:21 +0100 Subject: [PATCH 23/23] Refactor to remove comments --- lib/order.rb | 2 +- lib/takeaway.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/order.rb b/lib/order.rb index 54b257dfdc..a3415522e1 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -2,7 +2,7 @@ class Order attr_reader :basket, :complete_status, :basket_total def initialize - @basket = [] # [{'pizza': 9.50}, {'pasta': 8.20}] + @basket = [] @complete_status = false end diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 2cae5f77d2..82e180408f 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -15,7 +15,7 @@ def display_menu menu.display_available_dishes end - def add_to_order(*dishes) # {'pizza': 9.50}, {'pasta': 8.20} + def add_to_order(*dishes) current_order.add_to_basket(dishes) end