Code Monkey home page Code Monkey logo

codeplay's Introduction

Hi, I'm Weslley Campos!



coding-time

Melhores Tecnologias <3

ruby rails rspec c-icon react-icon html-icon css-icon css-icon

Redes Sociais

snake gif

codeplay's People

Contributors

weslley6216 avatar

Watchers

 avatar

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:

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

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 com expect(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 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.