all repos

onasty @ ebcfde16e154958e0949a5abc611dde2e9b22960

a one-time notes service

onasty/e2e/e2e_utils_db_test.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
refactor: remove `username` (#112)..., 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
// getUserByEmail queries user from db by it's email
14
func (e *AppTestSuite) getUserByEmail(email string) models.User {
15
	query, args, err := pgq.
16
		Select("id", "email", "password", "created_at", "last_login_at").
17
		From("users").
18
		Where(pgq.Eq{"email": email}).
19
		SQL()
20
	e.require.NoError(err)
21
22
	var user models.User
23
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
24
		Scan(&user.ID, &user.Email, &user.Password, &user.CreatedAt, &user.LastLoginAt)
25
	e.require.NoError(err)
26
27
	return user
28
}
29
30
// insertUser inserts user into db
31
func (e *AppTestSuite) insertUser(email, passwd string, activated ...bool) uuid.UUID {
32
	p, err := e.hasher.Hash(passwd)
33
	e.require.NoError(err)
34
35
	var a bool
36
	if len(activated) == 1 {
37
		a = activated[0]
38
	}
39
40
	query, args, err := pgq.
41
		Insert("users").
42
		Columns("email", "password", "activated", "created_at", "last_login_at").
43
		Values(email, p, a, time.Now(), time.Now()).
44
		Returning("id").
45
		SQL()
46
	e.require.NoError(err)
47
48
	var id uuid.UUID
49
	err = e.postgresDB.QueryRow(e.ctx, query, args...).Scan(&id)
50
	e.require.NoError(err)
51
52
	return id
53
}
54
55
// getLastSessionByUserID gets last inserted [models.Session] for particular user
56
func (e *AppTestSuite) getLastSessionByUserID(uid uuid.UUID) models.Session {
57
	query, args, err := pgq.
58
		Select("refresh_token", "expires_at").
59
		From("sessions").
60
		Where(pgq.Eq{"user_id": uid.String()}).
61
		OrderBy("expires_at DESC").
62
		SQL()
63
	e.require.NoError(err)
64
65
	var session models.Session
66
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
67
		Scan(&session.RefreshToken, &session.ExpiresAt)
68
	if errors.Is(err, pgx.ErrNoRows) {
69
		return models.Session{} //nolint:exhaustruct
70
	}
71
72
	e.require.NoError(err)
73
	session.UserID = uid
74
	return session
75
}
76
77
// getLastUserByEmail gets last inserted [models.User] by user's email
78
func (e *AppTestSuite) getLastUserByEmail(em string) models.User {
79
	query, args, err := pgq.
80
		Select("id", "activated", "email", "password", "created_at", "last_login_at").
81
		From("users").
82
		Where(pgq.Eq{"email": em}).
83
		OrderBy("created_at DESC").
84
		Limit(1).
85
		SQL()
86
	e.require.NoError(err)
87
88
	var u models.User
89
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
90
		Scan(&u.ID, &u.Activated, &u.Email, &u.Password, &u.CreatedAt, &u.LastLoginAt)
91
	if errors.Is(err, pgx.ErrNoRows) {
92
		return models.User{} //nolint:exhaustruct
93
	}
94
95
	e.require.NoError(err)
96
	return u
97
}
98
99
// getNoteBySlug gets [models.Note] by slug
100
func (e *AppTestSuite) getNoteBySlug(slug string) models.Note {
101
	query, args, err := pgq.
102
		Select(
103
			"id",
104
			"content",
105
			"slug",
106
			"burn_before_expiration",
107
			"read_at",
108
			"created_at",
109
			"expires_at",
110
		).
111
		From("notes").
112
		Where(pgq.Eq{"slug": slug}).
113
		SQL()
114
	e.require.NoError(err)
115
116
	var note models.Note
117
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
118
		Scan(&note.ID, &note.Content, &note.Slug, &note.BurnBeforeExpiration, &note.ReadAt, &note.CreatedAt, &note.ExpiresAt)
119
	if errors.Is(err, pgx.ErrNoRows) {
120
		return models.Note{} //nolint:exhaustruct
121
	}
122
123
	e.require.NoError(err)
124
	return note
125
}
126
127
type noteAuthorModel struct {
128
	noteID uuid.UUID
129
	userID uuid.UUID
130
}
131
132
func (e *AppTestSuite) getLastNoteAuthorsRecordByAuthorID(uid uuid.UUID) noteAuthorModel {
133
	qeuery, args, err := pgq.
134
		Select("note_id", "user_id").
135
		From("notes_authors").
136
		Where(pgq.Eq{"user_id": uid.String()}).
137
		OrderBy("created_at DESC").
138
		Limit(1).
139
		SQL()
140
	e.require.NoError(err)
141
142
	var na noteAuthorModel
143
	err = e.postgresDB.QueryRow(e.ctx, qeuery, args...).Scan(&na.noteID, &na.userID)
144
	if errors.Is(err, pgx.ErrNoRows) {
145
		return noteAuthorModel{} //nolint:exhaustruct
146
	}
147
148
	e.require.NoError(err)
149
	return na
150
}
151
152
type userVerificationToken struct {
153
	Token  string
154
	UsedAt *time.Time
155
}
156
157
func (e *AppTestSuite) getVerificationTokenByUserID(u uuid.UUID) userVerificationToken {
158
	query, args, err := pgq.
159
		Select("token", "used_at").
160
		From("verification_tokens").
161
		Where(pgq.Eq{"user_id": u.String()}).
162
		SQL()
163
	e.require.NoError(err)
164
	var r userVerificationToken
165
	err = e.postgresDB.QueryRow(e.ctx, query, args...).Scan(&r.Token, &r.UsedAt)
166
	e.require.NoError(err)
167
	return r
168
}
169
170
func (e *AppTestSuite) getResetPasswordTokenByUserID(u uuid.UUID) userVerificationToken {
171
	query, args, err := pgq.
172
		Select("token", "used_at").
173
		From("password_reset_tokens ").
174
		Where(pgq.Eq{"user_id": u.String()}).
175
		Limit(1).
176
		SQL()
177
178
	e.require.NoError(err)
179
	var r userVerificationToken
180
	err = e.postgresDB.QueryRow(e.ctx, query, args...).Scan(&r.Token, &r.UsedAt)
181
	e.require.NoError(err)
182
	return r
183
}