Esta aplicação simula funcionalidades de um caixa eletrônico, recebendo e retornando dados diretamente no console (stdin/stdout)
Este projeto conta com Docker, e, estando no diretório do projeto, pode ser configurado com o seguinte comando:
docker-compose build
Caso prefira utilizar o Ruby nativo da máquina, também no diretório do projeto utilize o seguinte comando:
bundle install
A aplicação é iniciada pelo console através do arquivo app.rb
com os seguinte comandos
ruby app.rb
docker-compose run app
As operações são inseridas em texto, no formato JSON, diretamente no terminal, e após a inserção dos dados no terminal,
deve ser pressionada a combinação de teclas Ctrl + D
para iniciar o processamento. Ex:
Abastecimento:
{
"caixa": {
"caixaDisponivel": false,
"notas": {
"notasDez": 100,
"notasVinte": 50,
"notasCinquenta": 10,
"notasCem": 30
}
}
}
Saque:
{ "saque": { "valor":600, "horario":"2019-02-13T11:01:01.000Z" } }
A aplicação também conta com testes unitários, que podem ser verificados com os seguintes comandos
Para rodar todos os testes:
rspec
Para rodar testes específicos, o path e a linha do arquivos devem ser adicionados após o comando rspec. Ex:
rspec spec/services/recharge_atm_service_spec.rb:21
Para rodar todos os testes:
docker-compose run app rspec
Para rodar testes específicos, o path e a linha do arquivos devem ser adicionados após o comando rspec. Ex:
docker-compose run app rspec spec/services/recharge_atm_service_spec.rb:21
A seguir serão descritas as possibilidades de cenários de sucesso e erro, bem como os dados para simulá-los.
Como a aplicação depende somente de armazenamento em memória, caso ela seja encerrada todos os dados serão perdidos. O fluxo a seguir considera que a aplicação terá funcionamento continuo até o final dos testes.
docker-compose run app
Entrada:
{
"saque": {
"valor":600,
"horario":"2019-02-13T11:01:01.000Z"
}
}
Saída:
{"caixa":{},"erros":["caixa-inexistente"]}
Entrada:
{
"caixa": {
"caixaDisponivel": false,
"notas":{
"notasDez": 100,
"notasVinte": 50,
"notasCinquenta": 10,
"notasCem": 30
}
}
}
Saída:
{"caixa":{"caixaDisponivel":false,"notas":{"notasDez":100,"notasVinte":50,"notasCinquenta":10,"notasCem":30}},"erros":[""]}
Entrada:
{
"saque": {
"valor": 600,
"horario": "2019-02-13T11:01:01.000Z"
}
}
Saída:
{"caixa":{"caixaDisponivel":false,"notas":{"notasDez":100,"notasVinte":50,"notasCinquenta":10,"notasCem":30}},"erros":["caixa-indisponivel"]}
Entrada:
{
"caixa": {
"caixaDisponivel": true,
"notas": {
"notasDez": 100,
"notasVinte": 50,
"notasCinquenta": 10,
"notasCem": 30
}
}
}
Saída:
{ "caixa":{ "caixaDisponivel":true, "notas":{ "notasDez":100, "notasVinte":50, "notasCinquenta":10, "notasCem":30 } } }
Entrada:
{
"caixa": {
"caixaDisponivel": true,
"notas": {
"notasDez": 100,
"notasVinte": 50,
"notasCinquenta": 10,
"notasCem":30
}
}
}
Saída:
{"caixa":{"caixaDisponivel":true,"notas":{"notasDez":200,"notasVinte":100,"notasCinquenta":20,"notasCem":60}},"erros":["caixa-em-uso"]}
Entrada:
{
"saque": {
"valor": 600,
"horario": "2019-02-13T11:01:01.000Z"
}
}
Saída:
{"caixa":{"caixaDisponivel":true,"notas":{"notasDez":200,"notasVinte":100,"notasCinquenta":20,"notasCem":54}},"erros":[""]}
Entrada:
{
"saque": {
"valor": 600,
"horario": "2019-02-13T11:10:01.000Z"
}
}
Saída:
{"caixa":{"caixaDisponivel":true,"notas":{"notasDez":200,"notasVinte":100,"notasCinquenta":20,"notasCem":54}},"erros":["saque-duplicado"]}
Entrada:
{
"saque": {
"valor": 6000000000,
"horario": "2019-02-13T11:01:01.000Z"
}
}
Saída:
{"caixa":{"caixaDisponivel":true,"notas":{"notasDez":200,"notasVinte":100,"notasCinquenta":20,"notasCem":54}},"erros":["valor-indisponivel"]}
Entrada:
{
"saque": {
"valor": 123,
"horario": "2019-02-13T11:01:01.000Z"
}
}
Saída:
{"caixa":{"caixaDisponivel":true,"notas":{"notasDez":200,"notasVinte":100,"notasCinquenta":20,"notasCem":54}},"erros":["valor-indisponivel"]}