diff --git a/app/views/devise/shared/_error_messages.html.haml b/app/views/devise/shared/_error_messages.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..b7589a4460e68a393e846c2626a00d7231c9814c --- /dev/null +++ b/app/views/devise/shared/_error_messages.html.haml @@ -0,0 +1,9 @@ +- if resource.errors.any? + = render Pajamas::AlertComponent.new(title: I18n.t("errors.messages.not_saved", count: resource.errors.count, resource: resource.class.model_name.human.downcase), + variant: :danger, + dismissible: false, + alert_options: { id: 'error_explanation', class: 'gl-mb-3'}) do |c| + = c.body do + %ul.gl-pl-4 + - resource.errors.full_messages.each do |message| + %li= message diff --git a/spec/views/devise/shared/_error_messages.html.haml_spec.rb b/spec/views/devise/shared/_error_messages.html.haml_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..afd3141f2c7791cb48295080c0f6b6e3bbed22f1 --- /dev/null +++ b/spec/views/devise/shared/_error_messages.html.haml_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'devise/shared/_error_messages', feature_category: :authentication_and_authorization do + describe 'Error messages' do + let(:resource) do + instance_spy(User, errors: errors, class: User) + end + + before do + allow(view).to receive(:resource).and_return(resource) + end + + context 'with errors', :aggregate_failures do + let(:errors) { errors_stub(['Invalid name', 'Invalid password']) } + + it 'shows errors' do + render + + expect(rendered).to have_selector('#error_explanation') + expect(rendered).to have_content('Invalid name') + expect(rendered).to have_content('Invalid password') + end + end + + context 'without errors' do + let(:errors) { [] } + + it 'does not show errors' do + render + + expect(rendered).not_to have_selector('#error_explanation') + end + end + end + + def errors_stub(*messages) + ActiveModel::Errors.new(double).tap do |errors| + messages.each { |msg| errors.add(:base, msg) } + end + end +end