all repos

onasty @ abf0cb5582f45940ba0ad8e6312986a02a63c769

a one-time notes service

onasty/e2e/e2e_utils_db_test.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
feat: keep metadate on note removal (#96)..., 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
type noteModel struct {
95
	ID                   uuid.UUID
96
	Content              string
97
	Slug                 string
98
	BurnBeforeExpiration bool
99
	Password             string
100
	IsRead               bool
101
	ReadAt               *time.Time
102
	CreatedAt            time.Time
103
	ExpiresAt            time.Time
104
}
105
106
func (e *AppTestSuite) getNoteFromDBbySlug(slug string) noteModel {
107
	query, args, err := pgq.
108
		Select(
109
			"id",
110
			"content",
111
			"slug",
112
			"burn_before_expiration",
113
			"read_at",
114
			"created_at",
115
			"expires_at",
116
		).
117
		From("notes").
118
		Where(pgq.Eq{"slug": slug}).
119
		SQL()
120
	e.require.NoError(err)
121
122
	var note noteModel
123
	err = e.postgresDB.QueryRow(e.ctx, query, args...).
124
		Scan(&note.ID, &note.Content, &note.Slug, &note.BurnBeforeExpiration, &note.ReadAt, &note.CreatedAt, &note.ExpiresAt)
125
	if errors.Is(err, pgx.ErrNoRows) {
126
		return noteModel{} //nolint:exhaustruct
127
	}
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
	UsedAt *time.Time
161
}
162
163
func (e *AppTestSuite) getVerificationTokenByUserID(u uuid.UUID) userVerificationToken {
164
	query, args, err := pgq.
165
		Select("token", "used_at").
166
		From("verification_tokens").
167
		Where(pgq.Eq{"user_id": u.String()}).
168
		SQL()
169
	e.require.NoError(err)
170
	var r userVerificationToken
171
	err = e.postgresDB.QueryRow(e.ctx, query, args...).Scan(&r.Token, &r.UsedAt)
172
	e.require.NoError(err)
173
	return r
174
}