diff --git a/lib/driver.rb b/lib/driver.rb new file mode 100644 index 000000000..048bbf22c --- /dev/null +++ b/lib/driver.rb @@ -0,0 +1,99 @@ +require_relative 'user' +require 'pry' + +module RideShare + class Driver < User + attr_reader :vin, :driven_trips, :status + + def initialize(input) + super + + @vin = input[:vin] + if @vin.length != 17 + raise ArgumentError.new("Invalid VIN") + else + @vin = input[:vin] + end + + @driven_trips = input[:driven_trips].nil? ? [] : input[:driven_trips] + + if input[:status] != :AVAILABLE && input[:status] != :UNAVAILABLE + @status = :UNAVAILABLE + else + @status = input[:status] + end + end + + def add_driven_trip(trip) + if trip.is_a? Trip + # binding.pry + @driven_trips << trip + # binding.pry + else + raise ArgumentError.new("Invalid trip instance") + end + end + + def average_rating + total_num_rides = @driven_trips.length + total_sum = 0 + + if total_num_rides == 0 + return 0 + end + + @driven_trips.each do |x| + # binding.pry + if x.rating == "In Progress" + next + else + total_sum += x.rating + end + end + + avg_rating = total_sum.to_f / total_num_rides + return avg_rating + + end + + + def total_revenue + total_cost_all_trips = 0 + total_num_rides = 0 + + # if total_num_rides == 0 + # return 0 + # end + + @driven_trips.each do |x| + if x.cost == "In Progress" + next + else + total_cost_all_trips += x.cost + total_num_rides += 1 + end + end + + all_fees = total_num_rides * 1.65 + driver_revenue = (total_cost_all_trips - all_fees) * 0.8 + driver_revenue_rounded = driver_revenue.round(2) + + return driver_revenue_rounded + end + + def net_expenditures + net_expenditures = super + difference = net_expenditures - total_revenue + # difference = super - total_revenue # can use super in place of above code. + return difference + end + + def change_availability + if @status == :AVAILABLE + @status = :UNAVAILABLE + else + @status = :AVAILABLE + end + end + end +end diff --git a/lib/trip.rb b/lib/trip.rb index 9d465726b..f8967d886 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -2,7 +2,7 @@ module RideShare class Trip - attr_reader :id, :passenger, :start_time, :end_time, :cost, :rating + attr_reader :id, :passenger, :start_time, :end_time, :cost, :rating, :driver def initialize(input) @id = input[:id] @@ -11,10 +11,20 @@ def initialize(input) @end_time = input[:end_time] @cost = input[:cost] @rating = input[:rating] + @driver = input[:driver] - if @rating > 5 || @rating < 1 + if @rating == nil + @rating = "In Progress" + @cost = "In Progress" + elsif @rating > 5 || @rating < 1 raise ArgumentError.new("Invalid rating #{@rating}") end + + if @end_time == nil + @end_time = "In Progress" + elsif @end_time < @start_time + raise ArgumentError, "End time is before start time" + end end def inspect @@ -22,5 +32,13 @@ def inspect "ID=#{id.inspect} " + "PassengerID=#{passenger&.id.inspect}>" end + + def duration + if @end_time == "In Progress" + return "In Progress" + else + return @end_time - @start_time + end + end end end diff --git a/lib/trip_dispatcher.rb b/lib/trip_dispatcher.rb index 6aaa04954..b950bbf5d 100644 --- a/lib/trip_dispatcher.rb +++ b/lib/trip_dispatcher.rb @@ -1,16 +1,20 @@ require 'csv' require 'time' +require 'pry' require_relative 'user' require_relative 'trip' +require_relative 'driver' module RideShare class TripDispatcher attr_reader :drivers, :passengers, :trips def initialize(user_file = 'support/users.csv', - trip_file = 'support/trips.csv') + trip_file = 'support/trips.csv', + driver_file = 'support/drivers.csv') @passengers = load_users(user_file) + @drivers = load_drivers(driver_file) @trips = load_trips(trip_file) end @@ -22,13 +26,30 @@ def load_users(filename) input_data[:id] = line[0].to_i input_data[:name] = line[1] input_data[:phone] = line[2] - users << User.new(input_data) end - return users end + def load_drivers(filename) + drivers = [] + + CSV.read(filename, headers: true).each do |line| + passenger = find_passenger(line[0].to_i) + input_data = {} + input_data[:id] = line[0].to_i + input_data[:vin] = line[1] + input_data[:status] = line[2].to_sym + input_data[:name] = passenger.name + input_data[:phone] = passenger.phone_number + driver = Driver.new(input_data) + passenger_index = @passengers.find_index(passenger) + @passengers[passenger_index] = driver + drivers << driver + end + return drivers + end + def load_trips(filename) trips = [] @@ -37,21 +58,31 @@ def load_trips(filename) trip_data.each do |raw_trip| passenger = find_passenger(raw_trip[:passenger_id].to_i) + driver = find_driver(raw_trip[:driver_id].to_i) + passenger_as_driver = find_driver(raw_trip[:passenger_id].to_i) + + + start_time = Time.parse(raw_trip[:start_time]) + end_time = Time.parse(raw_trip[:end_time]) parsed_trip = { id: raw_trip[:id].to_i, passenger: passenger, - start_time: raw_trip[:start_time], - end_time: raw_trip[:end_time], + start_time: start_time, + end_time: end_time, cost: raw_trip[:cost].to_f, - rating: raw_trip[:rating].to_i + rating: raw_trip[:rating].to_i, + driver: driver } trip = Trip.new(parsed_trip) passenger.add_trip(trip) + driver.add_driven_trip(trip) + if passenger_as_driver != nil + passenger_as_driver.add_trip(trip) + end trips << trip end - return trips end @@ -60,6 +91,11 @@ def find_passenger(id) return @passengers.find { |passenger| passenger.id == id } end + def find_driver(id) + check_id(id) + return @drivers.find { |driver| driver.id == id } + end + def inspect return "#<#{self.class.name}:0x#{self.object_id.to_s(16)} \ #{trips.count} trips, \ @@ -67,10 +103,65 @@ def inspect #{passengers.count} passengers>" end - private + # private def check_id(id) raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 end + + + + # Note: The user_id must correspond to a User instance + def request_trip(user_id) + # Finding the User instance + current_passenger = @passengers.find { |passenger| passenger.id == user_id } + + if current_passenger == nil + raise ArgumentError.new("There is no user instance with the id #{user_id}") + end + + + # Checking for available drivers that do not have the same id as the user requesting a ride + available_drivers = [] + @drivers.each do |x| + if x.status == :AVAILABLE && x.id != user_id.to_i + available_drivers << x + end + end + + # If there are available drivers, then create trip instance. + if available_drivers.length > 0 + # number_of_drivers = available_drivers.length + # random_driver = available_drivers[rand(0...number_of_drivers)] + # random_driver_id = random_driver.id + first_available_driver = available_drivers.first + + trip_info = { + id: @trips.length + 1, + passenger: current_passenger, + start_time: Time.now, + end_time: nil, + cost: nil, + rating: nil, + driver: first_available_driver + } + + trip = Trip.new(trip_info) + @trips << trip + + # Changing driver data + first_available_driver.add_driven_trip(trip) + first_available_driver.change_availability + + # Changing current passenger data + current_passenger.add_trip(trip) + + return trip + + else + return "No available drivers" + # return nil + end + end end end diff --git a/lib/user.rb b/lib/user.rb index b903fc247..959c6c52f 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -16,5 +16,30 @@ def initialize(input) def add_trip(trip) @trips << trip end + + + def net_expenditures + trip_cost_sum = 0 + @trips.each do |trip| + if trip.cost == "In Progress" + next + else + trip_cost_sum += trip.cost + end + end + return trip_cost_sum + end + + def total_time_spent + total_time_as_a_passenger = 0 + @trips.each do |trip| + if trip.duration == "In Progress" + next + else + total_time_as_a_passenger += trip.duration + end + end + return total_time_as_a_passenger + end end end diff --git a/specs/driver_spec.rb b/specs/driver_spec.rb index a50aecd48..e62986d2d 100644 --- a/specs/driver_spec.rb +++ b/specs/driver_spec.rb @@ -1,104 +1,179 @@ require_relative 'spec_helper' -xdescribe "Driver class" do +describe "Driver class" do + + describe "Driver instantiation" do + before do + @driver = RideShare::Driver.new(id: 54, name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ", + phone: '111-111-1111', + status: :AVAILABLE) + end - describe "Driver instantiation" do - before do - @driver = RideShare::Driver.new(id: 54, name: "Rogers Bartell IV", - vin: "1C9EVBRM0YBC564DZ", - phone: '111-111-1111', - status: :AVAILABLE) - end + it "is an instance of Driver" do + expect(@driver).must_be_kind_of RideShare::Driver + end - it "is an instance of Driver" do - expect(@driver).must_be_kind_of RideShare::Driver - end + it "throws an argument error with a bad ID value" do + expect{ RideShare::Driver.new(id: 0, name: "George", vin: "33133313331333133")}.must_raise ArgumentError + end - it "throws an argument error with a bad ID value" do - expect{ RideShare::Driver.new(id: 0, name: "George", vin: "33133313331333133")}.must_raise ArgumentError - end + it "throws an argument error with a bad VIN value" do + expect{ RideShare::Driver.new(id: 100, name: "George", vin: "")}.must_raise ArgumentError + expect{ RideShare::Driver.new(id: 100, name: "George", vin: "33133313331333133extranums")}.must_raise ArgumentError + end - it "throws an argument error with a bad VIN value" do - expect{ RideShare::Driver.new(id: 100, name: "George", vin: "")}.must_raise ArgumentError - expect{ RideShare::Driver.new(id: 100, name: "George", vin: "33133313331333133extranums")}.must_raise ArgumentError - end + it "sets driven trips to an empty array if not provided" do + expect(@driver.driven_trips).must_be_kind_of Array + expect(@driver.driven_trips.length).must_equal 0 + end + + it "is set up for specific attributes and data types" do + [:id, :name, :vin, :status, :driven_trips].each do |prop| + expect(@driver).must_respond_to prop + end - it "sets trips to an empty array if not provided" do - expect(@driver.trips).must_be_kind_of Array - expect(@driver.trips.length).must_equal 0 + expect(@driver.id).must_be_kind_of Integer + expect(@driver.name).must_be_kind_of String + expect(@driver.vin).must_be_kind_of String + expect(@driver.status).must_be_kind_of Symbol + end end - it "is set up for specific attributes and data types" do - [:id, :name, :vehicle_id, :status, :driven_trips].each do |prop| - expect(@driver).must_respond_to prop + describe "add_driven_trip method" do + before do + pass = RideShare::User.new(id: 1, name: "Ada", phone: "412-432-7640") + @driver = RideShare::Driver.new(id: 3, name: "Lovelace", vin: "12345678912345678") + @trip = RideShare::Trip.new(id: 8, driver: @driver, passenger: pass, start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2018-08-09"), rating: 5) end - expect(@driver.id).must_be_kind_of Integer - expect(@driver.name).must_be_kind_of String - expect(@driver.vehicle_id).must_be_kind_of String - expect(@driver.status).must_be_kind_of Symbol - end - end + it "throws an argument error if trip is not provided" do + expect{ @driver.add_driven_trip(1) }.must_raise ArgumentError + end - describe "add_driven_trip method" do - before do - pass = RideShare::User.new(id: 1, name: "Ada", phone: "412-432-7640") - @driver = RideShare::Driver.new(id: 3, name: "Lovelace", vin: "12345678912345678") - @trip = RideShare::Trip.new({id: 8, driver: @driver, passenger: pass, date: "2016-08-08", rating: 5}) + it "increases the trip count by one" do + previous = @driver.driven_trips.length + @driver.add_driven_trip(@trip) + expect(@driver.driven_trips.length).must_equal previous + 1 + end end - it "throws an argument error if trip is not provided" do - expect{ @driver.add_trip(1) }.must_raise ArgumentError - end + describe "average_rating method" do + before do + @driver = RideShare::Driver.new(id: 54, name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ") + trip = RideShare::Trip.new(id: 8, driver: @driver, passenger: nil, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-08"), rating: 5) + @driver.add_driven_trip(trip) + end + + it "returns a float" do + expect(@driver.average_rating).must_be_kind_of Float + end + + it "returns a float within range of 1.0 to 5.0" do + average = @driver.average_rating + expect(average).must_be :>=, 1.0 + expect(average).must_be :<=, 5.0 + end + + it "returns zero if no driven trips" do + driver = RideShare::Driver.new(id: 54, name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ") + expect(driver.average_rating).must_equal 0 + end + + it "correctly calculates the average rating" do + trip2 = RideShare::Trip.new(id: 8, driver: @driver, passenger: nil, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + rating: 1) + @driver.add_driven_trip(trip2) + + expect(@driver.average_rating).must_be_close_to (5.0 + 1.0) / 2.0, 0.01 + end + + it "ignores in progress trips when calculating average driver rating" do + trip2 = RideShare::Trip.new(id: 9, driver: @driver, passenger: nil, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + rating: 1) + @driver.add_driven_trip(trip2) - it "increases the trip count by one" do - previous = @driver.trips.length - @driver.add_trip(@trip) - expect(@driver.trips.length).must_equal previous + 1 + trip3 = RideShare::Trip.new(id: 10, driver: @driver, passenger: nil, start_time: Time.now, end_time: nil, cost: nil, rating: nil) + + @driver.add_driven_trip(trip3) + + expect (@driver.average_rating).must_be_close_to 2.0, 0.33 + end end - end - describe "average_rating method" do + describe "total_revenue" do before do @driver = RideShare::Driver.new(id: 54, name: "Rogers Bartell IV", vin: "1C9EVBRM0YBC564DZ") - trip = RideShare::Trip.new(id: 8, driver: @driver, passenger: nil, - date: Time.parse("2016-08-08"), rating: 5) - @driver.add_trip(trip) - end + trip = RideShare::Trip.new(id: 7, driver: @driver, passenger: nil, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-08"), cost: 10, rating: 5) + @driver.add_driven_trip(trip) - it "returns a float" do - expect(@driver.average_rating).must_be_kind_of Float + trip2 = RideShare::Trip.new(id: 8, driver: @driver, passenger: nil, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), cost: 24, + rating: 1) + @driver.add_driven_trip(trip2) + + trip3 = RideShare::Trip.new(id: 9, driver: @driver, passenger: nil, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), cost: 16, + rating: 1) + @driver.add_driven_trip(trip3) end - it "returns a float within range of 1.0 to 5.0" do - average = @driver.average_rating - expect(average).must_be :>=, 1.0 - expect(average).must_be :<=, 5.0 + it "correctly calculates total driver revenue" do + # You add tests for the total_revenue method + driver_revenue = @driver.total_revenue + expect (driver_revenue).must_equal (50 - ( 3 * 1.65 ) ) * 0.80 end - it "returns zero if no trips" do - driver = RideShare::Driver.new(id: 54, name: "Rogers Bartell IV", - vin: "1C9EVBRM0YBC564DZ") - expect(driver.average_rating).must_equal 0 + it "ignores trips in progress when calculating total driver revenue" do + trip4 = RideShare::Trip.new(id: 10, driver: @driver, passenger: nil, start_time: Time.now, end_time: nil, cost: nil, rating: nil) + @driver.add_driven_trip(trip4) + + driver_revenue = @driver.total_revenue + expect (driver_revenue).must_equal (50 - ( 3 * 1.65 ) ) * 0.80 end + end - it "correctly calculates the average rating" do - trip2 = RideShare::Trip.new(id: 8, driver: @driver, passenger: nil, - date: Time.parse("2016-08-08"), rating: 1) - @driver.add_trip(trip2) - expect(@driver.average_rating).must_be_close_to (5.0 + 1.0) / 2.0, 0.01 - end + describe "net_expenditures" do + before do + @user = RideShare::User.new(id: 54, name: "Rogers Bartell IV", phone: "353-533-5334") - end - describe "total_revenue" do - # You add tests for the total_revenue method - end + @driver = RideShare::Driver.new(id: 54, name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ") + trip = RideShare::Trip.new(id: 8, driver: @driver, passenger: nil, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-08"), cost: 4, rating: 5) + @driver.add_driven_trip(trip) - describe "net_expenditures" do - # You add tests for the net_expenditures method + + trip = RideShare::Trip.new(id: 8, driver: 5, passenger: @driver, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-08"), cost: 10, rating: 5) + + @user.add_trip(trip) + it 'checks if driver.net_expenditures overrides user.net_expenditures' do + difference = @driver.net_expenditures + expect(difference).must_equal 10 - ((4 - 1.65) * 0.80) + end + + + + end end end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index eb3fd8272..c70ce7a65 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -12,4 +12,4 @@ require_relative '../lib/user' require_relative '../lib/trip' require_relative '../lib/trip_dispatcher' -#require_relative '../lib/driver' +require_relative '../lib/driver' diff --git a/specs/test_data/trips_test.csv b/specs/test_data/trips_test.csv index fb5fa4cff..f12483c00 100644 --- a/specs/test_data/trips_test.csv +++ b/specs/test_data/trips_test.csv @@ -1,6 +1,6 @@ id,driver_id,passenger_id,start_time,end_time,cost,rating 1,2,1,2018-05-25 11:52:40 -0700,2018-05-25 12:25:00 -0700,10,5 -2,2,3,2018-07-23 04:39:00 -0700,2018-05-25 04:55:00 -0700,7,3 +2,2,3,2018-07-23 04:39:00 -0700,2018-07-23 04:55:00 -0700,7,3 3,5,4,2018-06-11 22:22:00 -0700,2018-06-11 22:57:00 -0700,15,4 4,5,7,2018-08-12 15:04:00 -0700,2018-08-12 15:14:00 -0700,8,1 5,5,6,2018-08-05 08:58:00 -0700,2018-08-05 09:30:00 -0700,32,1 diff --git a/specs/trip_dispatch_spec.rb b/specs/trip_dispatch_spec.rb index 56d5b1a42..8af527b8d 100644 --- a/specs/trip_dispatch_spec.rb +++ b/specs/trip_dispatch_spec.rb @@ -8,19 +8,20 @@ describe "Initializer" do it "is an instance of TripDispatcher" do dispatcher = RideShare::TripDispatcher.new(USER_TEST_FILE, - TRIP_TEST_FILE) + TRIP_TEST_FILE, + DRIVER_TEST_FILE) expect(dispatcher).must_be_kind_of RideShare::TripDispatcher end it "establishes the base data structures when instantiated" do dispatcher = RideShare::TripDispatcher.new - [:trips, :passengers].each do |prop| + [:drivers, :trips, :passengers].each do |prop| expect(dispatcher).must_respond_to prop end expect(dispatcher.trips).must_be_kind_of Array expect(dispatcher.passengers).must_be_kind_of Array - # expect(dispatcher.drivers).must_be_kind_of Array + expect(dispatcher.drivers).must_be_kind_of Array end end @@ -41,29 +42,33 @@ # Uncomment for Wave 2 - # describe "find_driver method" do - # before do - # @dispatcher = RideShare::TripDispatcher.new - # end - # - # it "throws an argument error for a bad ID" do - # expect { @dispatcher.find_driver(0) }.must_raise ArgumentError - # end - # - # it "finds a driver instance" do - # driver = @dispatcher.find_driver(2) - # expect(driver).must_be_kind_of RideShare::Driver - # end - # end + describe "find_driver method" do + before do + @dispatcher = RideShare::TripDispatcher.new(USER_TEST_FILE, + TRIP_TEST_FILE, + DRIVER_TEST_FILE) + # Added (USER_TEST_FILE, TRIP_TEST_FILE, DRIVER_TEST_FILE) to provide data for "finds a driver instance" to test. + end + + it "throws an argument error for a bad ID" do + expect { @dispatcher.find_driver(0) }.must_raise ArgumentError + end + + it "finds a driver instance" do + driver = @dispatcher.find_driver(2) + expect(driver).must_be_kind_of RideShare::Driver + end + end describe "Driver & Trip loader methods" do before do @dispatcher = RideShare::TripDispatcher.new(USER_TEST_FILE, - TRIP_TEST_FILE) + TRIP_TEST_FILE, + DRIVER_TEST_FILE) end it "accurately loads driver information into drivers array" do - skip # Unskip After Wave 2 + # skip # Unskip After Wave 2 first_driver = @dispatcher.drivers.first last_driver = @dispatcher.drivers.last @@ -76,13 +81,13 @@ end it "Connects drivers with trips" do - skip # Unskip after wave 2 + # skip # Unskip after wave 2 trips = @dispatcher.trips [trips.first, trips.last].each do |trip| driver = trip.driver expect(driver).must_be_instance_of RideShare::Driver - expect(driver.trips).must_include trip + expect(driver.driven_trips).must_include trip end end end @@ -90,7 +95,8 @@ describe "User & Trip loader methods" do before do @dispatcher = RideShare::TripDispatcher.new(USER_TEST_FILE, - TRIP_TEST_FILE) + TRIP_TEST_FILE, + DRIVER_TEST_FILE) end it "accurately loads passenger information into passengers array" do @@ -111,4 +117,43 @@ expect(passenger.trips).must_include trip end end + + describe "request_trip method" do + before do + @dispatcher = RideShare::TripDispatcher.new(USER_TEST_FILE, + TRIP_TEST_FILE, + DRIVER_TEST_FILE) + # binding.pry + end + it "creates a new Trip instance" do + trip1 = @dispatcher.request_trip(1) + expect (trip1).must_be_kind_of RideShare::Trip + end + + it "updates trip lists for user, driver, and all trips" do + @dispatcher.request_trip(1) + + passenger = @dispatcher.passengers.first + driver = @dispatcher.drivers[1] + trips = @dispatcher.trips + # binding.pry + expect (passenger.trips.length).must_equal 2 + expect (driver.driven_trips.length).must_equal 4 + # binding.pry + expect (trips.length).must_equal 6 + end + + it "returns notice if no drivers are available" do + + @dispatcher.request_trip(1) + @dispatcher.request_trip(1) + trip3 = @dispatcher.request_trip(1) + + expect (trip3).must_equal "No available drivers" + end + + it "returns an argument error if user_id entered is not a user instance in the csv file" do + expect{ @dispatcher.request_trip("A")}.must_raise ArgumentError + end + end end diff --git a/specs/trip_spec.rb b/specs/trip_spec.rb index 3347ae011..1bd21f8b2 100644 --- a/specs/trip_spec.rb +++ b/specs/trip_spec.rb @@ -1,4 +1,5 @@ require_relative 'spec_helper' +require 'pry' describe "Trip class" do @@ -14,7 +15,13 @@ start_time: start_time, end_time: end_time, cost: 23.45, - rating: 3 + rating: 3, + driver: RideShare::Driver.new(id: 4, + name: "Josh", + phone: "206-555-5555", + vin: "11111111111111111", + status: :AVAILABLE) + # Added driver to give "stores an instance of driver" (see test below) data to test. } @trip = RideShare::Trip.new(@trip_data) end @@ -28,7 +35,7 @@ end it "stores an instance of driver" do - skip # Unskip after wave 2 + # skip # Unskip after wave 2 expect(@trip.driver).must_be_kind_of RideShare::Driver end @@ -40,5 +47,42 @@ }.must_raise ArgumentError end end + + it "raises an error if end time is before start time" do + @trip_data[:end_time] = Time.parse('2015-05-20T12:14:00+00:00') + @trip_data[:start_time] = Time.parse('2017-05-20T12:14:00+00:00') + + expect { + RideShare::Trip.new(@trip_data) + }.must_raise ArgumentError + end + + it "Calculates the duration of the trip in seconds" do + @trip_data[:end_time] = Time.parse('2015-05-20T12:15:00+00:00') + @trip_data[:start_time] = Time.parse('2015-05-20T12:14:00+00:00') + + test_trip = RideShare::Trip.new(@trip_data) + expect(test_trip.duration).must_equal 60.00 + end + end + + + describe "request_trip does not affect trip class calculations" do + before do + dispatcher = RideShare::TripDispatcher.new(USER_TEST_FILE, + TRIP_TEST_FILE, + DRIVER_TEST_FILE) + + @trip = dispatcher.request_trip(1) + end + + it "does not raise an error for rating value of nil" do + + expect (@trip.rating).wont_be_kind_of ArgumentError + end + + it "does not calculate the duration of the trip in seconds" do + expect (@trip.duration).must_equal "In Progress" + end end end diff --git a/specs/user_spec.rb b/specs/user_spec.rb index ec23fd36e..35547176e 100644 --- a/specs/user_spec.rb +++ b/specs/user_spec.rb @@ -1,4 +1,5 @@ require_relative 'spec_helper' +require 'pry' describe "User class" do @@ -42,6 +43,7 @@ trip = RideShare::Trip.new(id: 8, driver: nil, passenger: @user, start_time: Time.parse("2016-08-08"), end_time: Time.parse("2016-08-09"), + cost: 5, rating: 5) @user.add_trip(trip) @@ -58,5 +60,91 @@ expect(trip.passenger.id).must_equal 9 end end + + + + + it "sums total amount of money user has spent on their trips" do + # Arrange - Add two more trips to current user + trip = RideShare::Trip.new(id: 9, driver: nil, passenger: @user, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + cost: 10, + rating: 5) + @user.add_trip(trip) + + + trip = RideShare::Trip.new(id: 10, driver: nil, passenger: @user, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + cost: 15, + rating: 5) + @user.add_trip(trip) + # binding.pry + # Act - call net_expenditures method on user + passenger_expenditure = @user.net_expenditures + + # Assert - state correct result + expect (passenger_expenditure).must_equal 30 + end + + it "Does not include trips in progress in calculation of total amount spent on trips" do + + run_trip_dispatcher = RideShare::TripDispatcher.new() + trip2 = RideShare::Trip.new(id: 9, driver: nil, passenger: @user, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + cost: 10, + rating: 5) + @user.add_trip(trip2) + + trip3 = RideShare::Trip.new(id: 10, driver: nil, passenger: @user, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + cost: 15, + rating: 5) + @user.add_trip(trip3) + + new_trip = run_trip_dispatcher.request_trip(@user.id) + @user.add_trip(new_trip) + + passenger_expenditure = @user.net_expenditures + + expect (passenger_expenditure).must_equal 30 + + end + + it "Sums the total time spent (in seconds)" do + run_trip_dispatcher = RideShare::TripDispatcher.new() + user_id = 94 + finding_a_passenger = run_trip_dispatcher.find_passenger(user_id) + passenger_total_time_spent = finding_a_passenger.total_time_spent + expect(passenger_total_time_spent).must_equal 321.0 + end + + it "Sums total time spent without including trips in progress" do + + run_trip_dispatcher = RideShare::TripDispatcher.new() + trip2 = RideShare::Trip.new(id: 9, driver: nil, passenger: @user, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + cost: 10, + rating: 5) + @user.add_trip(trip2) + + trip3 = RideShare::Trip.new(id: 10, driver: nil, passenger: @user, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + cost: 15, + rating: 5) + @user.add_trip(trip3) + + new_trip = run_trip_dispatcher.request_trip(@user.id) + @user.add_trip(new_trip) + + passenger_total_time_spent = @user.total_time_spent + + expect (passenger_total_time_spent).must_equal 259200 + end end end