heitoradao / promotion-system Goto Github PK
View Code? Open in Web Editor NEWSistema de geração de coupons para promoções.
Sistema de geração de coupons para promoções.
Eu, usuário administrador,
Gostaria de ver todas as promoções cadastradas,
Para ter certeza de que todas promoções estão cadastradas no sistema.
# promotion-system/test/system/promotions_test.rb
require 'application_system_test_case'
class PromotionsTest < ApplicationSystemTestCase
test 'view promotions' do
Promotion.create!(name: 'Natal', description: 'Promoção de Natal',
code: 'NATAL10', discount_rate: 10, coupon_quantity: 100,
expiration_date: '22/12/2033')
Promotion.create!(name: 'Cyber Monday', coupon_quantity: 100,
description: 'Promoção de Cyber Monday',
code: 'CYBER15', discount_rate: 15,
expiration_date: '22/12/2033')
visit root_path
click_on 'Promoções'
assert_text 'Natal'
assert_text 'Promoção de Natal'
assert_text '10,00%'
assert_text 'Cyber Monday'
assert_text 'Promoção de Cyber Monday'
assert_text '15,00%'
end
test 'view promotion details' do
Promotion.create!(name: 'Natal', description: 'Promoção de Natal',
code: 'NATAL10', discount_rate: 10, coupon_quantity: 100,
expiration_date: '22/12/2033')
Promotion.create!(name: 'Cyber Monday', coupon_quantity: 90,
description: 'Promoção de Cyber Monday',
code: 'CYBER15', discount_rate: 15,
expiration_date: '22/12/2033')
visit root_path
click_on 'Promoções'
click_on 'Cyber Monday'
assert_text 'Cyber Monday'
assert_text 'Promoção de Cyber Monday'
assert_text '15,00%'
assert_text 'CYBER15'
assert_text '22/12/2033'
assert_text '90'
end
test 'no promotion are available' do
visit root_path
click_on 'Promoções'
assert_text 'Nenhuma promoção cadastrada'
end
test 'view promotions and return to home page' do
Promotion.create!(name: 'Natal', description: 'Promoção de Natal',
code: 'NATAL10', discount_rate: 10, coupon_quantity: 100,
expiration_date: '22/12/2033')
visit root_path
click_on 'Promoções'
click_on 'Voltar'
assert_current_path root_path
end
test 'view details and return to promotions page' do
Promotion.create!(name: 'Natal', description: 'Promoção de Natal',
code: 'NATAL10', discount_rate: 10, coupon_quantity: 100,
expiration_date: '22/12/2033')
visit root_path
click_on 'Promoções'
click_on 'Natal'
click_on 'Voltar'
assert_current_path promotions_path
end
end
Eu, usuário administrador,
Gostaria de editar uma promoção
Para que eu possa corrigir erros durante o cadastro.
Dicas e Informações
Para editar um objeto, repare que os testes sempre começam criando um objeto diretamente na base de dados através do método create!. Não é necessário criar objetos via formulário pois isso deixaria o teste mais lento - com o método create o objeto é salvo no banco de dados em apenas um passo, para utilizar o formulário precisaríamos de passos para abrir o formulário, preencher os campos e clicar no botão 'Enviar'.
Repare também que existem testes para garantir que todas validações adotadas no processo de cadastro continuem sendo respeitadas aqui.
Eu, usuário administrador,
Gostaria de apagar uma promoção
Para que que não conste na lista de promoções.
Eu, usuário administrador,
Gostaria de tornar um cupom disponível novamente,
Para que possa disponibilizar um cupom em caso de erro
Eu, usuário administrador,
Gostaria de gerenciar uma categoria de produto,
Para que possam vê-las e gerenciá-las no sistema.
São formas de cadastrar produtos na plataforma para que ela possa conhecer e gerenciar produtos disponíveis. Exemplo:
Nome: Produto AntiFraude
Código: ANTIFRA
Eu, usuário administrador,
Gostaria de buscar uma promoção,
Para que possa de forma rápida encontrar resultados
Eu, usuário administrador,
Gostaria que o sistema validasse que uma promoção só seja cadastrada com um nome, data de término, número de cupons, código alfanumérico, percentual de desconto (não vazios) e que uma promoção não seja cadastrada duas vezes com o mesmo nome e código,
Para evitar cadastros indevidos na base de dados.
Nessa tarefa vamos resolver nossos primeiros testes unitários. O arquivo promotion_test.rb possui 2 testes que garantem que estamos adicionando validações em nosso model. O teste segue a mesma lógica dos testes de aceitação/integração, com uma etapa onde criamos os dados, uma etapa onde executamos o código e uma etapa de verificação dos resultados.
A grande diferença aqui é que, ao invés de executar a aplicação, visitar links, preencher formulários etc., nosso teste simplesmente executa o método valid? em um objeto do tipo Promotion. Essa é a principal característica de testes unitários: eles focam na execução de um único método e no retorno desse método dado as condições estabelecidas no começo do teste.
# promotion-system/test/models/promotion_test.rb
require 'test_helper'
class PromotionTest < ActiveSupport::TestCase
test 'attributes cannot be blank' do
promotion = Promotion.new
refute promotion.valid?
assert_includes promotion.errors[:name], 'não pode ficar em branco'
assert_includes promotion.errors[:code], 'não pode ficar em branco'
assert_includes promotion.errors[:discount_rate], 'não pode ficar em '\
'branco'
assert_includes promotion.errors[:coupon_quantity], 'não pode ficar em'\
' branco'
assert_includes promotion.errors[:expiration_date], 'não pode ficar em'\
' branco'
end
test 'code must be uniq' do
Promotion.create!(name: 'Natal', description: 'Promoção de Natal',
code: 'NATAL10', discount_rate: 10, coupon_quantity: 100,
expiration_date: '22/12/2033')
promotion = Promotion.new(code: 'NATAL10')
refute promotion.valid?
assert_includes promotion.errors[:code], 'deve ser único'
end
end
# promotion-system/test/system/promotions_test.rb
require 'application_system_test_case'
class PromotionsTest < ApplicationSystemTestCase
test 'create and attributes cannot be blank' do
Promotion.create!(name: 'Natal', description: 'Promoção de Natal',
code: 'NATAL10', discount_rate: 10, coupon_quantity: 100,
expiration_date: '22/12/2033')
visit root_path
click_on 'Promoções'
click_on 'Registrar uma promoção'
fill_in 'Nome', with: ''
fill_in 'Descrição', with: ''
fill_in 'Código', with: ''
fill_in 'Desconto', with: ''
fill_in 'Quantidade de cupons', with: ''
fill_in 'Data de término', with: ''
click_on 'Criar promoção'
assert_text 'não pode ficar em branco', count: 5
end
test 'create and code must be unique' do
Promotion.create!(name: 'Natal', description: 'Promoção de Natal',
code: 'NATAL10', discount_rate: 10, coupon_quantity: 100,
expiration_date: '22/12/2033')
visit root_path
click_on 'Promoções'
click_on 'Registrar uma promoção'
fill_in 'Código', with: 'NATAL10'
click_on 'Criar promoção'
assert_text 'deve ser único'
end
end
Toda promoção deve ser aprovada por um usuário diferente do usuário que
cadastrou a promoção. Ao aprovar uma promoção devem ser registrados: o
dia/hora/minuto/segundo da aprovação e o usuário responsável pela aprovação.
Essa nova funcionalidade impacta na emissão de cupons: a partir de agora somente promoções APROVADAS podem ter cupons emitidos;
Eu, usuário administrador,
Gostaria de emitir cupons de uma promoção,
Para que possa acompanhar o cupom no sistema
Tudo começa com a criação de um novo projeto Rails. Vamos usar a versão 6 do framework e para isso você vai precisar de uma versão de Ruby atualizada (recomendamos qualquer versão a partir da 2.6.0).
Além do Ruby você vai precisar ter instalado outros pré-requisitos:
Recomendamos também que você crie uma pasta em seu computador para manter todos os seus projetos. Essa é uma prática comum entre devs e os nomes mais populares são projects ou workspace.
Pelo terminal, navegue até sua pasta de projetos e execute o comando rails new promotion-system --skip-action-mailbox --skip-active-storage --skip-action-cable.
As opções --skip-action-mailbox
--skip-active-storage
--skip-action-cable
são para pularmos algumas novas funcionalidades do Rails que não iremos precisar, mas podemos ativá-las no futuro.
Vamos utilizar o minitest
com capybara
em nosso projeto.
Documentações:
Eu, usuário administrador,
Gostaria de queimar um cupom manualmente,
Para que possa indisponibilizar um cupom em caso de erro
Eu, um visitante ainda não autenticado,
Gostaria de acessar a aplicação,
Para ter certeza de que estou no site da PromotionSystem e posso começar a utilizar os recursos do sistema.
# promotion-system/test/system/home_test.rb
require 'application_system_test_case'
class HomeTest < ApplicationSystemTestCase
test 'visiting the index' do
visit root_path
assert_selector 'h1', text: 'Promotion System'
assert_selector 'h3', text: 'Boas vindas ao sistema de gestão de promoções'
end
end
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
echo "deb http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee -a /etc/apt/sources.list.d/google.list
sudo apt-get update
sudo apt-get install google-chrome-stable
Eu, usuário visitante,
Gostaria de cadastrar fazer login,
Para ter certeza que somente usuários autenticados possam executar ações no sistema
Criar conta apenas com e-mail @iugu.com.br
Agora que você já tem o projeto configurado, vamos começar a codificar as funcionalidades planejadas.
Cada funcionalidade vai ser descrita como um card/cartão aqui no Trello. O título do card serve como resumo do que deve ser feito e também como referência para nossa comunicação no Slack. Então, ao tirar dúvidas você pode sempre postar algo como: 'No card onde o Visitante deve abrir o site...'
Em cada card teremos também uma descrição no formato de uma User Story. Esse formato conta em uma pequena quantidade linhas:
QUEM irá fazer alguma ação no sistema (visitante, usuário autenticado, admin etc.)
O QUÊ deve ser feito (um cadastro, acessar uma página, um botão para remover itens do banco de dados)
PARA QUÊ essa ação será executada, ajudando você dev a entender o propósito do código criado
Ao longo do nosso trabalho vamos discutir mais esse formato, ele não é o único mas é bastante popular para documentar de forma rápida uma tarefa.
Em alguns dos cards, você vai encontrar arquivos em anexo que são os testes daquela tarefa. Todo processo de criação de código do treinamento será orientado a testes. Os testes vão estabelecer o que você precisa fazer para concluir uma tarefa. Quando todos os testes estiverem passando (verdes) você está pronto para a próxima tarefa.
Ao final de cada tarefa (card), esperamos que você faça um novo commit em seu projeto. Assim, com o passar dos dias, você pode revistar toda a linha do tempo das tarefas realizadas e ver sua evolução :)
Um usuário do sistema deveria ser capaz de buscar um cupom a partir do seu código identificador único. Ao buscar um cupom existente ele deve ser levado para uma tela com todos detalhes desse cupom, incluindo: a promoção, se o cupom já foi utilizado ou não.
Caso o código informado seja inexistente, deve ser exibida uma mensagem adequada na plataforma.
Eu, usuário administrador,
Gostaria de cadastrar uma promoção,
Para que possam ser gerados cupons para aquela promoção
# promotion-system/test/system/promotions_test.rb
require 'application_system_test_case'
class PromotionsTest < ApplicationSystemTestCase
test 'create promotion' do
visit root_path
click_on 'Promoções'
click_on 'Registrar uma promoção'
fill_in 'Nome', with: 'Cyber Monday'
fill_in 'Descrição', with: 'Promoção de Cyber Monday'
fill_in 'Código', with: 'CYBER15'
fill_in 'Desconto', with: '15'
fill_in 'Quantidade de cupons', with: '90'
fill_in 'Data de término', with: '22/12/2033'
click_on 'Criar promoção'
assert_current_path promotion_path(Promotion.last)
assert_text 'Cyber Monday'
assert_text 'Promoção de Cyber Monday'
assert_text '15,00%'
assert_text 'CYBER15'
assert_text '22/12/2033'
assert_text '90'
assert_link 'Voltar'
end
end
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.