all repos

onasty @ 33a27b8

a one-time notes service

onasty/e2e/e2e_utils_db_test.go (view raw)

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