We are doing three things for this part: (1) finish coding the REST api (2) Debug with Fiddler (3) Write
Frisby test against our API.
Finishing the REST api is the easy part. Make a folder with the path
api/v1/ inside the
routes folder. Inside the api folder is another folder called v1. I do this just out of habit. APIs
will change in even in a production environments. When that happens, I just add a v2 folder. It's just a cheap and easy way to future proof REST API endpoints.
After the folders, create a
posts.js file inside.
var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
// Get the model
var post = mongoose.model('Post');
// GET /api/v1/posts - GET ALL
router.get('/', function (req, res) {
post.find({}, function (err, posts) {
res.json(posts);
});
});
// GET /api/v1/posts/:post_id
router.get('/:post_id', function(req, res) {
post.findById(req.params.post_id, function(err, post) {
if (err) res.send(err);
res.json(post);
});
});
// POST /api/v1/posts
router.post('/', function(req, res) {
var newPost = new Post();
newPost.title = req.body.title;
newPost.body = req.body.body;
newPost.author = req.body.author;
newPost.published = req.body.published;
newPost.save(function(err) {
if (err) res.send(err);
res.json({ message: 'Post created!' });
});
});
// PUT /api/v1/posts
router.put('/', function(req, res) {
post.findById(req.params.post_id, function(err, post) {
if (err) res.send(err);
post.title = req.body.title;
post.body = req.body.body;
post.author = req.body.author;
post.published = req.body.published;
post.meta.favs = req.body.favs;
post.meta.dvotes = req.body.dvotes;
post.meta.uvotes = req.body.uvotes;
post.save(function(err) {
if (err) res.send(err);
res.json({ message: 'Post updated' });
});
});
});
// DELETE /api/v1/posts/:post_id
router.delete('/:post_id', function(req, res) {
post.findByIdAndRemove(req.params.post_id, function(err, post) {
if (err) res.send(err);
res.json({ message: 'Post deleted!' });
});
});
module.exports = router;
The whole thing should be fairly easy to figure out since this is the actual CRUD stuff.
Run the project and we should see our web page. Now we move to
Fiddler to see around our API. Remember, you can just
Postman instead of fiddler.
|
Start here: The Composer Tab in Fiddler |
After you've open Fiddler, just go to the composer tab and add the API url you're interested in. Don't forget the HTTP verb. Press the
Execute button on the top right to see the results.
You'll be able to go to the other tabs to see a lot of information.
The
Inspectors tab contents is what we are interested in. This is where we see what's inside the reply from our API (or lack thereof if that is what we are expecting).
And finally, tests for our REST API endpoints. I wanted to add tests for our API to ensure behavior and for regression. It just makes sure I don't break the API as we continue working on this little project of ours.
We will be using the Frisby framework. Frisby is made to test REST API on node.js projects.
So, we install Frisby. Open a terminal, navigate to the project folder and type in:
npm install -g --save frisby
That should install the latest frisby version and save it a dependency in our
package.json file. When frisby installed, create a folder named
spec and inside that another folder named
api. Inside these folders, a javascript file named
posts_spec.js.
var frisby = require('frisby');
var baseURL = 'http://localhost:1337/'; // just replace if on live server
frisby.create('Status 200 for GET /api/v1/posts is returned')
.get(baseURL + 'api/v1/posts')
.expectStatus(200)
.toss();
frisby.create('Status 200 for GET /api/v1/posts/:id')
.get(baseURL + 'api/v1/posts/5525f1e3f6a7f3a00b234a09')
.expectStatus(200)
.expectJSON({ 'author': 'jaypax' })
.toss();
Here we have two tests. Feel free to add more.
Now we just need to run it for which we need
jasmine-node.
npm install -g --save jasmine-node
After NPM is done, you should be able to run the command in your terminal:
jasmine-code spec/api/
|
Friby results after running the test |
By the way, you need the project to be running in order to run the test.
You basically have two terminals open: 1 terminal running the project and other terminal to run the test from.
Clone the code at the
github repo.