/modec-case

Primary LanguageJavaScript

Statements Branches Functions Lines
Statements Branches Functions Lines

🗺 Modec Case - Cities Weather

This is a case assigned to me to evaluate my front-end skills in a job application process. It consists of displaying a map and allowing users to click and mark a location on the map and then search the 15 surrounding cities and their weather (max/min temperatures).

One can access the application running at https://modec-case.netlify.app/

🛠 Stack

Main tools used in this project:

ReactJS Yarn Webpack Jest Testing Library
React Yarn Webpack Jest TestingLibrary
MSW Zustand Styled Components React Leaflet
MSW Zustand StyledComponents React Leaflet

⚠️ Requirements

  • Node v12+
  • NPM v 6.14.8+

🗃 Environment variables

Variable Description
ENVIRONMENT As its name says, is the environment of the application. default value: dev. values: dev/prd/hml

🚀 Installation and Running

This project was developed using yarn but one can use npm as well.

To run this project one must first install all project dependencies by running:

npm

npm install

or

yarn

yarn

Then run the application:

npm

npm start

or

yarn

yarn start

After that, the application will open and run at http://localhost:3000

💻 Code patterns

This project uses Prettier to auto format code, following Eslint rules (based on airbnb rules). For those who are using VSCode, this repository already has a vscode config versionated to be easily used.

The project is all set with alias to make things easier when it comes to importing files and modules. One can find this settings inside package.json, jest.config.js, jsconfig.json, webpack.config.js and .esling.js files. Find more about here

📋 Tests

For tests this application uses Jest and React testing Library

Jest setup is located in jest.config.js file where one can see that a file setupTests.js is being used, this file basically defines a few useful mocks.

One has a few helpers to use on tests located here: Commons/tests/Tests.Helpers.js

Running tests:

yarn test:all

Generate coverage report:

yarn coverage

Then the report can be accessed at /coverage/lcov-report/index.html

🌐 Mock Server Worker

MSW is used to mock all API requests in our application. Before all tests, the mock server must be started, this happens in setupTests.js file, and after each test, the mock is reseted, this is because one can change a few responses to specific tests and still avoid side effects on other tests, and at the end of our tests the server is stopped. All application handlers are located in Tests.ServerMockHandlers.js file, so every new service must also be included here to be available for tests.

Ok, but if one wants a different return for a specific request, what can one do? This can be easily handled by importing our MSW server and passing the new request specifications, for example:

import { server, rest } from 'Commons/tests/Tests.MockServer'

server.use(
  rest.get(`https://api.openweathermap.org/data/2.5/find`, (req, res, ctx) =>
    res(ctx.status(400)),
  ),
)

As it can be seen in the example above, one just needs to import server and rest from our MockServer and with the server method use pass the new request wanted.

🌍 Global State Management

This application uses Zustand lib to manage global state. When one creates a new store with Zustand, it returns a hook, ready to be used.

📡 Axios and Requests

This project uses Axios for http requests, and for this, there is a hook (useRequests) into the Requests.defaults.js file, this hook returns an Axios instance with set interceptors. Why is that? Well, the project's interceptors handle global loading feedbacks.

For global loading feedbacks (a loading over all the application), one can pass showLoading flag as true as an axios request config and the loading will be removed when the request is finished.

📝 Commit convention

This project follows Angular commit convention for commit patterns. If one is familiar with it just follow it, otherwise Commitizen CLI can be used to commit changes, remember, one first needs to stage changes before committing, and in order to commit one can use the script yarn cz to run Commitizen CLI and follow the wizard/helper mode. The project also uses husky to handle a pre-commit hook which will run tests before allowing the commit, if one doesn't want to run tests on a commit, use the parameter --no-verify on the commit command.