diff --git a/.gitignore b/.gitignore index 5e1422c9c..54a0fc95a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ /test/tmp/ /test/version_tmp/ /tmp/ - +coverage # Used by dotenv library to load environment variables. # .env diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..deb52f2cd --- /dev/null +++ b/Rakefile @@ -0,0 +1,9 @@ +require 'rake/testtask' + +Rake::TestTask.new do |t| + t.libs = ["lib"] + t.warning = true + t.test_files = FileList['specs/*_spec.rb'] +end + +task default: :test diff --git a/lib/.keep b/lib/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/front_desk.rb b/lib/front_desk.rb new file mode 100644 index 000000000..6605a4f40 --- /dev/null +++ b/lib/front_desk.rb @@ -0,0 +1,77 @@ +require 'date' + +require_relative '../lib/reservation.rb' +require_relative '../lib/room.rb' + +module Hotel + class Front_desk + + attr_reader :total_rooms, :total_reservations + + ROOM_ID = (1..20) + + def initialize + # an array of rooms + @total_rooms = room_generator + @total_reservations = [] + end + + # list of all rooms + def room_generator + new_room = [] + count = 1 + ROOM_ID.each do |room| + new_room << Room.new(count) + count += 1 + end + return new_room + end + + def list_rooms + return @total_rooms + end + # list of all reservations + def list_reservations + return @total_reservations + end + + def available?(start_date, end_date) + available_rooms = [] + first_day = DateTime.parse(start_date) + last_day = DateTime.parse(end_date) + # (StartA <= EndB) and (EndA >= StartB) + + @total_reservations.each do |reserve| + if first_day <= (reserve.end_date - 1) && last_day >= reserve.start_date + open_room = reserve.room + @total_rooms.reject! { |room| room.room_id == open_room } + end + end + + @total_rooms.each do |room| + available_rooms << room.room_id + end + return available_rooms + end + + # to create a reservation + def add_room(start_date, end_date) + new_ticket = {} + new_ticket[:ticket_id] = 0 + available = available?(start_date, end_date) + + new_ticket[:room_id] = available[0] + + new_ticket[:start_date] = DateTime.parse(start_date) + new_ticket[:end_date] = DateTime.parse(end_date) + + reserved = Hotel::Reservation.new(new_ticket) + + @total_reservations << reserved + + return reserved + end + + + end +end diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..57bf7c761 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,33 @@ +require 'date' + + +module Hotel + class Reservation + + attr_reader :ticket_id, :start_date, :end_date, :room + + @@count = 1 + + def initialize(input) + + @ticket_id = @@count + @start_date = input[:start_date] + @end_date = input[:end_date] + @room = input[:room_id] + @@count += 1 + + if @end_date < @start_date + raise StandardError('Invalid Date Range') + end + + end + + + def total_cost + duration = end_date - start_date + return ((duration - 1) * 200) + end + + + end +end diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..4254070e5 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,14 @@ +require 'date' + +module Hotel + class Room + + attr_reader :room_id, :price, :reservations + + def initialize(room) + @room_id = room + @price = 200 + end + + end +end diff --git a/specs/.keep b/specs/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/specs/front_desk_spec.rb b/specs/front_desk_spec.rb new file mode 100644 index 000000000..5cfd6a5e1 --- /dev/null +++ b/specs/front_desk_spec.rb @@ -0,0 +1,73 @@ +require_relative 'spec_helper' +require 'pry' + +describe 'Front_desk' do + + describe 'Initialize' do + it 'creates a list of 20 rooms' do + admin = Hotel::Front_desk.new + admin.total_rooms.must_be_kind_of Array + admin.total_rooms.length.must_equal 20 + + admin.total_rooms.each do |room| + room.must_be_instance_of Hotel::Room + end + end + + it 'creates a list of reservations' do + admin = Hotel::Front_desk.new + admin.total_reservations.must_be_kind_of Array + + admin.total_reservations.each do |room| + room.must_be_instance_of Hotel::Reservation + end + end + end + + describe 'list of rooms' do + it 'returns a list of all rooms' do + admin = Hotel::Front_desk.new + admin.list_rooms.must_be_kind_of Array + admin.list_rooms[10].must_be_kind_of Hotel::Room + admin.list_rooms[0].must_be_kind_of Hotel::Room + admin.list_rooms[21].must_be_nil + end + end + + describe 'list of reservations' do + it 'can return a list of reservations' do + admin = Hotel::Front_desk.new + admin.add_room('3rd Feb 2020', '6th Feb 2020') + admin.total_reservations.must_be_kind_of Array + admin.total_reservations[0].must_be_instance_of Hotel::Reservation + admin.total_reservations[1].must_be_nil + end + end + + describe 'available?' do + it 'returns a list of available rooms within the given dates' do + + admin = Hotel::Front_desk.new + admin.add_room('4th Feb 2020', '6th Feb 2020') + admin.add_room('1st Feb 2020', '3rd Feb 2020') + admin.add_room('20th Mar 2020', '31st Mar 2020') + + available_rooms = admin.available?('1st Feb 2020', '5th Feb 2020') + + available_rooms.wont_include 1 + available_rooms.must_be_kind_of Array + end + end + + + describe 'Add Room' do + it 'can create a reservation' do + admin = Hotel::Front_desk.new + new_date = admin.add_room('3rd Feb 2020', '6th Feb 2020') + + admin.total_reservations.must_include new_date + new_date.must_be_kind_of Hotel::Reservation + end + end + +end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb new file mode 100644 index 000000000..8693ab079 --- /dev/null +++ b/specs/reservation_spec.rb @@ -0,0 +1,26 @@ +require_relative 'spec_helper' +require 'pry' + +describe 'Reservation class' do + + describe 'Initialize' do + it 'can create a new reservation' do + new_ticket = Hotel::Reservation.new({ start_date: DateTime.parse('3rd Feb 2020'), end_date: DateTime.parse('6th Feb 2020'), room_id: 1}) + + new_ticket.must_be_instance_of Hotel::Reservation + end + + it 'will raise an Error if date range is invalid' do + proc { Hotel::Reservation.new({ start_date: DateTime.parse('10th Feb 2020'), end_date: DateTime.parse('6th Feb 2020'), room_id: 1}) }.must_raise StandardError + end + end + + describe 'total cost' do + it 'can calculate the total cost of a reservation' do + new_ticket = Hotel::Reservation.new({ start_date: DateTime.parse('2nd Feb 2020'), end_date: DateTime.parse('6th Feb 2020'), room_id: 1}) + + new_ticket.total_cost.must_equal 600 + end + end + +end diff --git a/specs/room_spec.rb b/specs/room_spec.rb new file mode 100644 index 000000000..e616fd44f --- /dev/null +++ b/specs/room_spec.rb @@ -0,0 +1,13 @@ +require_relative 'spec_helper' + + +describe 'Room' do + describe 'Initialize' do + it 'can create a new room' do + new_room = Hotel::Room.new(21) + new_room.room_id.must_equal 21 + new_room.must_be_instance_of Hotel::Room + end + end + +end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb new file mode 100644 index 000000000..a71f96d5d --- /dev/null +++ b/specs/spec_helper.rb @@ -0,0 +1,14 @@ +require 'simplecov' +SimpleCov.start + +require 'time' +require 'minitest' +require 'minitest/autorun' +require 'minitest/reporters' + +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + +require_relative '../lib/front_desk' +require_relative '../lib/room' +require_relative '../lib/reservation' +# Add simplecov