Skip to content
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

Add repository type option to /api/repo/search #2326

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
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
108 changes: 107 additions & 1 deletion integrations/api_repo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package integrations

import (
"fmt"
"net/http"
"testing"

Expand Down Expand Up @@ -32,7 +33,7 @@ func TestAPIUserReposNotLogin(t *testing.T) {
}
}

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

Expand All @@ -46,6 +47,111 @@ func TestAPISearchRepoNotLogin(t *testing.T) {
assert.Contains(t, repo.Name, keyword)
assert.False(t, repo.Private)
}

user := models.AssertExistsAndLoadBean(t, &models.User{ID: 15}).(*models.User)
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 16}).(*models.User)
orgUser := models.AssertExistsAndLoadBean(t, &models.User{ID: 17}).(*models.User)

type privacyType int

const (
_ privacyType = iota
privacyTypePrivate
privacyTypePublic
)

// Map of expected results, where key is user for login
type expectedResults map[*models.User]struct {
count int
repoOwnerID int64
repoName string
privacy privacyType
}

testCases := []struct {
name, requestURL string
expectedResults
}{
{name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50", expectedResults: expectedResults{
nil: {count: 15, privacy: privacyTypePublic},
user: {count: 15, privacy: privacyTypePublic},
user2: {count: 15, privacy: privacyTypePublic}},
},
{name: "RepositoriesMax10", requestURL: "/api/v1/repos/search?limit=10", expectedResults: expectedResults{
nil: {count: 10, privacy: privacyTypePublic},
user: {count: 10, privacy: privacyTypePublic},
user2: {count: 10, privacy: privacyTypePublic}},
},
{name: "RepositoriesDefaultMax10", requestURL: "/api/v1/repos/search", expectedResults: expectedResults{
nil: {count: 10, privacy: privacyTypePublic},
user: {count: 10, privacy: privacyTypePublic},
user2: {count: 10, privacy: privacyTypePublic}},
},
{name: "RepositoriesByName", requestURL: fmt.Sprintf("/api/v1/repos/search?q=%s", "big_test_"), expectedResults: expectedResults{
nil: {count: 7, repoName: "big_test_", privacy: privacyTypePublic},
user: {count: 7, repoName: "big_test_", privacy: privacyTypePublic},
user2: {count: 7, repoName: "big_test_", privacy: privacyTypePublic}},
},
{name: "RepositoriesAccessibleAndRelatedToUser", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d&limit=50", user.ID), expectedResults: expectedResults{
nil: {count: 7, privacy: privacyTypePublic},
user: {count: 14},
user2: {count: 7, privacy: privacyTypePublic}},
},
{name: "RepositoriesAccessibleAndRelatedToUser2", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d", user2.ID), expectedResults: expectedResults{
nil: {count: 1, privacy: privacyTypePublic},
user: {count: 1, privacy: privacyTypePublic},
user2: {count: 2}},
},
{name: "RepositoriesOwnedByOrganization", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d", orgUser.ID), expectedResults: expectedResults{
nil: {count: 2, repoOwnerID: orgUser.ID, privacy: privacyTypePublic},
user: {count: 4, repoOwnerID: orgUser.ID},
user2: {count: 2, repoOwnerID: orgUser.ID, privacy: privacyTypePublic}},
},
}

for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
for userToLogin, expected := range testCase.expectedResults {
var session *TestSession
var testName string
if userToLogin != nil && userToLogin.ID > 0 {
testName = fmt.Sprintf("LoggedUser%d", userToLogin.ID)
session = loginUser(t, userToLogin.Name)
} else {
testName = "AnonymousUser"
session = emptyTestSession(t)
}

t.Run(testName, func(t *testing.T) {
request := NewRequest(t, "GET", testCase.requestURL)
response := session.MakeRequest(t, request, http.StatusOK)

var body api.SearchResults
DecodeJSON(t, response, &body)

assert.Len(t, body.Data, expected.count)
for _, repo := range body.Data {
assert.NotEmpty(t, repo.Name)

if len(expected.repoName) > 0 {
assert.Contains(t, repo.Name, expected.repoName)
}

if expected.repoOwnerID > 0 {
assert.Equal(t, expected.repoOwnerID, repo.Owner.ID)
}

switch expected.privacy {
case privacyTypePrivate:
assert.True(t, repo.Private)
case privacyTypePublic:
assert.False(t, repo.Private)
}
}
})
}
})
}
}

func TestAPIViewRepo(t *testing.T) {
Expand Down
35 changes: 35 additions & 0 deletions models/fixtures/access.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,38 @@
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
-
id: 8
user_id: 15
repo_id: 27
mode: 4 # owner

-
id: 9
user_id: 15
repo_id: 28
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
191 changes: 191 additions & 0 deletions models/fixtures/repository.yml
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,194 @@
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
is_fork: 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
is_fork: 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
is_fork: 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
is_fork: 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
is_fork: 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
is_fork: 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
is_fork: 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
is_fork: false

-
id: 25
owner_id: 15
lower_name: big_test_public_mirror_5
name: big_test_public_mirror_5
is_private: false
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
num_watches: 0
is_mirror: true
is_fork: false

-
id: 26
owner_id: 15
lower_name: big_test_private_mirror_5
name: big_test_private_mirror_5
is_private: true
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
num_watches: 0
is_mirror: true
is_fork: false

-
id: 27
owner_id: 17
lower_name: big_test_public_mirror_6
name: big_test_public_mirror_6
is_private: false
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
num_watches: 0
is_mirror: true
num_forks: 1
is_fork: false

-
id: 28
owner_id: 17
lower_name: big_test_private_mirror_6
name: big_test_private_mirror_6
is_private: true
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
num_watches: 0
is_mirror: true
num_forks: 1
is_fork: false

-
id: 29
fork_id: 27
owner_id: 15
lower_name: big_test_public_fork_7
name: big_test_public_fork_7
is_private: false
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
is_mirror: false
is_fork: true

-
id: 30
fork_id: 28
owner_id: 15
lower_name: big_test_private_fork_7
name: big_test_private_fork_7
is_private: true
num_issues: 0
num_closed_issues: 0
num_pulls: 0
num_closed_pulls: 0
is_mirror: false
is_fork: true
9 changes: 9 additions & 0 deletions models/fixtures/team.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,12 @@
num_repos: 0
num_members: 1
unit_types: '[1,2,3,4,5,6,7]'
-
id: 5
org_id: 17
lower_name: owners
name: Owners
authorize: 4 # owner
num_repos: 4
num_members: 1
unit_types: '[1,2,3,4,5,6,7]'
Loading