all repos

onasty @ 3f20fac

a one-time notes service

onasty/e2e/e2e_utils_db_test.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
chore(golangci-lint): upgrade config (#14)..., 1 year ago
1
package e2e_test
2
3
import (
4
	"errors"
5
	"time"
6
7
	"github.com/gofrs/uuid/v5"
8
	"github.com/henvic/pgq"
9
	"github.com/jackc/pgx/v5"
10
	"github.com/olexsmir/onasty/internal/models"
11
)
12
13
func (e *AppTestSuite) getUserFromDBByUsername(username string) models.User {
14
	query, args, err := pgq.
15
		Select("id", "username", "email", "password", "created_at", "last_login_at").
16
		From("users").
17
		Where(pgq.Eq{"username": username}).
18
		SQL()
19
	e.require.NoError(err)
20
21
	var user models.User
22
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
23
		Scan(&user.ID, &user.Username, &user.Email, &user.Password, &user.CreatedAt, &user.LastLoginAt)
24
	e.require.NoError(err)
25
26
	return user
27
}
28
29
func (e *AppTestSuite) insertUserIntoDB(uname, email, passwd string, activated ...bool) uuid.UUID {
30
	p, err := e.hasher.Hash(passwd)
31
	e.require.NoError(err)
32
33
	var a bool
34
	if len(activated) == 1 {
35
		a = activated[0]
36
	}
37
38
	query, args, err := pgq.
39
		Insert("users").
40
		Columns("username", "email", "password", "activated", "created_at", "last_login_at").
41
		Values(uname, email, p, a, time.Now(), time.Now()).
42
		Returning("id").
43
		SQL()
44
	e.require.NoError(err)
45
46
	var id uuid.UUID
47
	err = e.postgresDB.QueryRow(e.ctx, query, args...).Scan(&id)
48
	e.require.NoError(err)
49
50
	return id
51
}
52
53
func (e *AppTestSuite) getLastUserSessionByUserID(uid uuid.UUID) models.Session {
54
	query, args, err := pgq.
55
		Select("refresh_token", "expires_at").
56
		From("sessions").
57
		Where(pgq.Eq{"user_id": uid.String()}).
58
		OrderBy("expires_at DESC").
59
		SQL()
60
	e.require.NoError(err)
61
62
	var session models.Session
63
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
64
		Scan(&session.RefreshToken, &session.ExpiresAt)
65
	if errors.Is(err, pgx.ErrNoRows) {
66
		return models.Session{} //nolint:exhaustruct
67
	}
68
69
	e.require.NoError(err)
70
	return session
71
}
72
73
func (e *AppTestSuite) getLastInsertedUserByEmail(em string) models.User {
74
	query, args, err := pgq.
75
		Select("id", "username", "activated", "email", "password").
76
		From("users").
77
		Where(pgq.Eq{"email": em}).
78
		OrderBy("created_at DESC").
79
		Limit(1).
80
		SQL()
81
	e.require.NoError(err)
82
83
	var u models.User
84
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
85
		Scan(&u.ID, &u.Username, &u.Activated, &u.Email, &u.Password)
86
	if errors.Is(err, pgx.ErrNoRows) {
87
		return models.User{} //nolint:exhaustruct
88
	}
89
90
	e.require.NoError(err)
91
	return u
92
}
93
94
func (e *AppTestSuite) getNoteFromDBbySlug(slug string) models.Note {
95
	query, args, err := pgq.
96
		Select("id", "content", "slug", "burn_before_expiration", "created_at", "expires_at").
97
		From("notes").
98
		Where(pgq.Eq{"slug": slug}).
99
		SQL()
100
	e.require.NoError(err)
101
102
	var note models.Note
103
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
104
		Scan(&note.ID, &note.Content, &note.Slug, &note.BurnBeforeExpiration, &note.CreatedAt, &note.ExpiresAt)
105
	if errors.Is(err, pgx.ErrNoRows) {
106
		return models.Note{} //nolint:exhaustruct
107
	}
108
109
	e.require.NoError(err)
110
	return note
111
}
112
113
type noteAuthorModel struct {
114
	noteID uuid.UUID
115
	userID uuid.UUID
116
}
117
118
func (e *AppTestSuite) getLastNoteAuthorsRecordByAuthorID(uid uuid.UUID) noteAuthorModel {
119
	qeuery, args, err := pgq.
120
		Select("note_id", "user_id").
121
		From("notes_authors").
122
		Where(pgq.Eq{"user_id": uid.String()}).
123
		OrderBy("created_at DESC").
124
		Limit(1).
125
		SQL()
126
	e.require.NoError(err)
127
128
	var na noteAuthorModel
129
	err = e.postgresDB.QueryRow(e.ctx, qeuery, args...).Scan(&na.noteID, &na.userID)
130
	if errors.Is(err, pgx.ErrNoRows) {
131
		return noteAuthorModel{} //nolint:exhaustruct
132
	}
133
134
	e.require.NoError(err)
135
	return na
136
}
137
138
type userVerificationToken struct {
139
	Token  string
140
	UsedAt *time.Time
141
}
142
143
func (e *AppTestSuite) getVerificationTokenByUserID(u uuid.UUID) userVerificationToken {
144
	query, args, err := pgq.
145
		Select("token", "used_at").
146
		From("verification_tokens").
147
		Where(pgq.Eq{"user_id": u.String()}).
148
		SQL()
149
	e.require.NoError(err)
150
	var r userVerificationToken
151
	err = e.postgresDB.QueryRow(e.ctx, query, args...).Scan(&r.Token, &r.UsedAt)
152
	e.require.NoError(err)
153
	return r
154
}