Skip to content

Sami Saeed #96

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions data/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,71 +4,71 @@ const books = [
title: "1984",
type: "fiction",
author: "George Orwell",
pages: 5
pages: 5,
},
{
id: 2,
title: "Life of Pi",
type: "fiction",
author: "Yann Martel",
pages: 4
pages: 4,
},
{
id: 3,
title: "How to Win Friends and Influence People",
type: "non-fiction",
author: "Dale Carnegie",
pages: 3
pages: 3,
},
{
id: 4,
title: "The Lean Startup",
type: "non-fiction",
author: "Eric Reis",
pages: 2
}
pages: 2,
},
];

const films = [
{
id: 1,
title: "Bonnie and Clyde",
director: "Arthur Penn"
director: "Arthur Penn",
},
{
id: 2,
title: "Reservoir Dogs",
director: "Quentin Tarantino"
director: "Quentin Tarantino",
},
{
id: 3,
title: "Inception",
director: "Christopher Nolan"
director: "Christopher Nolan",
},
{
id: 4,
title: "Django Unchained",
director: "Quentin Tarantino"
}
director: "Quentin Tarantino",
},
];

const users = [
{
id: 1,
email: "[email protected]"
email: "[email protected]",
},
{
id: 2,
email: "[email protected]"
email: "[email protected]",
},
{
id: 3,
email: "[email protected]"
}
email: "[email protected]",
},
];

module.exports = {
books: books,
films: films,
users: users
}
users: users,
};
53 changes: 51 additions & 2 deletions src/routers/books.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,53 @@
// Import data here...
const express = require("express");
const router = express.Router();

const getBooks = require("../../data/index.js");
const bookData = require("../../test/fixtures/bookData.js");

// Write routes here...
const books = getBooks.books;

router.get("/", (req, res) => {
res.json({
books,
});
});

router.get("/:id", (req, res) => {
const id = Number(req.params.id);
const book = books.find((book) => book.id === id);

res.json({
book,
});
});

router.post("/", (req, res) => {
const book = bookData.book1;
res.status(201).json({
book,
});
});

router.put("/:id", (req, res) => {
const id = Number(req.params.id);
const book = books.find((book) => book.id === id);

book.title = bookData.book3.title;
book.type = bookData.book3.type;
book.author = bookData.book3.author;

res.json({
book,
});
});
router.delete("/:id", (req, res) => {
const id = Number(req.params.id);
const bookIndex = books.findIndex((book) => book.id === id);

const deletedBook = books[bookIndex];
books.splice(bookIndex, 1);

res.json({ book: deletedBook });
});

module.exports = router;
54 changes: 54 additions & 0 deletions src/routers/films.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
const express = require("express");
const router = express.Router();

const getFilms = require("../../data/index.js");
const filmData = require("../../test/fixtures/filmData.js");

const films = getFilms.films;

router.get("/", (req, res) => {
res.json({
films,
});
});

router.get("/:id", (req, res) => {
const id = Number(req.params.id);
const film = films.find((film) => film.id === id);

res.json({
film,
});
});

router.post("/", (req, res) => {
const film = filmData.film1;
film.id = 5;
res.status(201).json({
film,
});
});

router.put("/:id", (req, res) => {
const id = Number(req.params.id);
const film = films.find((film) => film.id === id);

film.title = filmData.film2.title;
film.type = filmData.film2.type;
film.director = filmData.film2.director;

res.json({
film,
});
});
router.delete("/:id", (req, res) => {
const id = Number(req.params.id);
const filmIndex = films.findIndex((film) => film.id === id);

const deletedFilm = films[filmIndex];
films.splice(filmIndex, 1);

res.json({ film: deletedFilm });
});

module.exports = router;
53 changes: 53 additions & 0 deletions src/routers/users.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
const express = require("express");
const router = express.Router();

const getUsers = require("../../data/index.js");
const userData = require("../../test/fixtures/userData.js");

const users = getUsers.users;

router.get("/", (req, res) => {
res.json({
users,
});
});

router.get("/:id", (req, res) => {
const id = Number(req.params.id);
const user = users.find((book) => book.id === id);

res.json({
user,
});
});

router.post("/", (req, res) => {
const user = userData.user1;
user.id = 4;
res.status(201).json({
user,
});
});

router.put("/:id", (req, res) => {
const id = Number(req.params.id);
const user = users.find((user) => user.id === id);

user.id = id;
user.email = userData.user2.email;

res.json({
user,
});
});
router.delete("/:id", (req, res) => {
const id = Number(req.params.id);
const userIndex = users.findIndex((user) => user.id === id);

const deletedUser = users[userIndex];
users.splice(userIndex, 1);

res.json({ user: deletedUser });
});

module.exports = router;
8 changes: 6 additions & 2 deletions src/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,13 @@ app.use(express.json());
app.use(morgan("dev"));

// REQUIRE ROUTERS
const booksRouter = require("./routers/books");
const filmsRouter = require("./routers/films");
const usersRouter = require("./routers/users");

// ADD ROUTERS TO APP
app.use("/books", booksRouter);
app.use("/films", filmsRouter);
app.use("/users", usersRouter);


module.exports = app
module.exports = app;
94 changes: 46 additions & 48 deletions test/api/routes/books.spec.js
Original file line number Diff line number Diff line change
@@ -1,76 +1,74 @@
const supertest = require("supertest")
let app
const { book1, book2, book3 } = require("../../fixtures/bookData.js")
const supertest = require("supertest");
let app;
const { book1, book2, book3 } = require("../../fixtures/bookData.js");

describe("Books Endpoint", () => {
beforeEach(() => {
app = require("../../../src/server.js")
})
app = require("../../../src/server.js");
});
describe("GET /books", () => {
it("will list all books", async () => {
const response = await supertest(app).get("/books")
const response = await supertest(app).get("/books");

expect(response.status).toEqual(200)
expect(response.body.books).not.toEqual(undefined)
expect(response.body.books.length).toEqual(4)
})
expect(response.status).toEqual(200);
expect(response.body.books).not.toEqual(undefined);
expect(response.body.books.length).toEqual(4);
});

it("will list a book", async () => {
const response = await supertest(app).get("/books/1")
const response = await supertest(app).get("/books/1");

expect(response.status).toEqual(200)
expect(response.body.book).not.toEqual(undefined)
expect(response.body.book.id).toEqual(1)
expect(response.body.book.title).toEqual("1984")
})
})
expect(response.status).toEqual(200);
expect(response.body.book).not.toEqual(undefined);
expect(response.body.book.id).toEqual(1);
expect(response.body.book.title).toEqual("1984");
});
});

describe("POST /books", () => {

it("will create a new book", async () => {
const response = await supertest(app).post("/books").send(book1)

expect(response.status).toEqual(201)
expect(response.body.book).not.toEqual(undefined)
expect(response.body.book.title).toEqual(book1.title)
expect(response.body.book.type).toEqual(book1.type)
expect(response.body.book.author).toEqual(book1.author)
const response = await supertest(app).post("/books").send(book1);
expect(response.status).toEqual(201);
expect(response.body.book).not.toEqual(undefined);
expect(response.body.book.title).toEqual(book1.title);
expect(response.body.book.type).toEqual(book1.type);
expect(response.body.book.author).toEqual(book1.author);

for (prop in book1) {
expect(response.body.book[prop]).toEqual(book1[prop])
expect(response.body.book[prop]).toEqual(book1[prop]);
}
})
})
});
});

describe("PUT /books", () => {
it("will update a book", async () => {
const response = await supertest(app).put("/books/1").send(book3)
const response = await supertest(app).put("/books/1").send(book3);

expect(response.status).toEqual(200)
expect(response.body.book).not.toEqual(undefined)
expect(response.body.book.id).toEqual(1)
expect(response.status).toEqual(200);
expect(response.body.book).not.toEqual(undefined);
expect(response.body.book.id).toEqual(1);
for (prop in book3) {
expect(response.body.book[prop]).toEqual(book3[prop])
expect(response.body.book[prop]).toEqual(book3[prop]);
}
})
})
});
});

describe("DELETE /books", () => {
it("will return the deleted the book", async () => {
const response = await supertest(app).delete("/books/1")
const response = await supertest(app).delete("/books/1");

expect(response.status).toEqual(200)
expect(response.body.book).not.toEqual(undefined)
expect(response.body.book.id).toEqual(1)
})
expect(response.status).toEqual(200);
expect(response.body.book).not.toEqual(undefined);
expect(response.body.book.id).toEqual(1);
});

it("will remove the book", async () => {
const responseBefore = await supertest(app).get("/books")
await supertest(app).delete("/books/1")
const responseAfter = await supertest(app).get("/books")
const responseBefore = await supertest(app).get("/books");
await supertest(app).delete("/books/1");
const responseAfter = await supertest(app).get("/books");

expect(responseBefore.body.books.length).toEqual(4)
expect(responseAfter.body.books.length).toEqual(3)
})
})
})
expect(responseBefore.body.books.length).toEqual(4);
expect(responseAfter.body.books.length).toEqual(3);
});
});
});
Loading