From 919217f5a6b9c0d70431b78aa86507ce20c729e6 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Mon, 2 Mar 2020 12:40:07 -0800 Subject: [PATCH 01/35] Created Room class and test file for it. --- lib/room.rb | 5 +++++ test/room_test.rb | 14 ++++++++++++++ test/test_helper.rb | 1 + 3 files changed, 20 insertions(+) create mode 100644 lib/room.rb create mode 100644 test/room_test.rb diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..d07a0c55a --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,5 @@ +module Hotel + class Room + end + +end diff --git a/test/room_test.rb b/test/room_test.rb new file mode 100644 index 000000000..6ae39636c --- /dev/null +++ b/test/room_test.rb @@ -0,0 +1,14 @@ +require_relative 'test_helper' + +describe "Room Class" do + describe "Room instantiation" do + before do + @room = Hotel::Room.new() + end + + it "is an instance of Room" do + expect(@room).must_be_kind_of Hotel::Room + end + end + +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..e02ade26f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -6,3 +6,4 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # require_relative your lib files here! +require_relative "../lib/room" \ No newline at end of file From e84382d2edc89392e726cc505928b998c92ffff0 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Mon, 2 Mar 2020 15:19:41 -0800 Subject: [PATCH 02/35] Added ReservationDesk class with #rooms method and its tests. --- lib/reservation_desk.rb | 18 ++++++++++++++++++ lib/room.rb | 8 ++++++++ test/reservation_desk_test.rb | 33 +++++++++++++++++++++++++++++++++ test/room_test.rb | 8 ++++++-- test/test_helper.rb | 3 ++- 5 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 lib/reservation_desk.rb create mode 100644 test/reservation_desk_test.rb diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb new file mode 100644 index 000000000..a46bf8c2b --- /dev/null +++ b/lib/reservation_desk.rb @@ -0,0 +1,18 @@ +module Hotel + class ReservationDesk + attr_reader :room_num + + def initialize(room_num: 20) + @room_num = room_num + end + + def rooms + hotel_rooms = [] + room_num.times do |i| + hotel_rooms << Room.new(i+1) + end + return hotel_rooms + end + + end +end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb index d07a0c55a..f46f94140 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,5 +1,13 @@ module Hotel + + class Room + attr_reader :id + + def initialize(id) + @id = id + end end + end diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb new file mode 100644 index 000000000..e34c26832 --- /dev/null +++ b/test/reservation_desk_test.rb @@ -0,0 +1,33 @@ +require_relative "test_helper" + +describe "ReservationDesk class" do + before do + @reservation_desk = Hotel::ReservationDesk.new() + end + + describe "ReservationDesk instatiation" do + it "is an instance of ReservationDesk" do + expect(@reservation_desk).must_be_kind_of Hotel::ReservationDesk + end + end + + describe "rooms" do + it "returns an array" do + expect(@reservation_desk.rooms).must_be_kind_of Array + end + + it "includes 20 rooms by default" do + expect(@reservation_desk.rooms.length).must_equal 20 + end + + it "the first room has an id of 1" do + expect(@reservation_desk.rooms[0].id).must_equal 1 + end + + it "the last room has an id which is equal to the number of rooms" do + reservation_desk = Hotel::ReservationDesk.new(room_num: 134) + expect(reservation_desk.rooms.last.id).must_equal 134 + end + + end +end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index 6ae39636c..f936a266e 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -3,12 +3,16 @@ describe "Room Class" do describe "Room instantiation" do before do - @room = Hotel::Room.new() + @room = Hotel::Room.new(1) end it "is an instance of Room" do expect(@room).must_be_kind_of Hotel::Room end - end + it "stores an id" do + expect(@room.id).must_equal 1 + end + + end end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index e02ade26f..1fb6860b8 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -6,4 +6,5 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # require_relative your lib files here! -require_relative "../lib/room" \ No newline at end of file +require_relative "../lib/room" +require_relative "../lib/reservation_desk" \ No newline at end of file From 808a723134fed2a9b5c5769d6f07611ac92b68f2 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Mon, 2 Mar 2020 15:28:17 -0800 Subject: [PATCH 03/35] Added Reservation class and its tests. --- lib/reservation.rb | 14 ++++++++++++++ test/reservation_test.rb | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 lib/reservation.rb create mode 100644 test/reservation_test.rb diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..a4d8b2c0f --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,14 @@ +require "date" + +module Hotel + class Reservation + attr_reader :start_date, :end_date + + def initialize(start_date, end_date) + @start_date = Date.parse(start_date) + @end_date = Date.parse(end_date) + end + end + + +end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100644 index 000000000..b1f7efa8e --- /dev/null +++ b/test/reservation_test.rb @@ -0,0 +1,22 @@ +require_relative "test_helper" + +describe "Reservation class" do + describe "Reservation instatiation" do + before do + @start_date = "2020-4-1" + @end_date = "2020-4-5" + @reservation = Hotel::Reservation.new(@start_date, @end_date) + end + + it "is an instance of reservation" do + expect(@reservation).must_be_kind_of Hotel::Reservation + end + + it "stores start and end dates as Date objects" do + expect(@reservation.start_date).must_be_kind_of Date + end + + end + + +end \ No newline at end of file From a19a52cc3422f554e0cac11651f8cb022f917683 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Mon, 2 Mar 2020 16:04:34 -0800 Subject: [PATCH 04/35] Added ReservationDesk#new_reservation and add_reservation methods. --- lib/reservation_desk.rb | 12 +++++++++- test/reservation_desk_test.rb | 42 +++++++++++++++++++++++++++++++++++ test/test_helper.rb | 3 ++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index a46bf8c2b..54e4da8a4 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -1,9 +1,10 @@ module Hotel class ReservationDesk - attr_reader :room_num + attr_reader :room_num, :reservations def initialize(room_num: 20) @room_num = room_num + @reservations = [] end def rooms @@ -14,5 +15,14 @@ def rooms return hotel_rooms end + def new_reservation(start_date, end_date) + Reservation.new(start_date, end_date) + end + + def add_reservation(new_reservation) + reservations << new_reservation + end + + end end \ No newline at end of file diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index e34c26832..18c0cba4c 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -3,6 +3,7 @@ describe "ReservationDesk class" do before do @reservation_desk = Hotel::ReservationDesk.new() + #@reservation = Hotel::Reservation.new("2020-4-1", "2020-4-5") end describe "ReservationDesk instatiation" do @@ -16,6 +17,11 @@ expect(@reservation_desk.rooms).must_be_kind_of Array end + it "returns an array of Rooms" do + expect(@reservation_desk.rooms[0]).must_be_kind_of Hotel::Room + expect(@reservation_desk.rooms.last).must_be_kind_of Hotel::Room + end + it "includes 20 rooms by default" do expect(@reservation_desk.rooms.length).must_equal 20 end @@ -28,6 +34,42 @@ reservation_desk = Hotel::ReservationDesk.new(room_num: 134) expect(reservation_desk.rooms.last.id).must_equal 134 end + end + + + describe "reservations" do + it "returns an array" do + expect(@reservation_desk.reservations).must_be_kind_of Array + end + + # it "returns an array of reservations" do + # expect(@reservation_desk.reservations.first).must_be_kind_of Hotel::Reservation + # expect(@reservation_desk.reservations.last).must_be_kind_of Hotel::Reservation + # end + end + + describe "new_reservation" do + it "creates a new instanse of Reservation" do + start_date = "2020-4-1" + end_date = "2020-4-5" + expect(@reservation_desk.new_reservation(start_date, end_date)).must_be_kind_of Hotel::Reservation + end + end + + describe "add_reservation" do + before do + @start_date = "2020-4-1" + @end_date = "2020-4-5" + @reservation = @reservation_desk.new_reservation(@start_date, @end_date) + @reservations_num = @reservation_desk.reservations.length + @reservation_desk.add_reservation(@reservation) + end + + it "add a new instance of Reservation to reservations array" do + expect(@reservation_desk.reservations.include? @reservation).must_equal true + expect(@reservation_desk.reservations.length).must_equal (@reservations_num + 1) + end end + end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 1fb6860b8..84bc44db0 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -7,4 +7,5 @@ # require_relative your lib files here! require_relative "../lib/room" -require_relative "../lib/reservation_desk" \ No newline at end of file +require_relative "../lib/reservation_desk" +require_relative "../lib/reservation" \ No newline at end of file From 3daf2a377b3ed204728dec0d4996ef13b719e59c Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Mon, 2 Mar 2020 16:17:12 -0800 Subject: [PATCH 05/35] Updated arguments to be keyword in Reservation constructor. --- lib/reservation.rb | 7 +++++-- lib/reservation_desk.rb | 2 +- test/reservation_test.rb | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index a4d8b2c0f..806d62abb 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,13 +2,16 @@ module Hotel class Reservation - attr_reader :start_date, :end_date + attr_reader :start_date, :end_date, :room_id - def initialize(start_date, end_date) + def initialize(room_id: 1, start_date:, end_date: ) @start_date = Date.parse(start_date) @end_date = Date.parse(end_date) + @room_id = room_id end end + + end \ No newline at end of file diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 54e4da8a4..9e4ec51af 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -16,7 +16,7 @@ def rooms end def new_reservation(start_date, end_date) - Reservation.new(start_date, end_date) + Reservation.new(start_date: start_date, end_date: end_date) end def add_reservation(new_reservation) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index b1f7efa8e..73605472f 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -5,7 +5,7 @@ before do @start_date = "2020-4-1" @end_date = "2020-4-5" - @reservation = Hotel::Reservation.new(@start_date, @end_date) + @reservation = Hotel::Reservation.new(start_date: @start_date, end_date: @end_date) end it "is an instance of reservation" do From fbd6f3dbcaa71886d525c10e79541f8a4b2ed787 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Tue, 3 Mar 2020 12:01:59 -0800 Subject: [PATCH 06/35] Added ReservationDesk#find_reservations. --- lib/reservation.rb | 4 +-- lib/reservation_desk.rb | 19 ++++++++-- lib/room.rb | 8 +++-- test/reservation_desk_test.rb | 66 +++++++++++++++++++++++++++++++++-- test/reservation_test.rb | 3 +- 5 files changed, 90 insertions(+), 10 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 806d62abb..254e21e38 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -4,14 +4,14 @@ module Hotel class Reservation attr_reader :start_date, :end_date, :room_id - def initialize(room_id: 1, start_date:, end_date: ) + def initialize(room_id: , start_date:, end_date:) @start_date = Date.parse(start_date) @end_date = Date.parse(end_date) @room_id = room_id end end - + end \ No newline at end of file diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 9e4ec51af..052ba9958 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -15,12 +15,25 @@ def rooms return hotel_rooms end - def new_reservation(start_date, end_date) - Reservation.new(start_date: start_date, end_date: end_date) + def find_reservations(room_id: , start_date: nil, end_date: nil) + room = rooms.find { |room| room.id == room_id} + return room.reservations if (start_date == nil && end_date == nil) + #TODO: add logic here + end + + + # def find_room_by_id(id) + # hotel_rooms.select {|room| room.id == id} + # end + + def new_reservation(room_id, start_date, end_date) + raise ArgumentError.new("Invalid room ID.") unless rooms.find {|room| room.id == room_id} + Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) end def add_reservation(new_reservation) - reservations << new_reservation + reservations << new_reservation # to Room reservations? + #new_reservation.room_id end diff --git a/lib/room.rb b/lib/room.rb index f46f94140..d5870a70c 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -2,12 +2,16 @@ module Hotel class Room - attr_reader :id - + attr_reader :id, :reservations + def initialize(id) @id = id + @reservations = [] end + + end + end diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 18c0cba4c..6342caec6 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -36,6 +36,17 @@ end end + # describe "find_room_by_id" do + # it "returns an instanse of Room" do + + # end + + # it "returns a Room with a matching ID" + # end + + # it "returns nill if there is no Room with a matching ID" + # end + # end describe "reservations" do it "returns an array" do @@ -48,19 +59,70 @@ # end end + describe "find_reservations" do + it "returns an array" do + expect(@reservation_desk.find_reservations(room_id: 1)).must_be_kind_of Array + end + + it "returns an array of reservations" do + + end + + it "Reservation#room_id is what we searched for" do + + end + + it "Reservation@start_date and end_date are what we searched for" do + + end + + it "Returns empty array if there are no reservations for the room/dates" do + + end + + it "Returns nil if room ID doesn't exist" do + + end + + it "If end_date is nil, returns all reservations from the start date onward" do + #TODO: wording + end + + it "If start_date is nil, returns all reservations until the end date" do + + end + + it "If both start and end dates are nill, returns all reservations" do + + end + + end + describe "new_reservation" do it "creates a new instanse of Reservation" do + room_id = 1 + start_date = "2020-4-1" + end_date = "2020-4-5" + expect(@reservation_desk.new_reservation(room_id, start_date, end_date)).must_be_kind_of Hotel::Reservation + end + + it "raises an error if room id is invalid" do + room_id = 1000 #TODO: what if there is one? start_date = "2020-4-1" end_date = "2020-4-5" - expect(@reservation_desk.new_reservation(start_date, end_date)).must_be_kind_of Hotel::Reservation + expect { + @reservation_desk.new_reservation(room_id, start_date, end_date) + }.must_raise ArgumentError end end + describe "add_reservation" do before do + @room_id = 1 @start_date = "2020-4-1" @end_date = "2020-4-5" - @reservation = @reservation_desk.new_reservation(@start_date, @end_date) + @reservation = @reservation_desk.new_reservation(@room_id, @start_date, @end_date) @reservations_num = @reservation_desk.reservations.length @reservation_desk.add_reservation(@reservation) end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 73605472f..3420bd05f 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -3,9 +3,10 @@ describe "Reservation class" do describe "Reservation instatiation" do before do + @room_id = 1 @start_date = "2020-4-1" @end_date = "2020-4-5" - @reservation = Hotel::Reservation.new(start_date: @start_date, end_date: @end_date) + @reservation = Hotel::Reservation.new(room_id: @room_id, start_date: @start_date, end_date: @end_date) end it "is an instance of reservation" do From 92fd3e57fd78e9aee159f74e60fbe67c390b4843 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Tue, 3 Mar 2020 12:23:54 -0800 Subject: [PATCH 07/35] Added ReservationDesk#find_room_by_id. --- lib/reservation_desk.rb | 21 +++++++-------- test/reservation_desk_test.rb | 50 +++++++++++++++++------------------ 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 052ba9958..384a34439 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -4,7 +4,8 @@ class ReservationDesk def initialize(room_num: 20) @room_num = room_num - @reservations = [] + @reservations = [] + #TODO: not needed? end def rooms @@ -15,27 +16,25 @@ def rooms return hotel_rooms end + def find_room_by_id(id) + rooms.find {|room| room.id == id} + end + def find_reservations(room_id: , start_date: nil, end_date: nil) room = rooms.find { |room| room.id == room_id} return room.reservations if (start_date == nil && end_date == nil) #TODO: add logic here end - - # def find_room_by_id(id) - # hotel_rooms.select {|room| room.id == id} - # end - def new_reservation(room_id, start_date, end_date) raise ArgumentError.new("Invalid room ID.") unless rooms.find {|room| room.id == room_id} Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) end - def add_reservation(new_reservation) - reservations << new_reservation # to Room reservations? - #new_reservation.room_id - end - + # def add_reservation(new_reservation) + # room = find_room_by_id(new_reservation.room_id) + # room.reservations << new_reservation + # end end end \ No newline at end of file diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 6342caec6..1da900504 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -36,17 +36,19 @@ end end - # describe "find_room_by_id" do - # it "returns an instanse of Room" do - - # end + describe "find_room_by_id" do + it "returns an instanse of Room" do + expect(@reservation_desk.find_room_by_id(2)).must_be_kind_of Hotel::Room + end - # it "returns a Room with a matching ID" - # end + it "returns a Room with a matching ID" do + expect(@reservation_desk.find_room_by_id(2).id).must_equal 2 + end - # it "returns nill if there is no Room with a matching ID" - # end - # end + it "returns nill if there is no Room with a matching ID" do + assert_nil @reservation_desk.find_room_by_id(20000000) + end + end describe "reservations" do it "returns an array" do @@ -115,23 +117,21 @@ }.must_raise ArgumentError end end - - describe "add_reservation" do - before do - @room_id = 1 - @start_date = "2020-4-1" - @end_date = "2020-4-5" - @reservation = @reservation_desk.new_reservation(@room_id, @start_date, @end_date) - @reservations_num = @reservation_desk.reservations.length - @reservation_desk.add_reservation(@reservation) - end - - it "add a new instance of Reservation to reservations array" do - expect(@reservation_desk.reservations.include? @reservation).must_equal true - expect(@reservation_desk.reservations.length).must_equal (@reservations_num + 1) - end + # describe "add_reservation" do + # before do + # @room_id = 1 + # @start_date = "2020-4-1" + # @end_date = "2020-4-5" + # @reservation = @reservation_desk.new_reservation(@room_id, @start_date, @end_date) + # @reservations_num = @reservation_desk.reservations.length + # @reservation_desk.add_reservation(@reservation) + # end - end + # it "add a new instance of Reservation to reservations array" do + # expect(@reservation_desk.reservations.include? @reservation).must_equal true + # expect(@reservation_desk.reservations.length).must_equal (@reservations_num + 1) + # end + # end end \ No newline at end of file From d1f438176b211b04d5200f4abed6f963400ebdaa Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Tue, 3 Mar 2020 13:42:00 -0800 Subject: [PATCH 08/35] Fixed bug when ReservationDesk#rooms was creating a new array each time it was called. --- .gitignore | 1 + lib/reservation_desk.rb | 13 +++++++------ test/reservation_desk_test.rb | 13 +++++++------ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 5e1422c9c..964590134 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ /test/tmp/ /test/version_tmp/ /tmp/ +/lib/main.rb # Used by dotenv library to load environment variables. # .env diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 384a34439..8b1f1d5a8 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -1,19 +1,20 @@ module Hotel class ReservationDesk - attr_reader :room_num, :reservations + attr_reader :room_num, :rooms, :reservations def initialize(room_num: 20) @room_num = room_num + @rooms = make_rooms @reservations = [] #TODO: not needed? end - def rooms - hotel_rooms = [] + def make_rooms + rooms = [] room_num.times do |i| - hotel_rooms << Room.new(i+1) + rooms << Room.new(i+1) end - return hotel_rooms + return rooms end def find_room_by_id(id) @@ -26,7 +27,7 @@ def find_reservations(room_id: , start_date: nil, end_date: nil) #TODO: add logic here end - def new_reservation(room_id, start_date, end_date) + def new_reservation(room_id: , start_date: , end_date: ) raise ArgumentError.new("Invalid room ID.") unless rooms.find {|room| room.id == room_id} Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) end diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 1da900504..20105435c 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -105,7 +105,7 @@ room_id = 1 start_date = "2020-4-1" end_date = "2020-4-5" - expect(@reservation_desk.new_reservation(room_id, start_date, end_date)).must_be_kind_of Hotel::Reservation + expect(@reservation_desk.new_reservation(room_id: room_id, start_date: start_date, end_date: end_date)).must_be_kind_of Hotel::Reservation end it "raises an error if room id is invalid" do @@ -120,17 +120,18 @@ # describe "add_reservation" do # before do + # @room = @reservation_desk.rooms[0] # @room_id = 1 # @start_date = "2020-4-1" # @end_date = "2020-4-5" - # @reservation = @reservation_desk.new_reservation(@room_id, @start_date, @end_date) - # @reservations_num = @reservation_desk.reservations.length + # @reservation = @reservation_desk.new_reservation(room_id: @room_id, start_date: @start_date, end_date: @end_date) + # # @reservations_num = @reservation_desk.reservations.length # @reservation_desk.add_reservation(@reservation) # end - # it "add a new instance of Reservation to reservations array" do - # expect(@reservation_desk.reservations.include? @reservation).must_equal true - # expect(@reservation_desk.reservations.length).must_equal (@reservations_num + 1) + # it "add a new instance of Reservation to a correct Room's reservations array" do + # expect(@reservation_desk.rooms[0].reservations.include? @reservation).must_equal true + # # expect(@reservation_desk.reservations.length).must_equal (@reservations_num + 1) # end # end From f09559ef4a7a31e8e0248f4c577a8cf2e8a9c607 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Tue, 3 Mar 2020 13:44:18 -0800 Subject: [PATCH 09/35] Moved ReservationDesk#make_rooms to private. --- lib/reservation_desk.rb | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 8b1f1d5a8..fcb8d759a 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -9,14 +9,6 @@ def initialize(room_num: 20) #TODO: not needed? end - def make_rooms - rooms = [] - room_num.times do |i| - rooms << Room.new(i+1) - end - return rooms - end - def find_room_by_id(id) rooms.find {|room| room.id == id} end @@ -37,5 +29,14 @@ def new_reservation(room_id: , start_date: , end_date: ) # room.reservations << new_reservation # end + private + def make_rooms + rooms = [] + room_num.times do |i| + rooms << Room.new(i+1) + end + return rooms + end + end end \ No newline at end of file From 7b6b246cb4710a0e59f7f5b73a30b86c599c75aa Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Tue, 3 Mar 2020 13:59:44 -0800 Subject: [PATCH 10/35] Added ReservationDesk#add_reservation method. --- lib/reservation.rb | 3 --- lib/reservation_desk.rb | 8 ++++---- test/reservation_desk_test.rb | 32 ++++++++++++++++---------------- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 254e21e38..4ab0513fe 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -11,7 +11,4 @@ def initialize(room_id: , start_date:, end_date:) end end - - - end \ No newline at end of file diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index fcb8d759a..cd5742298 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -24,10 +24,10 @@ def new_reservation(room_id: , start_date: , end_date: ) Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) end - # def add_reservation(new_reservation) - # room = find_room_by_id(new_reservation.room_id) - # room.reservations << new_reservation - # end + def add_reservation(new_reservation) + room = find_room_by_id(new_reservation.room_id) + room.reservations << new_reservation + end private def make_rooms diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 20105435c..652b21fce 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -118,21 +118,21 @@ end end - # describe "add_reservation" do - # before do - # @room = @reservation_desk.rooms[0] - # @room_id = 1 - # @start_date = "2020-4-1" - # @end_date = "2020-4-5" - # @reservation = @reservation_desk.new_reservation(room_id: @room_id, start_date: @start_date, end_date: @end_date) - # # @reservations_num = @reservation_desk.reservations.length - # @reservation_desk.add_reservation(@reservation) - # end - - # it "add a new instance of Reservation to a correct Room's reservations array" do - # expect(@reservation_desk.rooms[0].reservations.include? @reservation).must_equal true - # # expect(@reservation_desk.reservations.length).must_equal (@reservations_num + 1) - # end - # end + describe "add_reservation" do + before do + @room = @reservation_desk.rooms[0] + @room_id = 1 + @start_date = "2020-4-1" + @end_date = "2020-4-5" + @reservation = @reservation_desk.new_reservation(room_id: @room_id, start_date: @start_date, end_date: @end_date) + @reservations_num = @reservation_desk.rooms[0].reservations.length + @reservation_desk.add_reservation(@reservation) + end + + it "add a new instance of Reservation to a correct Room's reservations array" do + expect(@reservation_desk.rooms[0].reservations.include? @reservation).must_equal true + expect(@reservation_desk.rooms[0].reservations.length).must_equal (@reservations_num + 1) + end + end end \ No newline at end of file From 9c03227abc4c64505818d64e4437e01d3247d109 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Tue, 3 Mar 2020 16:40:22 -0800 Subject: [PATCH 11/35] Added ReservationDesk#find_reservations method. --- lib/reservation.rb | 3 ++- lib/reservation_desk.rb | 26 ++++++++++++++++++++- test/reservation_desk_test.rb | 44 ++++++++++++++++++++++++++++------- 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 4ab0513fe..b2da1dd54 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,11 +2,12 @@ module Hotel class Reservation - attr_reader :start_date, :end_date, :room_id + attr_reader :start_date, :end_date, :date_range, :room_id def initialize(room_id: , start_date:, end_date:) @start_date = Date.parse(start_date) @end_date = Date.parse(end_date) + # @date_range = (@start_date...@end_date) #excluding @end_date @room_id = room_id end end diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index cd5742298..febdeff35 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -15,8 +15,32 @@ def find_room_by_id(id) def find_reservations(room_id: , start_date: nil, end_date: nil) room = rooms.find { |room| room.id == room_id} + return nil if room == nil + return room.reservations if (start_date == nil && end_date == nil) - #TODO: add logic here + + if end_date == nil + start_date = Date.parse(start_date) + reservations = room.reservations.select { |reservation| + start_date < reservation.end_date + } + elsif start_date == nil + end_date = Date.parse(end_date) + reservations = room.reservations.select { |reservation| + end_date > reservation.start_date + } + else + start_date = Date.parse(start_date) + end_date = Date.parse(end_date) + # date_range = (start_date..end_date) + reservations = room.reservations.select { |reservation| + start_date < reservation.end_date && end_date > reservation.start_date + } + end + return reservations + + + #TODO: add date_range class and refactor end def new_reservation(room_id: , start_date: , end_date: ) diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 652b21fce..a1800e662 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -62,40 +62,66 @@ end describe "find_reservations" do + before do + # @room = @reservation_desk.rooms[0] + @reservation_1 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-5") + @reservation_2 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-10", end_date: "2020-3-15") + @reservation_3 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-20", end_date: "2020-3-25") + + @reservation_desk.add_reservation(@reservation_1) + @reservation_desk.add_reservation(@reservation_2) + @reservation_desk.add_reservation(@reservation_3) + end + it "returns an array" do expect(@reservation_desk.find_reservations(room_id: 1)).must_be_kind_of Array end it "returns an array of reservations" do - + expect(@reservation_desk.find_reservations(room_id: 1)[0]).must_be_kind_of Hotel::Reservation end - it "Reservation#room_id is what we searched for" do - + it "returns reservation for a specific room" do + expect(@reservation_desk.find_reservations(room_id: 1)[0].room_id).must_equal 1 + expect(@reservation_desk.find_reservations(room_id: 1)[2].room_id).must_equal 1 end - it "Reservation@start_date and end_date are what we searched for" do - + it "returns reservations for a specific date range" do + result_1 = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-17") + expect(result_1.length).must_equal 2 + result_2 = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-10") + expect(result_2.length).must_equal 1 + result_3 = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-3", end_date: "2020-3-8") + expect(result_3.length).must_equal 1 + result_4 = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-11", end_date: "2020-3-13") + expect(result_4.length).must_equal 1 end it "Returns empty array if there are no reservations for the room/dates" do - + result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-4-1", end_date: "2020-4-17") + expect(result.length).must_equal 0 end it "Returns nil if room ID doesn't exist" do - + assert_nil @reservation_desk.find_reservations(room_id: 100000, start_date: "2020-3-1", end_date: "2020-3-17") end it "If end_date is nil, returns all reservations from the start date onward" do #TODO: wording + result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1") + expect(result.length).must_equal 3 end it "If start_date is nil, returns all reservations until the end date" do - + result_1 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-17") + expect(result_1.length).must_equal 2 + result_2 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-10") + expect(result_2.length).must_equal 1 end it "If both start and end dates are nill, returns all reservations" do - + result = @reservation_desk.find_reservations(room_id: 1) + expect(result.length).must_equal 3 end end From 4667767e22872019569dacafc26ef541ab0b3f95 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Tue, 3 Mar 2020 21:06:12 -0800 Subject: [PATCH 12/35] Added test outlines for ReservationDesk#find_reservations. --- lib/reservation_desk.rb | 3 +-- test/reservation_desk_test.rb | 27 +++++++++++++++++---------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index febdeff35..0b406ed4c 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -13,7 +13,7 @@ def find_room_by_id(id) rooms.find {|room| room.id == id} end - def find_reservations(room_id: , start_date: nil, end_date: nil) + def find_reservations(room_id: nil , start_date: nil, end_date: nil) room = rooms.find { |room| room.id == room_id} return nil if room == nil @@ -39,7 +39,6 @@ def find_reservations(room_id: , start_date: nil, end_date: nil) end return reservations - #TODO: add date_range class and refactor end diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index a1800e662..2e6f90979 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -81,12 +81,16 @@ expect(@reservation_desk.find_reservations(room_id: 1)[0]).must_be_kind_of Hotel::Reservation end - it "returns reservation for a specific room" do + it "returns all reservations if no arguments are provided" do + + end + + it "returns reservations for a specific room if room ID is provided" do expect(@reservation_desk.find_reservations(room_id: 1)[0].room_id).must_equal 1 expect(@reservation_desk.find_reservations(room_id: 1)[2].room_id).must_equal 1 end - it "returns reservations for a specific date range" do + it "returns reservations for specific dates for a specific room" do result_1 = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-17") expect(result_1.length).must_equal 2 result_2 = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-10") @@ -97,33 +101,36 @@ expect(result_4.length).must_equal 1 end - it "Returns empty array if there are no reservations for the room/dates" do + it "returns reservations for specific dates for all rooms" do + + end + + it "returns empty array if there are no reservations for the room/dates" do result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-4-1", end_date: "2020-4-17") expect(result.length).must_equal 0 end - it "Returns nil if room ID doesn't exist" do - assert_nil @reservation_desk.find_reservations(room_id: 100000, start_date: "2020-3-1", end_date: "2020-3-17") - end + # it "Returns nil if room ID doesn't exist" do + # assert_nil @reservation_desk.find_reservations(room_id: 100000, start_date: "2020-3-1", end_date: "2020-3-17") + # end - it "If end_date is nil, returns all reservations from the start date onward" do + it "if end_date is nil, returns all reservations from the start date onward" do #TODO: wording result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1") expect(result.length).must_equal 3 end - it "If start_date is nil, returns all reservations until the end date" do + it "if start_date is nil, returns all reservations until the end date" do result_1 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-17") expect(result_1.length).must_equal 2 result_2 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-10") expect(result_2.length).must_equal 1 end - it "If both start and end dates are nill, returns all reservations" do + it "if both start and end dates are nill, returns all reservations" do result = @reservation_desk.find_reservations(room_id: 1) expect(result.length).must_equal 3 end - end describe "new_reservation" do From 7a2130b8da28a60ae5aa63f24b2f7fb0e13f337a Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Wed, 4 Mar 2020 10:17:26 -0800 Subject: [PATCH 13/35] Changed all ReservationDesk#find_reservations arguments to be required for the time being. --- lib/reservation_desk.rb | 58 +++++++++++++++++++++-------------- test/reservation_desk_test.rb | 51 ++++++++++++++++-------------- 2 files changed, 63 insertions(+), 46 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 0b406ed4c..fd0b12ec6 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -13,35 +13,47 @@ def find_room_by_id(id) rooms.find {|room| room.id == id} end - def find_reservations(room_id: nil , start_date: nil, end_date: nil) + def find_reservations(room_id: , start_date: , end_date: ) room = rooms.find { |room| room.id == room_id} return nil if room == nil - return room.reservations if (start_date == nil && end_date == nil) - - if end_date == nil - start_date = Date.parse(start_date) - reservations = room.reservations.select { |reservation| - start_date < reservation.end_date - } - elsif start_date == nil - end_date = Date.parse(end_date) - reservations = room.reservations.select { |reservation| - end_date > reservation.start_date - } - else - start_date = Date.parse(start_date) - end_date = Date.parse(end_date) - # date_range = (start_date..end_date) - reservations = room.reservations.select { |reservation| - start_date < reservation.end_date && end_date > reservation.start_date - } - end - return reservations + start_date = Date.parse(start_date) + end_date = Date.parse(end_date) - #TODO: add date_range class and refactor + reservations = room.reservations.select { |reservation| + start_date < reservation.end_date && end_date > reservation.start_date + } end + # def find_reservations(room_id: nil , start_date: nil, end_date: nil) + # room = rooms.find { |room| room.id == room_id} + # return nil if room == nil + + # return room.reservations if (start_date == nil && end_date == nil) + + # if end_date == nil + # start_date = Date.parse(start_date) + # reservations = room.reservations.select { |reservation| + # start_date < reservation.end_date + # } + # elsif start_date == nil + # end_date = Date.parse(end_date) + # reservations = room.reservations.select { |reservation| + # end_date > reservation.start_date + # } + # else + # start_date = Date.parse(start_date) + # end_date = Date.parse(end_date) + # # date_range = (start_date..end_date) + # reservations = room.reservations.select { |reservation| + # start_date < reservation.end_date && end_date > reservation.start_date + # } + # end + # return reservations + + # #TODO: add date_range class and refactor + # end + def new_reservation(room_id: , start_date: , end_date: ) raise ArgumentError.new("Invalid room ID.") unless rooms.find {|room| room.id == room_id} Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 2e6f90979..6d66aed48 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -6,7 +6,7 @@ #@reservation = Hotel::Reservation.new("2020-4-1", "2020-4-5") end - describe "ReservationDesk instatiation" do + describe "ReservationDesk instantiation" do it "is an instance of ReservationDesk" do expect(@reservation_desk).must_be_kind_of Hotel::ReservationDesk end @@ -74,20 +74,24 @@ end it "returns an array" do - expect(@reservation_desk.find_reservations(room_id: 1)).must_be_kind_of Array + result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-17") + expect(result).must_be_kind_of Array end it "returns an array of reservations" do - expect(@reservation_desk.find_reservations(room_id: 1)[0]).must_be_kind_of Hotel::Reservation + result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-17") + expect(result[0]).must_be_kind_of Hotel::Reservation end - it "returns all reservations if no arguments are provided" do + # TODO: + # it "returns all reservations if no arguments are provided" do - end + # end it "returns reservations for a specific room if room ID is provided" do - expect(@reservation_desk.find_reservations(room_id: 1)[0].room_id).must_equal 1 - expect(@reservation_desk.find_reservations(room_id: 1)[2].room_id).must_equal 1 + result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-30") + expect(result[0].room_id).must_equal 1 + expect(result[2].room_id).must_equal 1 end it "returns reservations for specific dates for a specific room" do @@ -114,23 +118,24 @@ # assert_nil @reservation_desk.find_reservations(room_id: 100000, start_date: "2020-3-1", end_date: "2020-3-17") # end - it "if end_date is nil, returns all reservations from the start date onward" do - #TODO: wording - result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1") - expect(result.length).must_equal 3 - end - - it "if start_date is nil, returns all reservations until the end date" do - result_1 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-17") - expect(result_1.length).must_equal 2 - result_2 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-10") - expect(result_2.length).must_equal 1 - end + # TODO: + # it "if end_date is nil, returns all reservations from the start date onward" do + # #TODO: wording + # result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1") + # expect(result.length).must_equal 3 + # end + + # it "if start_date is nil, returns all reservations until the end date" do + # result_1 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-17") + # expect(result_1.length).must_equal 2 + # result_2 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-10") + # expect(result_2.length).must_equal 1 + # end - it "if both start and end dates are nill, returns all reservations" do - result = @reservation_desk.find_reservations(room_id: 1) - expect(result.length).must_equal 3 - end + # it "if both start and end dates are nill, returns all reservations" do + # result = @reservation_desk.find_reservations(room_id: 1) + # expect(result.length).must_equal 3 + # end end describe "new_reservation" do From 1627956545b6ed1f654c1148b009c00071a6cb3c Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Wed, 4 Mar 2020 14:59:17 -0800 Subject: [PATCH 14/35] Added DateRange class and DateRange#overlap?. --- lib/date_range.rb | 56 ++++++++++++++++++++++++++++++++++ test/date_range_test.rb | 66 +++++++++++++++++++++++++++++++++++++++++ test/test_helper.rb | 3 +- 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 lib/date_range.rb create mode 100644 test/date_range_test.rb diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..6eedc57a8 --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,56 @@ +module Hotel + class DateRange + attr_reader :start_date, :end_date + + def initialize(start_date: , end_date: ) + @start_date = Date.parse(start_date) + @end_date = Date.parse(end_date) + + raise ArgumentError.new("End date cannot be equal to or come before start date.") if @end_date <= @start_date + end + + # def initialize(start_date: nil, end_date: nil) + # start_date == nil ? @start_date = start_date : @start_date = Date.parse(start_date) + # end_date == nil ? @end_date = end_date : @end_date = Date.parse(end_date) + + # if @end_date != nil && @start_date != nil && @end_date <= @start_date + # raise ArgumentError.new("End date cannot be equal to or come before start date.") + # end + # end + + def overlap?(date_range) + raise ArgumentError.new("Must provide a date range.") unless date_range.is_a? DateRange + # raise ArgumentError.new("Must provide start and end dates.") if (date_range.start_date == nil || date_range.end_date == nil) + start_date < date_range.end_date && end_date > date_range.start_date + end + + end +end + +# if end_date == nil +# start_date = Date.parse(start_date) +# reservations = room.reservations.select { |reservation| +# start_date < reservation.end_date +# } +# elsif start_date == nil +# end_date = Date.parse(end_date) +# reservations = room.reservations.select { |reservation| +# end_date > reservation.start_date +# } +# else +# start_date = Date.parse(start_date) +# end_date = Date.parse(end_date) +# # date_range = (start_date..end_date) +# reservations = room.reservations.select { |reservation| +# start_date < reservation.end_date && end_date > reservation.start_date +# } +# end + +######## +# if start_date == nil +# end_date > date_range.start_date +# end + +# if start_date == nil && date_range.start_date == nil +# true +# end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb new file mode 100644 index 000000000..abb6c8d75 --- /dev/null +++ b/test/date_range_test.rb @@ -0,0 +1,66 @@ +require_relative "test_helper" + +describe "DateRange class" do + describe "DateRange instatiation" do + # before do + # date_range = Hotel::DateRange.new() + # end + it "is an instance of DateRange" do + expect(Hotel::DateRange.new(start_date: "2020-3-1", end_date: "2020-3-10")).must_be_kind_of Hotel::DateRange + end + + it "converts its start_date and end_date attributes to Date objects" do + date_range = Hotel::DateRange.new(start_date: "2020-3-1", end_date: "2020-3-10") + expect(date_range.start_date).must_be_kind_of Date + expect(date_range.end_date).must_be_kind_of Date + end + + it "raises an ArgumentError if end_date is equal to or comes before start_date" do + expect {Hotel::DateRange.new(start_date: "2020-3-1", end_date: "2020-2-10")}.must_raise ArgumentError + expect {Hotel::DateRange.new(start_date: "2020-3-1", end_date: "2020-3-1")}.must_raise ArgumentError + end + + # TODO + # it "can be instantiated with no arguments" do + # expect(Hotel::DateRange.new()).must_be_kind_of Hotel::DateRange + # end + end + + describe "overlap?" do + let (:date_range) { + Hotel::DateRange.new(start_date: "2020-3-1", end_date: "2020-3-20") + } + + it "expects a DateRange as an argument" do + expect {date_range.overlap?(50)}.must_raise ArgumentError + end + + it "returns true if the dates overlap and false if not" do + # TODO: each one should be a new test? + second_date_range = Hotel::DateRange.new(start_date: "2020-3-2", end_date: "2020-3-10") + expect(date_range.overlap?(second_date_range)).must_equal true + + third_date_range = Hotel::DateRange.new(start_date: "2020-3-13", end_date: "2020-3-25") + expect(date_range.overlap?(third_date_range)).must_equal true + + forth_date_range = Hotel::DateRange.new(start_date: "2020-2-10", end_date: "2020-2-26") + expect(date_range.overlap?(forth_date_range)).must_equal false + + fifth_date_range = Hotel::DateRange.new(start_date: "2020-3-23", end_date: "2020-3-25") + expect(date_range.overlap?(fifth_date_range)).must_equal false + + six_date_range = Hotel::DateRange.new(start_date: "2020-3-20", end_date: "2020-3-21") + expect(date_range.overlap?(six_date_range)).must_equal false + end + + # TODO: + # it "expects a DateRange provided as an argument to have start_date and end_date rather than nil" do + # other_date_range_1 = Hotel::DateRange.new(end_date: "2020-5-10") + # expect {date_range.overlap? (other_date_range_1)}.must_raise ArgumentError + + # other_date_range_2 = Hotel::DateRange.new(start_date: "2020-5-10") + # expect {date_range.overlap? (other_date_range_2)}.must_raise ArgumentError + # end + end + +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 84bc44db0..2dd3dc6c8 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -8,4 +8,5 @@ # require_relative your lib files here! require_relative "../lib/room" require_relative "../lib/reservation_desk" -require_relative "../lib/reservation" \ No newline at end of file +require_relative "../lib/reservation" +require_relative "../lib/date_range" \ No newline at end of file From 4bb0daffb69cf3d158ecf4c0c15034225cb1cc04 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Wed, 4 Mar 2020 15:20:01 -0800 Subject: [PATCH 15/35] Updated Reservation class and ReservationDesk#find_reservations to use DateRange. --- lib/reservation.rb | 6 ++---- lib/reservation_desk.rb | 5 ++--- test/reservation_desk_test.rb | 14 ++++++++------ test/reservation_test.rb | 4 ++-- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index b2da1dd54..af169b69d 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,12 +2,10 @@ module Hotel class Reservation - attr_reader :start_date, :end_date, :date_range, :room_id + attr_reader :date_range, :room_id def initialize(room_id: , start_date:, end_date:) - @start_date = Date.parse(start_date) - @end_date = Date.parse(end_date) - # @date_range = (@start_date...@end_date) #excluding @end_date + @date_range = DateRange.new(start_date: start_date, end_date: end_date) @room_id = room_id end end diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index fd0b12ec6..dc5cc5618 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -17,11 +17,10 @@ def find_reservations(room_id: , start_date: , end_date: ) room = rooms.find { |room| room.id == room_id} return nil if room == nil - start_date = Date.parse(start_date) - end_date = Date.parse(end_date) + date_range = DateRange.new(start_date: start_date, end_date: end_date) reservations = room.reservations.select { |reservation| - start_date < reservation.end_date && end_date > reservation.start_date + reservation.date_range.overlap? (date_range) } end diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 6d66aed48..4f43f42bc 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -83,10 +83,9 @@ expect(result[0]).must_be_kind_of Hotel::Reservation end - # TODO: - # it "returns all reservations if no arguments are provided" do - - # end + it "Returns nil if room ID doesn't exist" do + assert_nil @reservation_desk.find_reservations(room_id: 100000, start_date: "2020-3-1", end_date: "2020-3-17") + end it "returns reservations for a specific room if room ID is provided" do result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-30") @@ -114,11 +113,14 @@ expect(result.length).must_equal 0 end + + + # TODO: + # it "Returns nil if room ID doesn't exist" do # assert_nil @reservation_desk.find_reservations(room_id: 100000, start_date: "2020-3-1", end_date: "2020-3-17") # end - - # TODO: + # it "if end_date is nil, returns all reservations from the start date onward" do # #TODO: wording # result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1") diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 3420bd05f..6d47b85db 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -13,8 +13,8 @@ expect(@reservation).must_be_kind_of Hotel::Reservation end - it "stores start and end dates as Date objects" do - expect(@reservation.start_date).must_be_kind_of Date + it "has date_range variable which holds an instance of DateRange" do + expect(@reservation.date_range).must_be_kind_of Hotel::DateRange end end From e4faec3d1710a4ce0172014800d85e7fda64c31e Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Wed, 4 Mar 2020 15:58:03 -0800 Subject: [PATCH 16/35] Updated ReservationDesk#find_reservations: room_id is optional. --- lib/reservation_desk.rb | 23 ++++++++++++++++------- test/reservation_desk_test.rb | 16 ++++++++++++++-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index dc5cc5618..cbc16d956 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -13,15 +13,24 @@ def find_room_by_id(id) rooms.find {|room| room.id == id} end - def find_reservations(room_id: , start_date: , end_date: ) - room = rooms.find { |room| room.id == room_id} - return nil if room == nil - + def find_reservations(room_id: nil , start_date: , end_date: ) date_range = DateRange.new(start_date: start_date, end_date: end_date) + + if room_id + room = rooms.find { |room| room.id == room_id} + return nil if room == nil + reservations = room.reservations.select { |reservation| + reservation.date_range.overlap? (date_range) } + else + reservations = [] + rooms.each do |room| + room_reservations = room.reservations.select { |reservation| + reservation.date_range.overlap? (date_range) } + reservations += room_reservations + end + end - reservations = room.reservations.select { |reservation| - reservation.date_range.overlap? (date_range) - } + return reservations end # def find_reservations(room_id: nil , start_date: nil, end_date: nil) diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 4f43f42bc..f9d196e56 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -105,7 +105,19 @@ end it "returns reservations for specific dates for all rooms" do - + reservation_4 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-1", end_date: "2020-3-5") + reservation_5 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-10", end_date: "2020-3-15") + reservation_6 = @reservation_desk.new_reservation(room_id: 19, start_date: "2020-3-20", end_date: "2020-3-25") + reservation_7 = @reservation_desk.new_reservation(room_id: 19, start_date: "2020-5-20", end_date: "2020-5-25") + + @reservation_desk.add_reservation(reservation_4) + @reservation_desk.add_reservation(reservation_5) + @reservation_desk.add_reservation(reservation_6) + @reservation_desk.add_reservation(reservation_7) + + result = @reservation_desk.find_reservations(start_date: "2020-3-1", end_date: "2020-3-30") + expect(result.length).must_equal 6 + end it "returns empty array if there are no reservations for the room/dates" do @@ -120,7 +132,7 @@ # it "Returns nil if room ID doesn't exist" do # assert_nil @reservation_desk.find_reservations(room_id: 100000, start_date: "2020-3-1", end_date: "2020-3-17") # end - + # it "if end_date is nil, returns all reservations from the start date onward" do # #TODO: wording # result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1") From 1054cdc47f7827a899db4112539a87a48992cf20 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Wed, 4 Mar 2020 16:29:24 -0800 Subject: [PATCH 17/35] Added DateRange#nights. --- lib/date_range.rb | 4 ++++ test/date_range_test.rb | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/date_range.rb b/lib/date_range.rb index 6eedc57a8..d35cc6596 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -24,6 +24,10 @@ def overlap?(date_range) start_date < date_range.end_date && end_date > date_range.start_date end + def nights + (end_date - start_date).to_i + end + end end diff --git a/test/date_range_test.rb b/test/date_range_test.rb index abb6c8d75..0d39bc64f 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -63,4 +63,14 @@ # end end + describe "nights" do + it "calculates the number of nights for the date range" do + date_range = Hotel::DateRange.new(start_date: "2020-3-1", end_date: "2020-3-10") + expect(date_range.nights).must_equal 9 + + date_range = Hotel::DateRange.new(start_date: "2020-3-1", end_date: "2020-3-2") + expect(date_range.nights).must_equal 1 + end + end + end \ No newline at end of file From 517de120c0f43579040b78c3e0e935095d27498a Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Wed, 4 Mar 2020 16:32:34 -0800 Subject: [PATCH 18/35] Added Reservation#cost. --- lib/reservation.rb | 5 ++++- test/reservation_test.rb | 23 +++++++++++++++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index af169b69d..5834abcb9 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -8,6 +8,9 @@ def initialize(room_id: , start_date:, end_date:) @date_range = DateRange.new(start_date: start_date, end_date: end_date) @room_id = room_id end - end + def cost + date_range.nights * 200 + end + end end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 6d47b85db..e819a867b 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -1,14 +1,14 @@ require_relative "test_helper" describe "Reservation class" do - describe "Reservation instatiation" do - before do - @room_id = 1 - @start_date = "2020-4-1" - @end_date = "2020-4-5" - @reservation = Hotel::Reservation.new(room_id: @room_id, start_date: @start_date, end_date: @end_date) - end + before do + @room_id = 1 + @start_date = "2020-4-1" + @end_date = "2020-4-5" + @reservation = Hotel::Reservation.new(room_id: @room_id, start_date: @start_date, end_date: @end_date) + end + describe "Reservation instatiation" do it "is an instance of reservation" do expect(@reservation).must_be_kind_of Hotel::Reservation end @@ -16,8 +16,15 @@ it "has date_range variable which holds an instance of DateRange" do expect(@reservation.date_range).must_be_kind_of Hotel::DateRange end - end + describe "cost" do + it "returns an integer" do + expect(@reservation.cost).must_be_kind_of Integer + end + it "calculates cost as $200/night" do + expect(@reservation.cost).must_equal 800 + end + end end \ No newline at end of file From b8b358c408d72a7935589cadfbf3455e78cd3b22 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Thu, 5 Mar 2020 11:06:28 -0800 Subject: [PATCH 19/35] Added ReservationDesk#find_available_room. --- lib/reservation_desk.rb | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index cbc16d956..61503a721 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -29,7 +29,7 @@ def find_reservations(room_id: nil , start_date: , end_date: ) reservations += room_reservations end end - + return reservations end @@ -62,6 +62,25 @@ def find_reservations(room_id: nil , start_date: , end_date: ) # #TODO: add date_range class and refactor # end + def find_available_room(start_date: , end_date:) + #TODO: efficient date checking + + date_range = DateRange.new(start_date: start_date, end_date: end_date) + + rooms.each do |room| + switch = 0 + room.reservations.each do |reservation| + if reservation.date_range.overlap?(date_range) + switch = 1 + break + end + end + return room if switch == 0 + end + + return nil + end + def new_reservation(room_id: , start_date: , end_date: ) raise ArgumentError.new("Invalid room ID.") unless rooms.find {|room| room.id == room_id} Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) From 296d1e7d4c69aeb6335adfcbeb027da73bc5e80c Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Thu, 5 Mar 2020 13:25:56 -0800 Subject: [PATCH 20/35] Added ReservationDesk#make_reservation. --- lib/date_range.rb | 1 + lib/reservation_desk.rb | 83 +++++++++++++++++++++++++---------------- 2 files changed, 51 insertions(+), 33 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index d35cc6596..05ab12bb0 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -7,6 +7,7 @@ def initialize(start_date: , end_date: ) @end_date = Date.parse(end_date) raise ArgumentError.new("End date cannot be equal to or come before start date.") if @end_date <= @start_date + #TODO: validate dates' input end # def initialize(start_date: nil, end_date: nil) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 61503a721..4e8fde8a1 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -33,35 +33,6 @@ def find_reservations(room_id: nil , start_date: , end_date: ) return reservations end - # def find_reservations(room_id: nil , start_date: nil, end_date: nil) - # room = rooms.find { |room| room.id == room_id} - # return nil if room == nil - - # return room.reservations if (start_date == nil && end_date == nil) - - # if end_date == nil - # start_date = Date.parse(start_date) - # reservations = room.reservations.select { |reservation| - # start_date < reservation.end_date - # } - # elsif start_date == nil - # end_date = Date.parse(end_date) - # reservations = room.reservations.select { |reservation| - # end_date > reservation.start_date - # } - # else - # start_date = Date.parse(start_date) - # end_date = Date.parse(end_date) - # # date_range = (start_date..end_date) - # reservations = room.reservations.select { |reservation| - # start_date < reservation.end_date && end_date > reservation.start_date - # } - # end - # return reservations - - # #TODO: add date_range class and refactor - # end - def find_available_room(start_date: , end_date:) #TODO: efficient date checking @@ -77,15 +48,30 @@ def find_available_room(start_date: , end_date:) end return room if switch == 0 end - return nil end - def new_reservation(room_id: , start_date: , end_date: ) - raise ArgumentError.new("Invalid room ID.") unless rooms.find {|room| room.id == room_id} + def make_reservation(start_date:, end_date:) + # Create a date range here and use it moing forward? + room = find_available_room(start_date: start_date, end_date: end_date) + raise StandardError.new("No rooms available for these dates.") if room == nil + reservation = new_reservation(room_id: room.id, start_date: start_date, end_date: end_date) + add_reservation(reservation) + end + + def new_reservation(room_id: nil, start_date: , end_date: ) + unless room_id == nil || rooms.find {|room| room.id == room_id} + raise ArgumentError.new("Invalid room ID.") + end + #TODO: Check availability or possibly remove? + + if room_id == nil + room_id = find_available_room(start_date: start_date, end_date: end_date).id + end Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) end + # TODO: should be combined with new_reservation? Maybe a larger method to call both of them? def add_reservation(new_reservation) room = find_room_by_id(new_reservation.room_id) room.reservations << new_reservation @@ -101,4 +87,35 @@ def make_rooms end end -end \ No newline at end of file +end + + + +# def find_reservations(room_id: nil , start_date: nil, end_date: nil) + # room = rooms.find { |room| room.id == room_id} + # return nil if room == nil + + # return room.reservations if (start_date == nil && end_date == nil) + + # if end_date == nil + # start_date = Date.parse(start_date) + # reservations = room.reservations.select { |reservation| + # start_date < reservation.end_date + # } + # elsif start_date == nil + # end_date = Date.parse(end_date) + # reservations = room.reservations.select { |reservation| + # end_date > reservation.start_date + # } + # else + # start_date = Date.parse(start_date) + # end_date = Date.parse(end_date) + # # date_range = (start_date..end_date) + # reservations = room.reservations.select { |reservation| + # start_date < reservation.end_date && end_date > reservation.start_date + # } + # end + # return reservations + + # #TODO: add date_range class and refactor + # end \ No newline at end of file From f9687ca6b9fd75e2160b92096072236cbe5d22a7 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Thu, 5 Mar 2020 16:29:11 -0800 Subject: [PATCH 21/35] Added SimpleCov. --- test/test_helper.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 2dd3dc6c8..be432f25a 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,4 +1,5 @@ -# Add simplecov +require 'simplecov' +SimpleCov.start require "minitest" require "minitest/autorun" require "minitest/reporters" From 1b758d87d4985988ce140a026afebefc6c1cb84d Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Thu, 5 Mar 2020 16:37:41 -0800 Subject: [PATCH 22/35] Filtered tests to be excluded out of SimpleCov report. --- test/test_helper.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index be432f25a..4896bd827 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,5 +1,7 @@ require 'simplecov' -SimpleCov.start +SimpleCov.start do + add_filter 'test/' +end require "minitest" require "minitest/autorun" require "minitest/reporters" From f230fa35b83e0ca7412dbe90fb0c6a02055c7ca9 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Thu, 5 Mar 2020 18:41:27 -0800 Subject: [PATCH 23/35] Added ReservationDesk#find_reservations. --- .DS_Store | Bin 0 -> 6148 bytes lib/reservation_desk.rb | 19 ++++++ test/reservation_desk_test.rb | 117 ++++++++++++++++++++++++++++++++-- 3 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..10e9161f24a3c76b1b3a09078a6176d2132ff68e GIT binary patch literal 6148 zcmeHK&2G~`5S~p8*i?udkP0_nkT^sr1`&!7k_o9$4@d|jH~?zx*ln%4-pY0wK?w4N zmw+eWRk(2EL3jZ8_6JCuaIGS=Bh7xZyWgzWpW@jp5wXEI_J}$}WWxno7tyRRF)w_{ zT6)9*GPy=UAstY%lkw3K+YA^5i~{SXfcSQ88WE>cN@(u;jWQl#P85dw@Ebp+AzHzY zCgq9de~nJEw5)o)@2u6f&YiztJC5yKa^3`od=gY)H7*BX@k;cbhSg!D3Ynb72`H~$rg_XK13u2gmkdiVOXt~>R5 zx4o`=r+;@gbL`FQ-h-XJUKv&+1iwH24nq+w_oz^aQwK=dG}jVNr$EOR5%k()!lmp=)gI70|zYdt>c)YBp#T zFbbTt0-`>+aDl$YTA?f*Xyg?DXkl0yV)2(jE*;(>%#Zo!UV5YC{xhr<5&jbD834phB;RRKwo365F;@2M?lJ88l%9O GD)0*?Ev!-i literal 0 HcmV?d00001 diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 4e8fde8a1..7d013e13d 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -33,6 +33,25 @@ def find_reservations(room_id: nil , start_date: , end_date: ) return reservations end + def check_availability(start_date: start_date, end_date: end_date) + #TODO: efficient date checking + date_range = DateRange.new(start_date: start_date, end_date: end_date) + + available_rooms = [] + rooms.each do |room| + switch = 0 + room.reservations.each do |reservation| + if reservation.date_range.overlap?(date_range) + switch = 1 + break + end + end + available_rooms << room if switch == 0 + end + + return available_rooms + end + def find_available_room(start_date: , end_date:) #TODO: efficient date checking diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index f9d196e56..0d9f7e070 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -63,7 +63,6 @@ describe "find_reservations" do before do - # @room = @reservation_desk.rooms[0] @reservation_1 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-5") @reservation_2 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-10", end_date: "2020-3-15") @reservation_3 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-20", end_date: "2020-3-25") @@ -152,12 +151,83 @@ # end end + describe "check_availability" do + before do + @reservation_1 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-5") + @reservation_2 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-1", end_date: "2020-3-10") + @reservation_3 = @reservation_desk.new_reservation(room_id: 3, start_date: "2020-3-1", end_date: "2020-3-25") + + @reservation_desk.add_reservation(@reservation_1) + @reservation_desk.add_reservation(@reservation_2) + @reservation_desk.add_reservation(@reservation_3) + + @request = @reservation_desk.check_availability(start_date: "2020-2-27", end_date: "2020-4-2") + end + + it "returns an Array" do + expect(@request).must_be_kind_of Array + end + + it "returns an Array of Rooms" do + expect(@request[0]).must_be_kind_of Hotel::Room + end + + it "returns an array of Rooms which don't have Reservations for requested dates" do + expect(@request.length).must_equal 17 + expect(@request[0].id).must_equal 4 + end + end + + describe "find_available_room" do + before do + @reservation_1 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-5") + @reservation_2 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-10", end_date: "2020-3-15") + @reservation_3 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-20", end_date: "2020-3-25") + @reservation_4 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-20", end_date: "2020-3-25") + + @reservation_desk.add_reservation(@reservation_1) + @reservation_desk.add_reservation(@reservation_2) + @reservation_desk.add_reservation(@reservation_3) + @reservation_desk.add_reservation(@reservation_4) + + end + + it "returns an instance of Room" do + search = @reservation_desk.find_available_room(start_date: "2020-3-5", end_date: "2020-3-6") + expect(search).must_be_kind_of Hotel::Room + end + + it "returns a first room which is available for dates in question" do + search = @reservation_desk.find_available_room(start_date: "2020-3-5", end_date: "2020-3-6") + expect(search.id).must_equal 1 + + search_2 = @reservation_desk.find_available_room(start_date: "2020-3-2", end_date: "2020-3-4") + expect(search_2.id).must_equal 2 + + search_3 = @reservation_desk.find_available_room(start_date: "2020-3-21", end_date: "2020-3-24") + expect(search_3.id).must_equal 3 + end + + it "returns nil if no rooms are available for requested dates" do + 20.times do |i| + reservation = @reservation_desk.new_reservation(room_id: (i + 1), start_date: "2020-6-1", end_date: "2020-6-30") + @reservation_desk.add_reservation(reservation) + end + search = @reservation_desk.find_available_room(start_date: "2020-6-5", end_date: "2020-6-10") + assert_nil search + end + end + describe "new_reservation" do + before do + @room_id = 10 + @start_date = "2020-4-1" + @end_date = "2020-4-5" + @new_reservation = @reservation_desk.new_reservation(room_id: @room_id, start_date: @start_date, end_date: @end_date) + end + it "creates a new instanse of Reservation" do - room_id = 1 - start_date = "2020-4-1" - end_date = "2020-4-5" - expect(@reservation_desk.new_reservation(room_id: room_id, start_date: start_date, end_date: end_date)).must_be_kind_of Hotel::Reservation + expect(@new_reservation).must_be_kind_of Hotel::Reservation end it "raises an error if room id is invalid" do @@ -168,6 +238,20 @@ @reservation_desk.new_reservation(room_id, start_date, end_date) }.must_raise ArgumentError end + + it "reserves a room with a given ID" do + expect(@new_reservation.room_id).must_equal 10 + end + + it "raises ArgumentError if the requested room is occupied on requested dates" do + #possibly not needed + end + + it "reserves the first available room down the list if no provided" do + reservation = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-10") + @reservation_desk.add_reservation(reservation) + expect(@reservation_desk.new_reservation(start_date: "2020-3-2", end_date: "2020-3-15").room_id).must_equal 2 + end end describe "add_reservation" do @@ -187,4 +271,27 @@ end end + describe "make_reservation" do + it "makes a new reservation and add it into the Room's reservations array" do + room_id = 1 + start_date = "2020-4-1" + end_date = "2020-4-5" + reservation = @reservation_desk.new_reservation(room_id: room_id, start_date: start_date, end_date: end_date) + @reservation_desk.add_reservation(reservation) + + @reservation_desk.make_reservation(start_date: "2020-4-2", end_date: "2020-5-2") + expect(@reservation_desk.rooms[1].reservations.length).must_equal 1 + + @reservation_desk.make_reservation(start_date: "2020-4-20", end_date: "2020-5-1") + expect(@reservation_desk.rooms[0].reservations.length).must_equal 2 + end + + it "raises an Exception if no rooms are available for requested dates" do + 20.times do |i| + reservation = @reservation_desk.new_reservation(room_id: (i + 1), start_date: "2020-6-1", end_date: "2020-6-30") + @reservation_desk.add_reservation(reservation) + end + expect {@reservation_desk.make_reservation(start_date: "2020-6-12", end_date: "2020-6-15")}.must_raise StandardError + end + end end \ No newline at end of file From 2691071b7afe414680c47e2a36ea360d94de79a8 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Thu, 5 Mar 2020 21:00:39 -0800 Subject: [PATCH 24/35] Replaced ReservationDesk#find_available_room with check_availability. --- .DS_Store | Bin 6148 -> 6148 bytes lib/reservation_desk.rb | 42 ++++++++++--------- test/reservation_desk_test.rb | 75 +++++++++++++++++++--------------- 3 files changed, 64 insertions(+), 53 deletions(-) diff --git a/.DS_Store b/.DS_Store index 10e9161f24a3c76b1b3a09078a6176d2132ff68e..f7366d73b8fa6c3fb49447c14bf6912f9a305ddd 100644 GIT binary patch delta 220 zcmZoMXffCj&EobYsURn_xWvHV1|t(Q3o9Et2PYRdCpRBAcWiJ*etB?7Vo7PSQ({rP zfJ|^^N@`MKQFvxbNk&L&o@-8OS!$ktkxybt>f|04&-!SPhJeJ944@(oWruhN1`y!n z;EWd#udX)GQP4FuFsjv2s5Uk<*HJLCFsQBN7CogAga7KQ4a7kiGX|YpcQ8b7b zkXVwDlsI`Ii)SEMQM`a;b+wU&nT~>?rCF_xLbaiRv7wHFshN3gEhmS#s-dlCLT+VM jbxm#EECw)OWQ5QR{7@Q3&E6cqx}9lagVtttj=%f>v(P0r diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 7d013e13d..4d6e2baa5 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -49,30 +49,13 @@ def check_availability(start_date: start_date, end_date: end_date) available_rooms << room if switch == 0 end - return available_rooms + return available_rooms.empty? ? nil : available_rooms end - def find_available_room(start_date: , end_date:) - #TODO: efficient date checking - - date_range = DateRange.new(start_date: start_date, end_date: end_date) - - rooms.each do |room| - switch = 0 - room.reservations.each do |reservation| - if reservation.date_range.overlap?(date_range) - switch = 1 - break - end - end - return room if switch == 0 - end - return nil - end def make_reservation(start_date:, end_date:) # Create a date range here and use it moing forward? - room = find_available_room(start_date: start_date, end_date: end_date) + room = check_availability(start_date: start_date, end_date: end_date)[0] raise StandardError.new("No rooms available for these dates.") if room == nil reservation = new_reservation(room_id: room.id, start_date: start_date, end_date: end_date) add_reservation(reservation) @@ -85,7 +68,7 @@ def new_reservation(room_id: nil, start_date: , end_date: ) #TODO: Check availability or possibly remove? if room_id == nil - room_id = find_available_room(start_date: start_date, end_date: end_date).id + room_id = check_availability(start_date: start_date, end_date: end_date).first.id end Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) end @@ -137,4 +120,23 @@ def make_rooms # return reservations # #TODO: add date_range class and refactor + # end + + + # def find_available_room(start_date: , end_date:) + # #TODO: efficient date checking + + # date_range = DateRange.new(start_date: start_date, end_date: end_date) + + # rooms.each do |room| + # switch = 0 + # room.reservations.each do |reservation| + # if reservation.date_range.overlap?(date_range) + # switch = 1 + # break + # end + # end + # return room if switch == 0 + # end + # return nil # end \ No newline at end of file diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 0d9f7e070..a591ad339 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -176,48 +176,57 @@ expect(@request.length).must_equal 17 expect(@request[0].id).must_equal 4 end - end - - describe "find_available_room" do - before do - @reservation_1 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-5") - @reservation_2 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-10", end_date: "2020-3-15") - @reservation_3 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-20", end_date: "2020-3-25") - @reservation_4 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-20", end_date: "2020-3-25") - - @reservation_desk.add_reservation(@reservation_1) - @reservation_desk.add_reservation(@reservation_2) - @reservation_desk.add_reservation(@reservation_3) - @reservation_desk.add_reservation(@reservation_4) - end - - it "returns an instance of Room" do - search = @reservation_desk.find_available_room(start_date: "2020-3-5", end_date: "2020-3-6") - expect(search).must_be_kind_of Hotel::Room - end - - it "returns a first room which is available for dates in question" do - search = @reservation_desk.find_available_room(start_date: "2020-3-5", end_date: "2020-3-6") - expect(search.id).must_equal 1 - - search_2 = @reservation_desk.find_available_room(start_date: "2020-3-2", end_date: "2020-3-4") - expect(search_2.id).must_equal 2 - - search_3 = @reservation_desk.find_available_room(start_date: "2020-3-21", end_date: "2020-3-24") - expect(search_3.id).must_equal 3 - end - - it "returns nil if no rooms are available for requested dates" do + it "returns nil if there are no Rooms available for requested dates" do 20.times do |i| reservation = @reservation_desk.new_reservation(room_id: (i + 1), start_date: "2020-6-1", end_date: "2020-6-30") @reservation_desk.add_reservation(reservation) end - search = @reservation_desk.find_available_room(start_date: "2020-6-5", end_date: "2020-6-10") + search = @reservation_desk.check_availability(start_date: "2020-6-5", end_date: "2020-6-10") assert_nil search end end + # describe "find_available_room" do + # before do + # @reservation_1 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-5") + # @reservation_2 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-10", end_date: "2020-3-15") + # @reservation_3 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-20", end_date: "2020-3-25") + # @reservation_4 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-20", end_date: "2020-3-25") + + # @reservation_desk.add_reservation(@reservation_1) + # @reservation_desk.add_reservation(@reservation_2) + # @reservation_desk.add_reservation(@reservation_3) + # @reservation_desk.add_reservation(@reservation_4) + + # end + + # it "returns an instance of Room" do + # search = @reservation_desk.find_available_room(start_date: "2020-3-5", end_date: "2020-3-6") + # expect(search).must_be_kind_of Hotel::Room + # end + + # it "returns a first room which is available for dates in question" do + # search = @reservation_desk.find_available_room(start_date: "2020-3-5", end_date: "2020-3-6") + # expect(search.id).must_equal 1 + + # search_2 = @reservation_desk.find_available_room(start_date: "2020-3-2", end_date: "2020-3-4") + # expect(search_2.id).must_equal 2 + + # search_3 = @reservation_desk.find_available_room(start_date: "2020-3-21", end_date: "2020-3-24") + # expect(search_3.id).must_equal 3 + # end + + # it "returns nil if no rooms are available for requested dates" do + # 20.times do |i| + # reservation = @reservation_desk.new_reservation(room_id: (i + 1), start_date: "2020-6-1", end_date: "2020-6-30") + # @reservation_desk.add_reservation(reservation) + # end + # search = @reservation_desk.find_available_room(start_date: "2020-6-5", end_date: "2020-6-10") + # assert_nil search + # end + # end + describe "new_reservation" do before do @room_id = 10 From aa5b820d5d30f56e247ab43084325a83f74fb48d Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Fri, 6 Mar 2020 20:47:24 -0800 Subject: [PATCH 25/35] Added Room#available? and Room#reserve, refactored ReservationDesk. --- .DS_Store | Bin 6148 -> 6148 bytes lib/reservation_desk.rb | 81 +++++++++--------- lib/room.rb | 33 +++++-- test/reservation_desk_test.rb | 156 ++++++---------------------------- test/room_test.rb | 40 +++++++++ 5 files changed, 138 insertions(+), 172 deletions(-) diff --git a/.DS_Store b/.DS_Store index f7366d73b8fa6c3fb49447c14bf6912f9a305ddd..774aa4d69935939eb4be226e2c2d9ebd63e697ce 100644 GIT binary patch delta 75 zcmV-R0JQ&vFoZC$TLc02lUxL;Eg5@zF*GnREFd*AFnuf_do(mMEFdyCFnxUq2?!Y{ hMp9mNf{vP-q@|{(!^D#?1s?&$vrq-K0<#AQ{SSiO84mye delta 99 zcmZoMXffCj&BFL)atzB#Z}IAC104ljV*{gF9ffLRLvtMkBMXDtT24+5Np-iNxYDM+ kS+kccUAFw-AqFsDWQ5QRf>0Vp9o`(ox|L}&E60C+08^e9<^TWy diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 4d6e2baa5..0ef4bff47 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -1,12 +1,11 @@ module Hotel class ReservationDesk + # Responcibility: to organize reservations across hotel attr_reader :room_num, :rooms, :reservations def initialize(room_num: 20) @room_num = room_num @rooms = make_rooms - @reservations = [] - #TODO: not needed? end def find_room_by_id(id) @@ -33,50 +32,27 @@ def find_reservations(room_id: nil , start_date: , end_date: ) return reservations end - def check_availability(start_date: start_date, end_date: end_date) - #TODO: efficient date checking - date_range = DateRange.new(start_date: start_date, end_date: end_date) - + def find_available_rooms(start_date:, end_date:) + #TODO: efficient date checking, rename to find_available_rooms, date range? available_rooms = [] rooms.each do |room| - switch = 0 - room.reservations.each do |reservation| - if reservation.date_range.overlap?(date_range) - switch = 1 - break - end - end - available_rooms << room if switch == 0 + available_rooms << room if room.available?(start_date: start_date, end_date: end_date) end - return available_rooms.empty? ? nil : available_rooms end - - def make_reservation(start_date:, end_date:) - # Create a date range here and use it moing forward? - room = check_availability(start_date: start_date, end_date: end_date)[0] - raise StandardError.new("No rooms available for these dates.") if room == nil - reservation = new_reservation(room_id: room.id, start_date: start_date, end_date: end_date) - add_reservation(reservation) - end - - def new_reservation(room_id: nil, start_date: , end_date: ) - unless room_id == nil || rooms.find {|room| room.id == room_id} - raise ArgumentError.new("Invalid room ID.") - end - #TODO: Check availability or possibly remove? - - if room_id == nil - room_id = check_availability(start_date: start_date, end_date: end_date).first.id + def make_reservation(room_id: nil, start_date:, end_date:) + if room_id + room = find_room_by_id(room_id) + raise ArgumentError.new("Invalid room ID.") if room == nil + else + room = find_available_rooms(start_date: start_date, end_date: end_date)[0] + raise StandardError.new("No rooms available for these dates.") if room == nil end - Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) + room.reserve(start_date: start_date, end_date: end_date) end - # TODO: should be combined with new_reservation? Maybe a larger method to call both of them? - def add_reservation(new_reservation) - room = find_room_by_id(new_reservation.room_id) - room.reservations << new_reservation + def make_block(start_date:, end_date:, rooms:) end private @@ -87,12 +63,41 @@ def make_rooms end return rooms end - end end + + + + + + + + + + + +# def new_reservation(room_id: nil, start_date: , end_date: ) +# unless room_id == nil || rooms.find {|room| room.id == room_id} +# raise ArgumentError.new("Invalid room ID.") +# end +# #TODO: Check availability or possibly remove? + +# if room_id == nil +# room_id = find_available_rooms(start_date: start_date, end_date: end_date).first.id +# end +# Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) +# end + +# # TODO: should be combined with new_reservation? Maybe a larger method to call both of them? +# def add_reservation(new_reservation) +# room = find_room_by_id(new_reservation.room_id) +# room.reservations << new_reservation +# end + + # def find_reservations(room_id: nil , start_date: nil, end_date: nil) # room = rooms.find { |room| room.id == room_id} # return nil if room == nil diff --git a/lib/room.rb b/lib/room.rb index d5870a70c..a2fc4005a 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,7 +1,6 @@ module Hotel - - class Room + # Responcibility: to reserve individual rooms attr_reader :id, :reservations def initialize(id) @@ -9,9 +8,31 @@ def initialize(id) @reservations = [] end - - end - - + def available?(start_date:, end_date:) + date_range = DateRange.new(start_date: start_date, end_date: end_date) + reservations.each do |reservation| + if reservation.date_range.overlap? (date_range) + return false + end + end + return true + end + def reserve(start_date:, end_date:) + unless available?(start_date: start_date, end_date: end_date) + raise StandardError.new("Room is unavailabe for requested dates.") + end + reservation = new_reservation(start_date: start_date, end_date: end_date) + add_reservation(reservation) + end + + private + def new_reservation(start_date:, end_date:) + reservation = Reservation.new(room_id: id, start_date: start_date, end_date: end_date) + end + + def add_reservation(reservation) + reservations << reservation + end + end end diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index a591ad339..45f93b78d 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -49,17 +49,6 @@ assert_nil @reservation_desk.find_room_by_id(20000000) end end - - describe "reservations" do - it "returns an array" do - expect(@reservation_desk.reservations).must_be_kind_of Array - end - - # it "returns an array of reservations" do - # expect(@reservation_desk.reservations.first).must_be_kind_of Hotel::Reservation - # expect(@reservation_desk.reservations.last).must_be_kind_of Hotel::Reservation - # end - end describe "find_reservations" do before do @@ -151,17 +140,13 @@ # end end - describe "check_availability" do + describe "find_available_rooms" do before do - @reservation_1 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-5") - @reservation_2 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-1", end_date: "2020-3-10") - @reservation_3 = @reservation_desk.new_reservation(room_id: 3, start_date: "2020-3-1", end_date: "2020-3-25") - - @reservation_desk.add_reservation(@reservation_1) - @reservation_desk.add_reservation(@reservation_2) - @reservation_desk.add_reservation(@reservation_3) + @reservation_desk.rooms[0].reserve(start_date: "2020-3-1", end_date: "2020-3-5") + @reservation_desk.rooms[1].reserve(start_date: "2020-3-1", end_date: "2020-3-10") + @reservation_desk.rooms[2].reserve(start_date: "2020-3-1", end_date: "2020-3-25") - @request = @reservation_desk.check_availability(start_date: "2020-2-27", end_date: "2020-4-2") + @request = @reservation_desk.find_available_rooms(start_date: "2020-2-27", end_date: "2020-4-2") end it "returns an Array" do @@ -178,129 +163,44 @@ end it "returns nil if there are no Rooms available for requested dates" do - 20.times do |i| - reservation = @reservation_desk.new_reservation(room_id: (i + 1), start_date: "2020-6-1", end_date: "2020-6-30") - @reservation_desk.add_reservation(reservation) + @reservation_desk.rooms.each do |room| + room.reserve(start_date: "2020-6-1", end_date: "2020-6-30") end - search = @reservation_desk.check_availability(start_date: "2020-6-5", end_date: "2020-6-10") + search = @reservation_desk.find_available_rooms(start_date: "2020-6-5", end_date: "2020-6-10") assert_nil search end end - # describe "find_available_room" do - # before do - # @reservation_1 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-5") - # @reservation_2 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-10", end_date: "2020-3-15") - # @reservation_3 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-20", end_date: "2020-3-25") - # @reservation_4 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-20", end_date: "2020-3-25") - - # @reservation_desk.add_reservation(@reservation_1) - # @reservation_desk.add_reservation(@reservation_2) - # @reservation_desk.add_reservation(@reservation_3) - # @reservation_desk.add_reservation(@reservation_4) - - # end - - # it "returns an instance of Room" do - # search = @reservation_desk.find_available_room(start_date: "2020-3-5", end_date: "2020-3-6") - # expect(search).must_be_kind_of Hotel::Room - # end - - # it "returns a first room which is available for dates in question" do - # search = @reservation_desk.find_available_room(start_date: "2020-3-5", end_date: "2020-3-6") - # expect(search.id).must_equal 1 - - # search_2 = @reservation_desk.find_available_room(start_date: "2020-3-2", end_date: "2020-3-4") - # expect(search_2.id).must_equal 2 - - # search_3 = @reservation_desk.find_available_room(start_date: "2020-3-21", end_date: "2020-3-24") - # expect(search_3.id).must_equal 3 - # end - - # it "returns nil if no rooms are available for requested dates" do - # 20.times do |i| - # reservation = @reservation_desk.new_reservation(room_id: (i + 1), start_date: "2020-6-1", end_date: "2020-6-30") - # @reservation_desk.add_reservation(reservation) - # end - # search = @reservation_desk.find_available_room(start_date: "2020-6-5", end_date: "2020-6-10") - # assert_nil search - # end - # end - - describe "new_reservation" do - before do - @room_id = 10 - @start_date = "2020-4-1" - @end_date = "2020-4-5" - @new_reservation = @reservation_desk.new_reservation(room_id: @room_id, start_date: @start_date, end_date: @end_date) - end - - it "creates a new instanse of Reservation" do - expect(@new_reservation).must_be_kind_of Hotel::Reservation + describe "make_reservation" do + it "ID provided: makes a new reservation and add it into the Room's reservations array" do + @reservation_desk.make_reservation(room_id: 5, start_date: "2020-5-5", end_date: "2020-5-7") + @reservation_desk.make_reservation(room_id: 5, start_date: "2020-6-5", end_date: "2020-6-7") + expect(@reservation_desk.rooms[4].reservations.length).must_equal 2 + expect(@reservation_desk.rooms[4].available?(start_date: "2020-5-5", end_date: "2020-5-6")).must_equal false end - it "raises an error if room id is invalid" do - room_id = 1000 #TODO: what if there is one? - start_date = "2020-4-1" - end_date = "2020-4-5" + it "ID provided: Raises an ArgumentError if ID is invalid" do expect { - @reservation_desk.new_reservation(room_id, start_date, end_date) + @reservation_desk.make_reservation(room_id: 999999, start_date: "2020-5-5", end_date: "2020-5-7") }.must_raise ArgumentError end - it "reserves a room with a given ID" do - expect(@new_reservation.room_id).must_equal 10 - end - - it "raises ArgumentError if the requested room is occupied on requested dates" do - #possibly not needed - end - - it "reserves the first available room down the list if no provided" do - reservation = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-10") - @reservation_desk.add_reservation(reservation) - expect(@reservation_desk.new_reservation(start_date: "2020-3-2", end_date: "2020-3-15").room_id).must_equal 2 - end - end - - describe "add_reservation" do - before do - @room = @reservation_desk.rooms[0] - @room_id = 1 - @start_date = "2020-4-1" - @end_date = "2020-4-5" - @reservation = @reservation_desk.new_reservation(room_id: @room_id, start_date: @start_date, end_date: @end_date) - @reservations_num = @reservation_desk.rooms[0].reservations.length - @reservation_desk.add_reservation(@reservation) - end + it "No ID provided: reserves the first available room down the list for requested dates" do + @reservation_desk.rooms[0].reserve(start_date: "2020-3-1", end_date: "2020-3-5") + @reservation_desk.rooms[1].reserve(start_date: "2020-3-1", end_date: "2020-3-10") - it "add a new instance of Reservation to a correct Room's reservations array" do - expect(@reservation_desk.rooms[0].reservations.include? @reservation).must_equal true - expect(@reservation_desk.rooms[0].reservations.length).must_equal (@reservations_num + 1) + @request = @reservation_desk.make_reservation(start_date: "2020-3-4", end_date: "2020-3-15") + expect(@reservation_desk.rooms[2].reservations.length).must_equal 1 + expect(@reservation_desk.rooms[2].available?(start_date: "2020-3-1", end_date: "2020-3-5")).must_equal false end - end - describe "make_reservation" do - it "makes a new reservation and add it into the Room's reservations array" do - room_id = 1 - start_date = "2020-4-1" - end_date = "2020-4-5" - reservation = @reservation_desk.new_reservation(room_id: room_id, start_date: start_date, end_date: end_date) - @reservation_desk.add_reservation(reservation) - - @reservation_desk.make_reservation(start_date: "2020-4-2", end_date: "2020-5-2") - expect(@reservation_desk.rooms[1].reservations.length).must_equal 1 - - @reservation_desk.make_reservation(start_date: "2020-4-20", end_date: "2020-5-1") - expect(@reservation_desk.rooms[0].reservations.length).must_equal 2 - end - - it "raises an Exception if no rooms are available for requested dates" do - 20.times do |i| - reservation = @reservation_desk.new_reservation(room_id: (i + 1), start_date: "2020-6-1", end_date: "2020-6-30") - @reservation_desk.add_reservation(reservation) + it "No ID provided: raises an Exception if no rooms are available for requested dates" do + 20.times do + @reservation_desk.make_reservation(start_date: "2020-6-1", end_date: "2020-6-30") end - expect {@reservation_desk.make_reservation(start_date: "2020-6-12", end_date: "2020-6-15")}.must_raise StandardError + expect { + @reservation_desk.make_reservation(start_date: "2020-6-1", end_date: "2020-6-30") + }.must_raise StandardError end end end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index f936a266e..5aa8276ad 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -14,5 +14,45 @@ expect(@room.id).must_equal 1 end + it "starts with an empty array for reservations" do + expect(@room.reservations).must_be_kind_of Array + expect(@room.reservations.empty?).must_equal true + end + end + + describe "available?" do + before do + @room = Hotel::Room.new(1) + @room.reserve(start_date: "2020-3-1", end_date: "2020-3-10") + end + + it "returns true if the room is available for requested dates" do + expect(@room.available?(start_date: "2020-3-22", end_date: "2020-3-25")).must_equal true + end + + it "returns false if the room is unavailable for requested dates" do + expect(@room.available?(start_date: "2020-3-2", end_date: "2020-3-5")).must_equal false + end end + + describe "reserve" do + it "creates a new reservation and add it to the Room's reservations array" do + @room = Hotel::Room.new(10) + @room.reserve(start_date: "2020-3-1", end_date: "2020-3-10") + expect(@room.reservations.length).must_equal 1 + expect(@room.reservations[0]).must_be_kind_of Hotel::Reservation + expect(@room.reservations[0].room_id).must_equal 10 + end + end + + # # PRIVATE METHODS + # describe "new_reservation" do + # it "creates a new reservation" do + # room = Hotel::Room.new(5) + # result = room.new_reservation(room_id: room.id, start_date: "2020-3-1", end_date: "2020-3-10") + # expect(result).must_be_kind_of Hotel:: Reservation + # expect(result.room_id).must_equal 5 + # end + # end + # end end \ No newline at end of file From f8e561b8d89133fac5fe5c54637e8e2fb627fbe0 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Fri, 6 Mar 2020 21:20:31 -0800 Subject: [PATCH 26/35] Fixed tests for ReservationDesk#find_reservations. --- test/reservation_desk_test.rb | 66 +++++++---------------------------- 1 file changed, 13 insertions(+), 53 deletions(-) diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 45f93b78d..d327912f5 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -52,13 +52,11 @@ describe "find_reservations" do before do - @reservation_1 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-5") - @reservation_2 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-10", end_date: "2020-3-15") - @reservation_3 = @reservation_desk.new_reservation(room_id: 1, start_date: "2020-3-20", end_date: "2020-3-25") + @reservation_desk.rooms[0].reserve(start_date: "2020-3-1", end_date: "2020-3-5") + @reservation_desk.rooms[1].reserve(start_date: "2020-3-1", end_date: "2020-3-10") + @reservation_desk.rooms[2].reserve(start_date: "2020-3-1", end_date: "2020-3-25") + @reservation_desk.rooms[0].reserve(start_date: "2020-3-10", end_date: "2020-3-15") - @reservation_desk.add_reservation(@reservation_1) - @reservation_desk.add_reservation(@reservation_2) - @reservation_desk.add_reservation(@reservation_3) end it "returns an array" do @@ -71,17 +69,11 @@ expect(result[0]).must_be_kind_of Hotel::Reservation end - it "Returns nil if room ID doesn't exist" do + it "ID provided: returns nil if room ID doesn't exist" do assert_nil @reservation_desk.find_reservations(room_id: 100000, start_date: "2020-3-1", end_date: "2020-3-17") end - it "returns reservations for a specific room if room ID is provided" do - result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-30") - expect(result[0].room_id).must_equal 1 - expect(result[2].room_id).must_equal 1 - end - - it "returns reservations for specific dates for a specific room" do + it "ID provided: returns reservations for requested dates" do result_1 = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-17") expect(result_1.length).must_equal 2 result_2 = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1", end_date: "2020-3-10") @@ -92,52 +84,20 @@ expect(result_4.length).must_equal 1 end - it "returns reservations for specific dates for all rooms" do - reservation_4 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-1", end_date: "2020-3-5") - reservation_5 = @reservation_desk.new_reservation(room_id: 2, start_date: "2020-3-10", end_date: "2020-3-15") - reservation_6 = @reservation_desk.new_reservation(room_id: 19, start_date: "2020-3-20", end_date: "2020-3-25") - reservation_7 = @reservation_desk.new_reservation(room_id: 19, start_date: "2020-5-20", end_date: "2020-5-25") - - @reservation_desk.add_reservation(reservation_4) - @reservation_desk.add_reservation(reservation_5) - @reservation_desk.add_reservation(reservation_6) - @reservation_desk.add_reservation(reservation_7) + it "No ID provided: returns reservations for specific dates for all rooms" do + @reservation_desk.rooms[3].reserve(start_date: "2020-3-1", end_date: "2020-3-5") + @reservation_desk.rooms[4].reserve(start_date: "2020-3-10", end_date: "2020-3-15") + @reservation_desk.rooms[5].reserve(start_date: "2020-3-20", end_date: "2020-3-25") + @reservation_desk.rooms[6].reserve(start_date: "2020-5-20", end_date: "2020-5-25") result = @reservation_desk.find_reservations(start_date: "2020-3-1", end_date: "2020-3-30") - expect(result.length).must_equal 6 - + expect(result.length).must_equal 7 end - it "returns empty array if there are no reservations for the room/dates" do + it "No ID provided: returns empty array if there are no reservations for the room/dates" do result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-4-1", end_date: "2020-4-17") expect(result.length).must_equal 0 end - - - - # TODO: - - # it "Returns nil if room ID doesn't exist" do - # assert_nil @reservation_desk.find_reservations(room_id: 100000, start_date: "2020-3-1", end_date: "2020-3-17") - # end - - # it "if end_date is nil, returns all reservations from the start date onward" do - # #TODO: wording - # result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-3-1") - # expect(result.length).must_equal 3 - # end - - # it "if start_date is nil, returns all reservations until the end date" do - # result_1 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-17") - # expect(result_1.length).must_equal 2 - # result_2 = @reservation_desk.find_reservations(room_id: 1, end_date: "2020-3-10") - # expect(result_2.length).must_equal 1 - # end - - # it "if both start and end dates are nill, returns all reservations" do - # result = @reservation_desk.find_reservations(room_id: 1) - # expect(result.length).must_equal 3 - # end end describe "find_available_rooms" do From ad9577315c53a90b87ca154509e9e8cf70ded09e Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Fri, 6 Mar 2020 21:35:46 -0800 Subject: [PATCH 27/35] Added Room#select_reservations. --- lib/reservation_desk.rb | 8 +++----- lib/room.rb | 6 +++++- test/room_test.rb | 28 ++++++++++++++++++---------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 0ef4bff47..a0bb6a859 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -18,13 +18,11 @@ def find_reservations(room_id: nil , start_date: , end_date: ) if room_id room = rooms.find { |room| room.id == room_id} return nil if room == nil - reservations = room.reservations.select { |reservation| - reservation.date_range.overlap? (date_range) } + reservations = room.select_reservations(date_range) else reservations = [] rooms.each do |room| - room_reservations = room.reservations.select { |reservation| - reservation.date_range.overlap? (date_range) } + room_reservations = room.select_reservations(date_range) reservations += room_reservations end end @@ -33,7 +31,7 @@ def find_reservations(room_id: nil , start_date: , end_date: ) end def find_available_rooms(start_date:, end_date:) - #TODO: efficient date checking, rename to find_available_rooms, date range? + #TODO: efficient date checking available_rooms = [] rooms.each do |room| available_rooms << room if room.available?(start_date: start_date, end_date: end_date) diff --git a/lib/room.rb b/lib/room.rb index a2fc4005a..9d57aef51 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -26,6 +26,10 @@ def reserve(start_date:, end_date:) add_reservation(reservation) end + def select_reservations(date_range) + reservations.select { |reservation| reservation.date_range.overlap? (date_range)} + end + private def new_reservation(start_date:, end_date:) reservation = Reservation.new(room_id: id, start_date: start_date, end_date: end_date) @@ -33,6 +37,6 @@ def new_reservation(start_date:, end_date:) def add_reservation(reservation) reservations << reservation - end + end end end diff --git a/test/room_test.rb b/test/room_test.rb index 5aa8276ad..f6576b81b 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -45,14 +45,22 @@ end end - # # PRIVATE METHODS - # describe "new_reservation" do - # it "creates a new reservation" do - # room = Hotel::Room.new(5) - # result = room.new_reservation(room_id: room.id, start_date: "2020-3-1", end_date: "2020-3-10") - # expect(result).must_be_kind_of Hotel:: Reservation - # expect(result.room_id).must_equal 5 - # end - # end - # end + describe "select_reservations" do + before do + @room = Hotel::Room.new(10) + @room.reserve(start_date: "2020-3-1", end_date: "2020-3-10") + @room.reserve(start_date: "2020-3-12", end_date: "2020-3-13") + @room.reserve(start_date: "2020-3-15", end_date: "2020-3-20") + + end + it "returnes reservations which match requested date range" do + date_range = Hotel::DateRange.new(start_date: "2020-3-1", end_date: "2020-3-25") + expect(@room.select_reservations(date_range).length).must_equal 3 + end + + it "returns empty array if no reservations were made for requested dates" do + date_range = Hotel::DateRange.new(start_date: "2020-4-1", end_date: "2020-4-25") + expect(@room.select_reservations(date_range).empty?).must_equal true + end + end end \ No newline at end of file From 1bd279cf4f6e0a9caef7ca02d74a9464e600c3e2 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Fri, 6 Mar 2020 22:24:00 -0800 Subject: [PATCH 28/35] Added ReservationDesk#make_block and Room#add_block_participation. --- lib/reservation_desk.rb | 19 ++++++++++++++-- lib/room.rb | 18 +++++++++++---- test/reservation_desk_test.rb | 43 +++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 6 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index a0bb6a859..94142dd85 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -1,11 +1,12 @@ module Hotel class ReservationDesk # Responcibility: to organize reservations across hotel - attr_reader :room_num, :rooms, :reservations + attr_reader :room_num, :rooms, :reservations, :blocks def initialize(room_num: 20) @room_num = room_num @rooms = make_rooms + @blocks = {} end def find_room_by_id(id) @@ -50,7 +51,17 @@ def make_reservation(room_id: nil, start_date:, end_date:) room.reserve(start_date: start_date, end_date: end_date) end - def make_block(start_date:, end_date:, rooms:) + def make_block(room_ids: nil, start_date:, end_date:) + #TODO: nil scenario + raise ArgumentError.new("Blocks can't contain more than 5 rooms.") if room_ids.length > 5 + block_id = generate_block_id + blocks[block_id] = [] + room_ids.each do |id| + room = find_room_by_id(id) + raise ArgumentError.new("Invalid room ID.") if room == nil + room.reserve(start_date: start_date, end_date: end_date, block: block_id) + blocks[block_id] << id + end end private @@ -61,6 +72,10 @@ def make_rooms end return rooms end + + def generate_block_id + blocks.length + 1 + end end end diff --git a/lib/room.rb b/lib/room.rb index 9d57aef51..a8d4af6dd 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,11 +1,12 @@ module Hotel class Room # Responcibility: to reserve individual rooms - attr_reader :id, :reservations + attr_reader :id, :reservations, :block_participation def initialize(id) @id = id @reservations = [] + @block_participation = [] end def available?(start_date:, end_date:) @@ -15,15 +16,20 @@ def available?(start_date:, end_date:) return false end end + block_participation.each do |block_reservation| + if block_reservation.date_range.overlap? (date_range) + return false + end + end return true end - def reserve(start_date:, end_date:) + def reserve(start_date:, end_date:, block: nil) unless available?(start_date: start_date, end_date: end_date) - raise StandardError.new("Room is unavailabe for requested dates.") + raise StandardError.new("Room #{id} is unavailabe for requested dates.") end reservation = new_reservation(start_date: start_date, end_date: end_date) - add_reservation(reservation) + block ? add_block_participation(reservation) : add_reservation(reservation) end def select_reservations(date_range) @@ -38,5 +44,9 @@ def new_reservation(start_date:, end_date:) def add_reservation(reservation) reservations << reservation end + + def add_block_participation(reservation) + block_participation << reservation + end end end diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index d327912f5..a05554e8e 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -163,4 +163,47 @@ }.must_raise StandardError end end + + describe "make block" do + it "Room IDs provided: it creates Reservations and adds them to requested rooms' block_participation array" do + @reservation_desk.make_block(room_ids: [1, 2, 3], start_date: "2020-9-1", end_date: "2020-9-10") + expect(@reservation_desk.rooms[0].block_participation.length).must_equal 1 + expect(@reservation_desk.rooms[1].block_participation.length).must_equal 1 + expect(@reservation_desk.rooms[2].block_participation.length).must_equal 1 + expect(@reservation_desk.rooms[3].block_participation.length).must_equal 0 + end + + it "Rooms IDs provided: it adds block information to the block hash" do + @reservation_desk.make_block(room_ids: [1, 2, 3], start_date: "2020-9-1", end_date: "2020-9-10") + expect(@reservation_desk.blocks.length).must_equal 1 + expect(@reservation_desk.blocks[1].length).must_equal 3 + expect(@reservation_desk.blocks[1]).must_equal [1, 2, 3] + end + + it "Rooms IDs provided: raises an ArgumentError if any of IDs are invalid" do + expect { + @reservation_desk.make_block(room_ids: [1, 2, "love"], start_date: "2020-9-1", end_date: "2020-9-10") + }.must_raise ArgumentError + end + + it "Rooms IDs provided: raises ArgumentError if the room_ids array includes more then 5 rooms" do + expect { + @reservation_desk.make_block(room_ids: [1, 2, 3, 4, 5, 6], start_date: "2020-9-1", end_date: "2020-9-10") + }.must_raise ArgumentError + end + + it "Rooms IDs provided: it raises an Exception if any of the rooms are unavailable on requested dates" do + @reservation_desk.make_reservation(start_date: "2020-10-1", end_date: "2020-10-5") + + expect { + @reservation_desk.make_block(room_ids: [4, 5, 6, 7, 1], start_date: "2020-10-2", end_date: "2020-10-16") + }.must_raise StandardError + + @reservation_desk.make_block(room_ids: [1, 2, 3], start_date: "2020-9-1", end_date: "2020-9-10") + + expect { + @reservation_desk.make_block(room_ids: [4, 5, 6, 7, 1], start_date: "2020-9-2", end_date: "2020-9-5") + }.must_raise StandardError + end + end end \ No newline at end of file From ca06712ba89f8537ce78fefcaa0c39961819ff9f Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Sat, 7 Mar 2020 14:53:19 -0800 Subject: [PATCH 29/35] Added functionality to specify rate when making reservation/block. --- lib/reservation.rb | 14 ++++++++++---- lib/reservation_desk.rb | 12 +++++++----- lib/room.rb | 11 +++++++---- test/reservation_desk_test.rb | 24 +++++++++++++++++++++++ test/reservation_test.rb | 36 ++++++++++++++++++++++++++++++++++- test/room_test.rb | 17 ++++++++++++++++- 6 files changed, 99 insertions(+), 15 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 5834abcb9..c3272df92 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,15 +2,21 @@ module Hotel class Reservation - attr_reader :date_range, :room_id + attr_reader :date_range, :room_id, :rate + + def initialize(room_id: , start_date:, end_date:, rate: :default) + unless (rate == :default || rate.respond_to?(:>) && rate >= 0) + raise ArgumentError.new("Invalid rate.") + end - def initialize(room_id: , start_date:, end_date:) @date_range = DateRange.new(start_date: start_date, end_date: end_date) @room_id = room_id + @rate = (rate == :default) ? 200 : rate end def cost - date_range.nights * 200 + date_range.nights * rate end end -end \ No newline at end of file +end + diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 94142dd85..a74fd535e 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -40,7 +40,7 @@ def find_available_rooms(start_date:, end_date:) return available_rooms.empty? ? nil : available_rooms end - def make_reservation(room_id: nil, start_date:, end_date:) + def make_reservation(room_id: nil, start_date:, end_date:, rate: :default) if room_id room = find_room_by_id(room_id) raise ArgumentError.new("Invalid room ID.") if room == nil @@ -48,22 +48,23 @@ def make_reservation(room_id: nil, start_date:, end_date:) room = find_available_rooms(start_date: start_date, end_date: end_date)[0] raise StandardError.new("No rooms available for these dates.") if room == nil end - room.reserve(start_date: start_date, end_date: end_date) + room.reserve(start_date: start_date, end_date: end_date, rate: rate) end - def make_block(room_ids: nil, start_date:, end_date:) + def make_block(room_ids: nil, start_date:, end_date:, rate: :default) #TODO: nil scenario raise ArgumentError.new("Blocks can't contain more than 5 rooms.") if room_ids.length > 5 + block_id = generate_block_id blocks[block_id] = [] room_ids.each do |id| room = find_room_by_id(id) raise ArgumentError.new("Invalid room ID.") if room == nil - room.reserve(start_date: start_date, end_date: end_date, block: block_id) + room.reserve(start_date: start_date, end_date: end_date, block: block_id, rate: rate) blocks[block_id] << id end end - + private def make_rooms rooms = [] @@ -92,6 +93,7 @@ def generate_block_id + # def new_reservation(room_id: nil, start_date: , end_date: ) # unless room_id == nil || rooms.find {|room| room.id == room_id} # raise ArgumentError.new("Invalid room ID.") diff --git a/lib/room.rb b/lib/room.rb index a8d4af6dd..f8a999b5e 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,4 +1,5 @@ module Hotel + class Room # Responcibility: to reserve individual rooms attr_reader :id, :reservations, :block_participation @@ -24,11 +25,12 @@ def available?(start_date:, end_date:) return true end - def reserve(start_date:, end_date:, block: nil) + + def reserve(start_date:, end_date:, block: nil, rate: :default) unless available?(start_date: start_date, end_date: end_date) raise StandardError.new("Room #{id} is unavailabe for requested dates.") end - reservation = new_reservation(start_date: start_date, end_date: end_date) + reservation = new_reservation(start_date: start_date, end_date: end_date, rate: rate) block ? add_block_participation(reservation) : add_reservation(reservation) end @@ -37,14 +39,15 @@ def select_reservations(date_range) end private - def new_reservation(start_date:, end_date:) - reservation = Reservation.new(room_id: id, start_date: start_date, end_date: end_date) + def new_reservation(start_date:, end_date:, rate: :default) + reservation = Reservation.new(room_id: id, start_date: start_date, end_date: end_date, rate: rate) end def add_reservation(reservation) reservations << reservation end + def add_block_participation(reservation) block_participation << reservation end diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index a05554e8e..be28a20c6 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -162,6 +162,18 @@ @reservation_desk.make_reservation(start_date: "2020-6-1", end_date: "2020-6-30") }.must_raise StandardError end + + it "reserves a room at a default rate if no other specified" do + @reservation_desk.make_reservation(room_id: 1, start_date: "2020-5-5", end_date: "2020-5-7") + rate = @reservation_desk.rooms[0].reservations[0].rate + expect(rate).must_equal 200 + end + + it "reserves a room at a specified rate" do + @reservation_desk.make_reservation(room_id: 1, start_date: "2020-5-5", end_date: "2020-5-7", rate: 310.05) + rate = @reservation_desk.rooms[0].reservations[0].rate + expect(rate).must_equal 310.05 + end end describe "make block" do @@ -205,5 +217,17 @@ @reservation_desk.make_block(room_ids: [4, 5, 6, 7, 1], start_date: "2020-9-2", end_date: "2020-9-5") }.must_raise StandardError end + + it "creates reservations with default rate if no discount specified" do + @reservation_desk.make_block(room_ids: [1, 2, 3], start_date: "2020-9-1", end_date: "2020-9-10") + rate = @reservation_desk.rooms[0].block_participation[0].rate + expect(rate).must_equal 200 + end + + it "creates reservations with a different rate if specified" do + @reservation_desk.make_block(room_ids: [1, 2, 3], start_date: "2020-9-1", end_date: "2020-9-10", rate: 150) + rate = @reservation_desk.rooms[0].block_participation[0].rate + expect(rate).must_equal 150 + end end end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index e819a867b..8924e2906 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -16,6 +16,32 @@ it "has date_range variable which holds an instance of DateRange" do expect(@reservation.date_range).must_be_kind_of Hotel::DateRange end + + it "has a rate of 200 if no argument provided" do + expect(@reservation.rate).must_equal 200 + end + + it "can be instantiated with a different rate" do + reservation = Hotel::Reservation.new(room_id: 2, start_date: "2020-5-1", end_date: "2020-5-6", rate: 210) + expect(reservation.rate).must_equal 210 + end + + it "zero rate is fine" do + reservation = Hotel::Reservation.new(room_id: 2, start_date: "2020-5-1", end_date: "2020-5-6", rate: 0) + expect(reservation.rate).must_equal 0 + end + + it "raises an Argument error if rate provided is invalid (not a number)" do + expect { + reservation = Hotel::Reservation.new(room_id: 2, start_date: "2020-5-1", end_date: "2020-5-6", rate: "Cody") + }.must_raise ArgumentError + end + + it "raises an Argument error if rate provided is smaller than 0" do + expect { + reservation = Hotel::Reservation.new(room_id: 2, start_date: "2020-5-1", end_date: "2020-5-6", rate: -1) + }.must_raise ArgumentError + end end describe "cost" do @@ -23,8 +49,16 @@ expect(@reservation.cost).must_be_kind_of Integer end - it "calculates cost as $200/night" do + it "calculates cost at Reservation's rate" do expect(@reservation.cost).must_equal 800 + + room_id = 1 + start_date = "2020-5-1" + end_date = "2020-5-5" + rate = 180 + reservation = Hotel::Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date, rate: rate) + expect(reservation.cost).must_equal 720 end + end end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index f6576b81b..b47a29820 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -43,6 +43,20 @@ expect(@room.reservations[0]).must_be_kind_of Hotel::Reservation expect(@room.reservations[0].room_id).must_equal 10 end + + it "reserves a room at default rate if no other specified" do + room = Hotel::Room.new(10) + room.reserve(start_date: "2020-3-1", end_date: "2020-3-10") + rate = room.reservations[0].rate + expect(rate).must_equal 200 + end + + it "reserves room at a specified rate" do + room = Hotel::Room.new(10) + room.reserve(start_date: "2020-3-1", end_date: "2020-3-10", rate: 339.99) + rate = room.reservations[0].rate + expect(rate).must_equal 339.99 + end end describe "select_reservations" do @@ -63,4 +77,5 @@ expect(@room.select_reservations(date_range).empty?).must_equal true end end -end \ No newline at end of file +end + From ee4a5adcaf79bd7a161bb3ead2f4a14a913b4275 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Sun, 8 Mar 2020 15:01:04 -0700 Subject: [PATCH 30/35] Added helper methods Room#reserved? and Room#in_block?. --- lib/room.rb | 21 +++++++++++++++------ test/room_test.rb | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/lib/room.rb b/lib/room.rb index f8a999b5e..48bf59e4f 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -10,22 +10,32 @@ def initialize(id) @block_participation = [] end - def available?(start_date:, end_date:) + # available? helper method + def reserved?(start_date:, end_date:) date_range = DateRange.new(start_date: start_date, end_date: end_date) reservations.each do |reservation| if reservation.date_range.overlap? (date_range) - return false + return true end end + return false + end + + # available? helper method + def in_block?(start_date:, end_date:) + date_range = DateRange.new(start_date: start_date, end_date: end_date) block_participation.each do |block_reservation| if block_reservation.date_range.overlap? (date_range) - return false + return true end end - return true + return false + end + + def available?(start_date:, end_date:) + (reserved?(start_date: start_date, end_date: end_date) || in_block?(start_date: start_date, end_date: end_date)) ? false : true end - def reserve(start_date:, end_date:, block: nil, rate: :default) unless available?(start_date: start_date, end_date: end_date) raise StandardError.new("Room #{id} is unavailabe for requested dates.") @@ -47,7 +57,6 @@ def add_reservation(reservation) reservations << reservation end - def add_block_participation(reservation) block_participation << reservation end diff --git a/test/room_test.rb b/test/room_test.rb index b47a29820..8643ddb02 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -18,6 +18,41 @@ expect(@room.reservations).must_be_kind_of Array expect(@room.reservations.empty?).must_equal true end + + it "starts with an empty array for block participation" do + expect(@room.block_participation).must_be_kind_of Array + expect(@room.block_participation.empty?).must_equal true + end + end + + describe "reserved?" do + before do + @room = Hotel::Room.new(1) + @room.reserve(start_date: "2020-3-1", end_date: "2020-3-10") + end + + it "returns true if the room is reserved for requested dates" do + expect(@room.reserved?(start_date: "2020-3-2", end_date: "2020-3-25")).must_equal true + end + + it "returns false if the room is not reserved for requested dates" do + expect(@room.reserved?(start_date: "2020-3-22", end_date: "2020-3-25")).must_equal false + end + end + + describe "in_block?" do + before do + @room = Hotel::Room.new(1) + @room.reserve(start_date: "2020-3-1", end_date: "2020-3-10", block: 2) + end + + it "returns true if the room is in a block for requested dates" do + expect(@room.in_block?(start_date: "2020-3-2", end_date: "2020-3-25")).must_equal true + end + + it "returns false if the room is not in a block for requested dates" do + expect(@room.in_block?(start_date: "2020-3-22", end_date: "2020-3-25")).must_equal false + end end describe "available?" do From cb44c5fc22c43ffcf5de50c28704a679384c0c34 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Sun, 8 Mar 2020 17:01:11 -0700 Subject: [PATCH 31/35] Added ReservationDesk#reserve_from_block. --- lib/reservation_desk.rb | 40 +++++++++++++++++++++++-- test/reservation_desk_test.rb | 55 +++++++++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 6 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index a74fd535e..69aef7976 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -53,18 +53,52 @@ def make_reservation(room_id: nil, start_date:, end_date:, rate: :default) def make_block(room_ids: nil, start_date:, end_date:, rate: :default) #TODO: nil scenario + #TODO: no rooms given? raise ArgumentError.new("Blocks can't contain more than 5 rooms.") if room_ids.length > 5 block_id = generate_block_id - blocks[block_id] = [] + blocks[block_id] = {} + blocks[block_id][:date_range] = [start_date, end_date] + blocks[block_id][:rooms] = [] room_ids.each do |id| room = find_room_by_id(id) raise ArgumentError.new("Invalid room ID.") if room == nil room.reserve(start_date: start_date, end_date: end_date, block: block_id, rate: rate) - blocks[block_id] << id + blocks[block_id][:rooms] << room end end - + + def reserve_from_block(room_id: , block_id: ) + #TODO: block_id validation + blocks[block_id][:rooms].each do |room| + if room.id == room_id + start_date = blocks[block_id][:date_range][0] + end_date = blocks[block_id][:date_range][1] + unless room.reserved?(start_date: start_date, end_date: end_date) + room.block_participation.each do |block_part| + if block_part.date_range.start_date == Date.parse(start_date) + room.reservations << block_part + return true + end + end + end + raise StandardError.new("This room has already been reserved.") + end + end + raise ArgumentError.new("Invalid room ID.") + end + + # def check_block_availability(block_id) + # available_rooms = [] + # start_date = blocks[block_id][:date_range][0] + # end_date = blocks[block_id][:date_range][1] + # blocks[block_id][:rooms].each do |room| + # available_rooms << room unless room.reserved?(start_date: start_date, end_date: end_date) + # end + # return available_rooms + # end + + private def make_rooms rooms = [] diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index be28a20c6..51df5c129 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -176,7 +176,7 @@ end end - describe "make block" do + describe "make_block" do it "Room IDs provided: it creates Reservations and adds them to requested rooms' block_participation array" do @reservation_desk.make_block(room_ids: [1, 2, 3], start_date: "2020-9-1", end_date: "2020-9-10") expect(@reservation_desk.rooms[0].block_participation.length).must_equal 1 @@ -188,8 +188,8 @@ it "Rooms IDs provided: it adds block information to the block hash" do @reservation_desk.make_block(room_ids: [1, 2, 3], start_date: "2020-9-1", end_date: "2020-9-10") expect(@reservation_desk.blocks.length).must_equal 1 - expect(@reservation_desk.blocks[1].length).must_equal 3 - expect(@reservation_desk.blocks[1]).must_equal [1, 2, 3] + expect(@reservation_desk.blocks[1][:rooms].length).must_equal 3 + expect(@reservation_desk.blocks[1][:rooms][0]).must_be_kind_of Hotel::Room end it "Rooms IDs provided: raises an ArgumentError if any of IDs are invalid" do @@ -230,4 +230,53 @@ expect(rate).must_equal 150 end end + + describe "reserve_from_block" do + before do + @reservation_desk.make_block(room_ids: [1, 2, 3, 4], start_date: "2020-9-1", end_date: "2020-9-10") + @reservation = @reservation_desk.reserve_from_block(room_id: 2, block_id: 1) + end + it "returns true if reservation was successful" do + expect(@reservation).must_equal true + end + + it "raises ArgumentError if room ID was not valid or wasn't part of the block" do + expect { + @reservation_desk.reserve_from_block(room_id: 6, block_id: 1) + }.must_raise ArgumentError + end + + it "raises StandardError if the room has already been reserved" do + expect { + @reservation_desk.reserve_from_block(room_id: 2, block_id: 1) + }.must_raise StandardError + end + + it "adds the original block reservation for the room to reservations array" do + expect(@reservation_desk.rooms[0].reservations.length).must_equal 0 + @reservation_desk.reserve_from_block(room_id: 1, block_id: 1) + expect(@reservation_desk.rooms[0].reservations.length).must_equal 1 + end + end + + describe "check_block_availability" do + before do + @reservation_desk.make_block(room_ids: [1, 2, 3, 4, 5], start_date: "2020-9-1", end_date: "2020-9-10") + # @reservation_desk.make_reservation() + end + + it "returns an Array" do + expect(@reservation_desk.check_block_availability(1)).must_be_kind_of Array + end + + it "returns an array of unreserved rooms in requested block" do + + end + + it "returns empty array if no rooms are available" do + end + + it "throws an ArgumentError if there is no block with a given ID" do + end + end end \ No newline at end of file From afdbe86efd20fd7d6630f20f158e949cd33717c5 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Sun, 8 Mar 2020 20:29:25 -0700 Subject: [PATCH 32/35] Added ReservationDesk#check_block_availability. --- lib/reservation_desk.rb | 21 +++++++++++---------- test/reservation_desk_test.rb | 23 +++++++++++++++++++++-- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index 69aef7976..ba74eeb6e 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -70,6 +70,7 @@ def make_block(room_ids: nil, start_date:, end_date:, rate: :default) def reserve_from_block(room_id: , block_id: ) #TODO: block_id validation + raise ArgumentError.new("Invalid block ID.") unless blocks[block_id] blocks[block_id][:rooms].each do |room| if room.id == room_id start_date = blocks[block_id][:date_range][0] @@ -88,17 +89,17 @@ def reserve_from_block(room_id: , block_id: ) raise ArgumentError.new("Invalid room ID.") end - # def check_block_availability(block_id) - # available_rooms = [] - # start_date = blocks[block_id][:date_range][0] - # end_date = blocks[block_id][:date_range][1] - # blocks[block_id][:rooms].each do |room| - # available_rooms << room unless room.reserved?(start_date: start_date, end_date: end_date) - # end - # return available_rooms - # end + def check_block_availability(block_id) + raise ArgumentError.new("Invalid block ID.") unless blocks[block_id] + available_rooms = [] + start_date = blocks[block_id][:date_range][0] + end_date = blocks[block_id][:date_range][1] + blocks[block_id][:rooms].each do |room| + available_rooms << room unless room.reserved?(start_date: start_date, end_date: end_date) + end + return available_rooms + end - private def make_rooms rooms = [] diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index 51df5c129..c3f8fa798 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -236,6 +236,7 @@ @reservation_desk.make_block(room_ids: [1, 2, 3, 4], start_date: "2020-9-1", end_date: "2020-9-10") @reservation = @reservation_desk.reserve_from_block(room_id: 2, block_id: 1) end + it "returns true if reservation was successful" do expect(@reservation).must_equal true end @@ -246,6 +247,12 @@ }.must_raise ArgumentError end + it "raises ArgumentError if the block ID is invalid" do + expect { + @reservation_desk.reserve_from_block(room_id: 6, block_id: 1000) + }.must_raise ArgumentError + end + it "raises StandardError if the room has already been reserved" do expect { @reservation_desk.reserve_from_block(room_id: 2, block_id: 1) @@ -262,7 +269,7 @@ describe "check_block_availability" do before do @reservation_desk.make_block(room_ids: [1, 2, 3, 4, 5], start_date: "2020-9-1", end_date: "2020-9-10") - # @reservation_desk.make_reservation() + @reservation_desk.reserve_from_block(room_id: 3, block_id: 1) end it "returns an Array" do @@ -270,13 +277,25 @@ end it "returns an array of unreserved rooms in requested block" do - + expect(@reservation_desk.check_block_availability(1).length).must_equal 4 end it "returns empty array if no rooms are available" do + @reservation_desk.reserve_from_block(room_id: 1, block_id: 1) + @reservation_desk.reserve_from_block(room_id: 2, block_id: 1) + @reservation_desk.reserve_from_block(room_id: 4, block_id: 1) + @reservation_desk.reserve_from_block(room_id: 5, block_id: 1) + expect(@reservation_desk.check_block_availability(1).empty?).must_equal true end it "throws an ArgumentError if there is no block with a given ID" do + expect { + @reservation_desk.reserve_from_block(room_id: 1, block_id: 2) + }.must_raise ArgumentError + + expect { + @reservation_desk.reserve_from_block(room_id: 1, block_id: "Nataliya") + }.must_raise ArgumentError end end end \ No newline at end of file From 586eef560f742cfe5dc984b18b3b0f91f5dad310 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Sun, 8 Mar 2020 20:40:41 -0700 Subject: [PATCH 33/35] Added more tests. --- test/reservation_desk_test.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index c3f8fa798..b49f66b0a 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -94,6 +94,17 @@ expect(result.length).must_equal 7 end + it "takes into account reservertions from a block" do + @reservation_desk.make_block(room_ids:[7, 8, 9], start_date: "2020-3-4", end_date: "2020-3-8") + @reservation_desk.reserve_from_block(block_id: 1, room_id: 9) + + result = @reservation_desk.find_reservations(room_id: 9, start_date: "2020-3-1", end_date: "2020-3-30") + expect(result.length).must_equal 1 + + result_2 = @reservation_desk.find_reservations(start_date: "2020-3-1", end_date: "2020-3-30") + expect(result_2.length).must_equal 5 + end + it "No ID provided: returns empty array if there are no reservations for the room/dates" do result = @reservation_desk.find_reservations(room_id: 1, start_date: "2020-4-1", end_date: "2020-4-17") expect(result.length).must_equal 0 From 47056a5d4b9cde06b6aaa0b9dbf3913f5eeba110 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Sun, 8 Mar 2020 21:20:04 -0700 Subject: [PATCH 34/35] Cleaned up files, added TODOs. --- lib/date_range.rb | 48 ++------------- lib/reservation_desk.rb | 112 ++++++---------------------------- lib/room.rb | 6 +- test/reservation_desk_test.rb | 9 ++- test/reservation_test.rb | 1 - 5 files changed, 33 insertions(+), 143 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 05ab12bb0..bd78cbedf 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -2,60 +2,24 @@ module Hotel class DateRange attr_reader :start_date, :end_date - def initialize(start_date: , end_date: ) + def initialize(start_date:, end_date:) + #TODO: validate dates' input + #TODO: add defaults (for example, one year from/before Date.today) @start_date = Date.parse(start_date) @end_date = Date.parse(end_date) raise ArgumentError.new("End date cannot be equal to or come before start date.") if @end_date <= @start_date - #TODO: validate dates' input end - # def initialize(start_date: nil, end_date: nil) - # start_date == nil ? @start_date = start_date : @start_date = Date.parse(start_date) - # end_date == nil ? @end_date = end_date : @end_date = Date.parse(end_date) - - # if @end_date != nil && @start_date != nil && @end_date <= @start_date - # raise ArgumentError.new("End date cannot be equal to or come before start date.") - # end - # end - def overlap?(date_range) raise ArgumentError.new("Must provide a date range.") unless date_range.is_a? DateRange - # raise ArgumentError.new("Must provide start and end dates.") if (date_range.start_date == nil || date_range.end_date == nil) + + #TODO: efficient date checking (first compare years? months?) start_date < date_range.end_date && end_date > date_range.start_date end def nights (end_date - start_date).to_i end - end -end - -# if end_date == nil -# start_date = Date.parse(start_date) -# reservations = room.reservations.select { |reservation| -# start_date < reservation.end_date -# } -# elsif start_date == nil -# end_date = Date.parse(end_date) -# reservations = room.reservations.select { |reservation| -# end_date > reservation.start_date -# } -# else -# start_date = Date.parse(start_date) -# end_date = Date.parse(end_date) -# # date_range = (start_date..end_date) -# reservations = room.reservations.select { |reservation| -# start_date < reservation.end_date && end_date > reservation.start_date -# } -# end - -######## -# if start_date == nil -# end_date > date_range.start_date -# end - -# if start_date == nil && date_range.start_date == nil -# true -# end \ No newline at end of file +end \ No newline at end of file diff --git a/lib/reservation_desk.rb b/lib/reservation_desk.rb index ba74eeb6e..5c656118a 100644 --- a/lib/reservation_desk.rb +++ b/lib/reservation_desk.rb @@ -1,6 +1,6 @@ module Hotel class ReservationDesk - # Responcibility: to organize reservations across hotel + # Class responsibility: to organize reservations across hotel attr_reader :room_num, :rooms, :reservations, :blocks def initialize(room_num: 20) @@ -27,12 +27,10 @@ def find_reservations(room_id: nil , start_date: , end_date: ) reservations += room_reservations end end - return reservations end def find_available_rooms(start_date:, end_date:) - #TODO: efficient date checking available_rooms = [] rooms.each do |room| available_rooms << room if room.available?(start_date: start_date, end_date: end_date) @@ -51,15 +49,11 @@ def make_reservation(room_id: nil, start_date:, end_date:, rate: :default) room.reserve(start_date: start_date, end_date: end_date, rate: rate) end - def make_block(room_ids: nil, start_date:, end_date:, rate: :default) - #TODO: nil scenario - #TODO: no rooms given? - raise ArgumentError.new("Blocks can't contain more than 5 rooms.") if room_ids.length > 5 - - block_id = generate_block_id - blocks[block_id] = {} - blocks[block_id][:date_range] = [start_date, end_date] - blocks[block_id][:rooms] = [] + def make_block(room_ids:, start_date:, end_date:, rate: :default) + #TODO: add no rooms given scenario + raise ArgumentError.new("Blocks should contain 2-5 rooms.") if (room_ids.length > 5 || room_ids.length < 2) + + block_id = create_block(start_date: start_date, end_date: end_date) room_ids.each do |id| room = find_room_by_id(id) raise ArgumentError.new("Invalid room ID.") if room == nil @@ -69,8 +63,8 @@ def make_block(room_ids: nil, start_date:, end_date:, rate: :default) end def reserve_from_block(room_id: , block_id: ) - #TODO: block_id validation raise ArgumentError.new("Invalid block ID.") unless blocks[block_id] + blocks[block_id][:rooms].each do |room| if room.id == room_id start_date = blocks[block_id][:date_range][0] @@ -94,6 +88,7 @@ def check_block_availability(block_id) available_rooms = [] start_date = blocks[block_id][:date_range][0] end_date = blocks[block_id][:date_range][1] + blocks[block_id][:rooms].each do |room| available_rooms << room unless room.reserved?(start_date: start_date, end_date: end_date) end @@ -112,86 +107,13 @@ def make_rooms def generate_block_id blocks.length + 1 end - end -end - - - - - - - - - - - - - - -# def new_reservation(room_id: nil, start_date: , end_date: ) -# unless room_id == nil || rooms.find {|room| room.id == room_id} -# raise ArgumentError.new("Invalid room ID.") -# end -# #TODO: Check availability or possibly remove? - -# if room_id == nil -# room_id = find_available_rooms(start_date: start_date, end_date: end_date).first.id -# end -# Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date) -# end - -# # TODO: should be combined with new_reservation? Maybe a larger method to call both of them? -# def add_reservation(new_reservation) -# room = find_room_by_id(new_reservation.room_id) -# room.reservations << new_reservation -# end - - -# def find_reservations(room_id: nil , start_date: nil, end_date: nil) - # room = rooms.find { |room| room.id == room_id} - # return nil if room == nil - - # return room.reservations if (start_date == nil && end_date == nil) - - # if end_date == nil - # start_date = Date.parse(start_date) - # reservations = room.reservations.select { |reservation| - # start_date < reservation.end_date - # } - # elsif start_date == nil - # end_date = Date.parse(end_date) - # reservations = room.reservations.select { |reservation| - # end_date > reservation.start_date - # } - # else - # start_date = Date.parse(start_date) - # end_date = Date.parse(end_date) - # # date_range = (start_date..end_date) - # reservations = room.reservations.select { |reservation| - # start_date < reservation.end_date && end_date > reservation.start_date - # } - # end - # return reservations - - # #TODO: add date_range class and refactor - # end - - - # def find_available_room(start_date: , end_date:) - # #TODO: efficient date checking - - # date_range = DateRange.new(start_date: start_date, end_date: end_date) - - # rooms.each do |room| - # switch = 0 - # room.reservations.each do |reservation| - # if reservation.date_range.overlap?(date_range) - # switch = 1 - # break - # end - # end - # return room if switch == 0 - # end - # return nil - # end \ No newline at end of file + def create_block(start_date:, end_date:) + block_id = generate_block_id + blocks[block_id] = {} + blocks[block_id][:date_range] = [start_date, end_date] + blocks[block_id][:rooms] = [] + return block_id + end + end +end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb index 48bf59e4f..e220d0e0e 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,7 +1,7 @@ module Hotel class Room - # Responcibility: to reserve individual rooms + # Class responsibility: to reserve individual rooms attr_reader :id, :reservations, :block_participation def initialize(id) @@ -10,7 +10,7 @@ def initialize(id) @block_participation = [] end - # available? helper method + # available? helper method / public interface def reserved?(start_date:, end_date:) date_range = DateRange.new(start_date: start_date, end_date: end_date) reservations.each do |reservation| @@ -21,7 +21,7 @@ def reserved?(start_date:, end_date:) return false end - # available? helper method + # available? helper method / public interface def in_block?(start_date:, end_date:) date_range = DateRange.new(start_date: start_date, end_date: end_date) block_participation.each do |block_reservation| diff --git a/test/reservation_desk_test.rb b/test/reservation_desk_test.rb index b49f66b0a..34b25e8da 100644 --- a/test/reservation_desk_test.rb +++ b/test/reservation_desk_test.rb @@ -3,7 +3,6 @@ describe "ReservationDesk class" do before do @reservation_desk = Hotel::ReservationDesk.new() - #@reservation = Hotel::Reservation.new("2020-4-1", "2020-4-5") end describe "ReservationDesk instantiation" do @@ -209,7 +208,13 @@ }.must_raise ArgumentError end - it "Rooms IDs provided: raises ArgumentError if the room_ids array includes more then 5 rooms" do + it "Rooms IDs provided: raises ArgumentError if the room_ids array includes less than 2 rooms" do + expect { + @reservation_desk.make_block(room_ids: [1], start_date: "2020-9-1", end_date: "2020-9-10") + }.must_raise ArgumentError + end + + it "Rooms IDs provided: raises ArgumentError if the room_ids array includes more than 5 rooms" do expect { @reservation_desk.make_block(room_ids: [1, 2, 3, 4, 5, 6], start_date: "2020-9-1", end_date: "2020-9-10") }.must_raise ArgumentError diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 8924e2906..19ec211e1 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -59,6 +59,5 @@ reservation = Hotel::Reservation.new(room_id: room_id, start_date: start_date, end_date: end_date, rate: rate) expect(reservation.cost).must_equal 720 end - end end \ No newline at end of file From 3007f63b6813d09a474af6fd1dd9c2a546799e90 Mon Sep 17 00:00:00 2001 From: Nataliya Pogodina Date: Sun, 8 Mar 2020 21:36:57 -0700 Subject: [PATCH 35/35] Added refactors.txt. --- refactors.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 refactors.txt diff --git a/refactors.txt b/refactors.txt new file mode 100644 index 000000000..ea4cf9548 --- /dev/null +++ b/refactors.txt @@ -0,0 +1,17 @@ +1. Consider adding Block Class instead of hash structure in ReservationDesk +- ReservationDesk will have a blocks array of Block objects. +- ReservationDesk will have find_block_by_id method. +- Block object will have block_id, rooms (array of Room objects), date_range variables. +- Block object will have reserve_from_block and check_room_availability methods which will be called from inside current ReservationDesk methods. + +2. Add date input validation. + +3. Add defaults for start and end dates. +(gives functionality to select all reservations from/until specific date) + +4. Find a more efficient way to compare dates. +(sort and compare years/months first?..) + +5. Consider moving away from having start and end_date as arguments towards using date_range. + +6. Implement "no rooms given" scenario for make_block. \ No newline at end of file