From ff7c96caa312858fd253454993e363937155c608 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Wed, 17 Nov 2021 13:40:09 +0100 Subject: [PATCH] Fix instance account not being created (#310) * Rework 'CreateInstanceAccount' with better checking logic * add test for create instance account --- internal/db/bundb/admin.go | 13 ++++---- internal/db/bundb/admin_test.go | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 internal/db/bundb/admin_test.go diff --git a/internal/db/bundb/admin.go b/internal/db/bundb/admin.go index 4381c1de..accdf7e5 100644 --- a/internal/db/bundb/admin.go +++ b/internal/db/bundb/admin.go @@ -178,18 +178,19 @@ func (a *adminDB) NewSignup(ctx context.Context, username string, reason string, func (a *adminDB) CreateInstanceAccount(ctx context.Context) db.Error { username := a.config.Host - // check if instance account already exists - existsQ := a.conn. + q := a.conn. NewSelect(). Model(>smodel.Account{}). Where("username = ?", username). WhereGroup(" AND ", whereEmptyOrNull("domain")) - count, err := existsQ.Count(ctx) - if err != nil && count == 1 { + + exists, err := a.conn.Exists(ctx, q) + if err != nil { + return err + } + if exists { logrus.Infof("instance account %s already exists", username) return nil - } else if err != sql.ErrNoRows { - return a.conn.ProcessError(err) } key, err := rsa.GenerateKey(rand.Reader, 2048) diff --git a/internal/db/bundb/admin_test.go b/internal/db/bundb/admin_test.go new file mode 100644 index 00000000..a4c380c0 --- /dev/null +++ b/internal/db/bundb/admin_test.go @@ -0,0 +1,56 @@ +/* + GoToSocial + Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package bundb_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type AdminTestSuite struct { + BunDBStandardTestSuite +} + +func (suite *AdminTestSuite) TestCreateInstanceAccount() { + // we need to take an empty db for this... + testrig.StandardDBTeardown(suite.db) + // ...with tables created but no data + testrig.CreateTestTables(suite.db) + + // make sure there's no instance account in the db yet + acct, err := suite.db.GetInstanceAccount(context.Background(), suite.config.Host) + suite.Error(err) + suite.Nil(acct) + + // create it + err = suite.db.CreateInstanceAccount(context.Background()) + suite.NoError(err) + + // and now check it exists + acct, err = suite.db.GetInstanceAccount(context.Background(), suite.config.Host) + suite.NoError(err) + suite.NotNil(acct) +} + +func TestAdminTestSuite(t *testing.T) { + suite.Run(t, new(AdminTestSuite)) +}