Coffee Machine is an awesome console application that from a few input parameters (drink type, amount of money, number of sugars, extra hot check) is capable to order a drink and show a cool message of the desired drink.
Command
app:order-drink
Arguments
# | Name | Type | Required | Description | Values | Default |
---|---|---|---|---|---|---|
1 | drinkType | string | true | Type of drink | tea, coffee, chocolate | |
2 | money | float | true | Amount of money given by the user in unit of currency | ||
3 | sugars | int | false | Number of sugars | 0, 1, 2 | 0 |
Options
Name | Type | Required | Description | Values | Default |
---|---|---|---|---|---|
extraHot (--extra-hot) | false | Flag indicating if the user wants extra hot drink | true, false | false |
List prices
Drink | Price |
---|---|
Tea | 0.4 |
Coffee | 0.5 |
Chocolate | 0.6 |
Validations
- If the drink type is not tea, coffee or chocolate, it shows the following message:
The drink type should be tea, coffee or chocolate.
- If the amount of money does not reach the price of the drink, a message as the following is displayed:
The tea costs 0.4.
- If the number of sugars is not between 0 and 2, it shows a message like this:
The number of sugars should be between 0 and 2.
- If the arguments are right, the displayed message is:
You have ordered a coffee
- If the number of sugars is greater than 0, it includes the stick to the drink and it shows a message similar tot this:
You have ordered a coffee with 2 sugars (stick included).
- If it adds extra hot option, the displayed message will be:
You have ordered a coffee extra hot with 2 sugars (stick included)
This application was implemented by a developer who is no longer in the company.
His legacy is the class MakeDrinkCommand
. This class handle all the application logic:
- It reads input parameters
- It validates input parameters
- It shows output message
He also implemented an integration test covering all possibilities (MakeDrinkCommandTest
)
As you can see, this class is a bit messy and we need to adapt it to our coding standards so that we can create a Merge Request and merge it into master
We would like to have a reusable, maintainable and testable code, so we want to refactor
this MakeDrinkCommand
following these principles:
- Clean code
- SOLID principles
- Decoupling
- Design patterns
- Error handling
- Unit testing
- TDD
- Hexagonal architecture
You don't have to implement them all, but make the code better to be more comfortable with it.
Also, if there is time, our Product Owner has asked us to implement a new feature so that we could know how much money we have earned with each type of drink.
Something like the following table would be great:
Drink | Money |
---|---|
Tea | 15 |
Coffee | 25.75 |
Chocolate | 36 |
Install and run the application.
docker/composer install
docker/up
Examples of the use of the application.
docker/console app:order-drink tea 0.5 1 --extra-hot
docker/console app:order-drink coffee 0.5
docker/console app:order-drink chocolate 1 --extra-hot
Run tests
docker/test
Get income
docker/console app:get-income