Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: <https://metric-imperial-converter.freecodecamp.rocks/>. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos:
- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-metricimpconverter/) y completa tu proyecto localmente.
- Usa [nuestro proyecto de inicio en Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-metricimpconverter) para completar tu proyecto.
- Usa un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub.
Cuando hayas terminado, asegúrate de que una demostración funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`.
- Completa la lógica de conversión necesaria en `/controllers/convertHandler.js`
- Completa las rutas necesarias en `/routes/api.js`
- Copia el archivo `sample.env` a `.env` y establece las variables apropiadamente
- Para ejecutar las pruebas, descomenta `NODE_ENV=test` en tu archivo `.env`
- Para ejecutar las pruebas en la consola, usa el comando `npm run test`. Para abrir la consola de Replit presiona Ctrl+Shift+P (Cmd si estas en Mac) y escribe "open shell"
Escribe las siguientes pruebas en `tests/1_unit-tests.js`:
-`convertHandler` debe leer correctamente una entrada de número entero.
-`convertHandler` debe leer correctamente una entrada de número decimal.
-`convertHandler` debe leer correctamente una entrada fraccional.
-`convertHandler` debe leer correctamente una entrada fraccional con un decimal.
-`convertHandler` debe devolver correctamente un error en una fracción doble (i.e. `3/2/3`).
-`convertHandler` debe predeterminar correctamente una entrada numérica de `1` cuando no se proporciona ninguna entrada numérica.
-`convertHandler` debe leer correctamente cada unidad de las entradas válidas.
-`convertHandler` debe devolver correctamente un error por cada unidad de entrada no válida.
-`convertHandler` debe devolver la unidad de retorno correcta para cada unidad de entrada válida.
-`convertHandler` debe devolver correctamente la unidad de cadena deletreada para cada unidad de entrada válida.
-`convertHandler` debe convertir correctamente `gal` a `L`.
-`convertHandler` debe convertir correctamente `L` to `gal`.
-`convertHandler` debe convertir correctamente `mi` a `km`.
-`convertHandler` debe convertir correctamente `km` a `mi`.
-`convertHandler` debe convertir correctamente `lbs` a `kg`.
-`convertHandler` debe convertir correctamente `kg` a `lbs`.
Escribe las siguientes pruebas en `tests/2_functional-tests.js`:
- Convierte una entrada válida como `10L`: petición `GET` a `/api/convert`.
- Convierte una entrada inválida como `32g`: petición `GET` a `/api/convert`.
- Convierte un número inválido como `3/7.2/4kg`: petición `GET` a `/api/convert`.
- Convierte un número Y una unidad no válidos como `3/7.2/4kilomegagram`: petición `GET` a `/api/convert`.
- Convierte sin número tal como `kg`: petición `GET` a `/api/convert`.
Puedes realizar una petición `GET``/api/convert` con un único parámetro que contenga un número y una unidad aceptados y que lo convierta. (Pista: Divide la entrada buscando el índice del primer carácter que marcará el inicio de la unidad)
Todas las unidades entrantes deben ser aceptadas en mayúsculas y minúsculas, pero debe ser devuelto en `initUnit` y `returnUnit` en minúsculas excepto por litro, que debe ser representado como una `'L'` mayúscula.
Puedes utilizar fracciones, decimales o ambos en el parámetro (es decir, 5, 1/2, 2.5/6), pero si no se proporciona nada, el valor predeterminado será 1.
Su devolución consistirá en `initNum`, `initUnit`, `returnNum`, `returnUnit`, y `string` detallando unidades en el formato `'{initNum} {initUnitString} converts to {returnNum} {returnUnitString}'` con el resultado redondeado a 5 decimales.