def test_validateRental_lateClient_throwsException(self): self.initialize() self.__service_rentals.rent_movie(1, 1, 1, '1/1/1', '2/2/1') rentals = self.__service_rentals.get_rentals() rental = Rental(2, 2, 1, Date(2, 1, 2), Date(2, 2, 2), Date(3, 3, 3)) with self.assertRaises(ValidationError): self.__rental_validator.validate_rental(rental, rentals)
def late_rentals(self): current_date = datetime.date.today() situation_late_rentals = [] rentals = self.get_rentals() for rental in rentals: if rental.get_returnDate() == Date(0, 0, 0) and rental.get_dueDate( ) <= Date(current_date.day, current_date.month, current_date.year): # it means the movie hasn't been returned, and the due date passed movie_id = rental.get_movieId() movie = self.repoMovies.search(Movie(movie_id, '', '', '')) name = movie.get_title() delay = rental.number_of_days_delayed() situation_late_rentals.append( LateRentals(movie_id, name, delay)) situation_late_rentals.sort(key=lambda x: x.get_delay(), reverse=True) return situation_late_rentals
def rent_movie(self, rentalId, movieId, clientId, rentDate, dueDate): # it creates a rental - if movie and client exist # it validates and adds it to the repository for rentals # - the movie must not be already rented (and not returned) # - the client must not have any rented movies past their due date movie = self.repoMovies.search(Movie(movieId, '', '', '')) client = self.repoClients.search(Client(clientId, '')) rentDate = self.get_date(rentDate) dueDate = self.get_date(dueDate) returnDate = Date(0, 0, 0) if dueDate <= rentDate: raise TimelineError( 'Due date must be chronologically after rent-date') rental = Rental(rentalId, movie.get_id(), client.get_id(), rentDate, dueDate, returnDate) rentals = self.get_rentals() self.validRental.validate_rental(rental, rentals) self.repoRentals.add(rental) ''' For undo ''' operation = Operation(self.repoRentals, "Repository.add", "Repository.remove", rental) self.undoStack.push_op(operation) self.redoStack.clear()
def test_return_rentedMovie_returnDateIsAdded(self): self.initialize() self.__service_rentals.rent_movie(1, 1, 1, '1/1/2000', '1/1/2001') self.__service_rentals.return_movie(1, '2/2/2000') self.assertEqual( Date(2, 2, 2000), self.__rentals_repository.search(Rental(1, '', '', '', '', '')).get_returnDate())
def test_setters_rental_areSet(self): rental = Rental(1, 1, 1, Date(1, 1, 1), Date(2, 2, 2), Date(0, 0, 0)) rental.set_clientId(2) self.assertEqual(rental.get_clientId(), 2) rental.set_movieId(2) self.assertEqual(rental.get_movieId(), 2) rental.set_rentalId(2) self.assertEqual(rental.get_rentalId(), 2) rental.set_rentDate(Date(2, 1, 1)) self.assertEqual(rental.get_rentDate(), Date(2, 1, 1)) rental.set_dueDate(Date(3, 3, 3)) self.assertEqual(rental.get_dueDate(), Date(3, 3, 3))
def test_str_rental_string(self): rental = Rental(1, 1, 1, Date(1, 1, 1), Date(2, 2, 2), Date(0, 0, 0)) self.assertEqual( str(rental), "Rental ID: 1" + "\n" + "Movie ID: 1" + '\n' + "Client ID: 1" + '\n' + " Rented: 1/1/1" + '\n' + " Due date: 2/2/2" + '\n' + " Returned: - \n") rental = Rental(1, 1, 1, Date(1, 1, 1), Date(2, 2, 2), Date(3, 3, 3)) self.assertEqual( str(rental), "Rental ID: 1" + "\n" + "Movie ID: 1" + '\n' + "Client ID: 1" + '\n' + " Rented: 1/1/1" + '\n' + " Due date: 2/2/2" + '\n' + " Returned: 3/3/3" + "\n")
def return_movie(self, rentalId, returnDate): # it searches for the rental id given # if it exists it adds the returned date returnDate = self.get_date(returnDate) rental = self.repoRentals.search(Rental(rentalId, '', '', '', '', '')) initial_rental = copy.deepcopy(rental) if rental.get_returnDate() != Date(0, 0, 0): raise RentingError('Movie was already returned') if returnDate <= rental.get_rentDate(): raise TimelineError( 'Return-date must be chronologically after rent-date') self.repoRentals.update(rental, Rental(rentalId, '', '', '', '', returnDate)) ''' For undo ''' operation = UpdateOperation( self.repoRentals, "Repository.update", initial_rental, Rental(rentalId, '', '', '', '', returnDate)) self.undoStack.push_op(operation) self.redoStack.clear()
def test(self): valid_movie = ValidMovie() valid_client = ValidClient() valid_rental = ValidRental() repository_movie = Repository() repository_client = Repository() repository_rental = Repository() undo_stack = Stack() redo_stack = Stack() service_movie = ServiceMovies(repository_movie, valid_movie, undo_stack, redo_stack, repository_rental) service_client = ServiceClients(repository_client, valid_client, undo_stack, redo_stack, repository_rental) service_rental = ServiceRentals(repository_movie, repository_client, repository_rental, valid_rental, undo_stack, redo_stack) service_undo = ServiceUndo(undo_stack, redo_stack) service_undo.clear() service_movie.add_movie(1, 'a', 'a', 'a') service_undo.undo() self.assertEqual(0, service_movie.get_number()) service_undo.redo() self.assertEqual(service_movie.get_movies()[0], Movie(1, 'a', 'a', 'a')) service_client.add_client(1, 'a') service_undo.undo() self.assertEqual(0, service_client.get_number()) service_undo.redo() self.assertEqual(service_client.get_clients()[0], Client(1, 'a')) with self.assertRaises(UndoError): service_undo.redo() service_client.update_client(1, 'b') service_undo.undo() self.assertEqual(service_client.get_clients()[0].get_name(), 'a') service_undo.redo() self.assertEqual(service_client.get_clients()[0].get_name(), 'b') service_rental.rent_movie(1, 1, 1, '1/1/1', '2/2/2') service_client.remove_client(1) self.assertEqual(service_rental.get_number(), 0) self.assertEqual(service_client.get_number(), 0) service_undo.undo() self.assertEqual(service_rental.get_number(), 1) self.assertEqual(service_client.get_number(), 1) service_undo.redo() self.assertEqual(service_rental.get_number(), 0) self.assertEqual(service_client.get_number(), 0) service_client.add_client(1, 'a') service_rental.rent_movie(1, 1, 1, '1/1/1', '2/2/2') service_undo.undo() self.assertEqual(service_rental.get_number(), 0) service_undo.redo() self.assertEqual( service_rental.get_rentals()[0], Rental(1, 1, 1, Date(1, 1, 1), Date(2, 2, 2), Date(0, 0, 0))) service_rental.return_movie(1, '3/3/3') service_undo.undo() self.assertEqual(service_rental.get_rentals()[0].get_returnDate(), Date(0, 0, 0)) service_undo.redo() self.assertEqual(service_rental.get_rentals()[0].get_returnDate(), Date(3, 3, 3))
def test_rent_validMovieAndClient_rentalIsCreated(self): self.initialize() self.__service_rentals.rent_movie(1, 1, 1, '1/1/2000', '1/1/2001') rental = Rental(1, 1, 1, Date(1, 1, 2000), Date(1, 1, 2001), Date(0, 0, 0)) self.assertEqual(self.__service_rentals.get_rentals()[0], rental)
def test_validateRental_validRental_none(self): self.initialize() rentals = self.__service_rentals.get_rentals() rental = Rental(1, 1, 1, Date(2, 1, 1), Date(2, 2, 2), Date(3, 3, 3)) self.__rental_validator.validate_rental(rental, rentals)
def test_invalidDate(self): with self.assertRaises(DateError): d = Date(111, 111, 11)
def test_daysRented_rental_returnsNrOfDays(self): rental = Rental(1, 1, 1, Date(1, 1, 1), Date(2, 2, 2), Date(4, 1, 1)) self.assertEqual(rental.number_of_days_rented(), 4)
def test_identical_sameRentals_True(self): rental = Rental(1, 1, 1, Date(1, 1, 1), Date(2, 2, 2), Date(0, 0, 0)) rental1 = Rental(1, 1, 1, Date(1, 1, 1), Date(2, 2, 2), Date(0, 0, 0)) self.assertTrue(rental.identical(rental1))
def get_date(self, inputDate): date = inputDate.split('/') if len(date) != 3: raise DateError('Date is not in valid format') return Date(int(date[0]), int(date[1]), int(date[2]))
def validate_rental(self, rental, rentals): errors = '' # check if movie is available for existing_rental in rentals: if existing_rental.get_movieId() == rental.get_movieId() and existing_rental.get_returnDate() == Date(0, 0, 0): errors += 'Movie is not available at the moment \n' # check if client has unreturned movies past due date # (rent date (of new rental) > due date (old rental); return date - empty) for existing_rental in rentals: if existing_rental.get_clientId() == rental.get_clientId() and existing_rental.get_returnDate() == Date(0, 0, 0) and existing_rental.get_dueDate() <= rental.get_rentDate(): errors += 'Client has not returned a movie that passed the due date and can not rent another one' break if len(errors) > 0: raise RentingError(errors)