Coder Social home page Coder Social logo

promotion-system's Introduction

wakatime

promotion-system's People

Contributors

dependabot[bot] avatar heitoradao avatar

Watchers

 avatar  avatar

promotion-system's Issues

Ver todas as 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.

Promoção (Promotion)

  • Nome (name string)
  • Descrição (description string)
  • Código alfanumérico único (code string)
  • Percentual de desconto (discount_rate decimal)
  • Número cupons (coupon_quantity integer)
  • Data de término (expiration_date date)
# 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

Editar uma promoção

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.

Apagar uma promoção

Eu, usuário administrador,
Gostaria de apagar uma promoção
Para que que não conste na lista de promoções.

Disponibilizar um cupom novamente

Eu, usuário administrador,
Gostaria de tornar um cupom disponível novamente,
Para que possa disponibilizar um cupom em caso de erro

Gerenciar categoria de produto

Eu, usuário administrador,
Gostaria de gerenciar uma categoria de produto,
Para que possam vê-las e gerenciá-las no sistema.

Categoria de Produto

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

ProductCategory

  • Nome (name string)
  • Código alfanumérico único (code string)

Dica

  • Todos os campos devem ser obrigatórios
  • Esse card é de todo o fluxo de CRUD num card só

Buscar promoção

Eu, usuário administrador,
Gostaria de buscar uma promoção,
Para que possa de forma rápida encontrar resultados

Cadastrar promoção com todos os campos

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.

Dicas e Informações

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

Aprovar promoção

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;

Dicas e informações

  • Você deve alterar o fluxo de emissão de cupons para garantir que promoções não aprovadas não ofereçam a opção de emitir cupons;
  • Uma promoção aprovada não pode ser 'desaprovada'

Criar o projeto

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:

  • Rails
  • minitest
  • capybara

Queimar um cupom do sistema

Eu, usuário administrador,
Gostaria de queimar um cupom manualmente,
Para que possa indisponibilizar um cupom em caso de erro

Visitante abre o site

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

Instalar chrome no WSL

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

Autenticação do sistema

Eu, usuário visitante,
Gostaria de cadastrar fazer login,
Para ter certeza que somente usuários autenticados possam executar ações no sistema

Bônus

Criar conta apenas com e-mail @iugu.com.br

Fluxo de trabalho

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 :)

Buscar cupom

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.

Cadastrar uma promoção

Eu, usuário administrador,
Gostaria de cadastrar uma promoção,
Para que possam ser gerados cupons para aquela promoção

Dica

  • Nesse teste você ainda não precisa fazer as validações
  • Para testar os campos é importante preencher todos durante o teste com o método fill_in e também garantir que os 3 são exibidos em seguida com assert_text ou assert_selector
# 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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.