From dcd3014567f2b8be3fca01c20c2b3eabdc8f519e Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Mon, 27 Jan 2025 07:58:46 -0800
Subject: [PATCH] Add pubdate for repository rss and add some tests (#33411)

Fix #33291
---
 routers/web/feed/branch.go                    |  1 +
 routers/web/feed/file.go                      |  1 +
 tests/integration/feed_repo_test.go           | 35 +++++++++++++++++++
 ...pi_feed_user_test.go => feed_user_test.go} | 25 ++++++++++++-
 4 files changed, 61 insertions(+), 1 deletion(-)
 create mode 100644 tests/integration/feed_repo_test.go
 rename tests/integration/{api_feed_user_test.go => feed_user_test.go} (53%)

diff --git a/routers/web/feed/branch.go b/routers/web/feed/branch.go
index 6c4cc11ca0..d3dae9503e 100644
--- a/routers/web/feed/branch.go
+++ b/routers/web/feed/branch.go
@@ -43,6 +43,7 @@ func ShowBranchFeed(ctx *context.Context, repo *repo.Repository, formatType stri
 			},
 			Description: commit.Message(),
 			Content:     commit.Message(),
+			Created:     commit.Committer.When,
 		})
 	}
 
diff --git a/routers/web/feed/file.go b/routers/web/feed/file.go
index 518d995ccb..407e4fa2d5 100644
--- a/routers/web/feed/file.go
+++ b/routers/web/feed/file.go
@@ -55,6 +55,7 @@ func ShowFileFeed(ctx *context.Context, repo *repo.Repository, formatType string
 			},
 			Description: commit.Message(),
 			Content:     commit.Message(),
+			Created:     commit.Committer.When,
 		})
 	}
 
diff --git a/tests/integration/feed_repo_test.go b/tests/integration/feed_repo_test.go
new file mode 100644
index 0000000000..132ed32ced
--- /dev/null
+++ b/tests/integration/feed_repo_test.go
@@ -0,0 +1,35 @@
+// Copyright 2025 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package integration
+
+import (
+	"encoding/xml"
+	"net/http"
+	"testing"
+
+	"code.gitea.io/gitea/tests"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestFeedRepo(t *testing.T) {
+	t.Run("RSS", func(t *testing.T) {
+		defer tests.PrepareTestEnv(t)()
+
+		req := NewRequest(t, "GET", "/user2/repo1.rss")
+		resp := MakeRequest(t, req, http.StatusOK)
+
+		data := resp.Body.String()
+		assert.Contains(t, data, `<rss version="2.0"`)
+
+		var rss RSS
+		err := xml.Unmarshal(resp.Body.Bytes(), &rss)
+		assert.NoError(t, err)
+		assert.Contains(t, rss.Channel.Link, "/user2/repo1")
+		assert.NotEmpty(t, rss.Channel.PubDate)
+		assert.Len(t, rss.Channel.Items, 1)
+		assert.EqualValues(t, "issue5", rss.Channel.Items[0].Description)
+		assert.NotEmpty(t, rss.Channel.Items[0].PubDate)
+	})
+}
diff --git a/tests/integration/api_feed_user_test.go b/tests/integration/feed_user_test.go
similarity index 53%
rename from tests/integration/api_feed_user_test.go
rename to tests/integration/feed_user_test.go
index c44f9a1951..4315c67f48 100644
--- a/tests/integration/api_feed_user_test.go
+++ b/tests/integration/feed_user_test.go
@@ -4,6 +4,7 @@
 package integration
 
 import (
+	"encoding/xml"
 	"net/http"
 	"testing"
 
@@ -12,7 +13,23 @@ import (
 	"github.com/stretchr/testify/assert"
 )
 
-func TestFeed(t *testing.T) {
+// RSS is a struct to unmarshal RSS feeds test only
+type RSS struct {
+	Channel struct {
+		Title       string `xml:"title"`
+		Link        string `xml:"link"`
+		Description string `xml:"description"`
+		PubDate     string `xml:"pubDate"`
+		Items       []struct {
+			Title       string `xml:"title"`
+			Link        string `xml:"link"`
+			Description string `xml:"description"`
+			PubDate     string `xml:"pubDate"`
+		} `xml:"item"`
+	} `xml:"channel"`
+}
+
+func TestFeedUser(t *testing.T) {
 	t.Run("User", func(t *testing.T) {
 		t.Run("Atom", func(t *testing.T) {
 			defer tests.PrepareTestEnv(t)()
@@ -32,6 +49,12 @@ func TestFeed(t *testing.T) {
 
 			data := resp.Body.String()
 			assert.Contains(t, data, `<rss version="2.0"`)
+
+			var rss RSS
+			err := xml.Unmarshal(resp.Body.Bytes(), &rss)
+			assert.NoError(t, err)
+			assert.Contains(t, rss.Channel.Link, "/user2")
+			assert.NotEmpty(t, rss.Channel.PubDate)
 		})
 	})
 }