diff --git a/lib/driver.rb b/lib/driver.rb new file mode 100644 index 000000000..7203675b9 --- /dev/null +++ b/lib/driver.rb @@ -0,0 +1,77 @@ +require_relative "user" + + +module RideShare + class Driver < User + attr_reader :id, :name, :vehicle_id, :driven_trips, :phone_number + attr_accessor :status + + def initialize(input) + super(input) + + @vehicle_id = input[:vin] + @driven_trips = input[:trips].nil? ? [] : input[:trips] + @status = input[:status] ? input[:status] : :AVAILABLE + + + unless @vehicle_id.length == 17 + raise ArgumentError, 'Vehicle ID must contain 17 characters' + end + + unless @status == :AVAILABLE || @status == :UNAVAILABLE + raise ArgumentError, 'Not a valid status.' + end + + if input[:id].nil? || input[:id] <= 0 + raise ArgumentError, 'ID cannot be blank or less than zero.' + end + end + + def average_rating() + + sum = 0 + + if @driven_trips.empty? + return 0 + else + trips_amount = @driven_trips.length + + valid_trips = @driven_trips.reject { |trip| trip.rating.nil? } + + return valid_trips.sum {|trip| trip.rating} / trips_amount.to_f + end + end + + def add_driven_trip(trip) + + unless trip.class == RideShare::Trip + raise ArgumentError, 'This is not a valid trip' + end + + @driven_trips << trip + end + + + def total_revenue() + if @driven_trips.empty? + return 0 + else + valid_trips = @driven_trips.reject { |trip| trip.cost.nil? } + + revenue_made = valid_trips.sum {|trip| (trip.cost - 1.65) } * 0.80 + + return ("%.2f" % revenue_made).to_f + end + end + + + def net_expenditures() + + total_driver_revenue = total_revenue() + + if !(super.nil? && total_driver_revenue.nil?) + return ("%.2f" % (super - total_driver_revenue)).to_f + end + end + end +end diff --git a/lib/trip.rb b/lib/trip.rb index 9d465726b..37af79f6d 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -1,19 +1,31 @@ require 'csv' +require 'time' 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] @passenger = input[:passenger] @start_time = input[:start_time] @end_time = input[:end_time] @cost = input[:cost] @rating = input[:rating] + @driver = input[:driver] + + if @rating != nil + if @rating > 5 || @rating < 1 + raise ArgumentError.new("Invalid rating #{@rating}") + end + end + - if @rating > 5 || @rating < 1 - raise ArgumentError.new("Invalid rating #{@rating}") + if @end_time != nil + if @end_time - @start_time < 0 + raise ArgumentError.new("Trip end time is before start time.") + end end end @@ -22,5 +34,11 @@ def inspect "ID=#{id.inspect} " + "PassengerID=#{passenger&.id.inspect}>" end + + def calculate_trip_duration + if @end_time != nil + return @end_time - @start_time + end + end end end diff --git a/lib/trip_dispatcher.rb b/lib/trip_dispatcher.rb index 6aaa04954..933317b0f 100644 --- a/lib/trip_dispatcher.rb +++ b/lib/trip_dispatcher.rb @@ -3,15 +3,19 @@ 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 def load_users(filename) @@ -37,29 +41,87 @@ 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) + + 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) trips << trip end return trips end + def load_drivers(filename) + drivers = [] + + driver_data = CSV.open(filename, "r", headers:true, header_converters: :symbol) + + driver_data.each do |raw_driver| + user = find_passenger(raw_driver[:id].to_i) + + parsed_driver = { + id: raw_driver[:id].to_i, + name: user.name, + phone: user.phone_number, + vin: raw_driver[:vin], + status: raw_driver[:status].to_sym + } + + driver = Driver.new(parsed_driver) + drivers << driver + end + return drivers + end + def find_passenger(id) check_id(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 request_trip(user_id) + current_passenger = find_passenger(user_id) + available_driver = @drivers.find { |driver| driver.status == :AVAILABLE } + + available_driver.status = :UNAVAILABLE + + parsed_trip = { + id: (@trips.max_by {|trip| trip.id}).id + 1, + passenger: current_passenger, + start_time: Time.now, + end_time: nil, + cost: nil, + rating: nil, + driver: available_driver + } + + trip_in_progress = Trip.new(parsed_trip) + current_passenger.add_trip(trip_in_progress) + available_driver.add_driven_trip(trip_in_progress) + @trips << trip_in_progress + + return trip_in_progress + end + def inspect return "#<#{self.class.name}:0x#{self.object_id.to_s(16)} \ #{trips.count} trips, \ @@ -70,7 +132,9 @@ def inspect private def check_id(id) + id = id.to_i raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 + return id end end end diff --git a/lib/user.rb b/lib/user.rb index b903fc247..63792c45a 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -1,3 +1,7 @@ +require_relative "trip" +require "time" + + module RideShare class User attr_reader :id, :name, :phone_number, :trips @@ -16,5 +20,19 @@ def initialize(input) def add_trip(trip) @trips << trip end + + def net_expenditures() + valid_trips = @trips.reject { |trip| trip.cost.nil? } + return valid_trips.sum { |trip| trip.cost} if valid_trips.length > 0 + end + + def total_time_spent() + + valid_trips = @trips.reject { |trip| trip.calculate_trip_duration.nil? } + + return valid_trips.sum {|trip| trip.calculate_trip_duration} if valid_trips.length > 0 + + end + end end diff --git a/specs/driver_spec.rb b/specs/driver_spec.rb index a50aecd48..c406655d1 100644 --- a/specs/driver_spec.rb +++ b/specs/driver_spec.rb @@ -1,104 +1,175 @@ 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 "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 "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 + 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 + 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 "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 + 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 + + it "throws an argument error if trip is not provided" do + expect{ @driver.add_driven_trip(1) }.must_raise ArgumentError + end + + 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 "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 "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 - 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 - describe "add_driven_trip method" do + describe "total_revenue" 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}) + @driver = RideShare::Driver.new(id: 54, name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ", status: :AVAILABLE) + trip_1 = 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, cost: 100) + + trip_2 = 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, cost: 10) + + @driver.add_driven_trip(trip_1) + @driver.add_driven_trip(trip_2) + end + + it 'returns a float' do + expect(@driver.total_revenue).must_be_kind_of Float end - it "throws an argument error if trip is not provided" do - expect{ @driver.add_trip(1) }.must_raise ArgumentError + it 'returns zero for no driven trips' do + driver_2 = RideShare::Driver.new(id: 54, name: "Rogers Bartell IV",vin: "1C9EVBRM0YBC564DZ", status: :AVAILABLE) + + expect(driver_2.total_revenue).must_equal 0 end - it "increases the trip count by one" do - previous = @driver.trips.length - @driver.add_trip(@trip) - expect(@driver.trips.length).must_equal previous + 1 + it 'correctly calculates the total' do + expect(@driver.total_revenue).must_equal 85.36 + end + + it 'returns a floating point with correct money format' do + trip_3 = 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, cost: 66.66) + + @driver.add_driven_trip(trip_3) + + expect(@driver.total_revenue).must_equal 137.37 end end - describe "average_rating method" do + describe "net_expenditures" 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 + vin: "1C9EVBRM0YBC564DZ", status: :AVAILABLE) + trip_1 = 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, cost: 20) + @driver.add_driven_trip(trip_1) - it "returns a float" do - expect(@driver.average_rating).must_be_kind_of Float - end + trip_2 = RideShare::Trip.new(id: 8, driver: nil, passenger: @driver, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-08"), rating: 5, cost: 100) - 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 + @driver.add_trip(trip_2) - 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 - 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) + end - expect(@driver.average_rating).must_be_close_to (5.0 + 1.0) / 2.0, 0.01 + it 'Correctly calculates the total expenditures' do + expect(@driver.net_expenditures).must_equal 85.32 end + it "returns a float" do + expect(@driver.net_expenditures).must_be_kind_of Float + end - end + it "returns a float with correct money format" do + trip_3 = 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, cost: 66.66) - describe "total_revenue" do - # You add tests for the total_revenue method - end + @driver.add_driven_trip(trip_3) - describe "net_expenditures" do - # You add tests for the net_expenditures method + expect(@driver.net_expenditures).must_equal 33.31 + 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..c500ee080 100644 --- a/specs/trip_dispatch_spec.rb +++ b/specs/trip_dispatch_spec.rb @@ -8,25 +8,26 @@ 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 + dispatcher = RideShare::TripDispatcher.new(USER_TEST_FILE, + TRIP_TEST_FILE, DRIVER_TEST_FILE) [: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 describe "find_user method" do before do - @dispatcher = RideShare::TripDispatcher.new + @dispatcher = RideShare::TripDispatcher.new(user_file = USER_TEST_FILE, trip_file = TRIP_TEST_FILE, driver_file = DRIVER_TEST_FILE) end it "throws an argument error for a bad ID" do @@ -39,31 +40,29 @@ end end + describe "find_driver method" do + before do + @dispatcher = RideShare::TripDispatcher.new(USER_TEST_FILE, + TRIP_TEST_FILE, DRIVER_TEST_FILE) + end - # 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 + 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 first_driver = @dispatcher.drivers.first last_driver = @dispatcher.drivers.last @@ -76,13 +75,12 @@ end it "Connects drivers with trips" do - 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 +88,7 @@ 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 +109,32 @@ 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) + + @trip_in_progress = @dispatcher.request_trip(1) + end + + it 'During trip in progress, driver status is unavailable' do + expect(@trip_in_progress.driver.status).must_equal :UNAVAILABLE + end + + + it "Finds a trip instance" do + expect(@trip_in_progress).must_be_instance_of RideShare::Trip + end + + it "Connects drivers with trip in progress" do + + expect(@trip_in_progress.driver).must_be_instance_of RideShare::Driver + expect(@trip_in_progress.driver.id).must_equal 5 + end + + + it "Connects passenger with trip in progress" do + expect(@trip_in_progress.passenger.id).must_equal 1 + end + end end diff --git a/specs/trip_spec.rb b/specs/trip_spec.rb index 3347ae011..038f6bdf0 100644 --- a/specs/trip_spec.rb +++ b/specs/trip_spec.rb @@ -14,8 +14,9 @@ start_time: start_time, end_time: end_time, cost: 23.45, - rating: 3 - } + rating: 3, + driver: RideShare::Driver.new(id: 2, name: "michael", phone: "555-555-5555", vin: "12345678901234567", status: :AVAILABLE)} + @trip = RideShare::Trip.new(@trip_data) end @@ -28,7 +29,6 @@ end it "stores an instance of driver" do - skip # Unskip after wave 2 expect(@trip.driver).must_be_kind_of RideShare::Driver end @@ -40,5 +40,43 @@ }.must_raise ArgumentError end end + + it "raises an error if end time is before start time" do + start_time = Time.parse('2015-05-20T12:14:00+00:00') + end_time = start_time - 25 * 60 # 25 minutes + @trip_data = { + id: 8, + passenger: RideShare::User.new(id: 1, + name: "Ada", + phone: "412-432-7640"), + start_time: start_time, + end_time: end_time, + cost: 23.45, + rating: 3 + } + expect {RideShare::Trip.new(@trip_data)}.must_raise ArgumentError + end + end + + describe "#calculate_trip_duration" do + before do + @start_time = Time.parse('2015-05-20T12:14:00+00:00') + @end_time = Time.parse('2015-05-20T12:15:00+00:00') + @trip_data = { + id: 8, + passenger: RideShare::User.new(id: 1, + name: "Ada", + phone: "412-432-7640"), + start_time: @start_time, + end_time: @end_time, + cost: 23.45, + rating: 3 + } + @trip = RideShare::Trip.new(@trip_data) + end + + it "Returns trip duration in seconds" do + expect(@trip.calculate_trip_duration).must_equal 60 + end end end diff --git a/specs/user_spec.rb b/specs/user_spec.rb index ec23fd36e..f5f0bf985 100644 --- a/specs/user_spec.rb +++ b/specs/user_spec.rb @@ -34,7 +34,6 @@ end end - describe "trips property" do before do @user = RideShare::User.new(id: 9, name: "Merl Glover III", @@ -59,4 +58,62 @@ end end end + + + describe "user#net_expenditures" do + before do + @user = RideShare::User.new(id: 9, name: "Merl Glover III", + phone: "1-602-620-2330 x3723", trips: []) + + @trip1 = RideShare::Trip.new(id: 8, driver: nil, passenger: @user, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + cost: 500, + rating: 5) + + @trip2 = RideShare::Trip.new(id: 10, driver: nil, passenger: @user, + start_time: Time.parse("2016-08-08"), + end_time: Time.parse("2016-08-09"), + cost: 200, + rating: 5) + end + + it "calculates total trip costs for one user" do + + @user.add_trip(@trip1) + @user.add_trip(@trip2) + + net_expenditure = @user.net_expenditures() + + expect(net_expenditure).must_equal 700 + end + end + + describe "user#total_time_spent" do + before do + @user = RideShare::User.new(id: 9, name: "Merl Glover III", + phone: "1-602-620-2330 x3723", trips: []) + + @trip1 = RideShare::Trip.new(id: 8, driver: nil, passenger: @user, + start_time: Time.parse("2015-05-20T12:14:00+00:00"), + end_time: Time.parse("2015-05-20T12:15:00+00:00"), + cost: 500, + rating: 5) + + @trip2 = RideShare::Trip.new(id: 10, driver: nil, passenger: @user, + start_time: Time.parse("2015-05-20T12:14:00+00:00"), + end_time: Time.parse("2015-05-20T13:14:00+00:00"), + cost: 200, + rating: 5) + end + it "calculates total amount of time (in seconds) user spent in trips" do + + @user.add_trip(@trip1) + @user.add_trip(@trip2) + + duration = @user.total_time_spent() + + expect(duration).must_equal 3660 + end + end end