aboutsummaryrefslogtreecommitdiffstats
path: root/models/org_test.go
diff options
context:
space:
mode:
authorEthan Koenig <ethantkoenig@gmail.com>2017-01-24 11:16:36 -0500
committerEthan Koenig <ethantkoenig@gmail.com>2017-01-27 12:24:06 -0500
commita2412492da2def90457a2a20fd043bea21ef415f (patch)
tree842907cb6d69db617e5c048d23a864c8bbd6b22a /models/org_test.go
parentbb5a6b7a07125b29604f479f45e59073cb3d4648 (diff)
downloadgitea-a2412492da2def90457a2a20fd043bea21ef415f.tar.gz
gitea-a2412492da2def90457a2a20fd043bea21ef415f.zip
Unit tests and bug fix for models/org
Diffstat (limited to 'models/org_test.go')
-rw-r--r--models/org_test.go520
1 files changed, 520 insertions, 0 deletions
diff --git a/models/org_test.go b/models/org_test.go
new file mode 100644
index 0000000000..bf505b0abb
--- /dev/null
+++ b/models/org_test.go
@@ -0,0 +1,520 @@
+// Copyright 2017 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package models
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestUser_IsOwnedBy(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ assert.True(t, org.IsOwnedBy(2))
+ assert.False(t, org.IsOwnedBy(1))
+ assert.False(t, org.IsOwnedBy(3))
+ assert.False(t, org.IsOwnedBy(4))
+
+ nonOrg := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+ assert.False(t, nonOrg.IsOwnedBy(2))
+ assert.False(t, nonOrg.IsOwnedBy(3))
+}
+
+func TestUser_IsOrgMember(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ assert.True(t, org.IsOrgMember(2))
+ assert.True(t, org.IsOrgMember(4))
+ assert.False(t, org.IsOrgMember(1))
+ assert.False(t, org.IsOrgMember(3))
+
+ nonOrg := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+ assert.False(t, nonOrg.IsOrgMember(2))
+ assert.False(t, nonOrg.IsOrgMember(3))
+}
+
+func TestUser_GetTeam(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ team, err := org.GetTeam("team1")
+ assert.NoError(t, err)
+ assert.Equal(t, org.ID, team.OrgID)
+ assert.Equal(t, "team1", team.LowerName)
+
+ _, err = org.GetTeam("does not exist")
+ assert.Equal(t, ErrTeamNotExist, err)
+
+ nonOrg := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+ _, err = nonOrg.GetTeam("team")
+ assert.Equal(t, ErrTeamNotExist, err)
+}
+
+func TestUser_GetOwnerTeam(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ team, err := org.GetOwnerTeam()
+ assert.NoError(t, err)
+ assert.Equal(t, org.ID, team.OrgID)
+
+ nonOrg := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+ _, err = nonOrg.GetOwnerTeam()
+ assert.Equal(t, ErrTeamNotExist, err)
+}
+
+func TestUser_GetTeams(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ assert.NoError(t, org.GetTeams())
+ assert.Len(t, org.Teams, 2)
+ assert.Equal(t, int64(1), org.Teams[0].ID)
+ assert.Equal(t, int64(2), org.Teams[1].ID)
+}
+
+func TestUser_GetMembers(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ assert.NoError(t, org.GetMembers())
+ assert.Len(t, org.Members, 2)
+ assert.Equal(t, int64(2), org.Members[0].ID)
+ assert.Equal(t, int64(4), org.Members[1].ID)
+}
+
+func TestUser_AddMember(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+
+ // add a user that is not a member
+ AssertNotExistsBean(t, &OrgUser{UID: 5, OrgID: 3})
+ prevNumMembers := org.NumMembers
+ assert.NoError(t, org.AddMember(5))
+ AssertExistsAndLoadBean(t, &OrgUser{UID: 5, OrgID: 3})
+ org = AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ assert.Equal(t, prevNumMembers+1, org.NumMembers)
+
+ // add a user that is already a member
+ AssertExistsAndLoadBean(t, &OrgUser{UID: 4, OrgID: 3})
+ prevNumMembers = org.NumMembers
+ assert.NoError(t, org.AddMember(4))
+ AssertExistsAndLoadBean(t, &OrgUser{UID: 4, OrgID: 3})
+ org = AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ assert.Equal(t, prevNumMembers, org.NumMembers)
+}
+
+func TestUser_RemoveMember(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+
+ // remove a user that is a member
+ AssertExistsAndLoadBean(t, &OrgUser{UID: 4, OrgID: 3})
+ prevNumMembers := org.NumMembers
+ assert.NoError(t, org.RemoveMember(4))
+ AssertNotExistsBean(t, &OrgUser{UID: 4, OrgID: 3})
+ org = AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ assert.Equal(t, prevNumMembers-1, org.NumMembers)
+
+ // remove a user that is not a member
+ AssertNotExistsBean(t, &OrgUser{UID: 5, OrgID: 3})
+ prevNumMembers = org.NumMembers
+ assert.NoError(t, org.RemoveMember(5))
+ AssertNotExistsBean(t, &OrgUser{UID: 5, OrgID: 3})
+ org = AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ assert.Equal(t, prevNumMembers, org.NumMembers)
+}
+
+func TestUser_RemoveOrgRepo(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ repo := AssertExistsAndLoadBean(t, &Repository{OwnerID: org.ID}).(*Repository)
+
+ // remove a repo that does belong to org
+ AssertExistsAndLoadBean(t, &TeamRepo{RepoID: repo.ID, OrgID: org.ID})
+ assert.NoError(t, org.RemoveOrgRepo(repo.ID))
+ AssertNotExistsBean(t, &TeamRepo{RepoID: repo.ID, OrgID: org.ID})
+ AssertExistsAndLoadBean(t, &Repository{ID: repo.ID}) // repo should still exist
+
+ // remove a repo that does not belong to org
+ assert.NoError(t, org.RemoveOrgRepo(repo.ID))
+ AssertNotExistsBean(t, &TeamRepo{RepoID: repo.ID, OrgID: org.ID})
+
+ assert.NoError(t, org.RemoveOrgRepo(NonexistentID))
+}
+
+func TestCreateOrganization(t *testing.T) {
+ // successful creation of org
+ assert.NoError(t, PrepareTestDatabase())
+
+ owner := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+ const newOrgName = "neworg"
+ org := &User{
+ Name: newOrgName,
+ }
+
+ AssertNotExistsBean(t, &User{Name: newOrgName, Type: UserTypeOrganization})
+ assert.NoError(t, CreateOrganization(org, owner))
+ org = AssertExistsAndLoadBean(t,
+ &User{Name: newOrgName, Type: UserTypeOrganization}).(*User)
+ ownerTeam := AssertExistsAndLoadBean(t,
+ &Team{Name: ownerTeamName, OrgID: org.ID}).(*Team)
+ AssertExistsAndLoadBean(t, &TeamUser{UID: owner.ID, TeamID: ownerTeam.ID})
+}
+
+func TestCreateOrganization2(t *testing.T) {
+ // unauthorized creation of org
+ assert.NoError(t, PrepareTestDatabase())
+
+ owner := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User)
+ const newOrgName = "neworg"
+ org := &User{
+ Name: newOrgName,
+ }
+
+ AssertNotExistsBean(t, &User{Name: newOrgName, Type: UserTypeOrganization})
+ err := CreateOrganization(org, owner)
+ assert.Error(t, err)
+ assert.True(t, IsErrUserNotAllowedCreateOrg(err))
+ AssertNotExistsBean(t, &User{Name: newOrgName, Type: UserTypeOrganization})
+}
+
+func TestCreateOrganization3(t *testing.T) {
+ // create org with same name as existent org
+ assert.NoError(t, PrepareTestDatabase())
+
+ owner := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+ org := &User{Name: "user3"} // should already exist
+ AssertExistsAndLoadBean(t, &User{Name: org.Name}) // sanity check
+ err := CreateOrganization(org, owner)
+ assert.Error(t, err)
+ assert.True(t, IsErrUserAlreadyExist(err))
+}
+
+func TestCreateOrganization4(t *testing.T) {
+ // create org with unusable name
+ assert.NoError(t, PrepareTestDatabase())
+
+ owner := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+ err := CreateOrganization(&User{Name: "assets"}, owner)
+ assert.Error(t, err)
+ assert.True(t, IsErrNameReserved(err))
+}
+
+func TestGetOrgByName(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+
+ org, err := GetOrgByName("user3")
+ assert.NoError(t, err)
+ assert.EqualValues(t, 3, org.ID)
+ assert.Equal(t, "user3", org.Name)
+
+ org, err = GetOrgByName("user2") // user2 is an individual
+ assert.Equal(t, ErrOrgNotExist, err)
+
+ org, err = GetOrgByName("") // corner case
+ assert.Equal(t, ErrOrgNotExist, err)
+}
+
+func TestCountOrganizations(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ expected, err := x.Where("type=?", UserTypeOrganization).Count(&User{})
+ assert.NoError(t, err)
+ assert.Equal(t, expected, CountOrganizations())
+}
+
+func TestOrganizations(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ testSuccess := func(opts *SearchUserOptions, expectedOrgIDs []int64) {
+ orgs, err := Organizations(opts)
+ assert.NoError(t, err)
+ assert.Len(t, orgs, len(expectedOrgIDs))
+ for i, expectedOrgID := range expectedOrgIDs {
+ assert.EqualValues(t, expectedOrgID, orgs[i].ID)
+ }
+ }
+ testSuccess(&SearchUserOptions{OrderBy: "id ASC", Page: 1, PageSize: 2},
+ []int64{3, 6})
+
+ testSuccess(&SearchUserOptions{OrderBy: "id ASC", Page: 2, PageSize: 2},
+ []int64{7})
+
+ testSuccess(&SearchUserOptions{Page: 3, PageSize: 2},
+ []int64{})
+}
+
+func TestDeleteOrganization(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 6}).(*User)
+ assert.NoError(t, DeleteOrganization(org))
+ AssertNotExistsBean(t, &User{ID: 6})
+ AssertNotExistsBean(t, &OrgUser{OrgID: 6})
+ AssertNotExistsBean(t, &Team{OrgID: 6})
+
+ org = AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ err := DeleteOrganization(org)
+ assert.Error(t, err)
+ assert.True(t, IsErrUserOwnRepos(err))
+
+ nonOrg := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User)
+ assert.Error(t, DeleteOrganization(nonOrg))
+}
+
+func TestIsOrganizationOwner(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ assert.True(t, IsOrganizationOwner(3, 2))
+ assert.False(t, IsOrganizationOwner(3, 3))
+ assert.True(t, IsOrganizationOwner(6, 5))
+ assert.False(t, IsOrganizationOwner(6, 4))
+ assert.False(t, IsOrganizationOwner(NonexistentID, NonexistentID))
+}
+
+func TestIsOrganizationMember(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ assert.True(t, IsOrganizationMember(3, 2))
+ assert.False(t, IsOrganizationMember(3, 3))
+ assert.True(t, IsOrganizationMember(3, 4))
+ assert.True(t, IsOrganizationMember(6, 5))
+ assert.False(t, IsOrganizationMember(6, 4))
+ assert.False(t, IsOrganizationMember(NonexistentID, NonexistentID))
+}
+
+func TestIsPublicMembership(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ assert.True(t, IsPublicMembership(3, 2))
+ assert.False(t, IsPublicMembership(3, 3))
+ assert.False(t, IsPublicMembership(3, 4))
+ assert.True(t, IsPublicMembership(6, 5))
+ assert.False(t, IsPublicMembership(6, 4))
+ assert.False(t, IsPublicMembership(NonexistentID, NonexistentID))
+}
+
+func TestGetOrgsByUserID(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+
+ orgs, err := GetOrgsByUserID(4, true)
+ assert.NoError(t, err)
+ assert.Len(t, orgs, 1)
+ assert.EqualValues(t, 3, orgs[0].ID)
+
+ orgs, err = GetOrgsByUserID(4, false)
+ assert.NoError(t, err)
+ assert.Len(t, orgs, 0)
+}
+
+func TestGetOwnedOrgsByUserID(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+
+ orgs, err := GetOwnedOrgsByUserID(2)
+ assert.NoError(t, err)
+ assert.Len(t, orgs, 1)
+ assert.EqualValues(t, 3, orgs[0].ID)
+
+ orgs, err = GetOwnedOrgsByUserID(4)
+ assert.NoError(t, err)
+ assert.Len(t, orgs, 0)
+}
+
+func TestGetOwnedOrgsByUserIDDesc(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+
+ orgs, err := GetOwnedOrgsByUserIDDesc(5, "id")
+ assert.NoError(t, err)
+ assert.Len(t, orgs, 2)
+ assert.EqualValues(t, 7, orgs[0].ID)
+ assert.EqualValues(t, 6, orgs[1].ID)
+
+ orgs, err = GetOwnedOrgsByUserIDDesc(4, "id")
+ assert.NoError(t, err)
+ assert.Len(t, orgs, 0)
+}
+
+func TestGetOrgUsersByUserID(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+
+ orgUsers, err := GetOrgUsersByUserID(5, true)
+ assert.NoError(t, err)
+ assert.Len(t, orgUsers, 2)
+ assert.Equal(t, OrgUser{
+ ID: orgUsers[0].ID,
+ OrgID: 6,
+ UID: 5,
+ IsOwner: true,
+ IsPublic: true,
+ NumTeams: 1}, *orgUsers[0])
+ assert.Equal(t, OrgUser{
+ ID: orgUsers[1].ID,
+ OrgID: 7,
+ UID: 5,
+ IsOwner: true,
+ IsPublic: false,
+ NumTeams: 1}, *orgUsers[1])
+
+ publicOrgUsers, err := GetOrgUsersByUserID(5, false)
+ assert.NoError(t, err)
+ assert.Len(t, publicOrgUsers, 1)
+ assert.Equal(t, *orgUsers[0], *publicOrgUsers[0])
+
+ orgUsers, err = GetOrgUsersByUserID(1, true)
+ assert.NoError(t, err)
+ assert.Len(t, orgUsers, 0)
+}
+
+func TestGetOrgUsersByOrgID(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+
+ orgUsers, err := GetOrgUsersByOrgID(3)
+ assert.NoError(t, err)
+ assert.Len(t, orgUsers, 2)
+ assert.Equal(t, OrgUser{
+ ID: orgUsers[0].ID,
+ OrgID: 3,
+ UID: 2,
+ IsOwner: true,
+ IsPublic: true,
+ NumTeams: 1}, *orgUsers[0])
+ assert.Equal(t, OrgUser{
+ ID: orgUsers[1].ID,
+ OrgID: 3,
+ UID: 4,
+ IsOwner: false,
+ IsPublic: false,
+ NumTeams: 0}, *orgUsers[1])
+
+ orgUsers, err = GetOrgUsersByOrgID(NonexistentID)
+ assert.NoError(t, err)
+ assert.Len(t, orgUsers, 0)
+}
+
+func TestChangeOrgUserStatus(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+
+ testSuccess := func(orgID, userID int64, public bool) {
+ assert.NoError(t, ChangeOrgUserStatus(orgID, userID, public))
+ orgUser := AssertExistsAndLoadBean(t, &OrgUser{OrgID: orgID, UID: userID}).(*OrgUser)
+ assert.Equal(t, public, orgUser.IsPublic)
+ }
+
+ testSuccess(3, 2, false)
+ testSuccess(3, 2, false)
+ testSuccess(3, 4, true)
+ assert.NoError(t, ChangeOrgUserStatus(NonexistentID, NonexistentID, true))
+}
+
+func TestAddOrgUser(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ testSuccess := func(orgID, userID int64) {
+ org := AssertExistsAndLoadBean(t, &User{ID: orgID}).(*User)
+ expectedNumMembers := org.NumMembers
+ if !BeanExists(t, &OrgUser{OrgID: orgID, UID: userID}) {
+ expectedNumMembers++
+ }
+ assert.NoError(t, AddOrgUser(orgID, userID))
+ AssertExistsAndLoadBean(t, &OrgUser{OrgID: orgID, UID: userID})
+ org = AssertExistsAndLoadBean(t, &User{ID: orgID}).(*User)
+ assert.EqualValues(t, expectedNumMembers, org.NumMembers)
+ }
+ testSuccess(3, 5)
+ testSuccess(3, 5)
+ testSuccess(6, 2)
+}
+
+func TestRemoveOrgUser(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ testSuccess := func(orgID, userID int64) {
+ org := AssertExistsAndLoadBean(t, &User{ID: orgID}).(*User)
+ expectedNumMembers := org.NumMembers
+ if BeanExists(t, &OrgUser{OrgID: orgID, UID: userID}) {
+ expectedNumMembers--
+ }
+ assert.NoError(t, RemoveOrgUser(orgID, userID))
+ AssertNotExistsBean(t, &OrgUser{OrgID: orgID, UID: userID})
+ org = AssertExistsAndLoadBean(t, &User{ID: orgID}).(*User)
+ assert.EqualValues(t, expectedNumMembers, org.NumMembers)
+ }
+ testSuccess(3, 4)
+ testSuccess(3, 4)
+
+ err := RemoveOrgUser(7, 5)
+ assert.Error(t, err)
+ assert.True(t, IsErrLastOrgOwner(err))
+ AssertExistsAndLoadBean(t, &OrgUser{OrgID: 7, UID: 5})
+}
+
+func TestUser_GetUserTeamIDs(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ testSuccess := func(userID int64, expected []int64) {
+ teamIDs, err := org.GetUserTeamIDs(userID)
+ assert.NoError(t, err)
+ assert.Equal(t, expected, teamIDs)
+ }
+ testSuccess(2, []int64{1, 2})
+ testSuccess(4, []int64{2})
+ testSuccess(NonexistentID, []int64{})
+}
+
+func TestAccessibleReposEnv_CountRepos(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ testSuccess := func(userID, expectedCount int64) {
+ env, err := org.AccessibleReposEnv(userID)
+ assert.NoError(t, err)
+ count, err := env.CountRepos()
+ assert.NoError(t, err)
+ assert.EqualValues(t, expectedCount, count)
+ }
+ testSuccess(2, 2)
+ testSuccess(4, 1)
+}
+
+func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ testSuccess := func(userID, page, pageSize int64, expectedRepoIDs []int64) {
+ env, err := org.AccessibleReposEnv(userID)
+ assert.NoError(t, err)
+ repoIDs, err := env.RepoIDs(1, 100)
+ assert.NoError(t, err)
+ assert.Equal(t, expectedRepoIDs, repoIDs)
+ }
+ testSuccess(2, 1, 100, []int64{3, 5})
+ testSuccess(4, 0, 100, []int64{3})
+}
+
+func TestAccessibleReposEnv_Repos(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ testSuccess := func(userID int64, expectedRepoIDs []int64) {
+ env, err := org.AccessibleReposEnv(userID)
+ assert.NoError(t, err)
+ repos, err := env.Repos(1, 100)
+ assert.NoError(t, err)
+ expectedRepos := make([]*Repository, len(expectedRepoIDs))
+ for i, repoID := range expectedRepoIDs {
+ expectedRepos[i] = AssertExistsAndLoadBean(t,
+ &Repository{ID: repoID}).(*Repository)
+ }
+ assert.Equal(t, expectedRepos, repos)
+ }
+ testSuccess(2, []int64{3, 5})
+ testSuccess(4, []int64{3})
+}
+
+func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+ testSuccess := func(userID int64, expectedRepoIDs []int64) {
+ env, err := org.AccessibleReposEnv(userID)
+ assert.NoError(t, err)
+ repos, err := env.MirrorRepos()
+ assert.NoError(t, err)
+ expectedRepos := make([]*Repository, len(expectedRepoIDs))
+ for i, repoID := range expectedRepoIDs {
+ expectedRepos[i] = AssertExistsAndLoadBean(t,
+ &Repository{ID: repoID}).(*Repository)
+ }
+ assert.Equal(t, expectedRepos, repos)
+ }
+ testSuccess(2, []int64{5})
+ testSuccess(4, []int64{})
+}