@@ -147,5 +147,59 @@ func TestRepoMergeUpstream(t *testing.T) {
147147 return queryMergeUpstreamButtonLink (htmlDoc ) == ""
148148 }, 5 * time .Second , 100 * time .Millisecond )
149149 })
150+
151+ t .Run ("FastForwardOnly" , func (t * testing.T ) {
152+ // Create a clean branch for fast-forward testing
153+ req = NewRequestWithValues (t , "POST" , fmt .Sprintf ("/%s/test-repo-fork/branches/_new/branch/master" , forkUser .Name ), map [string ]string {
154+ "_csrf" : GetUserCSRFToken (t , session ),
155+ "new_branch_name" : "ff-test-branch" ,
156+ })
157+ session .MakeRequest (t , req , http .StatusSeeOther )
158+
159+ // Add content to base repository that can be fast-forwarded
160+ require .NoError (t , createOrReplaceFileInBranch (baseUser , baseRepo , "ff-test.txt" , "master" , "ff-content-1" ))
161+
162+ // ff_only=true with fast-forward possible (should succeed)
163+ req = NewRequestWithJSON (t , "POST" , fmt .Sprintf ("/api/v1/repos/%s/test-repo-fork/merge-upstream" , forkUser .Name ), & api.MergeUpstreamRequest {
164+ Branch : "ff-test-branch" ,
165+ FfOnly : true ,
166+ }).AddTokenAuth (token )
167+ resp := MakeRequest (t , req , http .StatusOK )
168+
169+ var mergeResp api.MergeUpstreamResponse
170+ DecodeJSON (t , resp , & mergeResp )
171+ assert .Equal (t , "fast-forward" , mergeResp .MergeStyle )
172+
173+ // Test ff_only=true when fast-forward is not possible (using fork-branch which has diverged)
174+ // The fork-branch already has merge commits from previous tests, so this should fail
175+ require .NoError (t , createOrReplaceFileInBranch (baseUser , baseRepo , "another-file.txt" , "master" , "more-content" ))
176+
177+ req = NewRequestWithJSON (t , "POST" , fmt .Sprintf ("/api/v1/repos/%s/test-repo-fork/merge-upstream" , forkUser .Name ), & api.MergeUpstreamRequest {
178+ Branch : "fork-branch" ,
179+ FfOnly : true ,
180+ }).AddTokenAuth (token )
181+ MakeRequest (t , req , http .StatusBadRequest )
182+
183+ // same scenario but with ff_only=false (should succeed with merge)
184+ req = NewRequestWithJSON (t , "POST" , fmt .Sprintf ("/api/v1/repos/%s/test-repo-fork/merge-upstream" , forkUser .Name ), & api.MergeUpstreamRequest {
185+ Branch : "fork-branch" ,
186+ FfOnly : false ,
187+ }).AddTokenAuth (token )
188+ resp = MakeRequest (t , req , http .StatusOK )
189+
190+ DecodeJSON (t , resp , & mergeResp )
191+ assert .Equal (t , "merge" , mergeResp .MergeStyle )
192+
193+ // ff_only not specified (should use default behavior - merge)
194+ require .NoError (t , createOrReplaceFileInBranch (baseUser , baseRepo , "final-file.txt" , "master" , "final-content" ))
195+
196+ req = NewRequestWithJSON (t , "POST" , fmt .Sprintf ("/api/v1/repos/%s/test-repo-fork/merge-upstream" , forkUser .Name ), & api.MergeUpstreamRequest {
197+ Branch : "fork-branch" ,
198+ }).AddTokenAuth (token )
199+ resp = MakeRequest (t , req , http .StatusOK )
200+
201+ DecodeJSON (t , resp , & mergeResp )
202+ assert .Equal (t , "merge" , mergeResp .MergeStyle )
203+ })
150204 })
151205}
0 commit comments