summaryrefslogtreecommitdiff
path: root/internal/oauth/pgclientstore_test.go
blob: d6a76981fe44abbbb408c4ef87e2ecc0c240b3d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package oauth

import (
	"context"
	"testing"

	"github.com/go-pg/pg/v10"
	"github.com/go-pg/pg/v10/orm"
	"github.com/gotosocial/oauth2/v4/models"
	"github.com/sirupsen/logrus"
	"github.com/stretchr/testify/suite"
)

type PgClientStoreTestSuite struct {
	suite.Suite
	conn             *pg.DB
	testClientID     string
	testClientSecret string
	testClientDomain string
	testClientUserID string
}

const ()

// SetupSuite sets some variables on the suite that we can use as consts (more or less) throughout
func (suite *PgClientStoreTestSuite) SetupSuite() {
	suite.testClientID = "test-client-id"
	suite.testClientSecret = "test-client-secret"
	suite.testClientDomain = "https://example.org"
	suite.testClientUserID = "test-client-user-id"
}

// SetupTest creates a postgres connection and creates the oauth_clients table before each test
func (suite *PgClientStoreTestSuite) SetupTest() {
	suite.conn = pg.Connect(&pg.Options{})
	if err := suite.conn.Ping(context.Background()); err != nil {
		logrus.Panicf("db connection error: %s", err)
	}
	if err := suite.conn.Model(&oauthClient{}).CreateTable(&orm.CreateTableOptions{
		IfNotExists: true,
	}); err != nil {
		logrus.Panicf("db connection error: %s", err)
	}
}

// TearDownTest drops the oauth_clients table and closes the pg connection after each test
func (suite *PgClientStoreTestSuite) TearDownTest() {
	if err := suite.conn.Model(&oauthClient{}).DropTable(&orm.DropTableOptions{}); err != nil {
		logrus.Panicf("drop table error: %s", err)
	}
	if err := suite.conn.Close(); err != nil {
		logrus.Panicf("error closing db connection: %s", err)
	}
	suite.conn = nil
}

func (suite *PgClientStoreTestSuite) TestClientStoreSetAndGet() {
	// set a new client in the store
	cs := NewPGClientStore(suite.conn)
	if err := cs.Set(context.Background(), suite.testClientID, models.New(suite.testClientID, suite.testClientSecret, suite.testClientDomain, suite.testClientUserID)); err != nil {
		suite.FailNow(err.Error())
	}

	// fetch that client from the store
	client, err := cs.GetByID(context.Background(), suite.testClientID)
	if err != nil {
		suite.FailNow(err.Error())
	}

	// check that the values are the same
	suite.NotNil(client)
	suite.EqualValues(models.New(suite.testClientID, suite.testClientSecret, suite.testClientDomain, suite.testClientUserID), client)
}

func (suite *PgClientStoreTestSuite) TestClientSetAndDelete() {
	// set a new client in the store
	cs := NewPGClientStore(suite.conn)
	if err := cs.Set(context.Background(), suite.testClientID, models.New(suite.testClientID, suite.testClientSecret, suite.testClientDomain, suite.testClientUserID)); err != nil {
		suite.FailNow(err.Error())
	}

	// fetch the client from the store
	client, err := cs.GetByID(context.Background(), suite.testClientID)
	if err != nil {
		suite.FailNow(err.Error())
	}

	// check that the values are the same
	suite.NotNil(client)
	suite.EqualValues(models.New(suite.testClientID, suite.testClientSecret, suite.testClientDomain, suite.testClientUserID), client)
	if err := cs.Delete(context.Background(), suite.testClientID); err != nil {
		suite.FailNow(err.Error())
	}

	// try to get the deleted client; we should get an error
	deletedClient, err := cs.GetByID(context.Background(), suite.testClientID)
	suite.Assert().Nil(deletedClient)
	suite.Assert().NotNil(err)
	suite.EqualValues("pg: no rows in result set", err.Error())
}

func TestPgClientStoreTestSuite(t *testing.T) {
	suite.Run(t, new(PgClientStoreTestSuite))
}