Skip to content

Commit

Permalink
feature(request):set route to search requests
Browse files Browse the repository at this point in the history
[Starts #167727650]
  • Loading branch information
ChidozieGabriel committed Sep 3, 2019
1 parent 4eb0b45 commit dbcf4c9
Show file tree
Hide file tree
Showing 4 changed files with 308 additions and 0 deletions.
46 changes: 46 additions & 0 deletions src/controllers/RequestController.js
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,52 @@ class RequestController {
return HelperMethods.serverError(res);
}
}

/**
* Search Requests
* Route: GET: /request/search
* @param {object} req - HTTP Request object
* @param {object} res - HTTP Response object
* @return {res} res - HTTP Response object
* @memberof RequestController
*/
static async searchRequests(req, res) {
try {
const {
id, origin, destination, flightDate, returnDate, reason, userId, status
} = req.query;

const query = {
id, origin, destination, flightDate, returnDate, reason, userId, status
};

const validQuery = {};
Object.entries(query).forEach(([key, value]) => {
if (value) validQuery[key] = value;
});

if (Object.keys(validQuery).length === 0) {
return HelperMethods.clientError(
res,
'Invalid search query.',
400
);
}

const requests = await Request.findAll({ where: validQuery });
HelperMethods.requestSuccessful(
res,
{
success: true,
message: 'Search successful',
searchResults: requests.map(request => request.get())
},
200
);
} catch (error) {
return HelperMethods.serverError(res);
}
}
}

export default RequestController;
7 changes: 7 additions & 0 deletions src/models/User.js
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,13 @@ export default (sequelize, DataTypes) => {
user.password = await CryptData.encryptData(user.password);
});

User.associate = models => {
User.hasMany(models.Request, {
foreignKey: 'userId',
onDelete: 'CASCADE'
});
};

// eslint-disable-next-line func-names
User.prototype.verifyPassword = async function (clearPassword) {
const isPasswordCorrect = await CryptData
Expand Down
6 changes: 6 additions & 0 deletions src/routes/requestRoute.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ const requestRoutes = app => {
Authorization.confirmRole,
RequestController.rejectRequest
);

app.get(
'/api/v1/request/search',
Authorization.checkToken,
RequestController.searchRequests
);
};

export default requestRoutes;
249 changes: 249 additions & 0 deletions src/test/integrationTests/requestController.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -312,4 +312,253 @@ describe('Integration tests for the request controller', () => {
expect(response.body.success).to.equal(false);
});
});

describe('Search functionality tests', () => {
it('should search request id', async () => {
const query = {
id: '8bda0fe3-a55a-4fd9-914d-9d93b53491b6'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.equal(200);
expect(response.body.data).to.have.property('message');
expect(response.body.data.message).to.equal('Search successful');
expect(response.body.data).to.have.property('searchResults');
expect(response.body.data.searchResults)
.to.be.an('array')
.that.has.length.greaterThan(0);
expect(response.body.data.searchResults).to.satisfy(
() => request => request.id === query.id
);
expect(response.body.data).to.have.property('success');
expect(response.body.data.success).to.equal(true);
});
it('should search request reason', async () => {
const query = {
reason: 'BUSINESS'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.equal(200);
expect(response.body.data).to.have.property('message');
expect(response.body.data.message).to.equal('Search successful');
expect(response.body.data).to.have.property('searchResults');
expect(response.body.data.searchResults).to.satisfy(
() => request => request.reason === query.reason
);
expect(response.body.data).to.have.property('success');
expect(response.body.data.success).to.equal(true);
});
it('should search request origin', async () => {
const query = {
origin: 'Yaba'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.equal(200);
expect(response.body.data).to.have.property('message');
expect(response.body.data.message).to.equal('Search successful');
expect(response.body.data).to.have.property('searchResults');
expect(response.body.data.searchResults)
.to.be.an('array')
.that.has.length.greaterThan(0);
expect(response.body.data.searchResults).to.satisfy(
() => request => request.origin === query.origin
);
expect(response.body.data).to.have.property('success');
expect(response.body.data.success).to.equal(true);
});
it('should search request destination', async () => {
const query = {
destination: 'Surulere'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.equal(200);
expect(response.body.data).to.have.property('message');
expect(response.body.data.message).to.equal('Search successful');
expect(response.body.data).to.have.property('searchResults');
expect(response.body.data.searchResults)
.to.be.an('array')
.that.has.length.greaterThan(0);
expect(response.body.data.searchResults).to.satisfy(
() => request => request.destination === query.destination
);
expect(response.body.data).to.have.property('success');
expect(response.body.data.success).to.equal(true);
});
it('should search request flightDate', async () => {
const query = {
flightDate: '2019-06-21'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.equal(200);
expect(response.body.data).to.have.property('message');
expect(response.body.data.message).to.equal('Search successful');
expect(response.body.data).to.have.property('searchResults');
expect(response.body.data.searchResults)
.to.be.an('array')
.that.has.length.greaterThan(0);
expect(response.body.data.searchResults).to.satisfy(
() => request => request.flightDate === query.flightDate
);
expect(response.body.data).to.have.property('success');
expect(response.body.data.success).to.equal(true);
});
it('should search request returnDate', async () => {
const query = {
returnDate: '2019-03-21'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.equal(200);
expect(response.body.data).to.have.property('message');
expect(response.body.data.message).to.equal('Search successful');
expect(response.body.data).to.have.property('searchResults');
expect(response.body.data.searchResults)
.to.be.an('array')
.that.has.length.greaterThan(0);
expect(response.body.data.searchResults).to.satisfy(
() => request => request.returnDate === query.returnDate
);
expect(response.body.data).to.have.property('success');
expect(response.body.data.success).to.equal(true);
});
it('should search request by owner', async () => {
const query = {
userId: '96dc6b6d-7a77-4322-8756-e22f181d952c'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.equal(200);
expect(response.body.data).to.have.property('message');
expect(response.body.data.message).to.equal('Search successful');
expect(response.body.data).to.have.property('searchResults');
expect(response.body.data.searchResults)
.to.be.an('array')
.that.has.length.greaterThan(0);
expect(response.body.data.searchResults).to.satisfy(
() => request => request.userId === query.userId
);
expect(response.body.data).to.have.property('success');
expect(response.body.data.success).to.equal(true);
});
it('should search request by status', async () => {
const query = {
status: 'open'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.equal(200);
expect(response.body.data).to.have.property('message');
expect(response.body.data.message).to.equal('Search successful');
expect(response.body.data).to.have.property('searchResults');
expect(response.body.data.searchResults)
.to.be.an('array')
.that.has.length.greaterThan(0);
expect(response.body.data.searchResults).to.satisfy(
() => request => request.status === query.status
);
expect(response.body.data).to.have.property('success');
expect(response.body.data.success).to.equal(true);
});
it('should search request with multiple search', async () => {
const query = {
origin: 'Ikeja',
destination: 'Surulere',
reason: 'BUSINESS',
returnDate: '2019-03-21',
status: 'approved'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.equal(200);
expect(response.body.data).to.have.property('message');
expect(response.body.data.message).to.equal('Search successful');
expect(response.body.data).to.have.property('searchResults');
expect(response.body.data.searchResults)
.to.be.an('array')
.that.has.length.greaterThan(0);
expect(response.body.data.searchResults).to.satisfy(
() => request => request.origin === query.origin
&& request.destination === query.destination
&& request.reason === query.reason
&& request.returnDate === query.returnDate
&& request.status === query.status
);
expect(response.body.data).to.have.property('success');
expect(response.body.data.success).to.equal(true);
});
it('should return client error 401 when token is missing', async () => {
const query = {
origin: 'Ikeja',
destination: 'Surulere',
reason: 'BUSINESS',
returnDate: '2019-03-21'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.query(query);
expect(response.status).to.deep.equal(401);
expect(response.body).to.have.property('success');
expect(response.body.success).to.equal(false);
expect(response.body).to.have.property('message');
});
it('should return client error 400 when query has no valid property', async () => {
const query = {
invalid: 'invalid'
};

const response = await chai
.request(app)
.get('/api/v1/request/search')
.set('x-access-token', token)
.query(query);
expect(response.status).to.deep.equal(400);
expect(response.body).to.have.property('success');
expect(response.body.success).to.equal(false);
expect(response.body).to.have.property('message');
expect(response.body.message).to
.equal('Invalid search query.');
});
});
});

0 comments on commit dbcf4c9

Please sign in to comment.