Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Desafio Gustavo Dias A. #69

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions funcionalidades-wpp/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
venv
45 changes: 45 additions & 0 deletions funcionalidades-wpp/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Especificação Funcionalidades Whatsapp

Proposta de solução para o desafio da concrete solutions,
utilizado no recrutamento de QA's.

## Desafio

* Especificação de duas funcionalidades do Whatsapp (não importa se o app é Android, iOS, Windows Phone ou versão Web) em Gherkin ou Gauge;

* Cada especificação deve conter ao menos um cenário de teste.

## Proposta de Solução

Nesta proposta foi utilizada como referência a versão mobile do app Whatsapp, no sistema operacional Android.

### Setup (Pré configuração) do ambiente

Toda a solução foi desenvolvida no sistema operacional Ubuntu Linux (18.04 LTS).

Foi utilizado o ambiente virtual do Python (venv), para que a instalação de ferramentas adicionais
não afete outras aplicações do sistema. Além disto, todas as dependências estão no arquivo [requirements.txt](requirements.txt).

Para instalar as dependências, utilizando o gerenciador de pacotes do Python (pip)

```console
user@linux:~$ pip install -r requirements.txt
```

### Behave

A ferramenta escolhida para a especificação (Gherkin), foi o [behave](https://behave.readthedocs.io/en/latest/) que utiliza testes escritos em linguagem natural, apoiado por códigos em Python.

Para o funcionamento correto do behave, deve ser respeitada a seguinte estrutura de diretórios

![Behave tree structure](img/tree-behave.png)

Após a instalação e configuração dos diretórios, basta executar o behave no diretório raiz

```console
user@linux:~$ behave
```

## Autor

[Gustavo Dias A.](https://www.linkedin.com/in/gustavo-dias-alexandre-543568157/)
34 changes: 34 additions & 0 deletions funcionalidades-wpp/features/configuraPerfil.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# language: pt

Funcionalidade: Configurar Perfil

Contexto:
Dado que iniciei a aplicação
E naveguei para a tela de configurações
E que eu tenha escolhido a opção com meu "Nome"

Cenário: Buscando na na galeria, opções de imagem para o perfil
"""
Sendo um usuário, eu desejo visualizar as imagens disponíveis
na minha galeria para utilizar como foto de perfil
"""
Quando pressiono o ícone da câmera
E escolho a opção "Galeria"
Então devo visualizar as "Imagens" disponíveis na minha "Galeria"

Cenário: Removendo imagem de perfil
"""
Sendo um usuário, eu desejo remover minha foto do perfil
"""
Quando pressiono o ícone da câmera
E escolho a opção "Remover foto"
Então devo visualizar a "Imagem padrão" do whatsapp

Cenário: Definindo nome de usuário
"""
Sendo um usuário, eu desejo definir um nome de usuário para o meu perfil
"""
Quando pressiono a "opção Nome"
E digito o meu "Nome de Usuário"
E salvo
Então devo ver meu "Nome de usuário" na "opção Nome"
23 changes: 23 additions & 0 deletions funcionalidades-wpp/features/fazChamada.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# language: pt

Funcionalidade: Fazer chamada

Contexto:
Dado que iniciei a aplicação
E abri uma conversa com "contato"

Cenário: Iniciando chamada de vídeo
"""
Sendo um usuário, eu desejo fazer uma chamada de vídeo
com o contato escolhido.
"""
Quando pressiono o ícone "Chamada de vídeo"
Então devo iniciar uma vídeo chamada com "contato"

Cenário: Iniciando chamada de voz
"""
Sendo um usuário, eu desejo fazer uma chamada de voz
com o contato escolhido.
"""
Quando pressiono o ícone "Chamada de voz"
Então devo iniciar uma chamada de voz com "contato"
Binary file added funcionalidades-wpp/img/tree-behave.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions funcionalidades-wpp/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
behave==1.2.6
parse==1.16.0
parse-type==0.5.2
pkg-resources==0.0.0
six==1.15.0
4 changes: 4 additions & 0 deletions kata09/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
venv
__pycache__
.pytest_cache
.vscode
45 changes: 45 additions & 0 deletions kata09/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Solução Kata09

Proposta de solução para o desafio da concrete solutions,
utilizado no recrutamento de QA's.

## Desafio

* Resposta do exercício 09 do site [CodeKata](http://www.codekata.com), ou [aqui](Kata09.md), na linguagem de programação que lhe for mais conveniente

## Proposta de Solução

### Setup (Pré configuração) do ambiente

Toda a solução foi desenvolvida no sistema operacional Ubuntu Linux (18.04 LTS).

Foi utilizado o ambiente virtual do Python (venv), para que a instalação de ferramentas adicionais
não afete outras aplicações do sistema. Além disto, todas as dependências estão no arquivo [requirements.txt](requirements.txt).

Para instalar as dependências, utilizando o gerenciador de pacotes do Python (pip)

```console
user@linux:~$ pip install -r requirements.txt
```

### Pytest

O framework escolhido para a execução dos testes, foi o [pytest](https://docs.pytest.org/en/stable/index.html)

Para o funcionamento correto do pytest, algumas regras sobre nomenclatura de casos de testes e pastas devem ser respeitadas.

Após a [instalação e configuração](https://docs.pytest.org/en/stable/getting-started.html#) dos diretórios, basta executar o pytest no diretório raiz

```console
user@linux:~$ python -m pytest
```

Obs: Para execução detalhada (*full verbose*), basta adicionar -vv ao pytest

```console
user@linux:~$ python -m pytest -vv
```

## Autor

[Gustavo Dias A.](https://www.linkedin.com/in/gustavo-dias-alexandre-543568157/)
Empty file added kata09/lib/__init__.py
Empty file.
65 changes: 65 additions & 0 deletions kata09/lib/checkout.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
class CheckOut():

"""
Classe Checkout.
Desafio Kata09
(http://codekata.com/kata/kata09-back-to-the-checkout/)
"""

def __init__(self, rules):
"""
Método construtor

Parameters:
rules (dict): Dicionário com as regras dos itens, preços e
descontos.
"""
self.total = 0
self.rules = rules
self.count_itens = {}

for item, value in rules.items():
self.count_itens[item] = 0

def scan(self, item):
"""Método scan

Parameters:
item (str): Item
"""
price = self.get_price(item)
if price:
self.total += price
self.count_itens[item] += 1
self.special_price(item)

def special_price(self, item):
"""Método special_price

Parameters:
item (str): Item
"""
count = self.count_itens.get(item)
item_rule = self.rules.get(item)
special_qtd = item_rule.get('special_qtd')

if special_qtd and (count == special_qtd):
item_price = item_rule.get('unit_price')
discount_price = item_rule.get('special_price')
discount = (special_qtd * item_price) - discount_price
self.total -= discount
self.count_itens[item] = 0

def get_price(self, item):
"""Método get_price

Parameters:
item (str): Item

Returns:
unit_price (int): Preço do item
"""
item = self.rules.get(item)
if item:
return item.get('unit_price')
return None
13 changes: 13 additions & 0 deletions kata09/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
attrs==19.3.0
importlib-metadata==1.7.0
iniconfig==1.0.1
more-itertools==8.4.0
packaging==20.4
pkg-resources==0.0.0
pluggy==0.13.1
py==1.9.0
pyparsing==2.4.7
pytest==6.0.1
six==1.15.0
toml==0.10.1
zipp==3.1.0
Empty file added kata09/resources/__init__.py
Empty file.
12 changes: 12 additions & 0 deletions kata09/resources/rules.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class Rules():
"""
Classe Rules.
Desafio Kata09
(http://codekata.com/kata/kata09-back-to-the-checkout/)
"""
dict_pricing_rules = {
'A': {'unit_price': 50, 'special_qtd': 3, 'special_price': 130},
'B': {'unit_price': 30, 'special_qtd': 2, 'special_price': 45},
'C': {'unit_price': 20},
'D': {'unit_price': 15}
}
94 changes: 94 additions & 0 deletions kata09/tests/test_checkout.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import pytest

"""
Estes testes cobrem
o checkout de produtos.

Desafio Kata09
(http://codekata.com/kata/kata09-back-to-the-checkout/)
"""

from lib.checkout import CheckOut
from resources.rules import Rules


def price(items):
"""Método price

Parameters:
items (str): Lista de itens

Returns:
co.total (int): Valor total dos itens da lista items
"""
rules_dict = Rules.dict_pricing_rules
co = CheckOut(rules_dict)
for item in items:
co.scan(item)
return co.total


def test_totals():

# assert_equal( 0, price(""))
total = price('')
assert total == 0
# assert_equal( 50, price("A"))
total = price('A')
assert total == 50
# assert_equal( 80, price("AB"))
total = price('AB')
assert total == 80
# assert_equal(115, price("CDBA"))
total = price('CDBA')
assert total == 115
# assert_equal(100, price("AA"))
total = price('AA')
assert total == 100
# assert_equal(130, price("AAA"))
total = price('AAA')
assert total == 130
# assert_equal(180, price("AAAA"))
total = price('AAAA')
assert total == 180
# assert_equal(230, price("AAAAA"))
total = price('AAAAA')
assert total == 230
# assert_equal(260, price("AAAAAA"))
total = price('AAAAAA')
assert total == 260
# assert_equal(160, price("AAAB"))
total = price('AAAB')
assert total == 160
# assert_equal(175, price("AAABB"))
total = price('AAABB')
assert total == 175
# assert_equal(190, price("AAABBD"))
total = price('AAABBD')
assert total == 190
# assert_equal(190, price("DABABA"))
total = price('DABABA')
assert total == 190


def test_incremental():

rules_dict = Rules.dict_pricing_rules
co = CheckOut(rules_dict)
# assert_equal( 0, co.total)
assert co.total == 0
# co.scan("A"); assert_equal( 50, co.total)
co.scan('A')
assert co.total == 50
# co.scan("B"); assert_equal( 80, co.total)
co.scan('B')
assert co.total == 80
# co.scan("A"); assert_equal(130, co.total)
co.scan('A')
assert co.total == 130
# co.scan("A"); assert_equal(160, co.total)
co.scan('A')
assert co.total == 160
# co.scan("B"); assert_equal(175, co.total)
co.scan('B')
assert co.total == 175