1
0

organizations_test.go 5.1 KB

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