diff --git a/coverage/src/components/Header.jsx.html b/coverage/src/components/Header.jsx.html new file mode 100644 index 0000000..e32bcc7 --- /dev/null +++ b/coverage/src/components/Header.jsx.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for src/components/Header.jsx + + + + + + + + + +
+
+

All files / src/components Header.jsx

+
+ +
+ 0% + Statements + 0/19 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import React from 'react';
+import { Container, Navbar } from 'react-bootstrap';
+import 'bootstrap-icons/font/bootstrap-icons.css';
+import './Header.css';
+
+const Header = () => {
+  return (
+    <Navbar bg="light" className="header-navbar fixed-top justify-content-center">
+      <Container className="d-flex justify-content-center">
+        <Navbar.Brand href="/" className="text-center d-flex align-items-center">
+          <i className="bi bi-house-door-fill" style={{ fontSize: '2rem', color: '#4B7260' }}></i>
+          <span className="ms-3 good-neighbor-text">Good Neighbor</span>
+        </Navbar.Brand>
+      </Container>
+    </Navbar>
+  );
+};
+
+export default Header;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/components/pages/RequestPage.Haiche.test.jsx b/src/components/pages/RequestPage.Haiche.test.jsx new file mode 100644 index 0000000..9b7684f --- /dev/null +++ b/src/components/pages/RequestPage.Haiche.test.jsx @@ -0,0 +1,63 @@ +import { render, screen, waitFor } from '@testing-library/react'; +import { describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { MemoryRouter } from 'react-router-dom'; +import '@testing-library/jest-dom'; +import { useDbData, useAuthState } from '../../utilities/firebase'; +import RequestsPage from './RequestsPage'; + +vi.mock('../../utilities/firebase', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + useDbData: vi.fn(), + useAuthState: vi.fn(), + }; +}); + + +const mockRequests = { + request1: { request_id: "1", request_status: "Open", description: "Request 1", userid: "user1", delivery_pref: ["Drop off", "Meet up"] }, + request2: { request_id: "2", request_status: "Pending", description: "Request 2", userid: "user1", delivery_pref: ["Drop off"] }, + request3: { request_id: "3", request_status: "Accepted", description: "Request 3", userid: "user1", delivery_pref: ["Meet up"] }, + request4: { request_id: "4", request_status: "Closed", description: "Request 4", userid: "user1", delivery_pref: ["Drop off", "Meet up", "Meet up"] }, +}; + +const mockUsers = { + user1: { userid: "user1", username: "Haichen Xu" }, +}; + +beforeEach(() => { + useAuthState.mockReturnValue([{ uid: "user1" }, false]); + useDbData.mockImplementation((path) => { + if (path === "requests") return [mockRequests, null]; + if (path === "users") return [mockUsers, null]; + return [null, null]; + }); +}); + +afterEach(() => { + vi.resetAllMocks(); +}); + +describe("RequestsPage Component", () => { + it("displays request statuses for user1: Open, Pending, Accepted, Closed", async () => { + render( + + + + ); + + await waitFor(() => { + const openBadge = screen.getAllByText(/Open/i).find((el) => el.closest(".badge-responsive")); + const pendingBadge = screen.getAllByText(/Pending/i).find((el) => el.closest(".badge-responsive")); + const acceptedBadge = screen.getAllByText(/Accepted/i).find((el) => el.closest(".badge-responsive")); + const closedBadge = screen.getAllByText(/Closed/i).find((el) => el.closest(".badge-responsive")); + + expect(openBadge).toBeInTheDocument(); + expect(pendingBadge).toBeInTheDocument(); + expect(acceptedBadge).toBeInTheDocument(); + expect(closedBadge).toBeInTheDocument(); + }); + + }); +}); diff --git a/src/components/pages/RequestPage.Haichen2.test.jsx b/src/components/pages/RequestPage.Haichen2.test.jsx new file mode 100644 index 0000000..9daacaf --- /dev/null +++ b/src/components/pages/RequestPage.Haichen2.test.jsx @@ -0,0 +1,89 @@ +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import '@testing-library/jest-dom'; +import React, { useState } from 'react'; +import Request_Page_List from '../Request_Page_List'; +import { useDbData, useDbRemove, useDbStatusUpdate, useAuthState } from '../../utilities/firebase'; + + +vi.mock('../../utilities/firebase', () => { + return { + useDbData: vi.fn(), + useDbRemove: vi.fn(), + useDbStatusUpdate: vi.fn(), + useAuthState: vi.fn(() => [{ uid: 'user1' }, false]), + }; +}); + +let removeRequestMock; +let updateStatusMock; + +describe('Request_Page_List Component', () => { + it("deletes request from the mock database after clicking 'Withdraw Request'", async () => { + + let mockRequestsState; + const setMockRequests = (newState) => { + mockRequestsState = newState; + }; + + + const initialRequests = { + '1': { + request_id: '1', + request_status: 'Open', + description: 'Request 1', + userid: 'user1', + delivery_pref: ['Drop off', 'Meet up'], + }, + }; + mockRequestsState = initialRequests; + + useDbData.mockImplementation((path) => { + if (path === 'requests') { + return [mockRequestsState, null]; + } + if (path === 'users') { + return [{ user1: { name: 'Test User' } }, null]; + } + return [null, null]; + }); + + + removeRequestMock = vi.fn((path) => { + const requestId = path.split('/')[1]; + const { [requestId]: _, ...rest } = mockRequestsState; + setMockRequests(rest); + }); + useDbRemove.mockImplementation(() => [removeRequestMock, null]); + + + updateStatusMock = vi.fn(); + useDbStatusUpdate.mockImplementation(() => [updateStatusMock, null]); + + + const { rerender } = render(); + + + const withdrawButton = await screen.findByText(/Withdraw Request/i); + expect(withdrawButton).toBeInTheDocument(); + + + fireEvent.click(withdrawButton); + + + await waitFor(() => { + expect(removeRequestMock).toHaveBeenCalledWith('requests/1'); + }); + + + rerender(); + + + await waitFor(() => { + + expect(mockRequestsState['1']).toBeUndefined(); + + expect(screen.queryByText(/Withdraw Request/i)).not.toBeInTheDocument(); + }); + }); +});