SpaceToStudy project is a platform where experts in various fields share their knowledge and students can learn from the best. Here you can find the proper training course, find a tutor, or find students and receive feedback from them.
- All the
code
required to get started
- NodeJS (18.14.0 LTS)
- Clone this repo to your local machine using
https://github.com/ita-social-projects/Space2Study-BackEnd-mvp.git
install npm packages
$ npm install
- Open terminal.
- Run
npm run start
to start application.* - Open http://localhost:3000 to view it in the browser.
* - to run the project you need an .env
file in root folder
To run unit test open terminal and run npm run test
in it.
To run E2E tests you need open terminal and run npm run start
in it to start server.
Then open one more terminal and run npm run cypress
.
- Redux
- For each entity we should have separate folder
- In each folder we should have different files for actions, reducer
{modelName}.actions.js
or{modelName}.reducer.js
- Configuration
- Configuration is done via
.env
file where environment variables are located - Also we have
.env.example
that contains examples of environment variables
- Configuration is done via
- Styles
- For styling function
makeStyles
from@material-ui
should be used and all styles should be located inside separate component.
- For styling function
- Components
- Components that are connected to Redux should be located inside
containers
folder. Components without connection to Redux should be located insidecomponents
folder. - Each individual page that is accessed via
react-router
should be located insidepages
folder. All components that are used inside particular page should be located inside folder for the specific page. - Each component should have at least three files:
index.js
where we export anything from the whole folder{component-name}.jsx
- file where component is located{component-name}.styles.js
where all styles are located
- Components that are connected to Redux should be located inside
- File naming
- Files should be name in format
some-component.type.jsx
- Files should be name in format
- Architecture
- Logic is separated in layers
- resolver layer (handles graphql actions)
- service layer (handles business logic, interactions with database)
- model layer (mapping collections to mongoose models)
- All business logic (any database operations or validation related to the business rules) and interaction with models is located inside service
- Each model should live in its own folder
- In each folder files should be named in format
{model-name}.{type}.js
(like{model-name}.service.js
or{model-name}.resolver.js
) - For each model we define class like
{ModelName}Service
in{model-name}.service.js
and have separate methods for handling different types of operations
- Logic is separated in layers
- Configuration
- All configuration is implemented via environment variable that is located inside
.env
file
- All configuration is implemented via environment variable that is located inside
-
Tests are implemented in the format of contract tests. We test actual GraphQL operations like queries, mutations, or subscriptions on the running application. For testing, we should use a database that is running as a container locally. We should have a folder per entity with tests.
-
Test files:
- {entityName}.queries.spec.js - Testing the queries (if it exists)
- {entityName}.mutations.spec.js - Testing the mutations (if it exists)
- {entityName}.subscriptions.spec.js - Testing the subscriptions (if it exists)
-
Testing guides:
- All fields in data from the response from the backend should be checked for the appropriate value.
- If you cannot test some field for some particular value you should at least check its existence and its type.
- We should test the validation of the provided data to ensure that the backend performs validation by sending different combinations of valid and invalid data.
- Group tests for each operation (query, mutation, or subscription) to describe the statement.
Content (base scenario, for some operations we can have additional scenarios):
- describe(‘Validation’) with tests that validate a particular operation with combinations of valid and invalid data.
- describe(‘Success business logic’) with tests that perform operations with valid data and ensures that valid flows work
- Tests should be executed before any commit and don’t allow to push code if tests are failing.
- We need to develop utility functions that we can reuse in many tests files for creating user and base authentication (obtaining JWT token) for future performing operations that require authorization
-
Libraries
- vitest - testing framework
- apollo-boost - client for performing GraphQL operations
-
Runtime work
- Locally application is running in docker container. We have two docker
containers:
api
container anddatabase
container.
- Locally application is running in docker container. We have two docker
containers:
Order of testing components:
- simple stateless components that are used in multiple places
- components that depends on other components but not connected to Redux and don’t have any state
- components that have internal state but are not connected to Redux
- components that connected to Redux
- third-party libraries
- constants
- static css styles
- related components (test only one specific component at the specific moment of time)
- testing using snapshots (actual ui)
- testing logic of component (dynamic)
Snapshots allow us to compare actual UI with saved one and throw an error if it has accidentally changed. We can use flag “updateSnapshot” to update save snapshots of a component. It is appropriate for presentational components but doesn’t cover any logic
- Properties
- default properties
- custom properties
- Data types (use library “jest-extended”)
- Conditions (what if)
- State
- default state
- state after some event has happened
- Events
- with parameters or custom props
- without arguments
Flow:
- Set up the conditions of our test
- Mock the actual HTTP requests
- Instruct the saga to run through everything and finish its business
- Check that the expected side effects have happened (actions are dispatched, selectors are called, etc)
Link to the full article about proper saga testing: https://dev.to/phil/the-best-way-to-test-redux-sagas-4hib#:~:text=To%20test%20that%20the%20saga,selector%20into%20the%20following%20gen.
We test action creators as simple pure functions that just take an arguments and output proper arguments
We test reducers as simple pure functions that just take an arguments and output proper arguments Checks:
- valid default state
- changes of state when action is dispatched for different values of state
- Use
data-cy
as selector
Command npm run generate
is used to run graphql code generator
-
before using codegen you must run backend server SpaceToStudy backend
-
open terminal
-
run
npm run generate
-
you should run
npm run generate
every time new unions or interfaces are created
Deploy Сlient part: https://s2s-front-stage.azurewebsites.net/
You're encouraged to contribute to our project if you've found any issues or missing functionality that you would want to see. Here you can see the list of issues and here you can create a new issue.
Before sending any pull request, please discuss requirements/changes to be implemented using an existing issue or by creating a new one. All pull requests should be done into develop
branch.
There are three GitHub projects: SpaceToStudy-Client for frontend part, SpaceToStudy-BackEnd for backend part and admin part is currently under development. Every project has it's own issues.
Every pull request should be linked to an issue. So if you make changes on frontend, backend or admin parts you should create an issue with a link to corresponding requirement (story, task or epic).
All Pull Requests should start from prefix #xxx-yyy where xxx - task number and and yyy - short description e.g. #020-createAdminPanel
We have main , develop and feature branches.
All feature branches must be merged into develop branch!!!
Only the release should merge into the main branch!!!
-
Option 1
- 👯 Clone this repo to your local machine using
https://github.com/ita-social-projects/Space2Study-BackEnd-mvp.git
- 👯 Clone this repo to your local machine using
-
Option 2
- create new branch from development branch
- add some commits to your new branch
- 🔃 Create a new pull request using github.com/ita-social-projects/Space2Study-BackEnd-mvp.
- How do I do specifically so and so?
- No problem! Just do this.
- MIT license
- Copyright 2023 © SoftServe IT Academy.