diff --git a/Gemfile.lock b/Gemfile.lock index 72989ad..d5f5e1b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -131,6 +131,8 @@ GEM nio4r (2.5.8) nokogiri (1.13.8-arm64-darwin) racc (~> 1.4) + nokogiri (1.13.8-x86_64-linux) + racc (~> 1.4) orm_adapter (0.5.0) popper_js (2.11.6) public_suffix (5.0.0) @@ -206,6 +208,7 @@ GEM activesupport (>= 5.2) sprockets (>= 3.0.0) sqlite3 (1.5.2-arm64-darwin) + sqlite3 (1.5.2-x86_64-linux) thor (1.2.1) tilt (2.0.11) timeout (0.3.0) @@ -222,6 +225,7 @@ GEM PLATFORMS arm64-darwin-21 + x86_64-linux DEPENDENCIES bootstrap (~> 5.2.1) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1f6be59..b21f628 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,4 +1,9 @@ class ApplicationController < ActionController::Base - - + def authenticate_user! + if user_signed_in? + super + else + redirect_to new_user_session_path, :notice => 'Realize login para continuar ou crie uma nova conta' + end + end end diff --git a/app/controllers/product_categories_controller.rb b/app/controllers/product_categories_controller.rb index 180bc41..b2467d6 100644 --- a/app/controllers/product_categories_controller.rb +++ b/app/controllers/product_categories_controller.rb @@ -1,9 +1,10 @@ class ProductCategoriesController < ApplicationController def create - ProductCategory.create!(name: params.require(:product_category).permit(:name)) + ProductCategory.create!(params.require(:product_category).permit(:name)) redirect_to products_path, notice: 'Categoria cadastrada' end + def search nome_a_buscar = params[:busca] ProductCategory.where("name LIKE :param_busca OR outro_campo LIKE :param_busca OR mais_um_campo LIKE :param_busca ", diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 039a826..f7aeb63 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,12 +1,11 @@ class ProductsController < ApplicationController before_action :set_product, only: %i[ show edit update destroy ] + before_action :product_params, only:[:create, :update] + before_action :authenticate_user! # GET /products def index @products = Product.all - @product = Product.new - @product_category = ProductCategory.new - @product_categories = ProductCategory.all end # GET /products/1 @@ -25,11 +24,11 @@ def edit # POST /products def create @product = Product.new(product_params) - + if @product.save - redirect_to @product, notice: "Product was successfully created." + redirect_to @product, notice: "Produto cadastrado com sucesso" else - render :new, status: :unprocessable_entity + render :new end end @@ -50,12 +49,14 @@ def destroy private # Use callbacks to share common setup or constraints between actions. - def set_product - @product = Product.find(params[:id]) - end + def set_product + @product = Product.find(params[:id]) + end + + # Only allow a list of trusted parameters through. + def product_params + params.require(:product).permit(:name, :price, :product_category_id) + end - # Only allow a list of trusted parameters through. - def product_params - params.require(:product).permit(:name, :price, :product_category_id) - end end + diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index 73ff2dc..f1ecfc5 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -1,9 +1,6 @@ class WelcomeController < ApplicationController - def index - end - end \ No newline at end of file diff --git a/app/models/product.rb b/app/models/product.rb index a6e4544..1b0ccfe 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,5 +1,6 @@ class Product < ApplicationRecord - belongs_to :product_category, optional: true + belongs_to :product_category + validates :name, :price, :product_category, presence: true end diff --git a/app/models/product_category.rb b/app/models/product_category.rb index 282738c..305de3c 100644 --- a/app/models/product_category.rb +++ b/app/models/product_category.rb @@ -1,3 +1,4 @@ class ProductCategory < ApplicationRecord + has_many :products validates :name, presence: true end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c557d62..720718d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -11,42 +11,9 @@ - +
<%= notice %> diff --git a/app/views/products/_error.html.erb b/app/views/products/_error.html.erb new file mode 100644 index 0000000..1a9e830 --- /dev/null +++ b/app/views/products/_error.html.erb @@ -0,0 +1,9 @@ +<% if @product.errors.any? %> +
+ +
+ <% end %> \ No newline at end of file diff --git a/app/views/products/_form.html.erb b/app/views/products/_form.html.erb deleted file mode 100644 index a2a1d8e..0000000 --- a/app/views/products/_form.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -<%= form_with(model: product) do |form| %> - <% if product.errors.any? %> -
-

<%= pluralize(product.errors.count, "error") %> prohibited this product from being saved:

- - -
- <% end %> - -
- <%= form.label :name, style: "display: block" %> - <%= form.text_field :name %> -
- -
- <%= form.label :price, style: "display: block" %> - <%= form.text_field :price %> -
- -
- <%= form.submit %> -
-<% end %> diff --git a/app/views/products/_product.html.erb b/app/views/products/_product.html.erb deleted file mode 100644 index 19ca353..0000000 --- a/app/views/products/_product.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -
-

- Name: - <%= product.name %> -

- -

- Price: - <%= product.price %> -

- -
diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index a84a004..e3c20b6 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,11 +1,10 @@

<%= notice %>

-

Products

+

Produtos

<% @products.each do |product| %> - <%= render product %>

- <%= link_to "Show this product", product %> + <%= link_to "Ver produto", product %>

<% end %>
@@ -18,33 +17,7 @@ <% end %>
+<%= link_to 'Cadastrar produto', new_product_path %> +<%= link_to 'Voltar', root_path %> -

Novo Produto

-<%= form_with(model: @product) do |form| %> -
- <%= form.label :name, style: "display: block" %> - <%= form.text_field :name %> -
- -
- <%= form.label :price, style: "display: block" %> - <%= form.text_field :price %> -
- -
- <%= form.label :condition_new, 'Produto Novo' %> - <%= form.radio_button :condition, :new %> - - <%= form.label :condition_used, 'Produto Usado' %> - <%= form.radio_button :condition, :used %> -
- -
- <%= form.submit %> -
-<% end %> - - -choose 'Produto Usado' - diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index d438e41..ab47752 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1,9 +1,31 @@ -

New product

+<%= render 'error' %> -<%= render "form", product: @product %> +

Novo Produto

+ +<%= form_with(model: @product) do |form| %> +
+ <%= form.label :name, style: "display: block" %> + <%= form.text_field :name %> +
+ +
+ <%= form.label :price, style: "display: block" %> + <%= form.text_field :price %> +
+ +
+ <%= form.label :product_category_id, style: "display: block" %> + <%= form.collection_select :product_category_id, ProductCategory.all, :id, :name, include_blank:true %> +
+ +
+ <%= form.submit 'Salvar' %> +
+ +<% end %>
- <%= link_to "Back to products", products_path %> + <%= link_to "Voltar", products_path %>
diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 7e30dc8..31bb58b 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,12 +1,17 @@

<%= notice %>

-<%= render @product %> +

<%= @product.name %>

-<%= render @product.product_category %> +
+
<%= Product.human_attribute_name(:name) %>:
+
<%= @product.name %>
+
<%= Product.human_attribute_name(:price) %>:
+
<%= number_to_currency(@product.price, :unit => "R$ ", :separator => ",", :delimiter => ".") %>
+
<%= Product.human_attribute_name(:product_category) %>:
+
<%= @product.product_category.name %>
+
- <%= link_to "Edit this product", edit_product_path(@product) %> | - <%= link_to "Back to products", products_path %> - - <%= button_to "Destroy this product", @product, method: :delete %> + <%= link_to "Editar produto", edit_product_path(@product) %> | + <%= link_to "Voltar", products_path %>
diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb index 65777a5..7e404b8 100644 --- a/app/views/welcome/index.html.erb +++ b/app/views/welcome/index.html.erb @@ -1,4 +1,4 @@ -

<%= translate('.title') %>

+

Sistema de Frete e Transportadoras

@@ -40,3 +40,7 @@ <%= link_to 'Início', root_path, class: 'btn btn-primary btn-lg' %> +<%= link_to 'Produtos', products_path, class: 'btn btn-primary btn-lg' %> +<%= link_to 'Sair', destroy_user_session_path, :method => :delete, class: 'btn btn-primary btn-lg' %> + + diff --git a/config/application.rb b/config/application.rb index cfa4ef9..a7653f0 100644 --- a/config/application.rb +++ b/config/application.rb @@ -33,5 +33,9 @@ class Application < Rails::Application # Don't generate system test files. config.generators.system_tests = nil + + config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] + config.i18n.locale = :'pt-BR' + config.i18n.default_locale = :'pt-BR' end end diff --git a/config/environments/development.rb b/config/environments/development.rb index 5ab2549..53c1867 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -17,6 +17,8 @@ # Enable server timing config.server_timing = true + #config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } + # Enable/disable caching. By default caching is disabled. # Run rails dev:cache to toggle caching. if Rails.root.join("tmp/caching-dev.txt").exist? diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 5ea5514..3de640c 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -24,7 +24,7 @@ # Configure the e-mail address which will be shown in Devise::Mailer, # note that it will be overwritten if you use your own mailer class # with default "from" parameter. - config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com' + # config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com' # Configure the class responsible to send e-mails. # config.mailer = 'Devise::Mailer' diff --git a/config/initializers/locale.rb b/config/initializers/locale.rb new file mode 100644 index 0000000..53fbc79 --- /dev/null +++ b/config/initializers/locale.rb @@ -0,0 +1,2 @@ +I18n.available_locales = ['pt-BR'] +I18n.default_locale = :'pt-BR' diff --git a/config/locales/devise.pt-BR.yml b/config/locales/devise.pt-BR.yml new file mode 100644 index 0000000..e5e18d0 --- /dev/null +++ b/config/locales/devise.pt-BR.yml @@ -0,0 +1,148 @@ +pt-BR: + activerecord: + attributes: + user: + confirmation_sent_at: Confirmação enviada em + confirmation_token: Token de confirmação + confirmed_at: Confirmado em + created_at: Criado em + current_password: Senha atual + current_sign_in_at: Atualmente logado em + current_sign_in_ip: IP do acesso atual + email: E-mail + name: Nome + encrypted_password: Senha criptografada + failed_attempts: Tentativas sem sucesso + last_sign_in_at: Último acesso em + last_sign_in_ip: Último IP de acesso + locked_at: Bloqueado em + password: Senha + password_confirmation: Confirme sua senha + remember_created_at: Lembrar criado em + remember_me: Lembre-se de mim + reset_password_sent_at: Resetar senha enviado em + reset_password_token: Resetar token de senha + sign_in_count: Contagem de acessos + unconfirmed_email: E-mail não confirmado + unlock_token: Token de desbloqueio + updated_at: Atualizado em + models: + user: + one: Usuário + other: Usuários + devise: + confirmations: + confirmed: A sua conta foi confirmada com sucesso. + new: + resend_confirmation_instructions: Reenviar instruções de confirmação + send_instructions: Dentro de minutos, você receberá um email com as instruções de confirmação da sua conta. + send_paranoid_instructions: Se o seu e-mail existir em nosso banco de dados, você receberá um email com instruções sobre como confirmar sua conta em alguns minutos. + failure: + already_authenticated: Você já está autenticado. + inactive: A sua conta ainda não foi ativada. + invalid: "%{authentication_keys} ou senha inválidos." + last_attempt: Você tem mais uma única tentativa antes de sua conta ser bloqueada. + locked: A sua conta está bloqueada. + not_found_in_database: "%{authentication_keys} ou senha inválidos." + timeout: A sua sessão expirou, por favor, faça login novamente para continuar. + unauthenticated: Para continuar, faça login ou registre-se. + unconfirmed: Antes de continuar, confirme a sua conta. + mailer: + confirmation_instructions: + action: Confirmar minha conta + greeting: Bem-vindo %{recipient}! + instruction: 'Você pode confirmar sua conta através do link abaixo:' + subject: Instruções de confirmação + email_changed: + greeting: Olá %{recipient}! + message: Estamos entrando em contato para notificá-lo de que seu e-mail está sendo alterado para %{email}. + message_unconfirmed: Estamos entrando em contato para notificá-lo de que seu e-mail está sendo alterado para %{email}. + subject: E-mail alterado + password_change: + greeting: Olá %{recipient}! + message: Estamos entrando em contato para notificá-lo de que sua senha foi alterada. + subject: Senha alterada + reset_password_instructions: + action: Redefinir minha senha + greeting: Olá %{recipient}! + instruction: Alguém fez o pedido para redefinir sua senha, e você pode fazer isso clicando no link abaixo. + instruction_2: Se você não fez este pedido, por favor ignore este e-mail. + instruction_3: Sua senha não será alterada até que você acesse o link acima e crie uma nova. + subject: Instruções de redefinição de senha + unlock_instructions: + action: Desbloquear minha conta + greeting: Olá %{recipient}! + instruction: 'Clique no link abaixo para desbloquear sua conta:' + message: Sua conta foi bloqueada devido ao excessivo número de tentativas acesso inválidas. + subject: Instruções de desbloqueio + omniauth_callbacks: + failure: Não foi possível autorizar de uma conta de %{kind} porque "%{reason}". + success: Autorizado com sucesso de uma conta de %{kind}. + passwords: + edit: + change_my_password: Alterar minha senha + change_your_password: Alterar sua senha + confirm_new_password: Confirme sua nova senha + new_password: Nova senha + new: + forgot_your_password: Esqueceu sua senha? + send_me_reset_password_instructions: Enviar instruções para redefinição da senha + no_token: Você não pode acessar esta página sem estar logado. Se você veio de um email de redefinição de senha, por favor certifique-se de ter digitado a URL corretamente. + send_instructions: Dentro de minutos, você receberá um e-mail com as instruções de redefinição da sua senha. + send_paranoid_instructions: Se o seu email existir em nosso banco de dados, você receberá um email com um link para recuperação da senha. + updated: A sua senha foi alterada com sucesso. Você está autenticado. + updated_not_active: Sua senha foi alterada com sucesso. + registrations: + destroyed: Adeus! A sua conta foi cancelada com sucesso. Esperamos vê-lo novamente em breve. + edit: + are_you_sure: Você tem certeza? + cancel_my_account: Cancelar minha conta + currently_waiting_confirmation_for_email: 'No momento esperando por: %{email}' + leave_blank_if_you_don_t_want_to_change_it: deixe em branco caso não queira alterá-la + title: Editar %{resource} + unhappy: Não está contente? + update: Atualizar + we_need_your_current_password_to_confirm_your_changes: precisamos da sua senha atual para confirmar suas mudanças + new: + sign_up: Criar uma conta + signed_up: Boas-vindas! Você realizou seu registro com sucesso. + signed_up_but_inactive: Você se inscreveu com sucesso, porém nós não podemos autenticá-lo porque sua conta ainda não foi ativada. + signed_up_but_locked: Você se inscreveu com sucesso. Porém nós não podemos autenticá-lo porque sua conta está bloqueada. + signed_up_but_unconfirmed: Uma mensagem com um link de confirmação foi enviada para o seu e-mail. Por favor, acesse o link para ativar sua conta. + update_needs_confirmation: Sua conta foi atualizada com sucesso, mas nós precisamos verificar o novo endereço de email. Por favor, verifique seu e-mail e clique no link de confirmação para finalizar confirmando o seu novo e-mail. + updated: A sua conta foi atualizada com sucesso. + updated_but_not_signed_in: Sua conta foi atualizada com sucesso, uma vez que sua senha foi alterada será necessário realizar o login novamente. + sessions: + already_signed_out: Logout efetuado com sucesso. + new: + sign_in: Login + signed_in: Login efetuado com sucesso. + signed_out: Logout efetuado com sucesso. + shared: + links: + back: Voltar + didn_t_receive_confirmation_instructions: Não recebeu instruções de confirmação? + didn_t_receive_unlock_instructions: Não recebeu instruções de desbloqueio? + forgot_your_password: Esqueceu sua senha? + sign_in: Login + sign_in_with_provider: Entrar com %{provider} + sign_up: Inscrever-se + minimum_password_length: + one: "(Mínimo de %{count} caractere)" + other: "(Mínimo de %{count} caracteres)" + unlocks: + new: + resend_unlock_instructions: Reenviar instruções de desbloqueio + send_instructions: Dentro de minutos, você receberá um e-mail com instruções de desbloqueio da sua conta. + send_paranoid_instructions: Se sua conta existir em nosso banco de dados, você receberá em breve um e-mail com instruções para desbloquear ela. + unlocked: A sua conta foi desbloqueada com sucesso. Efetue login para continuar. + errors: + messages: + already_confirmed: já foi confirmado + confirmation_period_expired: É necessário ser confirmado dentro do período %{period}, por favor requisite um novo usuário. + expired: expirou, por favor solicite uma nova + not_found: não encontrado + not_locked: não foi bloqueado + not_saved: + one: 'Não foi possível salvar %{resource}: 1 erro' + other: 'Não foi possível salvar %{resource}: %{count} erros.' \ No newline at end of file diff --git a/config/locales/modelo_produto.yml b/config/locales/modelo_produto.yml new file mode 100644 index 0000000..405f627 --- /dev/null +++ b/config/locales/modelo_produto.yml @@ -0,0 +1,6 @@ +pt-BR: + helpers: + label: + product_category: + product_category: Modelo de produto + product_category_id: Modelo de produto \ No newline at end of file diff --git a/config/locales/product.pt-BR.yml b/config/locales/product.pt-BR.yml new file mode 100644 index 0000000..6909ea4 --- /dev/null +++ b/config/locales/product.pt-BR.yml @@ -0,0 +1,11 @@ +pt-BR: + activerecord: + models: + product: 'Produto' + product_category: 'Modelo de produto' + attributes: + product: + name: 'Nome' + price: 'Preço' + product_category: 'Modelo de produto' + product_category_id: 'Modelo de produto' diff --git a/config/locales/product_categories.pt-BR.yml b/config/locales/product_categories.pt-BR.yml new file mode 100644 index 0000000..956b7ee --- /dev/null +++ b/config/locales/product_categories.pt-BR.yml @@ -0,0 +1,8 @@ +pt-BR: + activerecord: + models: + product_categories: 'Produto' + attributes: + product_categories: + name: 'Nome' + \ No newline at end of file diff --git a/config/locales/produto.pt-BR.yml b/config/locales/produto.pt-BR.yml new file mode 100644 index 0000000..5e77ffa --- /dev/null +++ b/config/locales/produto.pt-BR.yml @@ -0,0 +1,4 @@ +produto: + Name: 'Nome' + Price: 'Prazo' + product_category: 'Modelo de produto' diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml deleted file mode 100644 index 68c10cf..0000000 --- a/config/locales/pt-BR.yml +++ /dev/null @@ -1,14 +0,0 @@ -en: - transport_mode: - error: - not_available: 'Não existe modalidade disponível' - - welcome: - index: - title: 'Sistema de Frete e Transporatdoras' - outro: - outro: - outro: - - -I18n.translate('transport_mode.error.not_available') \ No newline at end of file diff --git a/config/locales/pt-BR2.yml b/config/locales/pt-BR2.yml new file mode 100644 index 0000000..8f9d0df --- /dev/null +++ b/config/locales/pt-BR2.yml @@ -0,0 +1,223 @@ +--- +pt-BR: + activerecord: + errors: + messages: + record_invalid: 'A validação falhou: %{errors}' + restrict_dependent_destroy: + has_one: Não é possível excluir o registro pois existe um %{record} dependente + has_many: Não é possível excluir o registro pois existem %{record} dependentes + date: + abbr_day_names: + - dom + - seg + - ter + - qua + - qui + - sex + - sáb + abbr_month_names: + - + - jan + - fev + - mar + - abr + - mai + - jun + - jul + - ago + - set + - out + - nov + - dez + day_names: + - domingo + - segunda-feira + - terça-feira + - quarta-feira + - quinta-feira + - sexta-feira + - sábado + formats: + default: "%d/%m/%Y" + long: "%d de %B de %Y" + short: "%d de %B" + month_names: + - + - janeiro + - fevereiro + - março + - abril + - maio + - junho + - julho + - agosto + - setembro + - outubro + - novembro + - dezembro + order: + - :day + - :month + - :year + datetime: + distance_in_words: + about_x_hours: + one: aproximadamente 1 hora + other: aproximadamente %{count} horas + about_x_months: + one: aproximadamente 1 mês + other: aproximadamente %{count} meses + about_x_years: + one: aproximadamente 1 ano + other: aproximadamente %{count} anos + almost_x_years: + one: quase 1 ano + other: quase %{count} anos + half_a_minute: meio minuto + less_than_x_seconds: + one: menos de 1 segundo + other: menos de %{count} segundos + less_than_x_minutes: + one: menos de um minuto + other: menos de %{count} minutos + over_x_years: + one: mais de 1 ano + other: mais de %{count} anos + x_seconds: + one: 1 segundo + other: "%{count} segundos" + x_minutes: + one: 1 minuto + other: "%{count} minutos" + x_days: + one: 1 dia + other: "%{count} dias" + x_months: + one: 1 mês + other: "%{count} meses" + x_years: + one: 1 ano + other: "%{count} anos" + prompts: + second: Segundo + minute: Minuto + hour: Hora + day: Dia + month: Mês + year: Ano + errors: + format: "%{attribute} %{message}" + messages: + accepted: deve ser aceito + blank: não pode ficar em branco + confirmation: não é igual a %{attribute} + empty: não pode ficar vazio + equal_to: deve ser igual a %{count} + even: deve ser par + exclusion: não está disponível + greater_than: deve ser maior que %{count} + greater_than_or_equal_to: deve ser maior ou igual a %{count} + inclusion: não está incluído na lista + invalid: não é válido + less_than: deve ser menor que %{count} + less_than_or_equal_to: deve ser menor ou igual a %{count} + model_invalid: 'A validação falhou: %{errors}' + not_a_number: não é um número + not_an_integer: não é um número inteiro + odd: deve ser ímpar + other_than: deve ser diferente de %{count} + present: deve ficar em branco + required: é obrigatório(a) + taken: já está em uso + too_long: + one: 'é muito longo (máximo: 1 caracter)' + other: 'é muito longo (máximo: %{count} caracteres)' + too_short: + one: 'é muito curto (mínimo: 1 caracter)' + other: 'é muito curto (mínimo: %{count} caracteres)' + wrong_length: + one: não possui o tamanho esperado (1 caracter) + other: não possui o tamanho esperado (%{count} caracteres) + template: + body: 'Por favor, verifique o(s) seguinte(s) campo(s):' + header: + one: 'Não foi possível gravar %{model}: 1 erro' + other: 'Não foi possível gravar %{model}: %{count} erros' + helpers: + select: + prompt: Por favor selecione + submit: + create: Criar %{model} + submit: Salvar %{model} + update: Atualizar %{model} + number: + currency: + format: + delimiter: "." + format: "%u %n" + precision: 2 + separator: "," + significant: false + strip_insignificant_zeros: false + unit: R$ + format: + delimiter: "." + precision: 3 + separator: "," + significant: false + strip_insignificant_zeros: false + human: + decimal_units: + format: "%n %u" + units: + billion: + one: bilhão + other: bilhões + million: + one: milhão + other: milhões + quadrillion: + one: quatrilhão + other: quatrilhões + thousand: mil + trillion: + one: trilhão + other: trilhões + unit: '' + format: + delimiter: '' + precision: 3 + significant: true + strip_insignificant_zeros: true + storage_units: + format: "%n %u" + units: + byte: + one: Byte + other: Bytes + eb: EB + gb: GB + kb: KB + mb: MB + pb: PB + tb: TB + percentage: + format: + delimiter: "." + format: "%n%" + precision: + format: + delimiter: "." + support: + array: + last_word_connector: " e " + two_words_connector: " e " + words_connector: ", " + time: + am: '' + formats: + default: "%a, %d de %B de %Y, %H:%M:%S %z" + long: "%d de %B de %Y, %H:%M" + short: "%d de %B, %H:%M" + pm: '' \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index e23c4d5..5a476c6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,8 +1,12 @@ Rails.application.routes.draw do resources :products - resources :product_categories, only: [:create, :show] do - resources :products, only: [:create] + resources :product_categories, only: [:new, :create, :show] do + resources :products, only: [:create, :new, :show] end devise_for :users root 'welcome#index' + devise_scope :user do + get '/users/sign_out' => 'devise/sessions#destroy' + get "/home", :to => "devise/sessions#new", :as => :home + end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 1a859fa..c3b55ed 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -6,6 +6,9 @@ abort("The Rails environment is running in production mode!") if Rails.env.production? require 'rspec/rails' # Add additional requires below this line. Rails is not loaded until this point! +require 'capybara/rails' + +require 'devise' # Requires supporting ruby files with custom matchers and macros, etc, in # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are @@ -24,6 +27,7 @@ # Checks for pending migrations and applies them before tests are run. # If you are not using ActiveRecord, you can remove these lines. + begin ActiveRecord::Migration.maintain_test_schema! rescue ActiveRecord::PendingMigrationError => e @@ -33,6 +37,10 @@ config.before(:each, type: :system) do driven_by :rack_test end + + config.include Warden::Test::Helpers + + # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures config.fixture_path = "#{::Rails.root}/spec/fixtures" diff --git a/spec/system/product/user_register_product_spec.rb b/spec/system/product/user_register_product_spec.rb new file mode 100644 index 0000000..7a62179 --- /dev/null +++ b/spec/system/product/user_register_product_spec.rb @@ -0,0 +1,77 @@ +require 'rails_helper' + +describe 'Usuário cadastra produto' do + it 'com sucesso' do + user = User.create!(email:'joao@campuscode.com', password:'12345678') + ProductCategory.create!(name:'Eletrônicos') + + login_as(user) + visit root_path + click_on 'Produtos' + click_on 'Cadastrar produto' + fill_in 'Nome', with: 'XBox' + fill_in 'Preço', with: '1000' + select 'Eletrônicos', from: 'Modelo de produto' + click_on 'Salvar' + + expect(page).to have_content("Produto cadastrado com sucesso") + expect(page).to have_content("Nome: XBox") + expect(page).to have_content("Preço: R$ 1.000,00") + expect(page).to have_content("Modelo de produto: Eletrônicos") + expect(page).to have_link("Voltar") + end + + it 'e mantém campos obrigatórios' do + user = User.create!(email:'joao@campuscode.com', password:'12345678') + ProductCategory.create!(name:'Eletrodométicos') + + login_as(user) + visit root_path + click_on 'Produtos' + click_on 'Cadastrar produto' + fill_in 'Nome', with: '' + fill_in 'Preço', with: '' + click_on 'Salvar' + + expect(page).to have_content("Nome não pode ficar em branco") + expect(page).to have_content("Preço não pode ficar em branco") + expect(page).to have_content("Modelo de produto não pode ficar em branco") + expect(page).to have_content("Modelo de produto é obrigatório") + expect(page).to have_link("Voltar") + end + + it 'e volta para a tela inicial' do + user = User.create!(email:'joao@campuscode.com', password:'12345678') + ProductCategory.create!(name:'Artigos para o lar') + + login_as(user) + visit root_path + click_on 'Produtos' + click_on 'Cadastrar produto' + click_on 'Voltar' + click_on 'Voltar' + + expect(page).not_to have_link("Voltar") + expect(page).to have_content("Sistema de Frete e Transportadoras") + expect(page).to have_link("Início") + expect(page).to have_link("Produtos") + expect(page).to have_link("Sair") + expect(current_path).to eq root_path + end + + it 'e não está autenticado' do + user = User.create!(email:'joao@campuscode.com', password:'12345678') + ProductCategory.create!(name:'Artigos para o lar') + + visit root_path + click_on 'Produtos' + + expect(page).not_to have_link("Voltar") + expect(page).not_to have_content("Sistema de Frete e Transportadoras") + expect(page).not_to have_link("Sair") + expect(page).to have_text("Realize login para continuar ou crie uma nova conta") + expect(page).to have_field("E-mail") + expect(page).to have_field("Senha") + expect(page).to have_button("Log in") + end +end \ No newline at end of file