organizations_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. // Copyright 2022 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package database
  5. import (
  6. "context"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. "gogs.io/gogs/internal/dbutil"
  11. )
  12. func TestOrgs(t *testing.T) {
  13. if testing.Short() {
  14. t.Skip()
  15. }
  16. t.Parallel()
  17. ctx := context.Background()
  18. s := &OrganizationsStore{
  19. db: newTestDB(t, "OrganizationsStore"),
  20. }
  21. for _, tc := range []struct {
  22. name string
  23. test func(t *testing.T, ctx context.Context, s *OrganizationsStore)
  24. }{
  25. {"List", orgsList},
  26. {"SearchByName", organizationsSearchByName},
  27. {"CountByUser", organizationsCountByUser},
  28. } {
  29. t.Run(tc.name, func(t *testing.T) {
  30. t.Cleanup(func() {
  31. err := clearTables(t, s.db)
  32. require.NoError(t, err)
  33. })
  34. tc.test(t, ctx, s)
  35. })
  36. if t.Failed() {
  37. break
  38. }
  39. }
  40. }
  41. func orgsList(t *testing.T, ctx context.Context, s *OrganizationsStore) {
  42. usersStore := newUsersStore(s.db)
  43. alice, err := usersStore.Create(ctx, "alice", "alice@example.com", CreateUserOptions{})
  44. require.NoError(t, err)
  45. bob, err := usersStore.Create(ctx, "bob", "bob@example.com", CreateUserOptions{})
  46. require.NoError(t, err)
  47. // TODO: Use Orgs.Create to replace SQL hack when the method is available.
  48. org1, err := usersStore.Create(ctx, "org1", "org1@example.com", CreateUserOptions{})
  49. require.NoError(t, err)
  50. org2, err := usersStore.Create(ctx, "org2", "org2@example.com", CreateUserOptions{})
  51. require.NoError(t, err)
  52. err = s.db.Exec(
  53. dbutil.Quote("UPDATE %s SET type = ? WHERE id IN (?, ?)", "user"),
  54. UserTypeOrganization, org1.ID, org2.ID,
  55. ).Error
  56. require.NoError(t, err)
  57. // TODO: Use Orgs.Join to replace SQL hack when the method is available.
  58. err = s.db.Exec(`INSERT INTO org_user (uid, org_id, is_public) VALUES (?, ?, ?)`, alice.ID, org1.ID, false).Error
  59. require.NoError(t, err)
  60. err = s.db.Exec(`INSERT INTO org_user (uid, org_id, is_public) VALUES (?, ?, ?)`, alice.ID, org2.ID, true).Error
  61. require.NoError(t, err)
  62. err = s.db.Exec(`INSERT INTO org_user (uid, org_id, is_public) VALUES (?, ?, ?)`, bob.ID, org2.ID, true).Error
  63. require.NoError(t, err)
  64. tests := []struct {
  65. name string
  66. opts ListOrgsOptions
  67. wantOrgNames []string
  68. }{
  69. {
  70. name: "only public memberships for a user",
  71. opts: ListOrgsOptions{
  72. MemberID: alice.ID,
  73. IncludePrivateMembers: false,
  74. },
  75. wantOrgNames: []string{org2.Name},
  76. },
  77. {
  78. name: "all memberships for a user",
  79. opts: ListOrgsOptions{
  80. MemberID: alice.ID,
  81. IncludePrivateMembers: true,
  82. },
  83. wantOrgNames: []string{org1.Name, org2.Name},
  84. },
  85. {
  86. name: "no membership for a non-existent user",
  87. opts: ListOrgsOptions{
  88. MemberID: 404,
  89. IncludePrivateMembers: true,
  90. },
  91. wantOrgNames: []string{},
  92. },
  93. }
  94. for _, test := range tests {
  95. t.Run(test.name, func(t *testing.T) {
  96. got, err := s.List(ctx, test.opts)
  97. require.NoError(t, err)
  98. gotOrgNames := make([]string, len(got))
  99. for i := range got {
  100. gotOrgNames[i] = got[i].Name
  101. }
  102. assert.Equal(t, test.wantOrgNames, gotOrgNames)
  103. })
  104. }
  105. }
  106. func organizationsSearchByName(t *testing.T, ctx context.Context, s *OrganizationsStore) {
  107. // TODO: Use Orgs.Create to replace SQL hack when the method is available.
  108. usersStore := newUsersStore(s.db)
  109. org1, err := usersStore.Create(ctx, "org1", "org1@example.com", CreateUserOptions{FullName: "Acme Corp"})
  110. require.NoError(t, err)
  111. org2, err := usersStore.Create(ctx, "org2", "org2@example.com", CreateUserOptions{FullName: "Acme Corp 2"})
  112. require.NoError(t, err)
  113. err = s.db.Exec(
  114. dbutil.Quote("UPDATE %s SET type = ? WHERE id IN (?, ?)", "user"),
  115. UserTypeOrganization, org1.ID, org2.ID,
  116. ).Error
  117. require.NoError(t, err)
  118. t.Run("search for username org1", func(t *testing.T) {
  119. orgs, count, err := s.SearchByName(ctx, "G1", 1, 1, "")
  120. require.NoError(t, err)
  121. require.Len(t, orgs, int(count))
  122. assert.Equal(t, int64(1), count)
  123. assert.Equal(t, org1.ID, orgs[0].ID)
  124. })
  125. t.Run("search for username org2", func(t *testing.T) {
  126. orgs, count, err := s.SearchByName(ctx, "G2", 1, 1, "")
  127. require.NoError(t, err)
  128. require.Len(t, orgs, int(count))
  129. assert.Equal(t, int64(1), count)
  130. assert.Equal(t, org2.ID, orgs[0].ID)
  131. })
  132. t.Run("search for full name acme", func(t *testing.T) {
  133. orgs, count, err := s.SearchByName(ctx, "ACME", 1, 10, "")
  134. require.NoError(t, err)
  135. require.Len(t, orgs, int(count))
  136. assert.Equal(t, int64(2), count)
  137. })
  138. t.Run("search for full name acme ORDER BY id DESC LIMIT 1", func(t *testing.T) {
  139. orgs, count, err := s.SearchByName(ctx, "ACME", 1, 1, "id DESC")
  140. require.NoError(t, err)
  141. require.Len(t, orgs, 1)
  142. assert.Equal(t, int64(2), count)
  143. assert.Equal(t, org2.ID, orgs[0].ID)
  144. })
  145. }
  146. func organizationsCountByUser(t *testing.T, ctx context.Context, s *OrganizationsStore) {
  147. // TODO: Use Orgs.Join to replace SQL hack when the method is available.
  148. err := s.db.Exec(`INSERT INTO org_user (uid, org_id) VALUES (?, ?)`, 1, 1).Error
  149. require.NoError(t, err)
  150. err = s.db.Exec(`INSERT INTO org_user (uid, org_id) VALUES (?, ?)`, 2, 1).Error
  151. require.NoError(t, err)
  152. got, err := s.CountByUser(ctx, 1)
  153. require.NoError(t, err)
  154. assert.Equal(t, int64(1), got)
  155. got, err = s.CountByUser(ctx, 404)
  156. require.NoError(t, err)
  157. assert.Equal(t, int64(0), got)
  158. }