From 7175572069a497485c77403c25e6333108db9d9a Mon Sep 17 00:00:00 2001 From: sarah Date: Fri, 25 May 2018 15:19:49 -0400 Subject: [PATCH 1/5] Initial commit --- .gitignore | 25 +++ book_store.db | Bin 0 -> 8192 bytes pom.xml | 134 ++++++++++++++ projects-cli.json | 1 + src/main/java/com/pluralsight/Book.java | 51 ++++++ src/main/java/com/pluralsight/BookDAO.java | 93 ++++++++++ .../com/pluralsight/ControllerServlet.java | 119 ++++++++++++ .../java/com/pluralsight/DBConnection.java | 70 ++++++++ src/main/webapp/BookAdmin.jsp | 43 +++++ src/main/webapp/BookForm.jsp | 31 ++++ src/main/webapp/BookList.jsp | 41 +++++ src/main/webapp/WEB-INF/web.xml | 18 ++ src/main/webapp/css/style.css | 64 +++++++ .../pluralsight/module1/Module1_Task1_IT.java | 77 ++++++++ .../module1/Module1_Task2_and_3_IT.java | 79 ++++++++ .../pluralsight/module1/Module1_Task4_IT.java | 26 +++ .../pluralsight/module1/Module1_Task5_IT.java | 61 +++++++ .../pluralsight/module1/Module1_Task6_IT.java | 73 ++++++++ .../module1/Module1_Task7_and_8_IT.java | 109 +++++++++++ .../module2/Module2_Task11_thru_14_IT.java | 130 ++++++++++++++ .../module2/Module2_Task1_and_2_IT.java | 79 ++++++++ .../module2/Module2_Task3_thru_6_IT.java | 130 ++++++++++++++ .../module2/Module2_Task7_thru10_IT.java | 128 +++++++++++++ .../module3/Module3_Task1_thru_5_IT.java | 124 +++++++++++++ .../module3/Module3_Task6_and_7_IT.java | 88 +++++++++ .../module3/Module3_Task8_thru_11_IT.java | 169 ++++++++++++++++++ 26 files changed, 1963 insertions(+) create mode 100644 .gitignore create mode 100644 book_store.db create mode 100644 pom.xml create mode 100644 projects-cli.json create mode 100644 src/main/java/com/pluralsight/Book.java create mode 100644 src/main/java/com/pluralsight/BookDAO.java create mode 100644 src/main/java/com/pluralsight/ControllerServlet.java create mode 100644 src/main/java/com/pluralsight/DBConnection.java create mode 100644 src/main/webapp/BookAdmin.jsp create mode 100644 src/main/webapp/BookForm.jsp create mode 100644 src/main/webapp/BookList.jsp create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/css/style.css create mode 100644 src/test/java/com/pluralsight/module1/Module1_Task1_IT.java create mode 100644 src/test/java/com/pluralsight/module1/Module1_Task2_and_3_IT.java create mode 100644 src/test/java/com/pluralsight/module1/Module1_Task4_IT.java create mode 100644 src/test/java/com/pluralsight/module1/Module1_Task5_IT.java create mode 100644 src/test/java/com/pluralsight/module1/Module1_Task6_IT.java create mode 100644 src/test/java/com/pluralsight/module1/Module1_Task7_and_8_IT.java create mode 100644 src/test/java/com/pluralsight/module2/Module2_Task11_thru_14_IT.java create mode 100644 src/test/java/com/pluralsight/module2/Module2_Task1_and_2_IT.java create mode 100644 src/test/java/com/pluralsight/module2/Module2_Task3_thru_6_IT.java create mode 100644 src/test/java/com/pluralsight/module2/Module2_Task7_thru10_IT.java create mode 100644 src/test/java/com/pluralsight/module3/Module3_Task1_thru_5_IT.java create mode 100644 src/test/java/com/pluralsight/module3/Module3_Task6_and_7_IT.java create mode 100644 src/test/java/com/pluralsight/module3/Module3_Task8_thru_11_IT.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..7cd6a12e --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Eclipse +.classpath +.project +.settings/ + +# Server stuff +Servers/ + +# Intellij +.idea/ +*.iml +*.iws + +# Mac +.DS_Store + +# Maven +log/ +target/ + +# Default +/build/ +/target/ +/.metadata/ +/.recommenders/ diff --git a/book_store.db b/book_store.db new file mode 100644 index 0000000000000000000000000000000000000000..7ff26bcdb2cc2f134a102511432d63d2b67474f4 GIT binary patch literal 8192 zcmeI%!Ab%_7zglKbyUDGaLHTC9t-YONdOanwl{x7`>g!sz0o^eEkW zh2Ex-Qiu*6I`;pVkD2*1%Pha^bg%qK3A#&!5iL&O-%>(1z2mZ2B999RnD30TOK7XE@#vo>yO3E`FhF!0P}lP&Hw-a literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..17d420c6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,134 @@ + + 4.0.0 + com.pluralsight + bookstore + war + 1.0-SNAPSHOT + bookstore Maven Webapp + http://maven.apache.org + + + UTF-8 + UTF-8 + 1.8 + 1.8 + false + + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + javax.servlet.jsp + javax.servlet.jsp-api + 2.3.1 + provided + + + + + + javax.servlet + jstl + 1.2 + + + + javax.inject + javax.inject + 1 + + + + + + org.xerial + sqlite-jdbc + 3.21.0.1 + + + + + + junit + junit + 4.12 + test + + + net.sourceforge.htmlunit + htmlunit + 2.15 + test + + + org.mockito + mockito-core + 2.18.0 + + + + org.powermock + powermock-api-mockito2 + 2.0.0-beta.5 + + + org.powermock + powermock-module-junit4 + 2.0.0-beta.5 + + + + + + bookstore + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + 8080 + / + + + + + + + + integration + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.18.1 + + + + integration-test + verify + + + + + http://localhost:8080 + + + + + + + + + + + diff --git a/projects-cli.json b/projects-cli.json new file mode 100644 index 00000000..80d77fa6 --- /dev/null +++ b/projects-cli.json @@ -0,0 +1 @@ +{ "tagPattern": "_\\w+" } diff --git a/src/main/java/com/pluralsight/Book.java b/src/main/java/com/pluralsight/Book.java new file mode 100644 index 00000000..8896d317 --- /dev/null +++ b/src/main/java/com/pluralsight/Book.java @@ -0,0 +1,51 @@ +package com.pluralsight; + +public class Book { + int id; + String title; + String author; + float price; + + public Book(String title, String author, float price) { + this.title = title; + this.author = author; + this.price = price; + } + + public Book(int id, String title, String author, float price) { + this.id = id; + this.title = title; + this.author = author; + this.price = price; + } + + @Override + public String toString() { + return "(" + title + ", " + author + ", " + price + ")"; + } + + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getAuthor() { + return author; + } + public void setAuthor(String author) { + this.author = author; + } + public float getPrice() { + return price; + } + public void setPrice(float price) { + this.price = price; + } +} diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java new file mode 100644 index 00000000..6acd6b8f --- /dev/null +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -0,0 +1,93 @@ +package com.pluralsight; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import java.util.ArrayList; + +public class BookDAO { + private Connection jdbcConnection; + public BookDAO(Connection connection) + { + jdbcConnection = connection; + } + + public Book getBook(int id) { + Book book = null; + String sql = "SELECT * FROM book WHERE id = ?"; + + try { + PreparedStatement statement = jdbcConnection.prepareStatement(sql); + statement.setInt(1, id); + + ResultSet resultSet = statement.executeQuery(); + + if (resultSet.next()) { + String title = resultSet.getString("title"); + String author = resultSet.getString("author"); + float price = resultSet.getFloat("price"); + + book = new Book(id, title, author, price); + } + + resultSet.close(); + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + + return book; + } + + public ArrayList listAllBooks() { + ArrayList listBook = new ArrayList<>(); + + String sql = "SELECT * FROM book"; + + try { + Statement statement = jdbcConnection.createStatement(); + + ResultSet resultSet = statement.executeQuery(sql); + + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String title = resultSet.getString("title"); + String author = resultSet.getString("author"); + float price = resultSet.getFloat("price"); + + Book book = new Book(id, title, author, price); + listBook.add(book); + } + + resultSet.close(); + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + return listBook; + } + + public boolean insertBook(Book book) { + String sql = "INSERT INTO book (title, author, price) VALUES (?, ?, ?)"; + + try { + PreparedStatement statement = jdbcConnection.prepareStatement(sql); + statement.setString(1, book.getTitle()); + statement.setString(2, book.getAuthor()); + statement.setFloat(3, book.getPrice()); + + boolean rowInserted = statement.executeUpdate() > 0; + statement.close(); + return rowInserted; + } catch (SQLException e) { + e.printStackTrace(); + } + + return false; + } +} diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java new file mode 100644 index 00000000..1fdd645b --- /dev/null +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -0,0 +1,119 @@ +package com.pluralsight; + +import java.io.IOException; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.util.ArrayList; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.inject.Inject; +/** + * Servlet implementation class HelloWorld + */ + +public class ControllerServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + private DBConnection dbConnection; + + @Inject + private BookDAO bookDAO; + /** + * @see HttpServlet#HttpServlet() + */ + + public void init() { + dbConnection = new DBConnection(); + bookDAO = new BookDAO(dbConnection.getConnection()); + } + + public void destroy() { + dbConnection.disconnect(); + } + + public ControllerServlet() { + super(); + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) + */ + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + String action = request.getPathInfo(); + + try { + switch(action) { + case "/admin": + showBookAdmin(request, response); + break; + case "/new": + showNewForm(request, response); + break; + case "/insert": + insertBook(request, response); + break; + default: + listBooks(request, response); + break; + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private void showBookAdmin(HttpServletRequest request, HttpServletResponse response) + throws ClassNotFoundException, SQLException, ServletException, IOException { + ArrayList books_list = bookDAO.listAllBooks(); + + request.setAttribute("books", books_list); + RequestDispatcher dispatcher = request.getRequestDispatcher("/BookAdmin.jsp"); + dispatcher.forward(request, response); + } + + private void listBooks(HttpServletRequest request, HttpServletResponse response) + throws ClassNotFoundException, SQLException, ServletException, IOException { + ArrayList books_list = bookDAO.listAllBooks(); + + request.setAttribute("books", books_list); + RequestDispatcher dispatcher = request.getRequestDispatcher("/BookList.jsp"); + dispatcher.forward(request, response); + } + + private void showNewForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + RequestDispatcher dispatcher = request.getRequestDispatcher("/BookForm.jsp"); + dispatcher.forward(request, response); + } + + private void insertBook(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException, ClassNotFoundException, SQLException { + String title = request.getParameter("booktitle"); + String author = request.getParameter("bookauthor"); + String priceString = request.getParameter("bookprice"); + + Book newBook = new Book(title, author, Float.parseFloat(priceString)); + + bookDAO.insertBook(newBook); + response.sendRedirect("list"); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + PrintWriter out = response.getWriter(); + out.println("This is the doPost() method!"); + doGet(request, response); + + } + +} diff --git a/src/main/java/com/pluralsight/DBConnection.java b/src/main/java/com/pluralsight/DBConnection.java new file mode 100644 index 00000000..53cebd2c --- /dev/null +++ b/src/main/java/com/pluralsight/DBConnection.java @@ -0,0 +1,70 @@ +package com.pluralsight; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class DBConnection { + private Connection jdbcConnection; + + public DBConnection() { + connect(); + } + + public Connection getConnection() { + return jdbcConnection; + } + + public void connect() { + try { + Class.forName("org.sqlite.JDBC"); + jdbcConnection = DriverManager.getConnection("jdbc:sqlite:book_store.db"); + System.out.println("Opened database successfully"); + + createTableIfNotExists(); + } catch ( Exception e ) { + System.err.println( e.getClass().getName() + ": " + e.getMessage() ); + System.exit(0); + } + } + + private void createTableIfNotExists() { + try { + DatabaseMetaData meta = jdbcConnection.getMetaData(); + ResultSet res = meta.getTables(null, null, null, new String[] {"TABLE"}); + Statement stmt = jdbcConnection.createStatement(); + if (!res.next()) { + // Create table + + String sql = "CREATE TABLE book " + + "(id INTEGER PRIMARY KEY NOT NULL," + + " title TEXT NOT NULL, " + + " author TEXT NOT NULL, " + + " price REAL)"; + stmt.executeUpdate(sql); + + sql = "INSERT INTO book (title, author, price) VALUES (\"1984\", \"George Orwell\", 1.00)"; + stmt.executeUpdate(sql); + + stmt.close(); + } + } catch ( Exception e ) { + System.err.println( e.getClass().getName() + ": " + e.getMessage() ); + System.exit(0); + } + } + + + public void disconnect() { + try { + if (jdbcConnection != null && !jdbcConnection.isClosed()) { + jdbcConnection.close(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/webapp/BookAdmin.jsp b/src/main/webapp/BookAdmin.jsp new file mode 100644 index 00000000..420c8e95 --- /dev/null +++ b/src/main/webapp/BookAdmin.jsp @@ -0,0 +1,43 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %> +<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %> + + + + Codestin Search App + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
List of Books
TitleAuthorPriceAdd Book
${ item.getTitle() } ${ item.getAuthor() } Edit + Delete
+
+
+ + diff --git a/src/main/webapp/BookForm.jsp b/src/main/webapp/BookForm.jsp new file mode 100644 index 00000000..c71ce22d --- /dev/null +++ b/src/main/webapp/BookForm.jsp @@ -0,0 +1,31 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %> + + + + Codestin Search App + + + + + +
+
+

+ New Book Form +

+

+

+

+

+

+

+

+
+
+ + diff --git a/src/main/webapp/BookList.jsp b/src/main/webapp/BookList.jsp new file mode 100644 index 00000000..ac40509a --- /dev/null +++ b/src/main/webapp/BookList.jsp @@ -0,0 +1,41 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %> +<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %> + + + + Codestin Search App + + + + + + + +
+
+ + + + + + + + + + + + + + + + +
List of Books
TitleAuthorPrice
${ item.getTitle() } ${ item.getAuthor() }
+
+
+ + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..449850f0 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,18 @@ + + + Archetype Created Web Application + + + ControllerServlet + com.pluralsight.ControllerServlet + + + ControllerServlet + /books/* + + diff --git a/src/main/webapp/css/style.css b/src/main/webapp/css/style.css new file mode 100644 index 00000000..3d65295a --- /dev/null +++ b/src/main/webapp/css/style.css @@ -0,0 +1,64 @@ +body { + font-family: "Open Sans", Open Sans, "Verdana", Verdana, Arial, sans; +} + + +.container { + text-align: center; + margin: 80px auto 0px; + +} + +.booktable table { + width: 75%; + margin: 0 auto; +} +table, td, th { + border: 1px solid #ddd; + text-align: left; +} +table { + border-collapse: collapse; +} +th, td { + padding: 15px; +} +form { + margin: 80px; + border: 1px solid #ddd; +} + +ul { + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; + background-color: #333; + position: fixed; + top: 0; + width: 100%; +} + +li { + float: left; +} + +li a { + display: block; + color: white; + text-align: center; + padding: 14px 16px; + text-decoration: none; +} + +li a:hover:not(.active) { + background-color: #111; +} + +a { + text-decoration: none; +} + +.active { + background-color: #cc0066; +} diff --git a/src/test/java/com/pluralsight/module1/Module1_Task1_IT.java b/src/test/java/com/pluralsight/module1/Module1_Task1_IT.java new file mode 100644 index 00000000..0144e088 --- /dev/null +++ b/src/test/java/com/pluralsight/module1/Module1_Task1_IT.java @@ -0,0 +1,77 @@ +package com.pluralsight.module1; +import com.pluralsight.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.gargoylesoftware.htmlunit.ElementNotFoundException; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebResponse; +import com.gargoylesoftware.htmlunit.html.HtmlAnchor; +import com.gargoylesoftware.htmlunit.html.HtmlPage; + +import static org.junit.Assert.*; + +import java.io.IOException; + +public class Module1_Task1_IT { + + private String indexUrl; + private WebClient webClient; + HtmlPage page; + + @Before + public void setUp() throws IOException { + indexUrl = "http://localhost:8080"; //System.getProperty("integration.base.url"); + webClient = new WebClient(); + // Open the admin page + page = webClient.getPage(indexUrl + "/books/admin"); + } + @After + public void tearDown() { + webClient.closeAllWindows(); + } + + // Verify the edit and delete hrefs, in BookAdmin.jsp contain the id + @Test + public void _task1() { + url_contains_id("Delete"); + url_contains_id("Edit"); + } + + public void url_contains_id(String textStr) { + // First check if an anchor with text "Edit" exists + HtmlAnchor anchor = null; + try { + anchor = page.getAnchorByText(textStr); + } + catch ( ElementNotFoundException e) {} + + assertNotNull("An anchor with the text " + textStr + " does not exist.", anchor); + + boolean found = findURLWithID(textStr.toLowerCase()); + assertTrue("The " + textStr + " anchor's href does not contain the id.", found); + } + + private boolean findURLWithID(String urlStr) { + String foundURL = ""; + try { + for ( HtmlAnchor a : page.getAnchors()) { + String href = a.getHrefAttribute(); + if (href.contains(urlStr)) { + foundURL = a.getHrefAttribute().toString(); + break; + } + } + } + catch ( ElementNotFoundException e) { + return false; + } + foundURL = foundURL.replaceAll("\\s+",""); + // Might have different id's in the database so remove them. + foundURL = foundURL.replaceAll("[0-9]",""); + String testingURL = urlStr+"?id="; + return foundURL.equals(testingURL); + } +} diff --git a/src/test/java/com/pluralsight/module1/Module1_Task2_and_3_IT.java b/src/test/java/com/pluralsight/module1/Module1_Task2_and_3_IT.java new file mode 100644 index 00000000..422a4075 --- /dev/null +++ b/src/test/java/com/pluralsight/module1/Module1_Task2_and_3_IT.java @@ -0,0 +1,79 @@ +package com.pluralsight.module1; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +import org.junit.BeforeClass; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.exceptions.*; + +import org.powermock.reflect.Whitebox; +import java.lang.reflect.Method; + +import java.io.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ControllerServlet.class) +public class Module1_Task2_and_3_IT { + + private ControllerServlet controllerServlet; + private Method method = null; + + @Before + public void setUp() throws Exception { + try { + method = Whitebox.getMethod(ControllerServlet.class, + "deleteBook", HttpServletRequest.class, HttpServletResponse.class); + } catch (Exception e) {} + } + + // Verify the deleteBook() method exists in ControllerServlet + @Test + public void _task2() throws Exception { + String errorMsg = "private void deleteBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, method); + } + + @Test + public void _task3() throws Exception { + String tempID = "0"; + String errorMsg = "private void deleteBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, method); + + ControllerServlet controllerServlet = PowerMockito.spy(new ControllerServlet()); + boolean called_deleteBook = false; + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + HttpServletResponse response = Mockito.mock(HttpServletResponse.class); + + try { + Mockito.when(request.getPathInfo()).thenReturn("/delete"); + //PowerMockito.doNothing().when(controllerServlet, "deleteBook", request, response); + Mockito.when(request.getParameter("id")).thenReturn(tempID); + } catch (MethodNotFoundException e) {} + + try { + controllerServlet.doGet(request, response); + try { + PowerMockito.verifyPrivate(controllerServlet) + .invoke("deleteBook", request, response); + called_deleteBook = true; + } catch (Throwable e) {} + } catch (Exception e) {} + + errorMsg = "After action \"" + "/delete" + + "\", did not call deleteBook()."; + assertTrue(errorMsg, called_deleteBook); + } +} diff --git a/src/test/java/com/pluralsight/module1/Module1_Task4_IT.java b/src/test/java/com/pluralsight/module1/Module1_Task4_IT.java new file mode 100644 index 00000000..cc51128e --- /dev/null +++ b/src/test/java/com/pluralsight/module1/Module1_Task4_IT.java @@ -0,0 +1,26 @@ +package com.pluralsight.module1; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.io.*; + +public class Module1_Task4_IT { + + // Verify the deleteBook() method exists in BookDAO + @Test + public void _task4() throws Exception { + Method method = null; + + try { + method = BookDAO.class.getMethod("deleteBook", int.class); + } catch (NoSuchMethodException e) { + //e.printStackTrace(); + } + + String message = "The method deleteBook() doesn't exist in BookDAO.java."; + assertNotNull(message, method); + } +} diff --git a/src/test/java/com/pluralsight/module1/Module1_Task5_IT.java b/src/test/java/com/pluralsight/module1/Module1_Task5_IT.java new file mode 100644 index 00000000..e271b466 --- /dev/null +++ b/src/test/java/com/pluralsight/module1/Module1_Task5_IT.java @@ -0,0 +1,61 @@ +package com.pluralsight.module1; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Mockito; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.lang.reflect.Method; + +import java.io.*; + + +@RunWith(PowerMockRunner.class) +@PrepareForTest({DriverManager.class, PreparedStatement.class, BookDAO.class}) +public class Module1_Task5_IT { + + // Verify the deleteBook() in BookDAO calls prepareStatement() + @Test + public void _task5() throws Exception { + Method method = null; + String sql = "DELETE FROM book WHERE id = ?"; + Connection mockConnection = Mockito.mock(Connection.class); + PreparedStatement mockStatement = Mockito.mock(PreparedStatement.class); + BookDAO bookDAO = new BookDAO(mockConnection); + BookDAO spyBookDAO = Mockito.spy(bookDAO); + boolean called_prepareStatement = false; + + + Mockito.when(mockConnection.prepareStatement(sql)).thenReturn(mockStatement); + + try { + method = BookDAO.class.getMethod("deleteBook", int.class); + } catch (NoSuchMethodException e) { + //e.printStackTrace(); + } + + String message = "The method deleteBook() doesn't exist in BookDAO.java."; + assertNotNull(message, method); + + try { + method.invoke(spyBookDAO, 0); + } catch (Exception e) {} + + try { + Mockito.verify(mockConnection,Mockito.atLeast(1)).prepareStatement(sql); + called_prepareStatement = true; + } catch (Throwable e) {} + + message = "The method deleteBook() doesn't call prepareStatement() correctly."; + assertTrue(message, called_prepareStatement); + } +} diff --git a/src/test/java/com/pluralsight/module1/Module1_Task6_IT.java b/src/test/java/com/pluralsight/module1/Module1_Task6_IT.java new file mode 100644 index 00000000..7cf42715 --- /dev/null +++ b/src/test/java/com/pluralsight/module1/Module1_Task6_IT.java @@ -0,0 +1,73 @@ +package com.pluralsight.module1; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Mockito; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.lang.reflect.Method; + +import java.io.*; + + +@RunWith(PowerMockRunner.class) +@PrepareForTest({DriverManager.class, PreparedStatement.class, BookDAO.class}) +public class Module1_Task6_IT { + + // Verify the deleteBook() method exists in BookDAO + @Test + public void _task6() throws Exception { + Method method = null; + String sql = "DELETE FROM book WHERE id = ?"; + Connection spyConnection = Mockito.mock(Connection.class); + PreparedStatement mockStatement = Mockito.mock(PreparedStatement.class); + BookDAO bookDAO = new BookDAO(spyConnection); + BookDAO spyBookDAO = Mockito.spy(bookDAO); + boolean called_setInt = false; + boolean called_execute = false; + boolean called_prepareStatement = false; + boolean called_close = false; + + Mockito.when(spyConnection.prepareStatement(sql)).thenReturn(mockStatement); + + try { + method = BookDAO.class.getMethod("deleteBook", int.class); + } catch (NoSuchMethodException e) { + //e.printStackTrace(); + } + + String message = "The method deleteBook() doesn't exist in BookDAO.java."; + assertNotNull(message, method); + + try { + method.invoke(spyBookDAO, 0); + } catch (Exception e) {} + + try { + Mockito.verify(mockStatement, Mockito.atLeast(1)).setInt(Mockito.anyInt(), Mockito.anyInt()); + called_setInt = true; + Mockito.verify(mockStatement, Mockito.atLeast(1)).executeUpdate(); + called_execute = true; + Mockito.verify(mockStatement, Mockito.atLeast(1)).close(); + called_close = true; + } catch (Throwable e) {} + + message = "The method deleteBook() doesn't call setInt()."; + assertTrue(message, called_setInt); + + message = "The method deleteBook() doesn't call executeUpdate()."; + assertTrue(message, called_execute); + + message = "The method deleteBook() doesn't call PreparedStatement close()."; + assertTrue(message, called_close); + } +} diff --git a/src/test/java/com/pluralsight/module1/Module1_Task7_and_8_IT.java b/src/test/java/com/pluralsight/module1/Module1_Task7_and_8_IT.java new file mode 100644 index 00000000..1461c702 --- /dev/null +++ b/src/test/java/com/pluralsight/module1/Module1_Task7_and_8_IT.java @@ -0,0 +1,109 @@ +package com.pluralsight.module1; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.util.List; +import java.util.ArrayList; +import java.util.Collection; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +import org.junit.BeforeClass; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.MockingDetails; +import org.mockito.invocation.Invocation; +import org.powermock.reflect.Whitebox; + +import java.lang.reflect.Method; +import java.io.*; + +public class Module1_Task7_and_8_IT extends Mockito{ + + static StringWriter stringWriter = new StringWriter(); + static String tempID = "0"; + static boolean called_getParameter = false; + static boolean called_sendRedirect = false; + static boolean called_deleteBook = false; + static HttpServletRequest request = mock(HttpServletRequest.class); + static HttpServletResponse response = mock(HttpServletResponse.class); + static Method deleteMethod = null; + @Mock + private BookDAO mockBookDAO; + + @InjectMocks + private ControllerServlet controllerServlet; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + request = mock(HttpServletRequest.class); + response = mock(HttpServletResponse.class); + + when(request.getPathInfo()).thenReturn("/delete"); + when(request.getParameter("id")).thenReturn(tempID); + + try { + deleteMethod = Whitebox.getMethod(ControllerServlet.class, + "deleteBook", HttpServletRequest.class, HttpServletResponse.class); + } catch (Exception e) {} + + // String errorMsg = "private void deleteBook() does not exist in ControllerServlet"; + // assertNotNull(errorMsg, deleteMethod); + if (deleteMethod != null) { + try { + controllerServlet.doGet(request, response); + } catch (Exception e) {} + } + } + + // Verify deleteBook() in ControllerServlet is complete + @Test + public void _task7() throws Exception { + String errorMsg = "private void deleteBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, deleteMethod); + + MockingDetails mockingDetails = Mockito.mockingDetails(mockBookDAO); + + Collection invocations = mockingDetails.getInvocations(); + + List methodsCalled = new ArrayList<>(); + for (Invocation anInvocation : invocations) { + methodsCalled.add(anInvocation.getMethod().getName()); + } + errorMsg = "The ControllerServlet deleteBook() method was not called."; + assertTrue(errorMsg, methodsCalled.contains("deleteBook")); + + try { + verify(request, atLeast(1)).getParameter("id"); + called_getParameter = true; + } catch (Throwable e) {} + + errorMsg = "In ControllerServlet deleteBook()," + + " did not call getParameter(\"id\")."; + assertTrue(errorMsg, called_getParameter); + } + + @Test + public void _task8() throws Exception { + String errorMsg = "private void deleteBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, deleteMethod); + try { + verify(response, atLeast(1)).sendRedirect("list"); + called_sendRedirect = true; + } catch (Throwable e) {} + + errorMsg = "In ControllerServlet deleteBook()," + + " did not call sendRedirect(\"list\")."; + assertTrue(errorMsg, called_sendRedirect); + } +} diff --git a/src/test/java/com/pluralsight/module2/Module2_Task11_thru_14_IT.java b/src/test/java/com/pluralsight/module2/Module2_Task11_thru_14_IT.java new file mode 100644 index 00000000..23ee70d1 --- /dev/null +++ b/src/test/java/com/pluralsight/module2/Module2_Task11_thru_14_IT.java @@ -0,0 +1,130 @@ +package com.pluralsight.module2; +import com.pluralsight.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.gargoylesoftware.htmlunit.ElementNotFoundException; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebResponse; +import com.gargoylesoftware.htmlunit.html.DomElement; +import com.gargoylesoftware.htmlunit.html.DomNodeList; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.gargoylesoftware.htmlunit.html.HtmlAnchor; +import com.gargoylesoftware.htmlunit.html.HtmlForm; +import com.gargoylesoftware.htmlunit.html.HtmlInput; + +import static org.junit.Assert.*; + +import java.io.IOException; + +public class Module2_Task11_thru_14_IT { + private String BOOK_FORM_NAME = "book_form"; + private String indexUrl; + private WebClient webClient; + HtmlPage firstPage = null; + HtmlPage nextPage = null; + HtmlForm form = null; + String formErrorMsg = "We can’t find a
with name 'book_form' in BookForm.jsp"; + + @Before + public void setUp() throws IOException { + indexUrl = "http://localhost:8080"; //System.getProperty("integration.base.url"); + webClient = new WebClient(); + // Open the admin page + firstPage = webClient.getPage(indexUrl + "/books/admin"); + clickLink("Edit"); + assertNotNull("Link Edit did not work.", nextPage); + // Get form + try { + form = nextPage.getFormByName(BOOK_FORM_NAME); + } catch (ElementNotFoundException e) {} + } + @After + public void tearDown() { + webClient.closeAllWindows(); + } + + // Verify they adapted the BookForm.jsp page for editing existing books + // and adding new book + // In this test check the form input fields have values filled in + @Test + public void _task11() { + assertNotNull("Link Edit did not work.", nextPage); + assertNotNull(formErrorMsg, form); + //Get id input field + try { + HtmlInput inputId = form.getInputByName("id"); + + // Check if hidden + String typeAttribute = inputId.getTypeAttribute(); + assertEquals("The id input needs type=\"hidden\".", "hidden", typeAttribute); + + // Check value is an int + try { + Integer.parseInt(inputId.getValueAttribute()); + } catch (NumberFormatException e) { + assertTrue("The id input does not have an int for value.", false); + } + } catch (ElementNotFoundException e) { + assertTrue("The input field with name \"id\" does not exist.", false); + } + } + + @Test + public void _task12() { + assertNotNull("Link Edit did not work.", nextPage); + assertNotNull(formErrorMsg, form); + // Get title input field, check value + try { + HtmlInput inputTitle = form.getInputByName("booktitle"); + String titleValue = inputTitle.getValueAttribute(); + assertTrue("Title field value is empty, value is \"" + titleValue + "\".", + titleValue.length() > 0); + }catch (ElementNotFoundException e) { + assertTrue("The input field with name \"booktitle\" does not exist.", false); + } + } + + @Test + public void _task13() { + assertNotNull("Link Edit did not work.", nextPage); + assertNotNull(formErrorMsg, form); + + // Get author input field, check value + try { + HtmlInput inputAuthor = form.getInputByName("bookauthor"); + String authorValue = inputAuthor.getValueAttribute(); + assertTrue("Author field value is empty, value is \"" + authorValue + "\".", + authorValue.length() > 0); + }catch (ElementNotFoundException e) { + assertTrue("The input field with name \"bookauthor\" does not exist.", false); + } + + // Get price input field, check value + try { + HtmlInput inputPrice = form.getInputByName("bookprice"); + String priceValue = inputPrice.getValueAttribute(); + assertTrue("Price field value is empty, value is \"" + priceValue + "\".", + priceValue.length() > 0); + }catch (ElementNotFoundException e) { + assertTrue("The input field with name \"bookprice\" does not exist.", false); + } + } + + private void clickLink(String urlStr) { + String foundURL = ""; + String desiredUrlText = urlStr.toLowerCase(); + try { + for ( HtmlAnchor a : firstPage.getAnchors()) { + String href = a.getHrefAttribute(); + if (href.contains(desiredUrlText)) { + nextPage = a.click(); + break; + } + } + } + catch ( Exception e) {} + } +} diff --git a/src/test/java/com/pluralsight/module2/Module2_Task1_and_2_IT.java b/src/test/java/com/pluralsight/module2/Module2_Task1_and_2_IT.java new file mode 100644 index 00000000..79366031 --- /dev/null +++ b/src/test/java/com/pluralsight/module2/Module2_Task1_and_2_IT.java @@ -0,0 +1,79 @@ +package com.pluralsight.module2; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +import org.junit.BeforeClass; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.exceptions.*; + +import org.powermock.reflect.Whitebox; +import java.lang.reflect.Method; + +import java.io.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ControllerServlet.class) +public class Module2_Task1_and_2_IT extends Mockito { + + private ControllerServlet controllerServlet; + private Method method = null; + + @Before + public void setUp() throws Exception { + try { + method = Whitebox.getMethod(ControllerServlet.class, + "showEditForm", HttpServletRequest.class, HttpServletResponse.class); + } catch (Exception e) {} + } + + // Verify the showEditForm() method exists in ControllerServlet + @Test + public void _task1() throws Exception { + String errorMsg = "private void showEditForm() does not exist in ControllerServlet"; + assertNotNull(errorMsg, method); + } + + @Test + public void _task2() throws Exception { + String errorMsg = "private void showEditForm() does not exist in ControllerServlet"; + assertNotNull(errorMsg, method); + + String tempID = "0"; + ControllerServlet controllerServlet = PowerMockito.spy(new ControllerServlet()); + boolean called_showEditForm = false; + HttpServletRequest request = mock(HttpServletRequest.class); + HttpServletResponse response = mock(HttpServletResponse.class); + + try { + when(request.getPathInfo()).thenReturn("/edit"); + //PowerMockito.doNothing().when(controllerServlet, "showEditForm", request, response); + when(request.getParameter("id")).thenReturn(tempID); + } catch (MethodNotFoundException e) {} + + try { + controllerServlet.doGet(request, response); + try { + PowerMockito.verifyPrivate(controllerServlet) + .invoke("showEditForm", request, response); + called_showEditForm = true; + } catch (Throwable e) {} + } catch (Exception e) {} + + errorMsg = "After action \"" + "/edit" + + "\", did not call showEditForm()."; + assertTrue(errorMsg, called_showEditForm); + } +} diff --git a/src/test/java/com/pluralsight/module2/Module2_Task3_thru_6_IT.java b/src/test/java/com/pluralsight/module2/Module2_Task3_thru_6_IT.java new file mode 100644 index 00000000..e2a42b83 --- /dev/null +++ b/src/test/java/com/pluralsight/module2/Module2_Task3_thru_6_IT.java @@ -0,0 +1,130 @@ +package com.pluralsight.module2; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.RequestDispatcher; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +import org.junit.BeforeClass; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.lang.reflect.Method; +import java.io.*; + + + +public class Module2_Task3_thru_6_IT extends Mockito{ + + static StringWriter stringWriter = new StringWriter(); + static String tempID = "1"; + static int tempIntID = 1; + static HttpServletRequest request; + static HttpServletResponse response; + static RequestDispatcher mockRequestDispatcher; + static Book mockBook; + + @Mock + private BookDAO mockBookDAO; + + @InjectMocks + private ControllerServlet controllerServlet; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + request = mock(HttpServletRequest.class); + response = mock(HttpServletResponse.class); + mockRequestDispatcher = mock(RequestDispatcher.class); + mockBook = mock(Book.class); + + when(request.getPathInfo()).thenReturn("/edit"); + when(request.getParameter("id")).thenReturn(tempID); + when(mockBookDAO.getBook(tempIntID)).thenReturn(mockBook); + when(request.getRequestDispatcher("/BookForm.jsp")) + .thenReturn(mockRequestDispatcher); + + try { + controllerServlet.doGet(request, response); + } catch (Exception e) {} + } + + // Verify showEditForm() is complete in ControllerServlet + // Since it's private need to verify the lines of code get called + // through the /edit action in doGet() + @Test + public void _task3() throws Exception { + boolean called_getParameter = false; + boolean called_getBook = false; + + try { + verify(request, atLeast(1)).getParameter("id"); + called_getParameter = true; + } catch (Throwable e) {} + + try { + verify(mockBookDAO).getBook(anyInt()); + called_getBook = true; + } catch (Throwable e) {} + + String errorMsg = "In ControllerServlet showEditForm()," + + " did not call getParameter(\"id\")."; + assertTrue(errorMsg, called_getParameter); + errorMsg = "In ControllerServlet showEditForm()," + + " did not call getBook(id)."; + assertTrue(errorMsg, called_getBook); + } + + @Test + public void _task4() throws Exception { + boolean called_getRequestDispatcher = false; + + try { + verify(request).getRequestDispatcher("/BookForm.jsp"); + called_getRequestDispatcher = true; + } catch (Throwable e) {} + + String errorMsg = "In ControllerServlet showEditForm()," + + " did not call request.getRequestDispatcher(\"BookForm.jsp\")."; + assertTrue(errorMsg, called_getRequestDispatcher); + } + + @Test + public void _task5() throws Exception { + boolean called_setAttribute = false; + + try { + verify(request).setAttribute("book", mockBook); + called_setAttribute = true; + } catch (Throwable e) {} + + String errorMsg = "In ControllerServlet showEditForm()," + + " did not call request.setAttribute(\"book\", bookObject);."; + assertTrue(errorMsg, called_setAttribute); + } + + @Test + public void _task6() throws Exception { + boolean called_forward = false; + + try { + verify(mockRequestDispatcher).forward(request, response); + called_forward = true; + } catch (Throwable e) {} + + String errorMsg = "In ControllerServlet showEditForm()," + + " did not call dispatcher.forward(request, response);."; + assertTrue(errorMsg, called_forward); + } + + +} diff --git a/src/test/java/com/pluralsight/module2/Module2_Task7_thru10_IT.java b/src/test/java/com/pluralsight/module2/Module2_Task7_thru10_IT.java new file mode 100644 index 00000000..2bf7e288 --- /dev/null +++ b/src/test/java/com/pluralsight/module2/Module2_Task7_thru10_IT.java @@ -0,0 +1,128 @@ +package com.pluralsight.module2; +import com.pluralsight.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.gargoylesoftware.htmlunit.ElementNotFoundException; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebResponse; +import com.gargoylesoftware.htmlunit.html.DomElement; +import com.gargoylesoftware.htmlunit.html.DomNodeList; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.gargoylesoftware.htmlunit.html.HtmlAnchor; +import com.gargoylesoftware.htmlunit.html.HtmlForm; +import com.gargoylesoftware.htmlunit.html.HtmlInput; + +import static org.junit.Assert.*; + +import java.io.IOException; + +public class Module2_Task7_thru10_IT { + private String BOOK_FORM_NAME = "book_form"; + private String indexUrl; + private WebClient webClient; + HtmlPage firstPage; + HtmlPage editPage; + HtmlPage newPage; + + @Before + public void setUp() throws IOException { + indexUrl = "http://localhost:8080"; //System.getProperty("integration.base.url"); + webClient = new WebClient(); + // Open the admin page + firstPage = webClient.getPage(indexUrl + "/books/admin"); + + try { + for ( HtmlAnchor a : firstPage.getAnchors()) { + String href = a.getHrefAttribute(); + if (href.contains("edit")) { + editPage = a.click(); + } + else if (href.contains("new")) { + newPage = a.click(); + } + } + } + catch ( Exception e) {} + } + + @After + public void tearDown() { + webClient.closeAllWindows(); + } + + // Verify they adapted the BookForm.jsp page for editing existing books + // and adding new book + // In this test check the form action is conditional, and the form h2 + @Test + public void _task7() { + assertNotNull("Link, edit, did not work.", editPage); + checkForm("Edit"); + } + + @Test + public void _task8() { + assertNotNull("Link, edit, did not work.", editPage); + checkForm("Edit"); + assertNotNull("Link, new, did not work.", newPage); + checkForm("New"); + } + + @Test + public void _task9() { + h2_correct("Edit"); + } + + @Test + public void _task10() { + h2_correct("Edit"); + h2_correct("New"); + } + + public void h2_correct(String urlStr) { + // First check if an H2 exists with text "New Book Form" + boolean h2Text_correct = false; + DomNodeList< DomElement > list; + if (urlStr.equals("Edit")) list = editPage.getElementsByTagName( "h2" ); + else list = newPage.getElementsByTagName( "h2" ); + String h2Text = ""; + String desiredText = urlStr + " Book Form"; + desiredText = desiredText.replaceAll("\\s+",""); + for( DomElement domElement : list ) + { + h2Text = domElement.getTextContent(); + h2Text = h2Text.replaceAll("\\s+",""); + if (h2Text.equals(desiredText)) + h2Text_correct = true; + } + String errorMsg = "The h2 tag in BookForm contains "+ h2Text + + " but we expected it to contain " + desiredText; + assertTrue(errorMsg, h2Text_correct); + } + + public void checkForm(String urlStr) { + // Get form and check action + HtmlForm form = null; + String errorMsg = ""; + String desiredAction = ""; + try { + if (urlStr.equals("Edit")) { + form = editPage.getFormByName(BOOK_FORM_NAME); + errorMsg = "Form, book_form, action not \"update\"."; + desiredAction = "update"; + } + else { + form = newPage.getFormByName(BOOK_FORM_NAME); + errorMsg = "Form, book_form, action not \"insert\"."; + desiredAction = "insert"; + } + } catch (ElementNotFoundException e) {} + + String formErrorMsg = "We can’t find a with name 'book_form' in BookForm.jsp"; + assertNotNull(formErrorMsg, form); + String action = form.getActionAttribute(); + assertEquals(errorMsg, desiredAction, action); + } +} diff --git a/src/test/java/com/pluralsight/module3/Module3_Task1_thru_5_IT.java b/src/test/java/com/pluralsight/module3/Module3_Task1_thru_5_IT.java new file mode 100644 index 00000000..d479698e --- /dev/null +++ b/src/test/java/com/pluralsight/module3/Module3_Task1_thru_5_IT.java @@ -0,0 +1,124 @@ +package com.pluralsight.module3; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.Before; +import org.mockito.Mockito; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.lang.reflect.Method; + +import java.io.*; + + +@RunWith(PowerMockRunner.class) +@PrepareForTest({DriverManager.class, PreparedStatement.class, BookDAO.class}) +public class Module3_Task1_thru_5_IT { + + static Method method = null; + static String sql = "UPDATE book SET title = ?, author = ?, price = ?" + + " WHERE id = ?"; + Connection spyConnection; + PreparedStatement mockStatement; + static BookDAO bookDAO; + static BookDAO spyBookDAO; + static boolean called_prepareStatement = false; + static boolean called_setTitle = false; + static boolean called_setAuthor = false; + static boolean called_setPrice = false; + static boolean called_setId = false; + static boolean called_executeUpdate = false; + static boolean called_close = false; + static String message = ""; + @Before + public void setUp() { + spyConnection = Mockito.mock(Connection.class); + mockStatement = Mockito.mock(PreparedStatement.class); + bookDAO = new BookDAO(spyConnection); + spyBookDAO = Mockito.spy(bookDAO); + + Book tempBookObject = new Book(1, "1984", "George Orwell", 1.50f); + try { + Mockito.when(spyConnection.prepareStatement(sql)).thenReturn(mockStatement); + method = BookDAO.class.getMethod("updateBook", Book.class); + method.invoke(spyBookDAO, tempBookObject); + } catch (Exception e) { + //e.printStackTrace(); + } + } + + // Verify updateBook() method exists in BookDAO + @Test + public void _task1() throws Exception { + message = "The method updateBook() doesn't exist in BookDAO.java."; + assertNotNull(message, method); + } + + @Test + public void _task2() throws Exception { + try { + Mockito.verify(spyConnection).prepareStatement(sql); + called_prepareStatement = true; + } catch (Throwable e) {} + + message = "The method updateBook() doesn't call prepareStatement() correctly."; + assertTrue(message, called_prepareStatement); + } + + @Test + public void _task3() throws Exception { + try { + Mockito.verify(mockStatement).setString(1, "1984"); + called_setTitle = true; + Mockito.verify(mockStatement).setString(2, "George Orwell"); + called_setAuthor = true; + } catch (Throwable e) {} + + message = "The method updateBook() doesn't call setString() for the title."; + assertTrue(message, called_setTitle); + + message = "The method updateBook() doesn't call setString() for the author."; + assertTrue(message, called_setAuthor); + } + + @Test + public void _task4() throws Exception { + try { + Mockito.verify(mockStatement).setFloat(3, 1.50f); + called_setPrice = true; + Mockito.verify(mockStatement).setInt(4, 1); + called_setId = true; + } catch (Throwable e) {} + + message = "The method updateBook() doesn't call setFloat() for the price."; + assertTrue(message, called_setPrice); + + message = "The method updateBook() doesn't call setInt() for the id."; + assertTrue(message, called_setId); + } + + @Test + public void _task5() throws Exception { + try { + Mockito.verify(mockStatement).executeUpdate(); + called_executeUpdate = true; + Mockito.verify(mockStatement).close(); + called_close = true; + } catch (Throwable e) {} + + message = "The method updateBook() doesn't call executeUpdate()."; + assertTrue(message, called_executeUpdate); + + message = "The method updateBook() doesn't call PreparedStatement close()."; + assertTrue(message, called_close); + } +} diff --git a/src/test/java/com/pluralsight/module3/Module3_Task6_and_7_IT.java b/src/test/java/com/pluralsight/module3/Module3_Task6_and_7_IT.java new file mode 100644 index 00000000..d3607fd5 --- /dev/null +++ b/src/test/java/com/pluralsight/module3/Module3_Task6_and_7_IT.java @@ -0,0 +1,88 @@ +package com.pluralsight.module3; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +import org.junit.BeforeClass; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import org.powermock.reflect.Whitebox; +import java.lang.reflect.Method; + +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.exceptions.*; + +import java.io.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ControllerServlet.class) +public class Module3_Task6_and_7_IT extends Mockito{ + static String tempID = "0"; + static boolean called_updateBook = false; + + static HttpServletRequest request; + static HttpServletResponse response; + + private Method method = null; + private ControllerServlet controllerServlet; + + @Before + public void setUp() throws Exception { + try { + method = Whitebox.getMethod(ControllerServlet.class, + "updateBook", HttpServletRequest.class, HttpServletResponse.class); + } catch (Exception e) {} + + if (method != null) { + controllerServlet = PowerMockito.spy(new ControllerServlet()); + + request = mock(HttpServletRequest.class); + response = mock(HttpServletResponse.class); + try { + when(request.getPathInfo()).thenReturn("/update"); + //PowerMockito.doNothing().when(controllerServlet, "updateBook", request, response); + when(request.getParameter("id")).thenReturn(tempID); + } catch (MethodNotFoundException e) {} + try { + controllerServlet.doGet(request, response); + } catch (Exception e) {} + } + } + + // Verify updateBook() exists in ControllerServlet + @Test + public void _task6() throws Exception { + String errorMsg = "private void updateBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, method); + } + + @Test + public void _task7() throws Exception { + String errorMsg = "private void updateBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, method); + + try { + PowerMockito.verifyPrivate(controllerServlet) + .invoke("updateBook", request, response); + called_updateBook = true; + } catch (Throwable e) {} + + errorMsg = "After action \"" + "/update" + + "\", did not call updateBook()."; + assertTrue(errorMsg, called_updateBook); + } +} diff --git a/src/test/java/com/pluralsight/module3/Module3_Task8_thru_11_IT.java b/src/test/java/com/pluralsight/module3/Module3_Task8_thru_11_IT.java new file mode 100644 index 00000000..fe1a686e --- /dev/null +++ b/src/test/java/com/pluralsight/module3/Module3_Task8_thru_11_IT.java @@ -0,0 +1,169 @@ +package com.pluralsight.module3; +import com.pluralsight.*; + +import static org.junit.Assert.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.util.List; +import java.util.ArrayList; +import java.util.Collection; +import java.lang.reflect.Method; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +import org.junit.BeforeClass; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.MockingDetails; +import org.mockito.invocation.Invocation; +import org.powermock.reflect.Whitebox; + +import java.io.*; + +public class Module3_Task8_thru_11_IT extends Mockito{ + + static StringWriter stringWriter = new StringWriter(); + static String tempIDStr = "1"; + static int tempID = 1; + static String tempTitle = "1984"; + static String tempAuthor = "George Orwell"; + static String tempPriceStr = "1.50"; + static float tempPrice = 1.50f; + + static boolean called_getId = false; + static boolean called_getTitle = false; + static boolean called_getAuthor = false; + static boolean called_getPrice = false; + static boolean called_updateBook = false; + static boolean called_sendRedirect = false; + static HttpServletRequest request; + static HttpServletResponse response; + static Book tempBook; + static Method updateMethod = null; + + @Mock + private BookDAO mockBookDAO; + + @InjectMocks + private ControllerServlet controllerServlet; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + request = mock(HttpServletRequest.class); + response = mock(HttpServletResponse.class); + tempBook = new Book(tempID, tempTitle, tempAuthor, tempPrice); + + when(request.getPathInfo()).thenReturn("/update"); + when(request.getParameter("id")).thenReturn(tempIDStr); + when(request.getParameter("booktitle")).thenReturn(tempTitle); + when(request.getParameter("bookauthor")).thenReturn(tempAuthor); + when(request.getParameter("bookprice")).thenReturn(tempPriceStr); + + + try { + updateMethod = Whitebox.getMethod(ControllerServlet.class, + "updateBook", HttpServletRequest.class, HttpServletResponse.class); + } catch (Exception e) {} + + // String errorMsg = "private void updateBook() does not exist in ControllerServlet"; + // assertNotNull(errorMsg, updateMethod); + + if (updateMethod != null) { + try { + controllerServlet.doGet(request, response); + } catch (Exception e) {} + } + } + + @Test + public void _task8() throws Exception { + String errorMsg = "private void updateBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, updateMethod); + + try { + verify(request).getParameter("id"); + called_getId = true; + } catch (Throwable e) {} + + errorMsg = "After action \"" + "/update" + + "\", did not call getParameter(\"id\")."; + assertTrue(errorMsg, called_getId); + } + + @Test + public void _task9() throws Exception { + String errorMsg = "private void updateBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, updateMethod); + + try { + verify(request).getParameter("booktitle"); + called_getTitle = true; + verify(request).getParameter("bookauthor"); + called_getAuthor = true; + verify(request).getParameter("bookprice"); + called_getPrice = true; + } catch (Throwable e) {} + + errorMsg = "After action \"" + "/update" + + "\", did not call getParameter(\"booktitle\")."; + assertTrue(errorMsg, called_getTitle); + errorMsg = "After action \"" + "/update" + + "\", did not call getParameter(\"bookauthor\")."; + assertTrue(errorMsg, called_getAuthor); + errorMsg = "After action \"" + "/update" + + "\", did not call getParameter(\"bookprice\")."; + assertTrue(errorMsg, called_getPrice); + } + + @Test + public void _task10() throws Exception { + String errorMsg = "private void updateBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, updateMethod); + + Method method = null; + try { + method = BookDAO.class.getMethod("updateBook", Book.class); + } catch (NoSuchMethodException e) { + //e.printStackTrace(); + } + + errorMsg = "The method updateBook() doesn't exist in BookDAO.java."; + assertNotNull(errorMsg, method); + + MockingDetails mockingDetails = Mockito.mockingDetails(mockBookDAO); + + Collection invocations = mockingDetails.getInvocations(); + + List methodsCalled = new ArrayList<>(); + for (Invocation anInvocation : invocations) { + methodsCalled.add(anInvocation.getMethod().getName()); + } + errorMsg = "After action \"" + "/update" + + "\", did not updateBook(newBookObject)."; + assertTrue(errorMsg, methodsCalled.contains("updateBook")); + } + + @Test + public void _task11() throws Exception { + String errorMsg = "private void updateBook() does not exist in ControllerServlet"; + assertNotNull(errorMsg, updateMethod); + + try { + verify(response).sendRedirect("list"); + called_sendRedirect = true; + } catch (Throwable e) {} + + errorMsg = "In ControllerServlet updateBook()," + + " did not call sendRedirect(\"list\")."; + assertTrue(errorMsg, called_sendRedirect); + } +} From dbe75b37c7f683711416465c0f77374268103aae Mon Sep 17 00:00:00 2001 From: sarah Date: Thu, 31 May 2018 14:24:17 -0400 Subject: [PATCH 2/5] Updating pom.xml --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 17d420c6..35f01a49 100644 --- a/pom.xml +++ b/pom.xml @@ -96,6 +96,7 @@ 8080 / + true From 9534a969932b803eb171ffb1da5a6b4066ddfc92 Mon Sep 17 00:00:00 2001 From: trizzo Date: Thu, 15 Nov 2018 15:51:26 -0700 Subject: [PATCH 3/5] added delete method --- book_store.db | Bin 8192 -> 8192 bytes src/main/java/com/pluralsight/BookDAO.java | 13 +++ .../com/pluralsight/ControllerServlet.java | 93 ++++++++++-------- src/main/webapp/BookAdmin.jsp | 4 +- 4 files changed, 67 insertions(+), 43 deletions(-) diff --git a/book_store.db b/book_store.db index 7ff26bcdb2cc2f134a102511432d63d2b67474f4..fb161be32c54591f89b4d61251d5874976b2aca8 100644 GIT binary patch delta 43 zcmZp0XmFSy&B!%T#+i|8W5N=CE++nb2L6To`TY5t1qI^xC+EmVFxpQ(DsK${{+J8Z delta 43 zcmZp0XmFSy&B!@X#+i|GW5N=CE@u9G2L6ToH~I573kt;XPtK8#V3e4ARNfi@1uhI1 diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index 6acd6b8f..ecbfe130 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -90,4 +90,17 @@ public boolean insertBook(Book book) { return false; } + + public void deleteBook(int id) { + String SQL = "DELETE FROM book WHERE id = ?"; + + try { + PreparedStatement statement = jdbcConnection.prepareStatement(SQL); + statement.setInt(1, id); + statement.executeUpdate(); + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index 1fdd645b..9de06d54 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -14,57 +14,61 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.inject.Inject; + /** * Servlet implementation class HelloWorld */ public class ControllerServlet extends HttpServlet { - private static final long serialVersionUID = 1L; - private DBConnection dbConnection; - - @Inject - private BookDAO bookDAO; - /** - * @see HttpServlet#HttpServlet() - */ - - public void init() { - dbConnection = new DBConnection(); - bookDAO = new BookDAO(dbConnection.getConnection()); - } - - public void destroy() { - dbConnection.disconnect(); - } + private static final long serialVersionUID = 1L; + private DBConnection dbConnection; + + @Inject + private BookDAO bookDAO; + + /** + * @see HttpServlet#HttpServlet() + */ + + public void init() { + dbConnection = new DBConnection(); + bookDAO = new BookDAO(dbConnection.getConnection()); + } - public ControllerServlet() { - super(); - } + public void destroy() { + dbConnection.disconnect(); + } + + public ControllerServlet() { + super(); + } /** - * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) */ - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getPathInfo(); try { - switch(action) { - case "/admin": - showBookAdmin(request, response); - break; - case "/new": - showNewForm(request, response); - break; - case "/insert": - insertBook(request, response); - break; - default: - listBooks(request, response); - break; + switch (action) { + case "/admin": + showBookAdmin(request, response); + break; + case "/new": + showNewForm(request, response); + break; + case "/insert": + insertBook(request, response); + break; + case "/delete": + deleteBook(request,response); + break; + default: + listBooks(request, response); + break; } } catch (Exception e) { - // TODO Auto-generated catch block e.printStackTrace(); } } @@ -105,10 +109,17 @@ private void insertBook(HttpServletRequest request, HttpServletResponse response response.sendRedirect("list"); } - /** - * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) - */ - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + private void deleteBook(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + int id = Integer.parseInt(request.getParameter("id")); + bookDAO.deleteBook(id); + + response.sendRedirect("list"); + + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { // TODO Auto-generated method stub PrintWriter out = response.getWriter(); out.println("This is the doPost() method!"); diff --git a/src/main/webapp/BookAdmin.jsp b/src/main/webapp/BookAdmin.jsp index 420c8e95..cbb67588 100644 --- a/src/main/webapp/BookAdmin.jsp +++ b/src/main/webapp/BookAdmin.jsp @@ -32,8 +32,8 @@ ${ item.getTitle() } ${ item.getAuthor() } - Edit - Delete + Edit + Delete From 712a10ec7b51bfe33e0e7a57d5e6e8424ca49615 Mon Sep 17 00:00:00 2001 From: trizzo Date: Thu, 15 Nov 2018 17:14:59 -0700 Subject: [PATCH 4/5] Added edit form and routes --- .../com/pluralsight/ControllerServlet.java | 29 ++++++--- src/main/webapp/BookForm.jsp | 59 ++++++++++++------- 2 files changed, 59 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index 9de06d54..3fe00123 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -61,8 +61,11 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro case "/insert": insertBook(request, response); break; - case "/delete": - deleteBook(request,response); + case "/delete": + deleteBook(request, response); + break; + case "/edit": + showEditForm(request, response); break; default: listBooks(request, response); @@ -109,13 +112,21 @@ private void insertBook(HttpServletRequest request, HttpServletResponse response response.sendRedirect("list"); } - private void deleteBook(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - int id = Integer.parseInt(request.getParameter("id")); - bookDAO.deleteBook(id); - - response.sendRedirect("list"); - + private void deleteBook(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + int id = Integer.parseInt(request.getParameter("id")); + bookDAO.deleteBook(id); + + response.sendRedirect("list"); + } + + private void showEditForm(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + int id = Integer.parseInt(request.getParameter("id")); + Book existingBook = bookDAO.getBook(id); + RequestDispatcher dispatcher = request.getRequestDispatcher("/BookForm.jsp"); + request.setAttribute("book", existingBook); + dispatcher.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) diff --git a/src/main/webapp/BookForm.jsp b/src/main/webapp/BookForm.jsp index c71ce22d..a0893b5a 100644 --- a/src/main/webapp/BookForm.jsp +++ b/src/main/webapp/BookForm.jsp @@ -1,31 +1,50 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8"%> -<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %> + pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> - Codestin Search App - +Codestin Search App + -
    -
  • Book Listing
  • -
  • Admin
  • + -
    - -

    - New Book Form -

    -

    -

    -

    -

    -

    -

    -

    - +
    + +
    + + + + +

    + Edit Book Form + New Book Form +

    +

    + + + + + +

    +

    + +

    +

    + +

    +

    + +

    +
    From c9f1c1cb4c1c4568212caf28a068473a4de0faba Mon Sep 17 00:00:00 2001 From: trizzo Date: Thu, 15 Nov 2018 17:37:42 -0700 Subject: [PATCH 5/5] added method to complete update with DAO and DB --- book_store.db | Bin 8192 -> 8192 bytes src/main/java/com/pluralsight/BookDAO.java | 192 ++++++++++-------- .../com/pluralsight/ControllerServlet.java | 16 ++ 3 files changed, 120 insertions(+), 88 deletions(-) diff --git a/book_store.db b/book_store.db index fb161be32c54591f89b4d61251d5874976b2aca8..102ebdaf0cfe7e2ed44fb645945dcc264ca52d65 100644 GIT binary patch delta 135 zcmZp0XmFSy&B!}Z#+i|KW5ObSo`np|{P_(0&-wHDH*OXbh~uA}BX1hdz`!6Ns?Kg` zX<_1?nqQP|!p6$rtjg|@UsRl`;FMpHnU}6$WTg<2k*W}sT9%rZp6aHj;F6h~otamh fpXXryw_pL#2ytds22piJxGAX${zc`fIXNi+pgbj+ delta 135 zcmZp0XmFSy&B!%T#+i|8W5ObSo`Vcb{P_(03;FZ;^EV3$#PLtgkvEN(V`gO#RcAM} zv@mf`%`Zw%Rq!t=PtD135MqDGIpyt#{2NsBK0MD-=%m4rY diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index ecbfe130..e49dd0b9 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -11,96 +11,112 @@ import java.util.ArrayList; public class BookDAO { - private Connection jdbcConnection; - public BookDAO(Connection connection) - { - jdbcConnection = connection; - } - - public Book getBook(int id) { - Book book = null; - String sql = "SELECT * FROM book WHERE id = ?"; - - try { - PreparedStatement statement = jdbcConnection.prepareStatement(sql); - statement.setInt(1, id); - - ResultSet resultSet = statement.executeQuery(); - - if (resultSet.next()) { - String title = resultSet.getString("title"); - String author = resultSet.getString("author"); - float price = resultSet.getFloat("price"); - - book = new Book(id, title, author, price); - } - - resultSet.close(); - statement.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - - return book; - } - - public ArrayList listAllBooks() { - ArrayList listBook = new ArrayList<>(); - - String sql = "SELECT * FROM book"; - - try { - Statement statement = jdbcConnection.createStatement(); - - ResultSet resultSet = statement.executeQuery(sql); - - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String title = resultSet.getString("title"); - String author = resultSet.getString("author"); - float price = resultSet.getFloat("price"); - - Book book = new Book(id, title, author, price); - listBook.add(book); - } - - resultSet.close(); - statement.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - return listBook; - } - - public boolean insertBook(Book book) { - String sql = "INSERT INTO book (title, author, price) VALUES (?, ?, ?)"; - - try { - PreparedStatement statement = jdbcConnection.prepareStatement(sql); - statement.setString(1, book.getTitle()); - statement.setString(2, book.getAuthor()); - statement.setFloat(3, book.getPrice()); - - boolean rowInserted = statement.executeUpdate() > 0; - statement.close(); - return rowInserted; - } catch (SQLException e) { - e.printStackTrace(); - } - - return false; - } - - public void deleteBook(int id) { - String SQL = "DELETE FROM book WHERE id = ?"; - - try { + private Connection jdbcConnection; + + public BookDAO(Connection connection) { + jdbcConnection = connection; + } + + public Book getBook(int id) { + Book book = null; + String sql = "SELECT * FROM book WHERE id = ?"; + + try { + PreparedStatement statement = jdbcConnection.prepareStatement(sql); + statement.setInt(1, id); + + ResultSet resultSet = statement.executeQuery(); + + if (resultSet.next()) { + String title = resultSet.getString("title"); + String author = resultSet.getString("author"); + float price = resultSet.getFloat("price"); + + book = new Book(id, title, author, price); + } + + resultSet.close(); + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + + return book; + } + + public ArrayList listAllBooks() { + ArrayList listBook = new ArrayList<>(); + + String sql = "SELECT * FROM book"; + + try { + Statement statement = jdbcConnection.createStatement(); + + ResultSet resultSet = statement.executeQuery(sql); + + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String title = resultSet.getString("title"); + String author = resultSet.getString("author"); + float price = resultSet.getFloat("price"); + + Book book = new Book(id, title, author, price); + listBook.add(book); + } + + resultSet.close(); + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + return listBook; + } + + public boolean insertBook(Book book) { + String sql = "INSERT INTO book (title, author, price) VALUES (?, ?, ?)"; + + try { + PreparedStatement statement = jdbcConnection.prepareStatement(sql); + statement.setString(1, book.getTitle()); + statement.setString(2, book.getAuthor()); + statement.setFloat(3, book.getPrice()); + + boolean rowInserted = statement.executeUpdate() > 0; + statement.close(); + return rowInserted; + } catch (SQLException e) { + e.printStackTrace(); + } + + return false; + } + + public void deleteBook(int id) { + String SQL = "DELETE FROM book WHERE id = ?"; + + try { PreparedStatement statement = jdbcConnection.prepareStatement(SQL); - statement.setInt(1, id); + statement.setInt(1, id); statement.executeUpdate(); - statement.close(); + statement.close(); } catch (SQLException e) { e.printStackTrace(); - } - } + } + } + + public void updateBook(Book book) { + String SQL = "UPDATE book SET title = ?, author = ?, price = ?" + "WHERE id = ?"; + try { + PreparedStatement statement = jdbcConnection.prepareStatement(SQL); + statement.setString(1, book.getTitle()); + statement.setString(2, book.getAuthor()); + statement.setFloat(3, book.getPrice()); + statement.setInt(4, book.getId()); + + statement.executeUpdate(); + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index 3fe00123..92dce3a6 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -67,6 +67,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro case "/edit": showEditForm(request, response); break; + case "/update": + updateBook(request, response); + break; default: listBooks(request, response); break; @@ -129,6 +132,19 @@ private void showEditForm(HttpServletRequest request, HttpServletResponse respon dispatcher.forward(request, response); } + private void updateBook(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + int id = Integer.parseInt(request.getParameter("id")); + String title = request.getParameter("booktitle"); + String author = request.getParameter("bookauthor"); + String price = request.getParameter("bookprice"); + + Book newBook = new Book(id, title, author, Float.parseFloat(price)); + + bookDAO.updateBook(newBook); + response.sendRedirect("list"); + } + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub