View List of Required Features
The repository is structured as follows:
- The
client/
directory. This contains all the logic for the user interface. Components are in thesrc/components/
directory. Thepackage.json
file contains all dependencies for theclient/
. Thecypress/
directory contains all e2e tests and the component tests. - The
server/
directory contains all logic for the application’s server. The starting point isserver.js
. The fileconfig.js
contains server configuration settings. Currently, it has the URLs for the local instances of the node server and MongoDB service. The init.js file has some starter code to connect to a MongoDB database instance running locally. Thedestroy.js
file is used to delete the entire database and start afresh whenever necessary. Thetests/
directory contains all unit testing files. Thepackage.json
file contains all dependencies for theserver/
.
The client/
and the server/
directory have a file named Dockerfile
. These files contain commands to install a client and server application on a docker container and run them in the container. The project root has a file docker-compose.yml
file. This file has commands to build the project. Building the project includes creating an image of MongoDB in a docker container, transferring all client and server files to the same container, and executing the server followed by the client on the container.
Steps to run docker:
- Install docker by referring - https://docs.docker.com/engine/install/
- Ensure you have docker set-up on your host machines and the docker daemon is up and running.
- Update the Mongodb url as per the docker-compose.yml, i.e. update mongodb://localhost:27017/fake_so to mongodb://mongodb:27017/fake_so
- From the main project directory, run the command to generate the images and start the containers
- Run the command docker-compose up from the project root. This should result in the container being up and running. Start the application from your browser.
We used a SnackBar to display error messages when users attempt to do certain actions. Cypress has trouble getting the SnackBar and because of this, these tests are flaky. When running the tests, if the test mentions a SnackBar, it does regularly pass, but if it fails, this is due to it being flaky.
Feature | Description | E2E Tests | Component Tests | Jest Tests ('': <path/to/endpoint) |
---|---|---|---|---|
User Validation / Authentication | Validate user identity throughout application. | /client/cypress/e2e/userAuth | /client/cypress/component/userAuth | '/user/validateAuth' & '/user/csrf-token': /server/tests/accounts |
View Posts | Allow users to view existing posts, including metadata (i.e., vote count) on the platform. | /client/cypress/e2e/viewPosts | /client/cypress/component/viewPosts | '/question/getQuestion' & '/question/getQuestionByID/:qid': /server/tests/viewPosts |
Create New Posts | Allow users to compose and publish new posts. | /client/cypress/e2e/createPosts | /client/cypress/component/createPosts | '/question/addQuestion' & '/answer/addAnswer': /server/tests/createPosts |
Search for Existing Posts | Allow users to search for specific posts or topics. | /client/cypress/e2e/search | /client/cypress/component/search | '/question/getQuestion': /server/tests/search |
Commenting on Posts | Allow users to add comments to existing posts. | /client/cypress/e2e/comments | /client/cypress/component/comments | '/comment/addCommentToQuestion' & '/comment/addCommentToAnswer': /server/tests/comments |
Voting on Posts | Increases or decreases the score of a question or answer depending on user voting. | /client/cypress/e2e/voting | /client/cypress/component/voting | '/vote/addVoteTo{Question/Answer/Comment}': /server/tests/voting |
Tagging Posts | Association of terms or keywords when creating questions, and suggestion of tags. | /client/cypress/e2e/tagging | /client/cypress/component/tagging & /client/cypress/component/createPosts/new_question.cy.js | '/question/addQuestion': /server/tests/createPosts |
Viewing User Profiles | Show user information, summary statistics, and views of a user’s posts. | /client/cypress/e2e/profiles | /client/cypress/component/profiles | '/profile/view/:uid': /server/tests/profiles |
Editing User Profiles | Show options that a user can edit and update them accordingly. | /client/cypress/e2e/editProfiles | /client/cypress/component/editProfiles | '/profile/edit': /server/tests/profiles |
Post Moderation | User moderation to open or close question threads and flag for inappropriate posts. | /client/cypress/e2e/mod | /client/cypress/component/mod | '/vote/addVoteTo{Question/Answer/Comment}' & '/isAuthorizedToVote/:voteType': /server/tests/voting |
Account Creation / Sign In | Creates a new user account or updates session to use an existing one. | /client/cypress/e2e/accounts | /client/cypress/component/accounts | '/user/login' & '/user/logout' & '/user/signUp': /server/tests/accounts |
Mark Post as Solution | Allow users to mark an answer post as the solution to a specific question. | /client/cypress/e2e/solution | /client/cypress/component/solution | '/answer/markAnswerAsSolution': /server/tests/solution |
- Install MongoDB on your local machine.
- Install NodeJS on your local machine.
cd server
npm install
cd ../client
npm install
cd server
node init.js
Generate the coverage report by running the following instructions:
cd server
npx jest --runInBand --coverage