def __init__(self): self.__apiController = ApiController() self.__loginController = LoginController() self.__registerController = RegistrationController() self.__encryptPassword = EncryptPassword() self.__verificationController = VerificationController() self.__voiceSearch = VoiceSearch()
class EncryptPasswordTest(unittest.TestCase): __encryptor = EncryptPassword() def testHash(self): data = 'Green3#H' expected = 'aed85f0f64c1223e1a84d125ee7c1b7cd172727d32c7fe1c902e05f6b4cee3b90359a0b8a85c2d6aeac2b4c2e2f84deeaf3d69fbe92eadf5e2855a84d49891f1' self.assertEqual(self.__encryptor.hash(data), expected)
def userRegister(self): camController = CameraController(self.__camera, self.__recogniser) regController = RegistrationController() verController = VerificationController() encryptPassword = EncryptPassword() reg = registerFromConsole(verController, regController, encryptPassword, camController) reg.register()
class TestUserController(unittest.TestCase): __encryptor = EncryptPassword() __resourceFound = '<Response streamed [200 OK]>' __resourceCreated = '<Response streamed [201 CREATED]>' __userData = None def setUp(self): self.__userData = { 'id': 999, 'username': '******', 'password': self.__encryptor.hash('Doitsu3#G'), 'firstName': 'Rudol', 'lastName': 'Stroheim', 'email': '*****@*****.**', 'faceId': 'None', 'type': 'admin' } return super().setUp() def __getRequest(self, url): return str(app.test_client().get(url)) def __postRequest(self, url, data): return str(app.test_client().post(url, data=data)) def __putRequest(self, url, data): return str(app.test_client().put(url, data=data)) def __deleteRequest(self, url): return str(app.test_client().delete(url)) def testGetUser(self): self.assertEqual( self.__getRequest('http://localhost:5000/css/api/v1.0/users/1'), self.__resourceFound) def testGetUsers(self): self.assertEqual( self.__getRequest('http://localhost:5000/css/api/v1.0/users'), self.__resourceFound) def testCreateUser(self): self.assertEqual( self.__postRequest('http://localhost:5000/css/api/v1.0/users', self.__userData), self.__resourceCreated) def testUpdateUser(self): self.assertEqual( self.__putRequest('http://localhost:5000/css/api/v1.0/users/1', {'username': '******'}), self.__resourceCreated) def testDeleteUser(self): self.assertEqual( self.__deleteRequest( 'http://localhost:5000/css/api/v1.0/users/999'), self.__resourceFound)
def initialMenu(self): camController = CameraController(self.__camera, self.__recogniser) logController = LoginController() verController = VerificationController() regController = RegistrationController() encryptPassword = EncryptPassword() log = loginFromConsole(logController, verController, encryptPassword) reg = registerFromConsole(verController, regController, encryptPassword, camController) menuController = InitialMenuController(log, reg) menuConsole = initialMenuConsole(menuController) self.__user = menuConsole.printMenu() self.__bookingController = BookingController(self.__user) print('Please wait while your existing bookings are updated...') self.__bookingController.updateBookingsStatus() return self.__user
def userLogin(self): logController = LoginController() verController = VerificationController() encryptPassword = EncryptPassword() log = loginFromConsole(logController, verController, encryptPassword) return log.login()
class RoutesTest(unittest.TestCase): __validTemplateResponse = '<Response streamed [200 OK]>' __validGetResponse = '<Response streamed [302 FOUND]>' __encryptor = EncryptPassword() def __getRequest(self, url): return str(app.test_client().get(url)) def __postRequest(self, url, params): return str(app.test_client().post(url, data=params)) def testGetIndex(self): self.assertEqual(self.__getRequest('/'), self.__validTemplateResponse) def testGetLogin(self): self.assertEqual(self.__getRequest('/login'), self.__validTemplateResponse) def testPostLogin(self): postRequest = self.__postRequest( '/login', { 'email': '*****@*****.**', 'password': self.__encryptor.hash('Green3#H') }) self.assertEqual(postRequest, self.__validGetResponse) def testGetRegister(self): self.assertEqual(self.__getRequest('/register'), self.__validTemplateResponse) def testGetLogout(self): self.assertEqual(self.__getRequest('/logout'), self.__validGetResponse) def testGetUser(self): self.assertEqual(self.__getRequest('/users/1'), self.__validTemplateResponse) def testGetNewUser(self): self.assertEqual(self.__getRequest('/users/new'), self.__validGetResponse) def testGetUpdateUser(self): self.assertEqual(self.__getRequest('/users/1/update'), self.__validGetResponse) def testGetDeleteUser(self): self.assertEqual(self.__getRequest('users/1/delete'), self.__validGetResponse) def testGetCars(self): self.assertEqual(self.__getRequest('/cars'), self.__validTemplateResponse) def testGetVoice(self): self.assertEqual(self.__getRequest('/voice'), self.__validGetResponse) def getCar(self): self.assertEqual(self.__getRequest('/cars/1'), self.__validTemplateResponse) def testGetNewCar(self): self.assertEqual(self.__getRequest('/cars/new'), self.__validGetResponse) def testGetUpdateCar(self): self.assertEqual(self.__getRequest('/cars/1/update'), self.__validGetResponse) def testGetDeleteCar(self): self.assertEqual(self.__getRequest('/cars/1/delete'), self.__validGetResponse) def testGetBookCar(self): self.assertEqual(self.__getRequest('/cars/1/book'), self.__validGetResponse) def testGetReportCar(self): self.assertEqual(self.__getRequest('/cars/1/report'), self.__validGetResponse) def testGetBookings(self): self.assertEqual(self.__getRequest('/bookings'), self.__validTemplateResponse) def testGetBookingHistory(self): self.assertEqual(self.__getRequest('/bookings/history'), self.__validGetResponse) def testGetBooking(self): self.assertEqual(self.__getRequest('/bookings/1'), self.__validTemplateResponse)
def testLogin(self): encryptor = EncryptPassword() self.assertIsNotNone( self.__loginController.login('*****@*****.**', encryptor.hash('Green3#H')))
class Middleware: def __init__(self): self.__apiController = ApiController() self.__loginController = LoginController() self.__registerController = RegistrationController() self.__encryptPassword = EncryptPassword() self.__verificationController = VerificationController() self.__voiceSearch = VoiceSearch() self.__pushbulletController = PushbulletController() def index(self): if not self.__isUserLoggedIn(): return render_template('index.html') userType = self.__getUserType() users = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/users')['users'] cars = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/cars')['cars'] bookings = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/bookings')['bookings'] if userType == 'customer': return render_template('customerDashboard.html') elif userType == 'engineer': return render_template('engineerDashboard.html', cars=cars) elif userType == 'manager': carIds, rentalAmounts = self.getMostPopularCars(10, bookings, cars) months, bookingCounts = self.getBookingsPerMonth(bookings) userTypes, userCounts = self.getUserTypeCount(users) return render_template('managerDashboard.html', carIds=carIds, rentalAmounts=rentalAmounts, months=months, \ bookingCounts=bookingCounts, userTypes=userTypes, userCounts=userCounts) elif userType == 'admin': return render_template('adminDashboard.html', users=users, cars=cars) else: return render_template('index.html') def login(self): form = LoginForm() if request.method == 'POST': email = request.form['email'] password = self.__encryptPassword.hash(request.form['password']) user = self.__loginController.login(email, password) if user: googleController.authenticateGoogleUser() googleController.fetchCalendar() bookingController = BookingController(user) bookingController.updateBookingsStatus() return redirect(url_for('index')) return redirect(url_for('login')) return render_template('login.html', form=form) def logout(self): if self.__isUserLoggedIn(): self.__loginController.logout() return redirect(url_for('index')) def register(self): form = RegisterForm() if request.method == 'POST': formData = request.form if not self.__validateRegister( formData['username'], formData['password'], formData['firstName'], formData['lastName'], formData['email']): return redirect(url_for('register')) username = formData['username'] password = self.__encryptPassword.hash(formData['password']) firstName = formData['firstName'] lastName = formData['lastName'] email = formData['email'] user = self.__registerController.register(username, password, firstName, lastName, email, 'None') if user: self.__loginController.setLoggedInUser(user) return redirect(url_for('index')) return redirect(url_for('register')) return render_template('register.html', form=form) def __validateRegister(self, username, password, firstName, lastName, email): ver = self.__verificationController return ver.verifyUsername(username) and ver.verifyPassword(password) and ver.verifyFirstName(firstName) and \ ver.verifyLastName(lastName) and ver.verifyEmail(email) def getUser(self, id): user = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/users/{}'.format(id)) return render_template('user.html', user=user) # only accepted by post requests def getUsers(self): formData = request.form searchQuery = formData['query'] users = self.__getMatchingUsers(searchQuery) return render_template('users.html', users=users, searchQuery=searchQuery) def newUser(self): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isAdmin(): return redirect(url_for('index')) form = UserForm() if request.method == 'POST': formData = request.form userId = self.__getNextUserId() username = formData['username'] password = self.__encryptPassword.hash(formData['password']) firstName = formData['firstName'] lastName = formData['lastName'] email = formData['email'] userType = formData['userType'] userData = { 'id': userId, 'username': username, 'password': password, 'firstName': firstName, 'lastName': lastName, 'email': email, 'faceId': 'None', 'type': userType } self.__apiController.requestPost( 'http://localhost:5000/css/api/v1.0/users', userData) return redirect(url_for('index')) return render_template('newUser.html', form=form) def updateUser(self, id): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isAdmin() and not self.__getLoggedInUser().getId() == id: return redirect(url_for('index')) user = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/users/{}'.format(id)) form = UserForm(userType=user['type']) if request.method == 'POST': formData = request.form username = formData['username'] firstName = formData['firstName'] lastName = formData['lastName'] email = formData['email'] userType = formData['userType'] userData = { 'username': username, 'firstName': firstName, 'lastName': lastName, 'email': email, 'type': userType } self.__apiController.requestPut( 'http://localhost:5000/css/api/v1.0/users/{}'.format(id), userData) return redirect(url_for('index')) return render_template('updateUser.html', form=form, user=user) def deleteUser(self, id): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isAdmin() and not self.__getLoggedInUser().getId() == id: return redirect(url_for('index')) self.__apiController.requestDelete( 'http://localhost:5000/css/api/v1.0/users/{}'.format(id)) return redirect(url_for('index')) def voiceSearch(self): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isAdmin() and not self.__getLoggedInUser().getId() == id: return redirect(url_for('index')) carSearched = self.__voiceSearch.voiceSearch() #time.sleep(10) if request.method == 'POST': cars = self.__getMatchingCars(carSearched) redirect(url_for('cars')) return render_template('voice.html', cars=cars) def getCar(self, id): car = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/cars/{}'.format(id)) return render_template('car.html', car=car) def getAllCars(self): cars = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/cars')['cars'] form = SearchForm() if request.method == 'POST': query = request.form['query'] cars = self.__getMatchingCars(query) return render_template('cars.html', cars=cars, form=form) def newCar(self): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isAdmin(): return redirect(url_for('index')) form = CarForm() if request.method == 'POST': formData = request.form carId = self.__getNextCarId() make = formData['make'] bodyType = formData['bodyType'] colour = formData['colour'] seats = formData['seats'] xCoordinate = formData['xCoordinate'] yCoordinate = formData['yCoordinate'] costPerHour = formData['costPerHour'] carData = { 'id': carId, 'make': make, 'bodyType': bodyType, 'colour': colour, 'seats': seats, 'xCoordinate': xCoordinate, 'yCoordinate': yCoordinate, 'costPerHour': costPerHour, 'isLocked': 1 } self.__apiController.requestPost( 'http://localhost:5000/css/api/v1.0/cars', carData) return redirect(url_for('index')) return render_template('newCar.html', form=form) def updateCar(self, id): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isAdmin(): return redirect(url_for('index')) form = CarForm() car = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/cars/{}'.format(id)) if request.method == 'POST': formData = request.form make = formData['make'] bodyType = formData['bodyType'] colour = formData['colour'] seats = formData['seats'] xCoordinate = formData['xCoordinate'] yCoordinate = formData['yCoordinate'] costPerHour = formData['costPerHour'] carData = { 'make': make, 'bodyType': bodyType, 'colour': colour, 'seats': seats, 'xCoordinate': xCoordinate, 'yCoordinate': yCoordinate, 'costPerHour': costPerHour } self.__apiController.requestPut( 'http://localhost:5000/css/api/v1.0/cars/{}'.format(id), carData) return redirect(url_for('index')) return render_template('updateCar.html', form=form, car=car) def deleteCar(self, id): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isAdmin(): return redirect(url_for('index')) self.__apiController.requestDelete( 'http://localhost:5000/css/api/v1.0/cars/{}'.format(id)) return redirect(url_for('index')) def bookCar(self, id): if not self.__isUserLoggedIn(): return redirect(url_for('index')) form = BookingForm() if request.method == 'POST': userId = self.__getLoggedInUser().getId() carId = request.form['carId'] startMonth = request.form['startMonth'] startDay = request.form['startDay'] endMonth = request.form['endMonth'] endDay = request.form['endDay'] userDict = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/users/{}'.format(userId)) user = User(userDict['id'], userDict['username'], userDict['password'], userDict['firstName'], userDict['lastName'], userDict['email'], userDict['faceId']) carDict = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/cars/{}'.format(carId)) bookingController = BookingController(user) bookingController.book(carDict['make'], user, startMonth, startDay, endMonth, endDay) return redirect(url_for('index')) return render_template('carBooking.html', carId=id, userId=self.__getLoggedInUser().getId(), form=form) def reportCar(self, id): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isAdmin(): return redirect(url_for('index')) form = ReportForm() if request.method == 'POST': formData = request.form reportId = self.__getNextReportId() carId = id description = formData['description'] if formData[ 'description'] is not '' else 'N/A' reportData = { 'id': reportId, 'carId': carId, 'description': description, 'open': 1 } self.__apiController.requestPost( 'http://localhost:5000/css/api/v1.0/reports', reportData) self.__pushbulletController.notifyEngineer(str(carId), description) return redirect(url_for('index')) return render_template('carReport.html', cardId=id, form=form) def viewReportCar(self, id): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isEngineer(): return redirect(url_for('index')) reportsJson = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/reports') jsonData = reportsJson reportsList = [] jsonReports = None for x in jsonData["reports"]: if x["car"]["id"] == id: reportData = { 'id': x["id"], 'carId': id, 'description': x["description"], 'open': x["open"] } reportsList.append(reportData) return render_template('viewreports.html', reports=reportsList) def viewReport(self, id): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if not self.isEngineer(): return redirect(url_for('index')) reportJson = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/reports/{}'.format(id)) return render_template('report.html', reports=reportJson) def viewLocation(self, id): reportJson = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/reports/{}'.format(id)) locationX = reportJson["car"]["location"]["x"] locationY = reportJson["car"]["location"]["y"] # Initialize the map at a given point gmap = gmplot.GoogleMapPlotter(float(locationX), float(locationY), 14) car_lats, car_lngs = zip( *[(float(locationX), float(locationY)), (float(locationX), float(locationY))]) gmap.scatter(car_lats, car_lngs, color='#3B0B39', size=40, marker=False) gmap.draw("mp/view/templates/my_map.html") return render_template('my_map.html') def getAllBookings(self): bookings = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/bookings')['bookings'] return render_template('bookings.html', bookings=bookings) def getBooking(self, id): booking = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/bookings/{}'.format(id)) return render_template('booking.html', booking=booking) def getBookingHistory(self): if not self.__isUserLoggedIn(): return redirect(url_for('index')) if self.isAdmin(): bookingHistory = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/bookings?active=0' )['bookings'] else: userId = self.__getLoggedInUser().getId() bookingHistory = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/bookings?user_id={}&active=0' .format(userId))['bookings'] return render_template('bookingHistory.html', bookings=bookingHistory) def cancelBooking(self, id): urlUpdate = "http://localhost:5000/css/api/v1.0/bookings/{}".format( str(id)) self.__apiController.requestPut(urlUpdate, {'active': 0}) return redirect(url_for('index')) def carById(self, id): return self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/cars/{}'.format(id)) def usernameById(self, id): return self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/users/{}'.format( id))['username'] def loggedInUser(self): return self.__loginController.getLoggedInUser() def isAdmin(self): return self.__loginController.getLoggedInUserType() == 'admin' def isManager(self): return self.__loginController.getLoggedInUserType() == 'manager' def isEngineer(self): return self.__loginController.getLoggedInUserType() == 'engineer' def isCustomer(self): return self.__loginController.getLoggedInUserType() == 'customer' def getMostPopularCars(self, number, bookings, cars): carPopularity = {} for car in cars: carPopularity.update({'Car {}'.format(car['id']): 0}) for booking in bookings: carId = booking['car']['id'] oldValue = carPopularity['Car {}'.format(carId)] carPopularity.update({'Car {}'.format(carId): oldValue + 1}) return list(carPopularity.keys()), list(carPopularity.values()) def getBookingsPerMonth(self, bookings): months = { 'Jan': 0, 'Feb': 0, 'Mar': 0, 'Apr': 0, 'May': 0, 'Jun': 0, 'Jul': 0, 'Aug': 0, 'Sep': 0, 'Oct': 0, 'Nov': 0, 'Dec': 0 } for booking in bookings: for month in months.keys(): if month in booking['startTime']: previousValue = months[month] months.update({month: previousValue + 1}) return list(months.keys()), list(months.values()) def getUserTypeCount(self, users): userTypes = {'admin': 0, 'manager': 0, 'engineer': 0, 'customer': 0} for user in users: for userType in userTypes.keys(): if userType == user['type']: previousValue = userTypes[userType] userTypes.update({userType: previousValue + 1}) return list(userTypes.keys()), list(userTypes.values()) def __getUserType(self): return self.__loginController.getLoggedInUserType() def __isUserLoggedIn(self): return self.__loginController.getLoggedInUser() is not None def __getLoggedInUser(self): return self.__loginController.getLoggedInUser() def __getNextBookingId(self): allBookings = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/bookings')['bookings'] currentIds = [] for booking in allBookings: currentIds.append(int(booking['id'])) currentIds.sort() for i in range(len(currentIds)): if currentIds[i] != i + 1: return i + 1 return len(allBookings) + 1 def __getNextUserId(self): allUsers = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/users')['users'] currentIds = [] for user in allUsers: currentIds.append(int(user['id'])) currentIds.sort() for i in range(len(currentIds)): if currentIds[i] != i + 1: return i + 1 return len(allUsers) + 1 def __getNextCarId(self): allCars = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/cars')['cars'] currentIds = [] for car in allCars: currentIds.append(int(car['id'])) currentIds.sort() for i in range(len(currentIds)): if currentIds[i] != i + 1: return i + 1 return len(allCars) + 1 def __getNextReportId(self): allReports = self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/reports')['reports'] currentIds = [] for report in allReports: currentIds.append(int(report['id'])) currentIds.sort() for i in range(len(currentIds)): if currentIds[i] != i + 1: return i + 1 return len(allReports) + 1 def __getUsersByFilterParam(self, filterParam, paramValue): return self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/users?{}={}'.format( filterParam, paramValue))['users'] def __getMatchingUsers(self, searchQuery): matchingUsers = [] for i in range(len(User.attributesAsList()) - 2): currentFiltered = self.__getUsersByFilterParam( User.attributesAsList()[i], searchQuery) for item in currentFiltered: if item not in matchingUsers: matchingUsers.append(item) return matchingUsers def __getCarsByFilterParam(self, filterParam, paramValue): return self.__apiController.requestGet( 'http://localhost:5000/css/api/v1.0/cars?{}={}'.format( filterParam, paramValue))['cars'] def __getMatchingCars(self, searchQuery): matchingCars = [] for i in range(len(Car.attributesAsList()) - 1): matchingCars.extend( self.__getCarsByFilterParam(Car.attributesAsList()[i], searchQuery)) return matchingCars
def testRegister(self): encryptor = EncryptPassword() self.assertIsNotNone(self._registrationController.register('Ridoy', encryptor.hash('Abch#3'),'Mehedi','Hasan','*****@*****.**', 'None'))