-
Notifications
You must be signed in to change notification settings - Fork 0
Development Environment
This page provides insights into how to set up the project in your development environment including what dependencies need to be installed, the steps to build and run the application, and even some setup of additional tools that will assist you during development.
- Author: Alex Wilkes <adw4236@rit.edu>
Required programs:
Initial setup steps
- Clone the repo
- run
npm installfrom the top-level directory- This runs npm install on the sub-directories
clientandserver
- This runs npm install on the sub-directories
- At this point if you are unfamilliar with the project, you should familiarize yourself with the project structure
The client side can be ran independently of the server side so long as you specify a valid API server.
The client side application requires some environment variables to run, you can set up
these in any way you wish, however the easiest is through the use of a .env file.
A .env file (literally a text file just called .env) can be created in the /client
folder containing the following variables. The format of the file is KEY=VALUE on each
line. The following example can be used as a template for the file.
# The URL to the API server, this can be one running locally, or elsewhere
REACT_APP_SERVER_URL=http://localhost:9000
In a development environment, the server will only run the API server rather than serving up the client side frontend. This allows you to specify different ports for the two servers and run them both on your machine without needing to worry about setting up subdomains.
In a production environment, specifically when the environment variable NODE_ENV is set to
production, the app will run with subdomains enabled. See the section below about optional
host file configuration if you wish to test the app in production mode.
The server side application requires some environment variables to run, you can set up
these in any way you wish, however the easiest is through the use of a .env file.
A .env file (literally a text file just called .env) can be created in the /server
folder containing the following variables. The format of the file is KEY=VALUE on each
line. The following example can be used as a template for the file.
# The connection string pointing to a running database. This can be locally hosted or elsewhere
DB_CONN=mongodb://localhost:27017/data
# The username to the database
DB_USER=admin
# The password to the database
DB_PW=password
# The port the server will run on, defaults to 9000
# PORT=9000
# The domain to allow CORS through, this should match the domain used to access the app, you can
# safely ignore this if you aren't setting up a production environment since it defaults to localhost
# DOMAIN=fitr.com
If you wish to emulate the production server on your own machine (see Running the Application) you will need to also add a domain in your systems host file. Find the file listed below and append the following lines to the end of the file.
- Windows:
C:\Windows\System32\drivers\etc\hosts - Unix:
/etc/hosts
127.0.0.1 fitrskillsdev.com
127.0.0.1 api.fitrskillsdev.com
After doing this, ensure you update the frontend API url environment variable to point to
http://api.fitrskillsdev.com/
The application can be either be ran as two independent pieces (ideal for development) or built and ran as one unified server with subdomains (ideal for production).
The client side is simply a default create-react-app project which comes with several developer friendly tools.
To run the client side server, cd into the /client folder and run npm start which
is an alias for react-scripts start.
Once the application is running, it will automatically reload when the code has been changed.
The server is an express http server and running it will start the API server.
to run the server, cd into the /server folder and run npm start.
In order to emulate the production environment, the client and server must be built and then
ran. The following command should be ran at the top-level, they will invoke the proper
commands in the client and server projects. If you wish to see what exactly happens here,
reference the top-level package.json file.
Before proceeding, ensure you have configured your host file according to the directions in setting up the server.
-
npm installif you have yet to do so. -
npm run buildafter any code changes. -
npm run start- Note: This command will automatically set the NODE_ENV variable.
Alternatively you can just run npm run rebuildAndStart.
There are some additional tools that should be setup in your development environment for various reasons although they don't explicitly impact the code running.
Prettier is a tool that will re-write your code in one standard format. This makes it
easy to ensure that all developers are following the same style guidelines. Prettier is
installed as a top-level dependency, however it can alternatively be installed globally
using npm install -g prettier to have easy access to the command line tools.
All pull requests should run Prettier on all files changed in that request. Because of this, it is a good idea to configure your IDE to automatically run prettier when you save a file. Some instructions on how to set up your IDE to do this can be found below:
If you are doing heavy database activity during development, you should setup a local database instead of using one on the cloud.
- Download and install MongoDB Community
- The database should automatically run as a service, but if you configured it differently, run the database now.
- Run the mongo shell
- Open a command prompt
- cd to
<MongoDB install directory>/Server/<version>/bin - run the command
mongo(Note, if you are not using the default port, you will have to specify which one, see the documentation linked below)
- Run:
use data(You can replace data here with anything, just make sure to update it in your DB_CONN environment variable as well). - Run:
db.createUser({user: "admin", pwd: "password", roles: []})(Again, you can change the username and password, just make sure the environment variables reflect it). - Set the environment variables for the server side project
- DB_CONN (Likely:
mongodb://localhost:27017/data) - DB_USER
- DB_PW
- DB_CONN (Likely:
- You should now be able to run the server connected to your local database.
- Optionally you can populate some dummy data into this database with the populate.js script.
Just run the command
npm run populateand the same database that is configured by the server will be populated with some basic data.
For more information on MongoDB shell commands, see the MongoDB documentation
You can also use MongoDB Compass as a graphical interface for exploring the database.
There are plenty of techniques to testing the application during development including Postman to hit an API endpoint, or just going through the UI to make the requests.
Another way to test the backend during development is by using the chrome dev tools. If you are familiar with the devtools, you know you can type in javascript directly into the console and execute it. Node.JS allows you to use this same functionality for the backend.
- Start the server with
node --inspect src/bin/wwwinstead of the normalnpm start. - In chrome, navigate to the url
chrome://inspect/#devices - The server should show up in the "Remote Target" section, click on
inspectto open the session. - Navigate to the
Sourcestab and click on the plus button under file system. Navigate to your saved project and open up theserverfolder.
This session allows you to execute code exactly like it would be if it was ran from a source file. The following are some commands that can be used to interact with the server.
// Lets you import a document (or any module for that matter) and use it as you would in code
const Document = require("./src/models/<file>");
// An example of how you would create a new document (database entry) in code and save it.
let document = new Document();
// await is very important on any asynchronous methods (most of them)
await document.save();
// Get a document already in the database
let document = await Document.findById("<id>");
// Edit values of that document
document.key = "newValue";
await document.save();
The documents are based on the mongoose API which you should be familiar with if you are working on the backend although as mentioned, this is not just restricted to model tier testing.
You can also use this to debug the code by navigating to the sources tab and opening files there.
There are four total types of automated tests that exist in our application.
- Model Tier Unit Tests
- API Integration Tests
- Frontend UI Tests
- End-To-End Tests
See UI Testing and Server Testing for information on the philosophies of writing tests.
The frontend and end-to-end tests can both be ran using Cypress which is a javascript framework for testing web applications with javascript.
NOTE: The end-to-end tests were in early stages at the end of our project and are mostly just a proof of concept, more will have to be implemented.
the cypress.json is the file that contains all configurations needed to run cypress tests.
This file must be committed to the repository to provide cypress configurations for CI, but
can otherwise be changed to support your local testing environment. If you do make changes
to this file, ensure you don't accidentally commit them.
Cypress cannot pull its environment variables from the .env file, so they must be placed in
this configuration. All environment variables to run the frontend and backend must be present.
The end-to-end tests will make use of the database environment variables to access and pre-populate
the database with data needed for tests.
The command npm run test can be executed in the /client folder to launch cypress. Note that
for Cypress to open, npm install must be ran in this directory specifically, the top level will
only install the cypress library and not the executable binaries for the application.
The integration and unit tests are both implemented using Jest on the backend.
The jest.config.js file contains all necessary configurations as well as descriptive comments
for what each one does. This file should be used to configure coverage reports and some other
features.
The jest-mongodb-config.js file contains configurations for the in memory mongoDB that is ran
during the jest tests.
From the /server folder, you can run the command npm run test to run all tests.
Alternatively you can specify individual files to be ran through the commands npx jext <file>.
The coverage results will automatically be generated and both be shown as output to the command
executed as well as html files in the /server/coverage directory for a more detailed view.
Currently, we have a system in place to automatically generate API documentation, although it has not been used much.
The command npm run doc can be used and uses JsDoc to generate
documentation. This can be extended to also generate documentation for other tiers if
needed.
- Requirements Gathering
- Templates
- Functional Requirements
- Non-Functional Requirements