diff options
author | Ethan Koenig <ethantkoenig@gmail.com> | 2017-01-24 11:16:36 -0500 |
---|---|---|
committer | Ethan Koenig <ethantkoenig@gmail.com> | 2017-01-27 12:24:06 -0500 |
commit | a2412492da2def90457a2a20fd043bea21ef415f (patch) | |
tree | 842907cb6d69db617e5c048d23a864c8bbd6b22a /models/org_test.go | |
parent | bb5a6b7a07125b29604f479f45e59073cb3d4648 (diff) | |
download | gitea-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.go | 520 |
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{}) +} |