From 803d22a2f6b0f77716b8e5eddc39615dbe90bcdc Mon Sep 17 00:00:00 2001 From: Josh Pigford Date: Mon, 26 May 2025 19:13:42 -0500 Subject: [PATCH] Fix changelog page crash when GitHub release notes are unavailable --- app/controllers/pages_controller.rb | 11 ++++++++ app/views/pages/changelog.html.erb | 6 ++--- test/controllers/pages_controller_test.rb | 31 +++++++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 32bca350..b921f89c 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -29,6 +29,17 @@ class PagesController < ApplicationController def changelog @release_notes = github_provider.fetch_latest_release_notes + # Fallback if no release notes are available + if @release_notes.nil? + @release_notes = { + avatar: "https://github.com/maybe-finance.png", + username: "maybe-finance", + name: "Release notes unavailable", + published_at: Date.current, + body: "

Unable to fetch the latest release notes at this time. Please check back later or visit our GitHub releases page directly.

" + } + end + render layout: "settings" end diff --git a/app/views/pages/changelog.html.erb b/app/views/pages/changelog.html.erb index e7192321..5a5345f2 100644 --- a/app/views/pages/changelog.html.erb +++ b/app/views/pages/changelog.html.erb @@ -5,17 +5,17 @@
- <%= image_tag @release_notes[:avatar], class: "rounded-full w-full h-full object-cover" %> + <%= image_tag @release_notes[:avatar], class: "rounded-full w-full h-full object-cover" if @release_notes[:avatar].present? %>
<%= "@#{@release_notes[:username]}" %> -
<%= @release_notes[:published_at].strftime("%B %d, %Y") %>
+
<%= @release_notes[:published_at]&.strftime("%B %d, %Y") %>

<%= @release_notes[:name] %>

- <%= @release_notes[:body].html_safe %> + <%= @release_notes[:body]&.html_safe %>
diff --git a/test/controllers/pages_controller_test.rb b/test/controllers/pages_controller_test.rb index 47fdc936..49ee225b 100644 --- a/test/controllers/pages_controller_test.rb +++ b/test/controllers/pages_controller_test.rb @@ -16,4 +16,35 @@ class PagesControllerTest < ActionDispatch::IntegrationTest assert_response :ok end end + + test "changelog with nil release notes" do + # Mock the GitHub provider to return nil (simulating API failure or no releases) + github_provider = mock + github_provider.expects(:fetch_latest_release_notes).returns(nil) + Provider::Registry.stubs(:get_provider).with(:github).returns(github_provider) + + get changelog_path + assert_response :ok + assert_select "h2", text: "Release notes unavailable" + assert_select "a[href='https://github.com/maybe-finance/maybe/releases']" + end + + test "changelog with incomplete release notes" do + # Mock the GitHub provider to return incomplete data (missing some fields) + github_provider = mock + incomplete_data = { + avatar: nil, + username: "maybe-finance", + name: "Test Release", + published_at: nil, + body: nil + } + github_provider.expects(:fetch_latest_release_notes).returns(incomplete_data) + Provider::Registry.stubs(:get_provider).with(:github).returns(github_provider) + + get changelog_path + assert_response :ok + assert_select "h2", text: "Test Release" + # Should not crash even with nil values + end end