diff --git a/webapp/src/components/About/AboutUs.test.tsx b/webapp/src/components/About/AboutUs.test.tsx new file mode 100644 index 0000000..d439b1b --- /dev/null +++ b/webapp/src/components/About/AboutUs.test.tsx @@ -0,0 +1,12 @@ +import AboutUs from "./AboutUs"; +import { render, screen} from "@testing-library/react"; + + +test('Check that everything is properly rendered', async () => { + render(); + expect(screen.getByText("About us")).toBeInTheDocument(); + expect(screen.getByText("Developer team")).toBeInTheDocument(); + expect(screen.getByText("Diego Martín Fernández")).toBeInTheDocument(); + expect(screen.getByText("Laura Pernía Blanco")).toBeInTheDocument(); + expect(screen.getByText("Stelian Adrian Stanci")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/components/Footer/Footer.test.tsx b/webapp/src/components/Footer/Footer.test.tsx new file mode 100644 index 0000000..8f0bc27 --- /dev/null +++ b/webapp/src/components/Footer/Footer.test.tsx @@ -0,0 +1,17 @@ +import {fireEvent, render, screen} from "@testing-library/react"; +import App from "../../App" + +test('Check that everything in the footer is rendered', async () => { + render(); + expect(screen.getByText("Code")).toBeInTheDocument(); + expect(screen.getByText("Documentation")).toBeInTheDocument(); + expect(screen.getByText("About Us")).toBeInTheDocument(); + expect(screen.getByText("SOLID")).toBeInTheDocument(); +}); + +test('Check that About Us link works at takes the user to About us page', async () => { + render(); + let aboutUs = screen.getByTestId("aboutUsLink"); + fireEvent.click(aboutUs); + expect(screen.getByText("Developer team")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/components/Footer/Footer.tsx b/webapp/src/components/Footer/Footer.tsx index 0cd7544..b6cc36c 100644 --- a/webapp/src/components/Footer/Footer.tsx +++ b/webapp/src/components/Footer/Footer.tsx @@ -69,7 +69,7 @@ const Footer = () => { - About Us + About Us diff --git a/webapp/src/components/ListProducts.test.tsx b/webapp/src/components/ListProducts.test.tsx new file mode 100644 index 0000000..c6dd2a8 --- /dev/null +++ b/webapp/src/components/ListProducts.test.tsx @@ -0,0 +1,21 @@ +import {ProductType} from "../shared/shareddtypes"; +import ListProducts from "./ListProducts"; +import {render, screen, waitForElementToBeRemoved} from "@testing-library/react"; + +const testProductList:ProductType[] = [{id:1, name:"Watermelon", category:"Fruit", price:3.45, + image:"https://images.unsplash.com/photo-1629084092232-b7b3fa74cd4b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=764&q=80", + description: "Rica sandia" }, + {id:2, name:"Salmon", category:"Fish", price:5.55, + image:"https://images.unsplash.com/photo-1499125562588-29fb8a56b5d5?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1332&q=80", + description: "Salmon description" } +]; + +test("Check that products are correctly rendered", async () => { + ///////// We need to change the implementation of ListProduct + //jest.spyOn(api, "useFetch").mockReturnValue(Promise.resolve(testProductList)); + //render() + + //await waitForElementToBeRemoved(() => screen.getByTestId('loadingProduct')); + //expect(screen.getByText("Watermelon - 3.45€")).toBeInTheDocument(); + //expect(screen.getByText("Rica sandia")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/components/PastOrders/OrderDetailProduct.test.tsx b/webapp/src/components/PastOrders/OrderDetailProduct.test.tsx new file mode 100644 index 0000000..65bd995 --- /dev/null +++ b/webapp/src/components/PastOrders/OrderDetailProduct.test.tsx @@ -0,0 +1,21 @@ +import OrderDetailProduct from "./OrderDetailProduct"; +import { render, screen} from "@testing-library/react"; +import {OrderProduct, ProductType} from "../../shared/shareddtypes"; + +const testProduct:ProductType = {id:1, name:"Watermelon", category:"Fruit", price:1.25, + image:"https://images.unsplash.com/photo-1629084092232-b7b3fa74cd4b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=764&q=80", + description: "Rica sandia" }; + +const testOrderProduct:OrderProduct = {id:1, quantity:2, price:1.25, product:testProduct, order:undefined!}; + +test('Check that order product is properly rendered and total', async () => { + render(); + expect(screen.getByText(testProduct.name)).toBeInTheDocument(); + expect(screen.getByText("Units: " + testOrderProduct.quantity)).toBeInTheDocument(); + expect(screen.getByText(testOrderProduct.price + "€")).toBeInTheDocument(); +}); + +test('Check that subtotal of this product is correctly calculated', async () => { + render(); + expect(screen.getByText(testOrderProduct.price * testOrderProduct.quantity + "€")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/components/ProductDetail.test.tsx b/webapp/src/components/ProductDetail.test.tsx new file mode 100644 index 0000000..4e1b8c0 --- /dev/null +++ b/webapp/src/components/ProductDetail.test.tsx @@ -0,0 +1,32 @@ +import * as api from "../api/api"; +import {ProductType, RatingType} from "../shared/shareddtypes"; +import ProductDetail from "./ProductDetail"; +import {render, screen, waitForElementToBeRemoved} from "@testing-library/react"; + +const testProduct:ProductType = {id:1, name:"Watermelon", category:"Fruit", price:3.45, + image:"https://images.unsplash.com/photo-1629084092232-b7b3fa74cd4b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=764&q=80", + description: "Rica sandia" }; + +const testRating:RatingType[] = [{user:"WatermelonLover", comment:"Nice watermelon", rating:0.9, product:testProduct}, + {user:"Laura", comment:"Bad watermelon", rating:0.1, product:testProduct}] + +test("Check that the details view of a product is renderer properly", async () => { + jest.spyOn(api, "getProductById").mockReturnValue(Promise.resolve(testProduct)); + render() + + await waitForElementToBeRemoved(() => screen.getByTestId('loadingProduct')); + expect(screen.getByText("Watermelon - 3.45€")).toBeInTheDocument(); + expect(screen.getByText("Rica sandia")).toBeInTheDocument(); +}); + +test("Check that reviews of a product are rendered correctly", async () => { + jest.spyOn(api, "getProductById").mockReturnValue(Promise.resolve(testProduct)); + jest.spyOn(api, "getRatingsForProduct").mockReturnValue(Promise.resolve(testRating)); + render() + + await waitForElementToBeRemoved(() => screen.getByTestId('loadingProduct')); + expect(screen.getByText("Nice watermelon")).toBeInTheDocument(); + expect(screen.getByText("WatermelonLover")).toBeInTheDocument(); + expect(screen.getByText("Bad watermelon")).toBeInTheDocument(); + expect(screen.getByText("Laura")).toBeInTheDocument(); +}); diff --git a/webapp/src/components/ProductDetail.tsx b/webapp/src/components/ProductDetail.tsx index eb23c5c..8a58c80 100644 --- a/webapp/src/components/ProductDetail.tsx +++ b/webapp/src/components/ProductDetail.tsx @@ -157,7 +157,7 @@ const ProductDetails = () => { ); } else { - return

No product could be loaded :(

; + return

No product could be loaded :(

; } }; diff --git a/webapp/src/shared/shareddtypes.ts b/webapp/src/shared/shareddtypes.ts index c9c465e..989df86 100644 --- a/webapp/src/shared/shareddtypes.ts +++ b/webapp/src/shared/shareddtypes.ts @@ -50,11 +50,10 @@ export type OrderProduct = { } export type RatingType = { - user: string comment: string rating: number - profileImage: string + profileImage?: string product: ProductType }