all repos

onasty @ 39d6b8e

a one-time notes service

onasty/e2e/e2e_utils_db_test.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
feat: notes manipulations for the note authors (#117)..., 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
			"password",
108
			"read_at",
109
			"created_at",
110
			"expires_at",
111
		).
112
		From("notes").
113
		Where(pgq.Eq{"slug": slug}).
114
		SQL()
115
	e.require.NoError(err)
116
117
	var note models.Note
118
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
119
		Scan(&note.ID, &note.Content, &note.Slug, &note.BurnBeforeExpiration, &note.Password, &note.ReadAt, &note.CreatedAt, &note.ExpiresAt)
120
	if errors.Is(err, pgx.ErrNoRows) {
121
		return models.Note{} //nolint:exhaustruct
122
	}
123
124
	e.require.NoError(err)
125
	return note
126
}
127
128
type noteAuthorModel struct {
129
	noteID uuid.UUID
130
	userID uuid.UUID
131
}
132
133
func (e *AppTestSuite) getLastNoteAuthorsRecordByAuthorID(uid uuid.UUID) noteAuthorModel {
134
	qeuery, args, err := pgq.
135
		Select("note_id", "user_id").
136
		From("notes_authors").
137
		Where(pgq.Eq{"user_id": uid.String()}).
138
		OrderBy("created_at DESC").
139
		Limit(1).
140
		SQL()
141
	e.require.NoError(err)
142
143
	var na noteAuthorModel
144
	err = e.postgresDB.QueryRow(e.ctx, qeuery, args...).Scan(&na.noteID, &na.userID)
145
	if errors.Is(err, pgx.ErrNoRows) {
146
		return noteAuthorModel{} //nolint:exhaustruct
147
	}
148
149
	e.require.NoError(err)
150
	return na
151
}
152
153
type userVerificationToken struct {
154
	Token  string
155
	UsedAt *time.Time
156
}
157
158
func (e *AppTestSuite) getVerificationTokenByUserID(u uuid.UUID) userVerificationToken {
159
	query, args, err := pgq.
160
		Select("token", "used_at").
161
		From("verification_tokens").
162
		Where(pgq.Eq{"user_id": u.String()}).
163
		SQL()
164
	e.require.NoError(err)
165
	var r userVerificationToken
166
	err = e.postgresDB.QueryRow(e.ctx, query, args...).Scan(&r.Token, &r.UsedAt)
167
	e.require.NoError(err)
168
	return r
169
}
170
171
func (e *AppTestSuite) getResetPasswordTokenByUserID(u uuid.UUID) userVerificationToken {
172
	query, args, err := pgq.
173
		Select("token", "used_at").
174
		From("password_reset_tokens ").
175
		Where(pgq.Eq{"user_id": u.String()}).
176
		Limit(1).
177
		SQL()
178
179
	e.require.NoError(err)
180
	var r userVerificationToken
181
	err = e.postgresDB.QueryRow(e.ctx, query, args...).Scan(&r.Token, &r.UsedAt)
182
	e.require.NoError(err)
183
	return r
184
}