diff --git a/src/controllers/authController.js b/src/controllers/authController.js index b680faf..240a37b 100644 --- a/src/controllers/authController.js +++ b/src/controllers/authController.js @@ -1,16 +1,20 @@ const jwt = require('jsonwebtoken'); -const formdata = require('form-data') -const Mailgun = require('mailgun.js') -const mailgun = new Mailgun(formdata) +const formdata = require('form-data'); +const Mailgun = require('mailgun.js'); +const mailgun = new Mailgun(formdata); const User = require('../models/usersModel.js'); const { StatusCodes } = require('http-status-codes'); -const { BadRequestError, UnauthenticatedError, NotFoundError } = require('../errors'); +const { + BadRequestError, + UnauthenticatedError, + NotFoundError, +} = require('../errors'); // Create the maildun client const mg = mailgun.client({ username: 'api', key: process.env.MAILGUN_API_KEY || 'apiKey', - domain: process.env.MAILGUN_DOMAIN || 'sandbox-123.mailgun.org' + domain: process.env.MAILGUN_DOMAIN || 'sandbox-123.mailgun.org', }); // Register controller @@ -37,6 +41,7 @@ const register = async (req, res, next) => { // Respond with user data and token res.status(StatusCodes.CREATED).json({ user: { + _id: user._id, parentName: user.parentName, email: user.email, }, @@ -63,26 +68,27 @@ const login = async (req, res, next) => { if (!user) { throw new UnauthenticatedError('Invalid Credentials'); - }; + } const isPasswordCorrect = await user.comparePassword(password); if (!isPasswordCorrect) { throw new UnauthenticatedError('Invalid Credentials'); - }; + } const token = await user.generateAuthToken(); - await user.save() + await user.save(); - res.status(StatusCodes.OK).json({ user: { name: user.parentName }, token }); + res + .status(StatusCodes.OK) + .json({ user: { name: user.parentName }, token }); } catch (error) { console.error('Login Error;', error); next(error); - }; + } }; - // Forgot Password Controller const forgotPassword = async (req, res) => { const { email } = req.body; @@ -107,20 +113,24 @@ const forgotPassword = async (req, res) => { from: process.env.EMAIL_USER, to: user.email, subject: 'Password reset', - text: `You requested a password reset. Please click on the following link to reset your password: ${resetUrl}` + text: `You requested a password reset. Please click on the following link to reset your password: ${resetUrl}`, }; - mg.messages.create(process.env.MAILGUN_DOMAIN, data) + mg.messages + .create(process.env.MAILGUN_DOMAIN, data) .then(() => { - res.status(StatusCodes.OK).json({ message: 'Password reset link sent to your email' }); + res + .status(StatusCodes.OK) + .json({ message: 'Password reset link sent to your email' }); }) - .catch(error => { + .catch((error) => { console.error('Error sending email:', error); - res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ message: 'Failed to send email' }); + res + .status(StatusCodes.INTERNAL_SERVER_ERROR) + .json({ message: 'Failed to send email' }); }); }; - const resetPassword = async (req, res) => { const { token } = req.params; const { password } = req.body; @@ -130,7 +140,7 @@ const resetPassword = async (req, res) => { try { decoded = jwt.verify(token, process.env.JWT_SECRET); } catch (err) { - throw new BadRequestError("Token is invalid or has expired"); + throw new BadRequestError('Token is invalid or has expired'); } // Find the user by ID @@ -145,31 +155,36 @@ const resetPassword = async (req, res) => { await user.save(); - res.status(StatusCodes.OK).json({ message: "Password has been reset successfully" }); + res + .status(StatusCodes.OK) + .json({ message: 'Password has been reset successfully' }); }; // Logout API const logout = async (req, res) => { - const { token } = req.user + const { token } = req.user; - const user = await User.findOne({ 'tokens.token' : token}) + const user = await User.findOne({ 'tokens.token': token }); if (!user) { - throw new UnauthenticatedError('Invalid Token') + throw new UnauthenticatedError('Invalid Token'); } - user.tokens = user.tokens.filter((userToken) => userToken.token !== token) + user.tokens = user.tokens.filter( + (userToken) => userToken.token !== token + ); await user.save(); - res.status(StatusCodes.OK).json({ message: 'Logged out successfully'}) -} - + res + .status(StatusCodes.OK) + .json({ message: 'Logged out successfully' }); +}; module.exports = { register, login, forgotPassword, resetPassword, - logout + logout, }; diff --git a/src/db/seeders/populateRequests.js b/src/db/seeders/populateRequests.js new file mode 100644 index 0000000..0c1e514 --- /dev/null +++ b/src/db/seeders/populateRequests.js @@ -0,0 +1,21 @@ +require('dotenv').config(); + +const connectDB = require('../conn'); +const RideRequest = require('../../models/requestModel'); + +const rideRequests = require('./testRequests.json'); + +const start = async () => { + try { + await connectDB(process.env.MONGO_URI); + await RideRequest.deleteMany(); + await RideRequest.create(rideRequests); + console.log('Success seeding ride requests database!!!!'); + process.exit(0); + } catch (error) { + console.log(error); + process.exit(1); + } +}; + +start(); diff --git a/src/db/seeders/populateUsers.js b/src/db/seeders/populateUsers.js new file mode 100644 index 0000000..2fcc1c6 --- /dev/null +++ b/src/db/seeders/populateUsers.js @@ -0,0 +1,21 @@ +require('dotenv').config(); + +const connectDB = require('../conn'); +const users = require('../../models/usersModel'); + +const testUsers = require('./testUsers.json'); + +const start = async () => { + try { + await connectDB(process.env.MONGO_URI); + await users.deleteMany(); + await users.create(testUsers); + console.log('Success seeding users database!!!!'); + process.exit(0); + } catch (error) { + console.error(error); + process.exit(1); + } +}; + +start(); diff --git a/src/db/seeders/testRequests.json b/src/db/seeders/testRequests.json new file mode 100644 index 0000000..ab07a9d --- /dev/null +++ b/src/db/seeders/testRequests.json @@ -0,0 +1,87 @@ +[ + { + "requester": "66da634df62f6553ab5c19bc", + "profile": "66da634df62f6553ab5c19c3", + "requestedPickUpDays": ["Tuesday", "Thursday", "Friday"], + "status": "pending" + }, + { + "requester": "66da634df62f6553ab5c19c3", + "profile": "66da634df62f6553ab5c19cc", + "requestedDropOffDays": ["Monday", "Wednesday", "Friday"], + "requestedPickUpDays": ["Monday", "Wednesday", "Friday"], + "status": "approved" + }, + { + "requester": "66da634df62f6553ab5c19cc", + "profile": "66da634df62f6553ab5c19c3", + "requestedDropOffDays": ["Thursday"], + "requestedPickUpDays": ["Tuesday", "Thursday"], + "status": "approved" + }, + { + "requester": "66da634df62f6553ab5c19c2", + "profile": "66da634df62f6553ab5c19c4", + "requestedDropOffDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "status": "approved" + }, + { + "requester": "66da634df62f6553ab5c19c4", + "profile": "66da634df62f6553ab5c19c2", + "requestedPickUpDays": ["Monday", "Tuesday", "Friday"], + "status": "pending" + }, + { + "requester": "66da634df62f6553ab5c19cd", + "profile": "66da634df62f6553ab5c19ce", + "requestedDropOffDays": ["Tuesday", "Thursday"], + "requestedPickUpDays": ["Tuesday", "Thursday"], + "status": "pending" + }, + { + "requester": "66da634df62f6553ab5c19cf", + "profile": "66da634df62f6553ab5c19bc", + "requestedDropOffDays": ["Monday", "Tuesday", "Thursday"], + "requestedPickUpDays": ["Monday"], + "status": "declined" + }, + { + "requester": "66da634df62f6553ab5c19bd", + "profile": "66da634df62f6553ab5c19c7", + "requestedPickUpDays": ["Wednesday"], + "status": "pending" + }, + { + "requester": "66da634df62f6553ab5c19c8", + "profile": "66da634df62f6553ab5c19d2", + "requestedDropOffDays": ["Monday", "Friday"], + "requestedPickUpDays": ["Monday", "Thursday"], + "status": "approved" + }, + { + "requester": "66da634df62f6553ab5c19c8", + "profile": "66da634df62f6553ab5c19d6", + "requestedDropOffDays": ["Wednesday"], + "requestedPickUpDays": ["Wednesday"], + "status": "approved" + }, + { + "requester": "66da634df62f6553ab5c19c8", + "profile": "66da634df62f6553ab5c19eb", + "requestedDropOffDays": ["Friday"], + "requestedPickUpDays": ["Thursday"], + "status": "declined" + }, + { + "requester": "66da634df62f6553ab5c19d6", + "profile": "66da634df62f6553ab5c19eb", + "requestedDropOffDays": ["Friday"], + "status": "approved" + }, + { + "requester": "66da634df62f6553ab5c19e2", + "profile": "66da634df62f6553ab5c19ca", + "requestedPickUpDays": ["Monday", "Friday"], + "status": "approved" + } +] \ No newline at end of file diff --git a/src/db/seeders/testUsers.json b/src/db/seeders/testUsers.json new file mode 100644 index 0000000..acc73cd --- /dev/null +++ b/src/db/seeders/testUsers.json @@ -0,0 +1,410 @@ +[ + { + "parentName": "Olaf", + "email": "count.olaf@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "availablePickUpDays": ["Monday", "Wednesday"], + "neighborhood": "French Quarter", + "childrenNames": ["Sunny Baudelaire", "Violet Baudelaire", "Klaus Baudelaire"] + }, + { + "parentName": "Drew Pickles", + "email": "drew.pickles@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": ["Monday", "Tuesday", "Wednesday", "Thursday" ], + "availablePickUpDays": [], + "neighborhood": "Toluca Lake", + "childrenNames": ["Angelica Pickles"] + }, + { + "parentName": "Hal Wilkerson", + "email": "hal.wilkerson@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": [], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "neighborhood": "Northridge", + "childrenNames": ["Malcolm", "Reese", "Dewey"] + }, + { + "parentName": "David Read", + "email": "david.read@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Monday", "Tuesday", "Wednesday"], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday"], + "neighborhood": "Elwood City", + "childrenNames": ["Arthur Read", "D.W. Read"] + }, + { + "parentName": "Delia Ketchum", + "email": "delia.ketchum@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": [], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday"], + "neighborhood": "Pallet Town", + "childrenNames": ["Ash Ketchum"] + }, + { + "parentName": "Phil Funnie", + "email": "phil.funnie@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 2, + "availableDropOffDays": [], + "availablePickUpDays": ["Thursday", "Friday"], + "neighborhood": "Bluffington", + "childrenNames": ["Doug Funnie", "Judy Funnie"] + }, + { + "parentName": "Judy Neutron", + "email": "judy.neutron@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Wednesday"], + "availablePickUpDays": ["Monday", "Tuesday", "Friday"], + "neighborhood": "Retroville", + "childrenNames": ["Jimmy Neutron"] + }, + { + "parentName": "Wilma Flintstone", + "email": "wilma.flintstone@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 5, + "availableDropOffDays": ["Thursday", "Friday"], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "neighborhood": "Bedrock", + "childrenNames": ["Pebbles Flintstone"] + }, + { + "parentName": "George Jetson", + "email": "george.jetson@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "availablePickUpDays": [], + "neighborhood": "Orbit City", + "childrenNames": ["Elroy Jetson", "Judy Jetson"] + }, + { + "parentName": "Ellen Talbot", + "email": "ellen.talbot@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 6, + "availableDropOffDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "availablePickUpDays": [], + "neighborhood": "Oakdale" + }, + { + "parentName": "Caroline Ingalls", + "email": "caroline.ingalls@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 4, + "availableDropOffDays": [], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "neighborhood": "Walnut Grove", + "childrenNames": ["Laura Ingalls", "Mary Ingalls"] + }, + { + "parentName": "Nani Pelekai", + "email": "nani.pelekai@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": [], + "availablePickUpDays": [], + "neighborhood": "Kokaua", + "childrenNames": ["Lilo Pelekai"] + }, + { + "parentName": "Arthur Weasley", + "email": "arthur.weasley@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 12, + "availableDropOffDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "availablePickUpDays": [], + "neighborhood": "Ottery St. Catchpole", + "childrenNames": ["Percy Weasley", "Fred Weasley", "George Weasley", "Ron Weasley"] + }, + { + "parentName": "Mary Poppins", + "email": "mary.poppins@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": [], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "neighborhood": "Kensington", + "childrenNames": ["Jane Banks", "Michael Banks"] + }, + { + "parentName": "Charlie Jones", + "email": "charlie.jones@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": ["Tuesday", "Wednesday", "Thursday", "Friday"], + "availablePickUpDays": ["Tuesday", "Wednesday", "Thursday", "Friday"], + "neighborhood": "Sellwood-Moreland", + "childrenNames": "Caroline Jones" + }, + { + "parentName": "Betty Rubble", + "email": "betty.rubble@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": ["Tuesday", "Thursday"], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "neighborhood": "Bedrock", + "childrenNames": ["Bamm-Bamm Rubble"] + }, + { + "parentName": "Elizabeth Brewer", + "email": "elizabeth.brewer@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": [], + "availablePickUpDays": [], + "neighborhood": "Stoneybrook", + "childrenNames": ["Kristy Thomas", "David Michael Thomas"] + }, + { + "parentName": "Richard Spier", + "email": "richard.spier@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 2, + "availableDropOffDays": ["Tuesday", "Wednesday", "Thursday", "Friday"], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday", "Thursday"], + "neighborhood": "Stoneybrook", + "childrenNames": ["Mary Anne Spier"] + }, + { + "parentName": "Narcissa Malfoy", + "email": "narcissa.malfoy@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 2, + "availableDropOffDays": ["Wednesday"], + "availablePickUpDays": ["Friday"], + "neighborhood": "Wiltshire", + "childrenNames": ["Draco Malfoy"] + }, + { + "parentName": "June Cleaver", + "email": "june.cleaver@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "neighborhood": "Mayfield", + "childrenNames": ["Wally Cleaver", "Theodore 'Beaver' Cleaver"] + }, + { + "parentName": "Bitzi Baxter", + "email": "bitzi.baxter@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 2, + "availableDropOffDays": ["Monday", "Tuesday"], + "availablePickUpDays": [], + "neighborhood": "Elwood City", + "childrenNames": ["Buster Baxter"] + }, + { + "parentName": "Hilda/Zelda Spellman", + "email": "hilda.spellman@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 13, + "availableDropOffDays": ["Monday", "Wednesday", "Friday"], + "availablePickUpDays": ["Monday", "Thursday"], + "neighborhood": "Westbridge", + "childrenNames": ["Sabrina Spellman"] + }, + { + "parentName": "Josephine Rabbit", + "email": "josephine.rabbit@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 4, + "availableDropOffDays": ["Monday", "Friday"], + "availablePickUpDays": ["Wednesday", "Thursday"], + "neighborhood": "Lake District", + "childrenNames": ["Peter Rabbit", "Flopsy Rabbit", "Mopsy Rabbit", "Cotton-Tail Rabbit"] + }, + { + "parentName": "Chas Finster", + "email": "chas.finster@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 2, + "availableDropOffDays": ["Tuesday"], + "availablePickUpDays": ["Friday"], + "neighborhood": "Toluca Lake", + "childrenNames": ["Chuckie Finster"] + }, + { + "parentName": "Opal Otter", + "email": "opal.otter@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Wednesday"], + "availablePickUpDays": ["Wednesday"], + "neighborhood": "Lake Hoohaw" + }, + { + "parentName": "Oliver Frensky", + "email": "oliver.frensky@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Monday", "Thursday"], + "availablePickUpDays": ["Tuesday", "Thursday"], + "neighborhood": "Elwood City", + "childrenNames": ["Francine Frensky", "Catherine Frensky"] + }, + { + "parentName": "Morticia Addams", + "email": "morticia.addams@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Friday"], + "availablePickUpDays": ["Friday"], + "neighborhood": "Sleepy Hallow", + "childrenNames": ["Wednesday Addams", "Pugsley Addams"] + }, + { + "parentName": "Petunia Dursley", + "email": "petunia.dursley@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": ["Monday", "Wednesday"], + "availablePickUpDays": ["Tuesday", "Thursday"], + "neighborhood": "Little Whinging", + "childrenNames": ["Dudley Dursley"] + }, + { + "parentName": "Danny Tanner", + "email": "danny.tanner@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Thursday"], + "availablePickUpDays": ["Thursday"], + "neighborhood": "Alamo Square", + "childrenNames": ["D.J. Tanner", "Stephanie Tanner", "Michelle Tanner"] + }, + { + "parentName": "Bob Belcher", + "email": "bob.belcher@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Wednesday", "Friday"], + "availablePickUpDays": ["Monday"], + "neighborhood": "Asbury Park", + "childrenNames": ["Tina Belcher", "Gene Belcher", "Louise Belcher"] + }, + { + "parentName": "Miriam Pataki", + "email": "miriam.pataki@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 4, + "availableDropOffDays": ["Tuesday", "Friday"], + "availablePickUpDays": ["Monday", "Thursday"], + "neighborhood": "Corktown", + "childrenNames": ["Helga Pataki"] + }, + { + "parentName": "Chilli(Bandit) Heeler", + "email": "chilli.heeler@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Wednesday"], + "availablePickUpDays": ["Tuesday", "Thursday"], + "neighborhood": "Paddington", + "childrenNames": ["Bluey Heeler", "Bingo Heeler"] + }, + { + "parentName": "Cpt. Ralph Crewe", + "email": "ralph.crewe@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Thursday"], + "availablePickUpDays": ["Wednesday"], + "neighborhood": "Kensington", + "childrenNames": ["Sara Crewe"] + }, + { + "parentName": "Martha Merriman", + "email": "martha.merriman@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": ["Monday", "Wednesday"], + "availablePickUpDays": ["Thursday"], + "neighborhood": "Williamsburg", + "childrenNames": ["Felicity Merriman"] + }, + { + "parentName": "Tatsuo Kusakabe", + "email": "tatsuo.kusakabe@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 2, + "availableDropOffDays": ["Monday", "Wednesday"], + "availablePickUpDays": ["Thursday"], + "neighborhood": "Tokigawa", + "childrenNames": ["Satsuki Kusakabe", "Mei Kusakabe"] + }, + { + "parentName": "Marilla & Matthew Cuthbert", + "email": "matthew.cuthbert@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 4, + "availableDropOffDays": ["Tuesday", "Friday"], + "availablePickUpDays": ["Wednesday"], + "neighborhood": "Avonlea", + "childrenNames": ["Anne Shirley"] + }, + { + "parentName": "Eleanor Little", + "email": "eleanor.little@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 2, + "availableDropOffDays": ["Monday", "Thursday"], + "availablePickUpDays": ["Wednesday"], + "neighborhood": "Upper West Side", + "childrenNames": ["Stuart Little", "George Little"] + }, + { + "parentName": "Ray Rocket", + "email": "ray.rocket@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Wednesday", "Friday"], + "availablePickUpDays": ["Thursday"], + "neighborhood": "Ocean Shores", + "childrenNames": ["Reggie Rocket", "Otto Rocket"] + }, + { + "parentName": "Lois Foutley", + "email": "lois.foutley@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 1, + "availableDropOffDays": ["Thursday"], + "availablePickUpDays": ["Friday"], + "neighborhood": "Shelterville", + "childrenNames": ["Ginger Foutley", "Carl Foutley"] + }, + { + "parentName": "Oliver Warbucks", + "email": "oliver.warbucks@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 4, + "availableDropOffDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "availablePickUpDays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], + "neighborhood": "Upper East Side", + "childrenNames": ["Annie"] + }, + { + "parentName": "Jill Taylor", + "email": "jill.taylor@testmail.com", + "password": "secret", + "numberOfSeatsInCar": 3, + "availableDropOffDays": [], + "availablePickUpDays": ["Tuesday", "Wednesday", "Thursday"], + "neighborhood": "Grosse Pointe", + "childrenNames": ["Brad Taylor", "Randy Taylor", "Mark Taylor"] + } +] \ No newline at end of file diff --git a/src/test/authController.test.js b/src/test/authController.test.js index eb83a47..1be5284 100644 --- a/src/test/authController.test.js +++ b/src/test/authController.test.js @@ -24,7 +24,10 @@ async function cleanupTestUsers() { } describe('Authentication Controller', function () { + this.timeout(15000); + before(async () => { + this.timeout(15000); await connectDB(); await cleanupTestUsers(); }); diff --git a/src/test/requestController.test.js b/src/test/requestController.test.js new file mode 100644 index 0000000..6cede56 --- /dev/null +++ b/src/test/requestController.test.js @@ -0,0 +1,148 @@ +const chai = require('chai'); +const chaiHttp = require('chai-http'); +const app = require('../app'); +const mongoose = require('mongoose'); +const User = require('../models/usersModel'); +const RideRequest = require('../models/requestModel'); + +chai.use(chaiHttp); +chai.should(); + +async function connectDB() { + const uri = process.env.MONGO_URI; + await mongoose.connect(uri, { + useNewUrlParser: true, + useUnifiedTopology: true, + }); +} + +async function disconnectDB() { + await mongoose.connection.close(); +} + +async function cleanupTestRequests() { + await RideRequest.deleteMany({ + pickupLocation: { $regex: /Test St/ }, + }); + await RideRequest.deleteMany({ + dropoffLocation: { $regex: /Test St/ }, + }); +} + +describe('Ride Request Controller', function () { + this.timeout(15000); + + before(async function () { + await connectDB(); + await cleanupTestRequests(); + }); + + after(async () => { + await cleanupTestRequests(); + await disconnectDB(); + }); + + describe('POST /api/v1/requests', function () { + it('should create a new ride request', async function () { + const requesterRes = await chai + .request(app) + .post('/api/v1/auth/register') + .send({ + parentName: 'Test Requester', + email: 'test.requester@test.com', + password: 'secret', + }); + + // console.log('Requester Response:', requesterRes.body); + + const token = requesterRes.body.token; + const requesterId = requesterRes.body.user._id.toString(); + + // requesterId.should.not.be.undefined; + + const profile = await User.create({ + parentName: 'Test Profile', + email: 'test.profile@test.com', + password: 'secret', + }); + + const res = await chai + .request(app) + .post('/api/v1/requests') + .set('Authorization', `Bearer ${token}`) + .send({ + requester: requesterId, + profile: profile._id, + requestedDropOffDays: ['Monday', 'Wednesday', 'Friday'], + requestedPickUpDays: ['Tuesday', 'Thursday'], + }); + + // console.log('Ride request response body:', res.body); + + res.should.have.status(201); + res.body.should.be.an('object'); + res.body.should.have.property('rideRequest'); + res.body.rideRequest.should.have + .property('requester') + .eql(requesterId); + res.body.rideRequest.should.have + .property('profile') + .eql(profile._id.toString()); + res.body.rideRequest.should.have + .property('requestedDropOffDays') + .eql(['Monday', 'Wednesday', 'Friday']); + res.body.rideRequest.should.have + .property('requestedPickUpDays') + .eql(['Tuesday', 'Thursday']); + }); + }); + + // describe('GET /api/v1/requests/:id', function () { + // it('should get a ride request by ID', async function () { + // const requesterRes = await chai + // .request(app) + // .post('/api/v1/auth/register') + // .send({ + // parentName: 'Test Requester', + // email: 'test.requester@test.com', + // password: 'secret', + // }); + + // console.log('Requester response', requesterRes.body); + + // const token = requesterRes.body.token; + // const requesterId = requesterRes.body.user._id.toString(); + + // const profile = await User.create({ + // parentName: 'Test Profile', + // email: 'test.profile@test.com', + // password: 'secret', + // }); + + // const createRequestRes = await chai + // .request(app) + // .post('/api/v1/requests') + // .set('Authorization', `Bearer {token}`) + // .send({ + // requester: requesterId, + // profile: profile._id, + // requestedDropOffDays: ['Monday', 'Wednesday', 'Friday'], + // requestedPickUpDays: ['Tuesday', 'Thursday'], + // }); + + // console.log( + // 'Ride request creation response:', + // createRequestRes.body + // ); + + // const rideRequestId = createRequestRes.body.rideRequest._id; + + // const res = await chai + // .request(app) + // .get(`/api/v1/requests/${rideRequestId}`) + // .set('Authorization', `Bearer ${token}`); + + // console.log('Ride request response body:', res.body); + // }); + // }); +});