From 7175572069a497485c77403c25e6333108db9d9a Mon Sep 17 00:00:00 2001 From: sarah Date: Fri, 25 May 2018 15:19:49 -0400 Subject: [PATCH 01/22] 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" %> + + + + Book Store + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
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" %> + + + + Book Store + + + + + +
+
+

+ 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" %> + + + + Book Store + + + + + + + +
+
+ + + + + + + + + + + + + + + + +
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 02/22] 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 21850ef95d770069a16a957777c5f7ff8fc8bc94 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 09:49:18 +0300 Subject: [PATCH 03/22] first change --- pom.xml | 251 ++++++++++++++++++---------------- src/main/webapp/BookAdmin.jsp | 4 +- 2 files changed, 132 insertions(+), 123 deletions(-) diff --git a/pom.xml b/pom.xml index 35f01a49..879de4ea 100644 --- a/pom.xml +++ b/pom.xml @@ -1,135 +1,144 @@ - - 4.0.0 - com.pluralsight - bookstore - war - 1.0-SNAPSHOT - bookstore Maven Webapp - http://maven.apache.org + + 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 - + + 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 + 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 - + + + javax.servlet + jstl + 1.2 + + + + javax.inject + javax.inject + 1 + - - - org.xerial - sqlite-jdbc - 3.21.0.1 - + + + org.xerial + sqlite-jdbc + 3.21.0.1 + + + + javax + javaee-api + 7.0 + provided + - - - 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 - + + + 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 - / - true - - - - + - - - integration - - - - - org.apache.maven.plugins - maven-failsafe-plugin - 2.18.1 - - - - integration-test - verify - - - - - http://localhost:8080 - - - - - - - - - + + bookstore + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + 8080 + / + true + + + + + + + + integration + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.18.1 + + + + integration-test + verify + + + + + http://localhost:8080 + + + + + + + + + diff --git a/src/main/webapp/BookAdmin.jsp b/src/main/webapp/BookAdmin.jsp index 420c8e95..09e5e89e 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 b690b375d7cd24fe7a153f9d343f6788c3e65d5a Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 10:21:49 +0300 Subject: [PATCH 04/22] Second change --- .../java/com/pluralsight/ControllerServlet.class | Bin 0 -> 6389 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bin/src/main/java/com/pluralsight/ControllerServlet.class diff --git a/bin/src/main/java/com/pluralsight/ControllerServlet.class b/bin/src/main/java/com/pluralsight/ControllerServlet.class new file mode 100644 index 0000000000000000000000000000000000000000..9da0b41826605ca0e8e7192f76870eddcd6122c1 GIT binary patch literal 6389 zcmeHL?Ni)D7=IQHl1phpuxMLf0#*wa@2u9UrB;uZD>x^#h2rQZbIF$5Hp!;DdlbI- zZ#kng`q3Hx5I^}hI6j+P?*ar8R62;gnM<;p-~RHv?epyJZ-4&yGXUIxB?I~hRHbmM zfy2V;BWKI0x;&^xep@)cWScEjo#&wv-1n(iqhiaa%77Aqkr?Yc;bwKU`G~p-yCfCN z@i(ZDjE4`F7YL9q37ka&shm)4IDVTB;D_~(5E$~B_$tJ)2q!SpI9!f}xgL6!fYIdq z@j`8tz?GbVa|sZ~T)N*56$|KcxWy!E`m`2?Tsivtl7QJ*4z(r-EU}QGM*UOM8`zlV z9yQ=)0>eF}7lq)$gmD7jKL`bt+~1;}jkb%J9~0V<;P{2$rfrqiThtDyYH`orq^hUJ z)U^Fj@W591UhPEGPU~n3`VdWND;~cOn3OEsOmIC4%Yrd@bqFrNMFNAjwA{A|oS$m+ zL|sz?2hM6$h8rxTEA603#kzyi5g2W77k%cS=dj)BEU6YlgIvooEK0FEGPGMfDzS6N zgb4x@xu!AUEn@wCI7~h>p+{Zc5oqSfaUVOI)Sg6pS5mP$X?vVX8+~dAj&fVE;pldR zPEC)(IIHM*uV@=p_HrcdVnM`(vSS3}w(ICfv6~dVlKA>>!{igc5M5ibV!)z=|1xg7 zh!+1H(2`P7C&6VXre~oO&poT0WQiP5itavr(#A<~lmRlrj6`!rbfjI}c4?$jSPp!7 zwJ0)47&&xB$)1BD=6y%X6|U;M9ePFOTD#XM3{C1@QFw7f*Mx9(8Z0+9QuV_}bj|m5 zO_Te|N2k&qRyn$#w91{hTwpTN$&!j3kH7Hb?h26330<@1*zkYj$zw}SCopP{P1j>j zZ1Ku4Cu9p%gF>LX&z-C?XqBHsYB@G1-Nn_l`dToRmp};&c>E5cMxpsZJ7@iGjjo{pUr`n1kP zV8X|QoI4q@us2WSxHgqQa*#(X!UQaa`xz12%Y>VR{Cdg_bnLV6gj8-kbMp9IE|m$N z5n`TluO6Y)TWh>6Tv})PkZpY5Nm+dKgy(e2p^H0x%p^2aONIBAi^(Q46>(f`sdEq)9D@vFEJj}#X*M7JN12Bj!16zGy;@^TZ@$(Rz z#r|{ntltmgy^Qw}cnPng*t(9R3Er)rVC;Z~(((1_Q}txD0Qjr0>L%_Q4gH?rNm1l4x`_gRPpu2Jl{&&4LnC z;Qa#_KgeKQ%4EF$4;b%dGJe!$97N5tHNKG{-?y1;pLE%@#+prQ{VXbaHvBY$@w*Jh r63liP50>v%1{=>{>xbLu#Xk5PzQ8-c9sG}Agjb*j^RS50qKEzhXyNCt literal 0 HcmV?d00001 From bc687f46b6efe722fc20eef8a7f0bdc7221f457f Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 10:26:07 +0300 Subject: [PATCH 05/22] second change no 2 --- src/main/java/com/pluralsight/ControllerServlet.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index 1fdd645b..e49f4fe7 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -58,6 +58,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) break; case "/insert": insertBook(request, response); + break; + case "/delete": + insertBook(request, response); break; default: listBooks(request, response); @@ -68,6 +71,7 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) e.printStackTrace(); } } + private void deleteBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } private void showBookAdmin(HttpServletRequest request, HttpServletResponse response) throws ClassNotFoundException, SQLException, ServletException, IOException { From 5e4e1da51e14ed3124fcb4c386be433dd96fbc7e Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 10:27:01 +0300 Subject: [PATCH 06/22] third change --- src/main/java/com/pluralsight/ControllerServlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index e49f4fe7..a5055d60 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -60,7 +60,7 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) insertBook(request, response); break; case "/delete": - insertBook(request, response); + deleteBook(request, response); break; default: listBooks(request, response); From c9165b67d6e1a36439d5d97c39a99fa56d8b7746 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:05:02 +0300 Subject: [PATCH 07/22] forth change --- src/main/java/com/pluralsight/BookDAO.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index 6acd6b8f..428bb892 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -71,6 +71,16 @@ public ArrayList listAllBooks() { } return listBook; } + public void deleteBook(int id) { + String sql= " DELETE from book where id=?"; + try { + PreparedStatement statement=jdbcConnection.prepareStatement(sql); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } public boolean insertBook(Book book) { String sql = "INSERT INTO book (title, author, price) VALUES (?, ?, ?)"; From 970e894293318192ba181a95eee649a085ca29b0 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:07:56 +0300 Subject: [PATCH 08/22] fifth change --- src/main/java/com/pluralsight/BookDAO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index 428bb892..dc2d04a3 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -72,9 +72,9 @@ public ArrayList listAllBooks() { return listBook; } public void deleteBook(int id) { - String sql= " DELETE from book where id=?"; + String SQL= " DELETE from book where id= ?"; try { - PreparedStatement statement=jdbcConnection.prepareStatement(sql); + PreparedStatement statement=jdbcConnection.prepareStatement(SQL); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); From 32aa09cfdbc8bb298a8231cae94af4696f5c01c5 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:11:51 +0300 Subject: [PATCH 09/22] 6 change --- src/main/java/com/pluralsight/BookDAO.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index dc2d04a3..5bf94488 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -1,13 +1,10 @@ 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 { From 7e467a8f9177cb943b49181f4d58ec75b3522c53 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:14:15 +0300 Subject: [PATCH 10/22] 7 change --- src/main/java/com/pluralsight/BookDAO.java | 125 +++++++++++---------- 1 file changed, 63 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index 5bf94488..e2615528 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -8,67 +8,68 @@ import java.util.ArrayList; public class BookDAO { - private Connection jdbcConnection; - public BookDAO(Connection connection) - { - jdbcConnection = connection; - } + private Connection jdbcConnection; - public Book getBook(int id) { - Book book = null; - String sql = "SELECT * FROM book WHERE id = ?"; + public BookDAO(Connection connection) { + jdbcConnection = connection; + } - try { - PreparedStatement statement = jdbcConnection.prepareStatement(sql); - statement.setInt(1, id); + public Book getBook(int id) { + Book book = null; + String sql = "SELECT * FROM book WHERE id = ?"; - ResultSet resultSet = statement.executeQuery(); + try { + PreparedStatement statement = jdbcConnection.prepareStatement(sql); + statement.setInt(1, id); - if (resultSet.next()) { - String title = resultSet.getString("title"); - String author = resultSet.getString("author"); - float price = resultSet.getFloat("price"); + ResultSet resultSet = statement.executeQuery(); - book = new Book(id, title, author, price); - } + if (resultSet.next()) { + String title = resultSet.getString("title"); + String author = resultSet.getString("author"); + float price = resultSet.getFloat("price"); - resultSet.close(); - statement.close(); - } catch (SQLException e) { - e.printStackTrace(); - } + book = new Book(id, title, author, price); + } - return book; - } + resultSet.close(); + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + } - public ArrayList listAllBooks() { - ArrayList listBook = new ArrayList<>(); + return book; + } - String sql = "SELECT * FROM book"; + public ArrayList listAllBooks() { + ArrayList listBook = new ArrayList<>(); - try { - Statement statement = jdbcConnection.createStatement(); + String sql = "SELECT * FROM book"; - ResultSet resultSet = statement.executeQuery(sql); + try { + Statement statement = jdbcConnection.createStatement(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String title = resultSet.getString("title"); - String author = resultSet.getString("author"); - float price = resultSet.getFloat("price"); + ResultSet resultSet = statement.executeQuery(sql); - Book book = new Book(id, title, author, price); - listBook.add(book); - } + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String title = resultSet.getString("title"); + String author = resultSet.getString("author"); + float price = resultSet.getFloat("price"); - resultSet.close(); - statement.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - return listBook; - } - public void deleteBook(int id) { + Book book = new Book(id, title, author, price); + listBook.add(book); + } + + resultSet.close(); + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + return listBook; + } + + public void deleteBook(int id) { String SQL= " DELETE from book where id= ?"; try { PreparedStatement statement=jdbcConnection.prepareStatement(SQL); @@ -79,22 +80,22 @@ public void deleteBook(int id) { } - public boolean insertBook(Book book) { - String sql = "INSERT INTO book (title, author, price) VALUES (?, ?, ?)"; + 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()); + 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(); - } + boolean rowInserted = statement.executeUpdate() > 0; + statement.close(); + return rowInserted; + } catch (SQLException e) { + e.printStackTrace(); + } - return false; - } + return false; + } } From 07b65ed45709690ce302208d3eb54ebfb4c95491 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:19:45 +0300 Subject: [PATCH 11/22] change 8 --- src/main/java/com/pluralsight/BookDAO.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index e2615528..d581eb4c 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -73,8 +73,10 @@ 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) { - // TODO Auto-generated catch block e.printStackTrace(); } From 4677e909ad1ed599e24bfa78288e360151491505 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:28:54 +0300 Subject: [PATCH 12/22] 9 change --- src/main/java/com/pluralsight/BookDAO.java | 6 +++--- src/main/java/com/pluralsight/ControllerServlet.java | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index d581eb4c..8e7ad6e0 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -70,10 +70,10 @@ public ArrayList listAllBooks() { } public void deleteBook(int id) { - String SQL= " DELETE from book where id= ?"; + String sql= " DELETE from book where id= ?"; try { - PreparedStatement statement=jdbcConnection.prepareStatement(SQL); - statement.setInt(1, id); + PreparedStatement statement = jdbcConnection.prepareStatement(sql); + statement.setInt(1, id); statement.executeUpdate(); statement.close(); } catch (SQLException e) { diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index a5055d60..8569a990 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -71,7 +71,10 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) e.printStackTrace(); } } - private void deleteBook(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); + } private void showBookAdmin(HttpServletRequest request, HttpServletResponse response) throws ClassNotFoundException, SQLException, ServletException, IOException { From 2f63667fd9eee016218ca03c315530d3f45b9189 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:31:06 +0300 Subject: [PATCH 13/22] 10 change --- src/main/java/com/pluralsight/ControllerServlet.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index 8569a990..cc8159ef 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -74,6 +74,7 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) 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 showBookAdmin(HttpServletRequest request, HttpServletResponse response) From 88d1e3b3c4c71bee021065a2bd26bded43cee731 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:35:38 +0300 Subject: [PATCH 14/22] change 11 --- book_store.db | Bin 8192 -> 8192 bytes src/main/java/com/pluralsight/BookDAO.java | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/book_store.db b/book_store.db index 7ff26bcdb2cc2f134a102511432d63d2b67474f4..398d6414515f28a0fb757754b260c097799e7947 100644 GIT binary patch delta 48 zcmZp0XmFSy&B!%T#+i|8W5ObSo`nod{P_(0H~I7V^EV3$#PLtgkvC;wU|_JAyi`6K E06dQjhX4Qo delta 48 zcmZp0XmFSy&B!@X#+i|GW5ObSo`Vd`{P_(03;A#I=WiAih~uA}BX7zg$IQwwd8vFf E07KIZ#sB~S diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index 8e7ad6e0..c570158b 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -70,12 +70,12 @@ public ArrayList listAllBooks() { } public void deleteBook(int id) { - String sql= " DELETE from book where id= ?"; + String sql= "DELETE from book where id= ?"; try { PreparedStatement statement = jdbcConnection.prepareStatement(sql); statement.setInt(1, id); - statement.executeUpdate(); - statement.close(); + statement.executeUpdate(); + statement.close(); } catch (SQLException e) { e.printStackTrace(); } From 945e902c689005976b712bef4c73516f79d73997 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:43:10 +0300 Subject: [PATCH 15/22] change 12 --- src/main/java/com/pluralsight/BookDAO.java | 23 +++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index c570158b..de8fba96 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -69,18 +69,6 @@ public ArrayList listAllBooks() { return listBook; } - 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(); - } - - } public boolean insertBook(Book book) { String sql = "INSERT INTO book (title, author, price) VALUES (?, ?, ?)"; @@ -100,4 +88,15 @@ public boolean insertBook(Book book) { return false; } +// statement.setInt(1, id); +// statement.executeUpdate(); +// statement.close(); + public void deleteBook(int id) { + String SQL= "DELETE from book where id= ?"; + try { + PreparedStatement statement= jdbcConnection.prepareStatement(SQL); + }catch (SQLException ex) { + ex.printStackTrace(); + } + } } From 8498aec0d8959c844f61e90ccae49d9e7ef8caee Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:53:51 +0300 Subject: [PATCH 16/22] change 13 --- src/main/java/com/pluralsight/BookDAO.java | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/pluralsight/BookDAO.java b/src/main/java/com/pluralsight/BookDAO.java index de8fba96..b66a38c6 100644 --- a/src/main/java/com/pluralsight/BookDAO.java +++ b/src/main/java/com/pluralsight/BookDAO.java @@ -88,15 +88,16 @@ public boolean insertBook(Book book) { return false; } -// statement.setInt(1, id); -// statement.executeUpdate(); -// statement.close(); public void deleteBook(int id) { - String SQL= "DELETE from book where id= ?"; - try { - PreparedStatement statement= jdbcConnection.prepareStatement(SQL); - }catch (SQLException ex) { - ex.printStackTrace(); - } - } + 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(); + } + } + } From 5abcbe16a8844483e0369f31efd9c45abb3d868c Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 11:59:26 +0300 Subject: [PATCH 17/22] change edit 13 --- src/main/java/com/pluralsight/ControllerServlet.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index cc8159ef..dbf817d0 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -76,6 +76,7 @@ private void deleteBook(HttpServletRequest request, HttpServletResponse response bookDAO.deleteBook(id); response.sendRedirect("list"); } + private void showEditForm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } private void showBookAdmin(HttpServletRequest request, HttpServletResponse response) throws ClassNotFoundException, SQLException, ServletException, IOException { From 1aaff597e427881e532c463a7b0b981072be260e Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 12:01:03 +0300 Subject: [PATCH 18/22] change 14 --- src/main/java/com/pluralsight/ControllerServlet.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index dbf817d0..4a8e5272 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -61,6 +61,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) break; case "/delete": deleteBook(request, response); + break; + case "/edit": + showEditForm(request,response); break; default: listBooks(request, response); From e14024b0f0ff03f2cef4e79881e90b7d3c5790f9 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 12:08:40 +0300 Subject: [PATCH 19/22] change showEdit --- src/main/java/com/pluralsight/ControllerServlet.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index 4a8e5272..7df12c33 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -70,7 +70,6 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) break; } } catch (Exception e) { - // TODO Auto-generated catch block e.printStackTrace(); } } @@ -79,7 +78,10 @@ private void deleteBook(HttpServletRequest request, HttpServletResponse response bookDAO.deleteBook(id); response.sendRedirect("list"); } - private void showEditForm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } + private void showEditForm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + int id=Integer.parseInt(request.getParameter("id")); + Book existingBook=bookDAO.getBook(id); + } private void showBookAdmin(HttpServletRequest request, HttpServletResponse response) throws ClassNotFoundException, SQLException, ServletException, IOException { From 5ba067fce8dfb1f8d7d8d4f4fd9ca90809f6be8c Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 12:31:55 +0300 Subject: [PATCH 20/22] change 15 --- .../java/com/pluralsight/ControllerServlet.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index 7df12c33..62c06bde 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -17,6 +17,16 @@ /** * Servlet implementation class HelloWorld */ +//RequestDispatcher dispatcher = request.getRequestDispatcher("/BookAdmin.jsp"); +//dispatcher.forward(request, response); +// we need this two when we want to send to another page + +//request.setAttribute("books", books_list); +// this sets the name of the attribute from .jsp to the passed object + +// requests are requests that have data that needs to be processed, ex saving a book, a req holds the data that needs to be saved +// after that the controller processes that data and +// the response returns a way for us to see that the data has been processed public class ControllerServlet extends HttpServlet { private static final long serialVersionUID = 1L; @@ -81,12 +91,14 @@ private void deleteBook(HttpServletRequest request, HttpServletResponse response 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); } 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); From dd51f01f518e535204f437ae90758b7a94f31511 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 13:58:11 +0300 Subject: [PATCH 21/22] change 16 --- book_store.db | Bin 8192 -> 8192 bytes src/main/java/com/pluralsight/BookDAO.java | 16 ++++++++++++++ src/main/webapp/BookForm.jsp | 24 ++++++++++++++++----- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/book_store.db b/book_store.db index 398d6414515f28a0fb757754b260c097799e7947..8b730577b70546443b157da004574496f08ea9cb 100644 GIT binary patch delta 131 zcmZp0XmFSy&B!}Z#+i|KW5N=C9%lZ02L7A;`TRTh{Wc2<*zqg!FJw?uS7i*zNL6sm zNzO>k%`7enNG#3CS8&cx&B@4To18CiYAPeUzDDz;9pdpnj_D~%79NN J>*SmA>Hu?ICXfIC delta 98 zcmZp0XmFSy&B!%T#+i|8W5N=CE++nb2L7A;`TY5t1qE#RCpM@|&X+eewGdTjH?*`c vaZk-JN>5erFDg&X$#D>3fB^|rRd%
- + + + + + + +

+ + Edit Book Form + + New Book Form +

+

-

+ + + +

-

+

-

+

-
From 896c76c8b091f9797ebafec7607de9a8072be043 Mon Sep 17 00:00:00 2001 From: "Loredana.Hozan" Date: Fri, 15 Jun 2018 14:05:08 +0300 Subject: [PATCH 22/22] updateBook change in contoller --- .../java/com/pluralsight/ControllerServlet.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/pluralsight/ControllerServlet.java b/src/main/java/com/pluralsight/ControllerServlet.java index 62c06bde..137d8686 100644 --- a/src/main/java/com/pluralsight/ControllerServlet.java +++ b/src/main/java/com/pluralsight/ControllerServlet.java @@ -74,6 +74,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) break; case "/edit": showEditForm(request,response); + break; + case "/update": + updateBook(request,response); break; default: listBooks(request, response); @@ -141,5 +144,16 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) doGet(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"); + } }