<%= f.password_field :password,
- id: "change-password-new-password",
- class: "w-full rounded-md border-gray-300 shadow-sm focus:ring-blue-500 focus:border-blue-500 p-2 pr-10",
- required: true,
- autocomplete: "new-password",
- autocorrect: "off",
- autocapitalize: "off",
- spellcheck: "false",
- data: { password_toggle_target: "input" } %>
+ id: "change-password-new-password",
+ class: "w-full form-control form-input password-field pr-10",
+ required: true,
+ minlength: 5,
+ autofocus: true,
+ autocomplete: "new-password",
+ autocorrect: "off",
+ autocapitalize: "off",
+ spellcheck: "false",
+ data: { password_toggle_target: "input" } %>
<%= f.password_field :password_confirmation,
- id: "change-password-new-password-confirmation",
- class: "w-full rounded-md border-gray-300 shadow-sm focus:ring-blue-500 focus:border-blue-500 p-2 pr-10",
- required: true,
- autocomplete: "new-password",
- autocorrect: "off",
- autocapitalize: "off",
- spellcheck: "false",
- data: { password_toggle_target: "input" } %>
+ id: "change-password-new-password-confirmation",
+ class: "w-full form-control form-input password-field pr-10",
+ required: true,
+ minlength: 5,
+ autofocus: true,
+ autocomplete: "new-password",
+ autocorrect: "off",
+ autocapitalize: "off",
+ spellcheck: "false",
+ data: { password_toggle_target: "input" } %>
From ca9d55e198b6f9adc0fe864ea2c4d6e35649210b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 15 Feb 2026 21:32:06 +0000
Subject: [PATCH 3/7] Add view specs for password forms
- Add spec for users/change_password view to verify password requirements display
- Add spec for devise/passwords/edit view to verify password requirements display
- Test error message display and formatting
Co-authored-by: maebeale <7607813+maebeale@users.noreply.github.com>
---
.../devise/passwords/edit.html.erb_spec.rb | 31 +++++++++++
.../users/change_password.html.erb_spec.rb | 53 +++++++++++++++++++
2 files changed, 84 insertions(+)
create mode 100644 spec/views/users/change_password.html.erb_spec.rb
diff --git a/spec/views/devise/passwords/edit.html.erb_spec.rb b/spec/views/devise/passwords/edit.html.erb_spec.rb
index 256e8cc54..a6f5b1f67 100644
--- a/spec/views/devise/passwords/edit.html.erb_spec.rb
+++ b/spec/views/devise/passwords/edit.html.erb_spec.rb
@@ -7,6 +7,7 @@
user.reset_password_token = Devise.friendly_token
assign(:resource, user)
assign(:resource_name, :user)
+<<<<<<< HEAD
u = user
mapping = Devise.mappings[:user]
view.define_singleton_method(:resource) { u }
@@ -15,6 +16,21 @@
render
end
+=======
+ allow(view).to receive(:resource).and_return(user)
+ allow(view).to receive(:resource_name).and_return(:user)
+ render
+ end
+
+ it "displays password requirements hint" do
+ expect(rendered).to have_content("Password must be at least 5 characters long")
+ end
+
+ it "has minlength attribute on password field" do
+ expect(rendered).to have_css('input[type="password"][minlength="5"]')
+ end
+
+>>>>>>> 8d996c5fb (Add view specs for password forms)
it "displays new password field" do
expect(rendered).to have_field("New password", type: :password)
end
@@ -27,6 +43,7 @@
expect(rendered).to have_button("Set password")
end
+<<<<<<< HEAD
it "displays password requirements hint" do
expect(rendered).to have_content("Password must be at least 5 characters long")
end
@@ -35,6 +52,8 @@
expect(rendered).to have_css('input[type="password"][minlength="5"]')
end
+=======
+>>>>>>> 8d996c5fb (Add view specs for password forms)
context "when user has password errors" do
before do
user.errors.add(:password, "is too short (minimum is 5 characters)")
@@ -42,6 +61,7 @@
render
end
+<<<<<<< HEAD
it "displays error explanation container" do
expect(rendered).to have_css('div#error_explanation')
end
@@ -51,5 +71,16 @@
expect(rendered).to have_content("Password is too short")
expect(rendered).to have_content("Password confirmation doesn't match")
end
+=======
+ it "displays error messages" do
+ expect(rendered).to have_content("prevented this from being saved")
+ expect(rendered).to have_content("Password is too short")
+ expect(rendered).to have_content("Password confirmation doesn't match")
+ end
+
+ it "displays error explanation with proper styling" do
+ expect(rendered).to have_css('div[role="alert"]#error_explanation')
+ end
+>>>>>>> 8d996c5fb (Add view specs for password forms)
end
end
diff --git a/spec/views/users/change_password.html.erb_spec.rb b/spec/views/users/change_password.html.erb_spec.rb
new file mode 100644
index 000000000..cceaacd7b
--- /dev/null
+++ b/spec/views/users/change_password.html.erb_spec.rb
@@ -0,0 +1,53 @@
+require 'rails_helper'
+
+RSpec.describe "users/change_password", type: :view do
+ let(:user) { create(:user) }
+
+ before do
+ assign(:user, user)
+ allow(view).to receive(:current_user).and_return(user)
+ render
+ end
+
+ it "displays password requirements hint" do
+ expect(rendered).to have_content("Password must be at least 5 characters long")
+ end
+
+ it "has minlength attribute on password field" do
+ expect(rendered).to have_css('input[type="password"][minlength="5"]#change-password-new-password')
+ end
+
+ it "displays current password field" do
+ expect(rendered).to have_field("Current password", type: :password)
+ end
+
+ it "displays new password field" do
+ expect(rendered).to have_field("New password", type: :password)
+ end
+
+ it "displays password confirmation field" do
+ expect(rendered).to have_field("New password confirmation", type: :password)
+ end
+
+ it "has a submit button" do
+ expect(rendered).to have_button("Change Password")
+ end
+
+ context "when user has password errors" do
+ before do
+ user.errors.add(:password, "is too short (minimum is 5 characters)")
+ user.errors.add(:current_password, "is invalid")
+ render
+ end
+
+ it "displays error messages" do
+ expect(rendered).to have_content("There was a problem with your password")
+ expect(rendered).to have_content("Password is too short")
+ expect(rendered).to have_content("Current password is invalid")
+ end
+
+ it "displays error alert with proper styling" do
+ expect(rendered).to have_css('div[role="alert"]#password-errors')
+ end
+ end
+end
From 5f53a098116b4e6db4256843d86135d076fbc022 Mon Sep 17 00:00:00 2001
From: maebeale
Date: Mon, 16 Feb 2026 18:46:16 -0500
Subject: [PATCH 4/7] Use fontawesome
---
app/views/devise/shared/_error_messages.html.erb | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/app/views/devise/shared/_error_messages.html.erb b/app/views/devise/shared/_error_messages.html.erb
index 2238216f6..1f99f86c8 100644
--- a/app/views/devise/shared/_error_messages.html.erb
+++ b/app/views/devise/shared/_error_messages.html.erb
@@ -2,9 +2,7 @@
From c73097c5209e2a027300c7ff7bee5950b0c36722 Mon Sep 17 00:00:00 2001
From: maebeale
Date: Mon, 16 Feb 2026 18:47:18 -0500
Subject: [PATCH 5/7] Use fontawesome
---
app/views/users/_password_errors.html.erb | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/app/views/users/_password_errors.html.erb b/app/views/users/_password_errors.html.erb
index fbac157f9..45130734c 100644
--- a/app/views/users/_password_errors.html.erb
+++ b/app/views/users/_password_errors.html.erb
@@ -3,9 +3,7 @@
There was a problem with your password:
From c9e9ac319997704dc398dd361add4d94cc76efde Mon Sep 17 00:00:00 2001
From: maebeale
Date: Mon, 16 Feb 2026 19:38:26 -0500
Subject: [PATCH 6/7] Merge conflicts
---
app/views/devise/passwords/edit.html.erb | 2 +-
.../devise/passwords/edit.html.erb_spec.rb | 19 -------------------
2 files changed, 1 insertion(+), 20 deletions(-)
diff --git a/app/views/devise/passwords/edit.html.erb b/app/views/devise/passwords/edit.html.erb
index f447bacce..b31ff01e8 100644
--- a/app/views/devise/passwords/edit.html.erb
+++ b/app/views/devise/passwords/edit.html.erb
@@ -20,7 +20,7 @@
required: true,
minlength: 5,
autofocus: true,
- autocomplete: "current-password",
+ autocomplete: "new-password",
autocorrect: "off",
autocapitalize: "off",
spellcheck: "false",
diff --git a/spec/views/devise/passwords/edit.html.erb_spec.rb b/spec/views/devise/passwords/edit.html.erb_spec.rb
index a6f5b1f67..1c5fb0b67 100644
--- a/spec/views/devise/passwords/edit.html.erb_spec.rb
+++ b/spec/views/devise/passwords/edit.html.erb_spec.rb
@@ -7,7 +7,6 @@
user.reset_password_token = Devise.friendly_token
assign(:resource, user)
assign(:resource_name, :user)
-<<<<<<< HEAD
u = user
mapping = Devise.mappings[:user]
view.define_singleton_method(:resource) { u }
@@ -16,12 +15,6 @@
render
end
-=======
- allow(view).to receive(:resource).and_return(user)
- allow(view).to receive(:resource_name).and_return(:user)
- render
- end
-
it "displays password requirements hint" do
expect(rendered).to have_content("Password must be at least 5 characters long")
end
@@ -30,7 +23,6 @@
expect(rendered).to have_css('input[type="password"][minlength="5"]')
end
->>>>>>> 8d996c5fb (Add view specs for password forms)
it "displays new password field" do
expect(rendered).to have_field("New password", type: :password)
end
@@ -43,7 +35,6 @@
expect(rendered).to have_button("Set password")
end
-<<<<<<< HEAD
it "displays password requirements hint" do
expect(rendered).to have_content("Password must be at least 5 characters long")
end
@@ -52,8 +43,6 @@
expect(rendered).to have_css('input[type="password"][minlength="5"]')
end
-=======
->>>>>>> 8d996c5fb (Add view specs for password forms)
context "when user has password errors" do
before do
user.errors.add(:password, "is too short (minimum is 5 characters)")
@@ -61,7 +50,6 @@
render
end
-<<<<<<< HEAD
it "displays error explanation container" do
expect(rendered).to have_css('div#error_explanation')
end
@@ -71,16 +59,9 @@
expect(rendered).to have_content("Password is too short")
expect(rendered).to have_content("Password confirmation doesn't match")
end
-=======
- it "displays error messages" do
- expect(rendered).to have_content("prevented this from being saved")
- expect(rendered).to have_content("Password is too short")
- expect(rendered).to have_content("Password confirmation doesn't match")
- end
it "displays error explanation with proper styling" do
expect(rendered).to have_css('div[role="alert"]#error_explanation')
end
->>>>>>> 8d996c5fb (Add view specs for password forms)
end
end
From b65501247b0d3b8982b5daf43fd7e0a8fcdf7492 Mon Sep 17 00:00:00 2001
From: maebeale
Date: Mon, 16 Feb 2026 19:43:57 -0500
Subject: [PATCH 7/7] Update password tests
---
app/views/users/change_password.html.erb | 1 +
spec/views/devise/passwords/edit.html.erb_spec.rb | 14 +-------------
2 files changed, 2 insertions(+), 13 deletions(-)
diff --git a/app/views/users/change_password.html.erb b/app/views/users/change_password.html.erb
index 994078565..c7a5f93de 100644
--- a/app/views/users/change_password.html.erb
+++ b/app/views/users/change_password.html.erb
@@ -54,6 +54,7 @@
+
Password must be at least 5 characters long
diff --git a/spec/views/devise/passwords/edit.html.erb_spec.rb b/spec/views/devise/passwords/edit.html.erb_spec.rb
index 1c5fb0b67..ca76d7f76 100644
--- a/spec/views/devise/passwords/edit.html.erb_spec.rb
+++ b/spec/views/devise/passwords/edit.html.erb_spec.rb
@@ -15,14 +15,6 @@
render
end
- it "displays password requirements hint" do
- expect(rendered).to have_content("Password must be at least 5 characters long")
- end
-
- it "has minlength attribute on password field" do
- expect(rendered).to have_css('input[type="password"][minlength="5"]')
- end
-
it "displays new password field" do
expect(rendered).to have_field("New password", type: :password)
end
@@ -55,13 +47,9 @@
end
it "displays error messages" do
- expect(rendered).to have_content("prevented this user from being saved")
+ expect(rendered).to have_content("prevented this from being saved")
expect(rendered).to have_content("Password is too short")
expect(rendered).to have_content("Password confirmation doesn't match")
end
-
- it "displays error explanation with proper styling" do
- expect(rendered).to have_css('div[role="alert"]#error_explanation')
- end
end
end