Skip to content

Add more repo search tests and /api/repo/search integration tests #2453

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
228 changes: 219 additions & 9 deletions integrations/api_repo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package integrations

import (
"net/http"
"strings"
"testing"

"code.gitea.io/gitea/models"
Expand All @@ -33,22 +32,233 @@ func TestAPIUserReposNotLogin(t *testing.T) {
}
}

type searchResponseBody struct {
ok bool
data []api.Repository
}

func TestAPISearchRepoNotLogin(t *testing.T) {
prepareTestEnv(t)
const keyword = "test"

req := NewRequestf(t, "GET", "/api/v1/repos/search?q=%s", keyword)
resp := MakeRequest(t, req, http.StatusOK)

var body searchResponseBody
var body api.SearchResults
DecodeJSON(t, resp, &body)
assert.NotEmpty(t, body.Data)
for _, repo := range body.Data {
assert.Contains(t, repo.Name, keyword)
assert.False(t, repo.Private)
}

// Should return all (max 50) public repositories
req = NewRequest(t, "GET", "/api/v1/repos/search?limit=50")
resp = MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 12)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}

// Should return (max 10) public repositories
req = NewRequest(t, "GET", "/api/v1/repos/search?limit=10")
resp = MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
for _, repo := range body.data {
assert.True(t, strings.Contains(repo.Name, keyword))
assert.Len(t, body.Data, 10)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}

const keyword2 = "big_test_"
// Should return all public repositories which (partial) match keyword
req = NewRequestf(t, "GET", "/api/v1/repos/search?q=%s", keyword2)
resp = MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 4)
for _, repo := range body.Data {
assert.Contains(t, repo.Name, keyword2)
assert.False(t, repo.Private)
}

// Should return all public repositories accessible and related to user
const userID = int64(15)
req = NewRequestf(t, "GET", "/api/v1/repos/search?uid=%d", userID)
resp = MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 4)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}

// Should return all public repositories accessible and related to user
const user2ID = int64(16)
req = NewRequestf(t, "GET", "/api/v1/repos/search?uid=%d", user2ID)
resp = MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 1)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}

// Should return all public repositories owned by organization
const orgID = int64(17)
req = NewRequestf(t, "GET", "/api/v1/repos/search?uid=%d", orgID)
resp = MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 1)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.Equal(t, repo.Owner.ID, orgID)
assert.False(t, repo.Private)
}
}

func TestAPISearchRepoLoggedUser(t *testing.T) {
prepareTestEnv(t)

user := models.AssertExistsAndLoadBean(t, &models.User{ID: 15}).(*models.User)
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 16}).(*models.User)
session := loginUser(t, user.Name)
session2 := loginUser(t, user2.Name)

var body api.SearchResults

// Get public repositories accessible and not related to logged in user that match the keyword
// Should return all public repositories which (partial) match keyword
const keyword = "big_test_"
req := NewRequestf(t, "GET", "/api/v1/repos/search?q=%s", keyword)
resp := session.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 4)
for _, repo := range body.Data {
assert.Contains(t, repo.Name, keyword)
assert.False(t, repo.Private)
}
// Test when user2 is logged in
resp = session2.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 4)
for _, repo := range body.Data {
assert.Contains(t, repo.Name, keyword)
assert.False(t, repo.Private)
}

// Get all public repositories accessible and not related to logged in user
// Should return all (max 50) public repositories
req = NewRequest(t, "GET", "/api/v1/repos/search?limit=50")
resp = session.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 12)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}
// Test when user2 is logged in
resp = session2.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 12)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}

// Get all public repositories accessible and not related to logged in user
// Should return all (max 10) public repositories
req = NewRequest(t, "GET", "/api/v1/repos/search?limit=10")
resp = session.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 10)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}
// Test when user2 is logged in
resp = session2.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 10)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}

// Get repositories of logged in user
// Should return all public and private repositories accessible and related to user
req = NewRequestf(t, "GET", "/api/v1/repos/search?uid=%d", user.ID)
resp = session.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 8)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
}
// Test when user2 is logged in
req = NewRequestf(t, "GET", "/api/v1/repos/search?uid=%d", user2.ID)
resp = session2.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 2)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
}

// Get repositories of another user
// Should return all public repositories accessible and related to user
req = NewRequestf(t, "GET", "/api/v1/repos/search?uid=%d", user2.ID)
resp = session.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 1)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}
// Test when user2 is logged in
req = NewRequestf(t, "GET", "/api/v1/repos/search?uid=%d", user.ID)
resp = session2.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 4)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.False(t, repo.Private)
}

// Get repositories of organization owned by logged in user
// Should return all public and private repositories owned by organization
const orgID = int64(17)
req = NewRequestf(t, "GET", "/api/v1/repos/search?uid=%d", orgID)
resp = session.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 2)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.Equal(t, repo.Owner.ID, orgID)
}

// Get repositories of organization owned by another user
// Should return all public repositories owned by organization
req = NewRequestf(t, "GET", "/api/v1/repos/search?uid=%d", orgID)
resp = session2.MakeRequest(t, req, http.StatusOK)

DecodeJSON(t, resp, &body)
assert.Len(t, body.Data, 1)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)
assert.Equal(t, repo.Owner.ID, orgID)
assert.False(t, repo.Private)
}
}

Expand Down
24 changes: 24 additions & 0 deletions models/fixtures/access.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,27 @@
user_id: 4
repo_id: 3
mode: 2 # write

-
id: 4
user_id: 15
repo_id: 22
mode: 2 # write

-
id: 5
user_id: 15
repo_id: 21
mode: 2 # write

-
id: 6
user_id: 15
repo_id: 23
mode: 4 # owner

-
id: 7
user_id: 15
repo_id: 24
mode: 4 # owner
8 changes: 8 additions & 0 deletions models/fixtures/org_user.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,11 @@
is_public: false
is_owner: true
num_teams: 1

-
id: 5
uid: 15
org_id: 17
is_public: true
is_owner: true
num_teams: 1
97 changes: 97 additions & 0 deletions models/fixtures/repository.yml
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,100 @@
num_pulls: 0
num_closed_pulls: 0
num_watches: 0

-
id: 17
owner_id: 15
lower_name: big_test_public_1
name: big_test_public_1
is_private: false
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
num_watches: 0
is_mirror: false

-
id: 18
owner_id: 15
lower_name: big_test_public_2
name: big_test_public_2
is_private: false
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
is_mirror: false

-
id: 19
owner_id: 15
lower_name: big_test_private_1
name: big_test_private_1
is_private: true
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
is_mirror: false

-
id: 20
owner_id: 15
lower_name: big_test_private_2
name: big_test_private_2
is_private: true
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
is_mirror: false

-
id: 21
owner_id: 16
lower_name: big_test_public_3
name: big_test_public_3
is_private: false
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
is_mirror: false

-
id: 22
owner_id: 16
lower_name: big_test_private_3
name: big_test_private_3
is_private: true
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
is_mirror: false

-
id: 23
owner_id: 17
lower_name: big_test_public_4
name: big_test_public_4
is_private: false
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
is_mirror: false

-
id: 24
owner_id: 17
lower_name: big_test_private_4
name: big_test_private_4
is_private: true
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
is_mirror: false
Loading