91 lines
3.9 KiB
Go
91 lines
3.9 KiB
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
)
|
|
|
|
func TestHandleRepoForkSuccess(t *testing.T) {
|
|
requireGitForApp(t)
|
|
s, mock, cleanup := newMockServer(t)
|
|
defer cleanup()
|
|
owner := User{ID: 1, Email: "alice@example.com", Username: "alice"}
|
|
src := Repository{ID: 10, OwnerUserID: owner.ID, Owner: "alice", Name: "demo", Visibility: "public", Description: "desc", DefaultBranch: "main"}
|
|
bare := s.repoPath(src.Owner, src.Name)
|
|
if err := os.MkdirAll(filepath.Dir(bare), 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
seedRepoWithFeatureBranch(t, bare)
|
|
expectBearerUser(mock, "tok", owner)
|
|
expectLoadRepo(mock, "alice", "demo", src)
|
|
mock.ExpectExec("INSERT INTO repositories").WithArgs(owner.ID, "fork", src.Visibility, src.Description, src.DefaultBranch, src.ID).WillReturnResult(sqlmock.NewResult(30, 1))
|
|
rr := httptest.NewRecorder()
|
|
req := httptest.NewRequest(http.MethodPost, "/api/repos/alice/demo/fork", strings.NewReader(`{"name":"fork"}`))
|
|
req.Header.Set("Authorization", "Bearer tok")
|
|
s.handleRepoFork(rr, req, "alice", "demo")
|
|
if rr.Code != http.StatusCreated {
|
|
t.Fatalf("fork status=%d body=%s", rr.Code, rr.Body.String())
|
|
}
|
|
var repo Repository
|
|
if err := json.Unmarshal(rr.Body.Bytes(), &repo); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if repo.ID != 30 || repo.Name != "fork" || repo.ForkedFromID == nil || *repo.ForkedFromID != src.ID {
|
|
t.Fatalf("unexpected fork repo: %#v", repo)
|
|
}
|
|
if _, err := os.Stat(s.repoPath("alice", "fork")); err != nil {
|
|
t.Fatalf("expected fork repo on disk: %v", err)
|
|
}
|
|
if err := mock.ExpectationsWereMet(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestHandlePRCreateSuccessAndValidation(t *testing.T) {
|
|
requireGitForApp(t)
|
|
s, mock, cleanup := newMockServer(t)
|
|
defer cleanup()
|
|
owner := User{ID: 1, Email: "alice@example.com", Username: "alice"}
|
|
repo := Repository{ID: 10, OwnerUserID: owner.ID, Owner: "alice", Name: "demo", Visibility: "public", DefaultBranch: "main"}
|
|
bare := s.repoPath(repo.Owner, repo.Name)
|
|
if err := os.MkdirAll(filepath.Dir(bare), 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
seedRepoWithFeatureBranch(t, bare)
|
|
pr := PullRequest{ID: 50, Number: 1, TargetRepositoryID: repo.ID, SourceRepositoryID: repo.ID, AuthorUserID: owner.ID, Author: "alice", SourceOwner: "alice", SourceRepo: "demo", SourceBranch: "feature", TargetOwner: "alice", TargetRepo: "demo", TargetBranch: "main", Title: "Fix", Status: "open"}
|
|
|
|
expectBearerUser(mock, "tok", owner)
|
|
expectLoadRepo(mock, "alice", "demo", repo)
|
|
expectLoadRepo(mock, "alice", "demo", repo)
|
|
mock.ExpectQuery("SELECT COALESCE").WithArgs(repo.ID).WillReturnRows(sqlmock.NewRows([]string{"number"}).AddRow(1))
|
|
mock.ExpectExec("INSERT INTO pull_requests").WithArgs(repo.ID, 1, owner.ID, repo.ID, "feature", "main", "Fix", "desc").WillReturnResult(sqlmock.NewResult(50, 1))
|
|
mock.ExpectQuery("FROM pull_requests pr").WithArgs(repo.ID, 1).WillReturnRows(prRows(pr))
|
|
rr := httptest.NewRecorder()
|
|
req := httptest.NewRequest(http.MethodPost, "/api/repos/alice/demo/pulls", strings.NewReader(`{"source_branch":"feature","target_branch":"main","title":"Fix","description":"desc"}`))
|
|
req.Header.Set("Authorization", "Bearer tok")
|
|
s.handlePRCreate(rr, req, "alice", "demo")
|
|
if rr.Code != http.StatusCreated || !strings.Contains(rr.Body.String(), "Fix") {
|
|
t.Fatalf("PR create status=%d body=%s", rr.Code, rr.Body.String())
|
|
}
|
|
|
|
expectBearerUser(mock, "tok", owner)
|
|
expectLoadRepo(mock, "alice", "demo", repo)
|
|
rr = httptest.NewRecorder()
|
|
req = httptest.NewRequest(http.MethodPost, "/api/repos/alice/demo/pulls", strings.NewReader(`{"source_branch":"bad branch","target_branch":"main","title":"Fix"}`))
|
|
req.Header.Set("Authorization", "Bearer tok")
|
|
s.handlePRCreate(rr, req, "alice", "demo")
|
|
if rr.Code != http.StatusBadRequest {
|
|
t.Fatalf("bad PR status=%d body=%s", rr.Code, rr.Body.String())
|
|
}
|
|
if err := mock.ExpectationsWereMet(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|