codeplay's Introduction
codeplay's People
codeplay's Issues
Ver todos os cursos
Eu, usuário administrador,
Gostaria de ver todos os cursos cadastrados,
Para ter certeza de que todos os cursos estão cadastradas corretamente.
Curso (Course)
- Nome (name string)
- Descrição (description text)
- Código alfanumérico único (code string)
- Valor (price decimal)
- Data limitede matrícula (enrollment_deadline date)
# spec/system/admin_view_courses_spec.rb
require 'rails_helper'
describe 'Admin view courses' do
it 'successfully' do
Course.create!(name: 'Ruby', description: 'Um curso de Ruby',
code: 'RUBYBASIC', price: 10,
enrollment_deadline: '22/12/2033')
Course.create!(name: 'Ruby on Rails',
description: 'Um curso de Ruby on Rails',
code: 'RUBYONRAILS', price: 20,
enrollment_deadline: '20/12/2033')
visit root_path
click_on 'Cursos'
expect(page).to have_content('Ruby')
expect(page).to have_content('Um curso de Ruby')
expect(page).to have_content('R$ 10,00')
expect(page).to have_content('Ruby on Rails')
expect(page).to have_content('Um curso de Ruby on Rails')
expect(page).to have_content('R$ 20,00')
end
it 'and view details' do
Course.create!(name: 'Ruby', description: 'Um curso de Ruby',
code: 'RUBYBASIC', price: 10,
enrollment_deadline: '22/12/2033')
Course.create!(name: 'Ruby on Rails',
description: 'Um curso de Ruby on Rails',
code: 'RUBYONRAILS', price: 20,
enrollment_deadline: '20/12/2033')
visit root_path
click_on 'Cursos'
click_on 'Ruby on Rails'
expect(page).to have_content('Ruby on Rails')
expect(page).to have_content('Um curso de Ruby on Rails')
expect(page).to have_content('RUBYONRAILS')
expect(page).to have_content('R$ 20,00')
expect(page).to have_content('20/12/2033')
end
it 'and no course is available' do
visit root_path
click_on 'Cursos'
expect(page).to have_content('Nenhum curso disponível')
end
it 'and return to home page' do
Course.create!(name: 'Ruby', description: 'Um curso de Ruby',
code: 'RUBYBASIC', price: 10,
enrollment_deadline: '22/12/2033')
visit root_path
click_on 'Cursos'
click_on 'Voltar'
expect(current_path).to eq root_path
end
it 'and return to promotions page' do
Course.create!(name: 'Ruby', description: 'Um curso de Ruby',
code: 'RUBYBASIC', price: 10,
enrollment_deadline: '22/12/2033')
visit root_path
click_on 'Cursos'
click_on 'Ruby'
click_on 'Voltar'
expect(current_path).to eq courses_path
end
end
Apagar um curso
Eu, usuário administrador,
Gostaria de apagar um curso no sistema,
Para que aquele curso não apareça mais na plataforma.
Administradores podem ver compras
Eu, usuário administrador,
gostaria de ver compras de outros usuários,
para que possa acompanhar quais cursos estão sendo vendidos
Ver professores
Eu, usuário administrador,
Gostaria de ver todos os professores cadastrados,
Para ter certeza de que todos estão cadastrados corretamente.
Professor (Instructor)
Nome (name string)
Email (email string)
Descrição (bio text)
Foto de perfil (profile_picture active storage)
Editar um curso
Eu, usuário administrador,
Gostaria de editar um curso no sistema,
Para atualizar cadastros na base de dados.
Curso pode ser um rascunho
Eu, usuário administrador,
gostaria de criar um curso em rascunho,
para que ele não possa ser cadastrado até marcado como publicado.
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.
# codeplay/spec/system/visitor_visit_homepage_spec.rb
require 'rails_helper'
describe 'Visitor visit homepage' do
it 'successfully' do
visit root_path
expect(page).to have_css('h1', text: 'Codeplay')
expect(page).to have_css('h3', text: 'Boas vindas ao sistema de gestão de '\
'cursos e aulas')
end
end
Configurar testes de sistema do RSpec para rodar com rack_test
Por muito tempo os testes de RSpec e Capybara eram feitos usando testes do tipo feature. Com uma nova implementação de testes de sistema diretamente no Rails, o RSpec fez uma abstração para usarmos esse novo modelo de testes. Esse modelo normalmente usa um browser para executar o teste mas essa necessidade ainda não existe, então vamos usar uma forma de leitura mais simples e leve o rack-test.
Para isso configure as seguintes linhas no arquivo spec/rails_helper.rb
:
config.before(type: :system) do
driven_by :rack_test
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
Usuário compra um curso
Eu, usuário autenticado no sistema,
Gostaria de comprar um curso,
Para que possa ver as aulas daquele curso.
Cadastrar curso com os campos corretos
Eu, usuário administrador,
Gostaria que o sistema validasse que um curso só seja cadastrada com um nome, código, preço (não vazios) e que um curso não seja cadastrado duas vezes com o mesmo 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 course_spec.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 Course
. 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.
# spec/system/admin_registers_courses_spec.rb
it 'and attributes cannot be blank' do
Course.create!(name: 'Ruby', description: 'Um curso de Ruby',
code: 'RUBYBASIC', price: 10,
enrollment_deadline: '22/12/2033')
visit root_path
click_on 'Cursos'
click_on 'Registrar um Curso'
fill_in 'Nome', with: ''
fill_in 'Descrição', with: ''
fill_in 'Código', with: ''
fill_in 'Preço', with: ''
fill_in 'Data limite de matrícula', with: ''
click_on 'Criar curso'
expect(page).to have_content('não pode ficar em branco', count: 3)
end
it 'and code must be unique' do
Course.create!(name: 'Ruby', description: 'Um curso de Ruby',
code: 'RUBYBASIC', price: 10,
enrollment_deadline: '22/12/2033')
visit root_path
click_on 'Cursos'
click_on 'Registrar um Curso'
fill_in 'Código', with: 'RUBYBASIC'
click_on 'Criar curso'
expect(page).to have_content('já está em uso')
end
# spec/models/course_spec.rb
require 'rails_helper'
describe Course do
context 'validation' do
it 'attributes cannot be blank' do
course = Course.new
course.valid?
expect(course.errors[:name]).to include('não pode ficar em branco')
expect(course.errors[:code]).to include('não pode ficar em branco')
expect(course.errors[:price]).to include('não pode ficar em branco')
end
it 'code must be uniq' do
Course.create!(name: 'Ruby', description: 'Um curso de Ruby',
code: 'RUBYBASIC', price: 10,
enrollment_deadline: '22/12/2033')
course = Course.new(code: 'RUBYBASIC')
course.valid?
expect(course.errors[:code]).to include('já está em uso')
end
end
end
Gerenciar aulas para um curso
Eu, usuário administrador,
Gostaria de gerenciar aulas para um curso,
Para que aquele ver, cadastrar, editar e apagar aulas num curso da plataforma.
Autorização de usuários e administradores
No sistema temos dois acessos de Administrador e Usuário
Esse card tem o foco em fazer essa separação de acesso para que administradores possam:
- Gerir cursos
- Gerir aulas
Usuários podem:
- Comprar cursos
- Ver aulas
- Marcar aulas como concluídas
Apagar professores
Eu, usuário administrador,
Gostaria de apagar um professor previamente cadastrado,
Para evitar dados de pessoas que não lecionam mais na plataforma
Inativar professores
Eu, Administrador,
gostaria de inativar um professor no sistema,
para que não apareçam mais na lista no momento de cadastrar um curso.
Professores já associados podem continuar associados
Cadastrar e editar professores
Eu, usuário administrador,
Gostaria de cadastrar e editar professores,
Para que possamos gerir as pessoas que vão dar as aulas
Um professor deve ter nome
e email
obrigatoriamente e o email
deve ser único.
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 codeplay -T --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. A opção -T vai impedir o Rails de adicionar o framework padrão de testes (minitest) que não é o mais utilizado em projetos comerciais.
Vamos utilizar rspec-rails
com capybara
em nosso projeto. Para isso atualize seu Gemfile de acordo com a documentação dessas duas gems e não esqueça de executar o comando rails generate rspec:install
ao final.
Documentações:
Visitante busca um curso
Eu, visitante,
gostaria de buscar um curso,
para que possa encontrar cursos de forma rápida
Usuário acessa seu perfil
Eu, um usuário cadastrado na plataforma,
gostaria de poder customizar meu perfil
para que outras pessoas possam ter ver meu perfil e cursos que estou fazendo
Usuário marca aula como concluída
Eu, um usuário que comprou o curso,
gostaria de marcar uma aula como concluída,
para que possa saber quais aulas ainda faltam no curso
Curso deve ter um professor
Eu, usuário administrador,
Gostaria de dizer que um professor previamente cadastrado ministra aquele curso,
Para que o curso possa ter um professor responsável
Cadastrar um curso
Eu, usuário administrador,
Gostaria de cadastrar um curso,
Para que possamos ver aulas para aquele curso
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 comexpect(page).to have_content
# spec/system/admin_registers_courses_spec.rb
require 'rails_helper'
describe 'Admin registers courses' do
it 'from index page' do
visit root_path
click_on 'Cursos'
expect(page).to have_link('Registrar um Curso',
href: new_course_path)
end
it 'successfully' do
visit root_path
click_on 'Cursos'
click_on 'Registrar um Curso'
fill_in 'Nome', with: 'Ruby on Rails'
fill_in 'Descrição', with: 'Um curso de Ruby on Rails'
fill_in 'Código', with: 'RUBYONRAILS'
fill_in 'Preço', with: '30'
fill_in 'Data limite de matrícula', with: '22/12/2033'
click_on 'Criar curso'
expect(current_path).to eq(course_path(Course.last))
expect(page).to have_content('Ruby on Rails')
expect(page).to have_content('Um curso de Ruby on Rails')
expect(page).to have_content('RUBYONRAILS')
expect(page).to have_content('R$ 30,00')
expect(page).to have_content('22/12/2033')
expect(page).to have_link('Voltar')
end
end
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
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.