@@ -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