package database import ( "context" "testing" "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/serviceaccounts" "github.com/grafana/grafana/pkg/services/serviceaccounts/tests" "github.com/grafana/grafana/pkg/services/sqlstore" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestStore_CreateServiceAccount(t *testing.T) { sqlStore, store := setupTestDatabase(t) t.Run("create service account", func(t *testing.T) { saDTO, err := store.CreateServiceAccount(context.Background(), 1, "new Service Account") require.NoError(t, err) assert.Equal(t, "sa-new-service-account", saDTO.Login) assert.Equal(t, "new Service Account", saDTO.Name) assert.Equal(t, 0, int(saDTO.Tokens)) query := models.GetUserByIdQuery{Id: saDTO.Id} err = sqlStore.GetUserById(context.Background(), &query) retrieved := query.Result require.NoError(t, err) assert.Equal(t, "sa-new-service-account", retrieved.Login) assert.Equal(t, "new Service Account", retrieved.Name) assert.Equal(t, "sa-new-service-account", retrieved.Email) assert.Equal(t, "", retrieved.Password) assert.Equal(t, 1, int(retrieved.OrgId)) assert.Len(t, retrieved.Salt, 10) assert.Equal(t, true, retrieved.IsServiceAccount) }) } func TestStore_DeleteServiceAccount(t *testing.T) { cases := []struct { desc string user tests.TestUser expectedErr error }{ { desc: "service accounts should exist and get deleted", user: tests.TestUser{Login: "servicetest1@admin", IsServiceAccount: true}, expectedErr: nil, }, { desc: "service accounts is false should not delete the user", user: tests.TestUser{Login: "test1@admin", IsServiceAccount: false}, expectedErr: serviceaccounts.ErrServiceAccountNotFound, }, } for _, c := range cases { t.Run(c.desc, func(t *testing.T) { db, store := setupTestDatabase(t) user := tests.SetupUserServiceAccount(t, db, c.user) err := store.DeleteServiceAccount(context.Background(), user.OrgId, user.Id) if c.expectedErr != nil { require.ErrorIs(t, err, c.expectedErr) } else { require.NoError(t, err) } }) } } func setupTestDatabase(t *testing.T) (*sqlstore.SQLStore, *ServiceAccountsStoreImpl) { t.Helper() db := sqlstore.InitTestDB(t) return db, NewServiceAccountsStore(db) } func TestStore_RetrieveServiceAccount(t *testing.T) { cases := []struct { desc string user tests.TestUser expectedErr error }{ { desc: "service accounts should exist and get retrieved", user: tests.TestUser{Login: "servicetest1@admin", IsServiceAccount: true}, expectedErr: nil, }, { desc: "service accounts is false should not retrieve user", user: tests.TestUser{Login: "test1@admin", IsServiceAccount: false}, expectedErr: serviceaccounts.ErrServiceAccountNotFound, }, } for _, c := range cases { t.Run(c.desc, func(t *testing.T) { db, store := setupTestDatabase(t) user := tests.SetupUserServiceAccount(t, db, c.user) dto, err := store.RetrieveServiceAccount(context.Background(), user.OrgId, user.Id) if c.expectedErr != nil { require.ErrorIs(t, err, c.expectedErr) } else { require.NoError(t, err) require.Equal(t, c.user.Login, dto.Login) require.Len(t, dto.Teams, 0) } }) } } func TestStore_RetrieveServiceAccountWithTeams(t *testing.T) { userToCreate := tests.TestUser{Login: "servicetestwithTeam@admin", IsServiceAccount: true} db, store := setupTestDatabase(t) user := tests.SetupUserServiceAccount(t, db, userToCreate) team, err := store.sqlStore.CreateTeam("serviceTeam", "serviceTeam", user.OrgId) require.NoError(t, err) err = store.sqlStore.AddTeamMember(user.Id, user.OrgId, team.Id, false, models.PERMISSION_VIEW) require.NoError(t, err) dto, err := store.RetrieveServiceAccount(context.Background(), user.OrgId, user.Id) require.NoError(t, err) require.Equal(t, userToCreate.Login, dto.Login) require.Len(t, dto.Teams, 1) require.Equal(t, "serviceTeam", dto.Teams[0]) }