- The Delivery Fee Calculator API provides a single-endpoint that responds to POST requests.
- Request body format:
{"cart_value": 975, "delivery_distance": 3520, "number_of_items": 3, "time": "2024-01-31T17:00:00Z"}| Field | Type | Description | Example value | 
|---|---|---|---|
| cart_value | Integer | Value of the shopping cart in cents. | 975 (975 cents = 9.75€) | 
| delivery_distance | Integer | The distance between the store and customer’s location in meters. | 3520 (3520 meters = 3.520 km) | 
| number_of_items | Integer | The number of items in the customer's shopping cart. | 3 (customer has 3 items in the cart) | 
| time | String | Order time in UTC in ISO format. | 2024-01-31T17:00:00Z | 
{"delivery_fee": 825}- delivery fee will be 8.25€ (825 cents)
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload| PowerShell | CMD | 
| python3 -m venv .venv  
.venv/Scripts/Activate.ps1  
pip install -r requirements.txt  
uvicorn app.main:app --reload   | python3 -m venv .venv  
.venv/Scripts/activate.bat  
pip install -r requirements.txt  
uvicorn app.main:app --reload   | 
deactivate
- Docker and docker-compose installed on your system.
docker compose up or docker-compose up
- Send POST requests to 127.0.0.1:8000/delivery_feeorlocalhost:8000/delivery_fee
- Access fastAPI's documentation and interact with the API: http://127.0.0.1:8000/docs
- Send a POST request from terminal:
curl -X "POST" -H "Content-Type: application/json" -d "{\"cart_value\": 975, \"delivery_distance\": 3520, \"number_of_items\": 3, \"time\": \"2024-01-31T17:00:00Z\"}" localhost:8000/delivery_fee
| Tests | Commands | 
|---|---|
| All tests: | pytest | 
| Unit tests: | pytest tests/unit | 
| Integration tests: | pytest tests/integration | 
| Show coverage: | pytest --cov=. | 
(No need to worry about these if you followed the steps under 'Getting started')
fastapi==0.109.0
httpx==0.26.0
pydantic==2.5.3
pytest==7.4.4
pytest-cov==4.1.0
uvicorn==0.27.0
python-dateutil==2.8.2
types-python-dateutil==2.8.19.20240106
- Rush hour in UTC: although it does not make much sense in a real-life scenario, I interpret it as any timezone converted to UTC; rush hour in UTC, no matter the local time of the order.
- Rush hour 3-7 PM is interpreted as 15:00:00.000 – 18:59:59.999 (3 inclusive, 7 exclusive).
- As stated in the docstrings of models.py: extra fields of the request body do not raise errors, but are disregarded. This is true only if the required fields are present and formatted correctly.
- Rounding; in cases where the rush hour multiplication results in a fractional number, banker's rounding is applied.