162 lines
4.1 KiB
Go
162 lines
4.1 KiB
Go
package postgres
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/assert"
|
|
"m8sh.su/d/jules/database"
|
|
)
|
|
|
|
func TestChats_Attach(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
user := setupTestUser(t, db)
|
|
|
|
t.Run("success", func(t *testing.T) {
|
|
err := db.chats.Attach(t.Context(), user.ID, "telegram", "@test_attach")
|
|
assert.NoError(t, err)
|
|
})
|
|
|
|
t.Run("already exists", func(t *testing.T) {
|
|
err := db.chats.Attach(t.Context(), user.ID, "telegram", "@test_attach")
|
|
assert.ErrorIs(t, err, database.ErrAlreadyExists)
|
|
})
|
|
|
|
t.Run("database error", func(t *testing.T) {
|
|
db2 := setupTestDB(t)
|
|
db2.Close()
|
|
err := db2.chats.Attach(t.Context(), user.ID, "whatsapp", "@test_attach")
|
|
assert.Error(t, err)
|
|
assert.NotErrorIs(t, err, database.ErrAlreadyExists)
|
|
})
|
|
}
|
|
|
|
func TestChats_GetUserID(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
user := setupTestUser(t, db)
|
|
|
|
err := db.chats.Attach(t.Context(), user.ID, "telegram", "@test_get")
|
|
assert.NoError(t, err)
|
|
|
|
t.Run("found", func(t *testing.T) {
|
|
got, err := db.chats.GetUserID(t.Context(), "telegram", "@test_get")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, user.ID, got)
|
|
})
|
|
|
|
t.Run("not found", func(t *testing.T) {
|
|
_, err := db.chats.GetUserID(t.Context(), "telegram", "@notfound")
|
|
assert.ErrorIs(t, err, database.ErrNotFound)
|
|
})
|
|
|
|
t.Run("database error", func(t *testing.T) {
|
|
db2 := setupTestDB(t)
|
|
db2.Close()
|
|
_, err := db2.chats.GetUserID(t.Context(), "telegram", "@test_get")
|
|
assert.Error(t, err)
|
|
assert.NotErrorIs(t, err, database.ErrNotFound)
|
|
})
|
|
}
|
|
|
|
func TestChats_List(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
user := setupTestUser(t, db)
|
|
db.chats.Attach(t.Context(), user.ID, "telegram", "@test")
|
|
db.chats.Attach(t.Context(), user.ID, "email", "test@example.com")
|
|
|
|
t.Run("success", func(t *testing.T) {
|
|
chats, err := db.chats.List(t.Context(), user.ID)
|
|
assert.NoError(t, err)
|
|
assert.Len(t, chats, 2)
|
|
})
|
|
|
|
t.Run("empty list", func(t *testing.T) {
|
|
otherUser := setupTestUser(t, db)
|
|
chats, err := db.chats.List(t.Context(), otherUser.ID)
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, chats)
|
|
})
|
|
|
|
t.Run("database error", func(t *testing.T) {
|
|
db.Close()
|
|
_, err := db.chats.List(t.Context(), user.ID)
|
|
assert.Error(t, err)
|
|
})
|
|
}
|
|
|
|
func TestChats_Detach(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
user := setupTestUser(t, db)
|
|
db.chats.Attach(t.Context(), user.ID, "telegram", "@test")
|
|
|
|
t.Run("success", func(t *testing.T) {
|
|
err := db.chats.Detach(t.Context(), user.ID, "telegram")
|
|
assert.NoError(t, err)
|
|
|
|
chats, _ := db.chats.List(t.Context(), user.ID)
|
|
assert.Empty(t, chats)
|
|
})
|
|
|
|
t.Run("not found", func(t *testing.T) {
|
|
err := db.chats.Detach(t.Context(), user.ID, "telegram")
|
|
assert.ErrorIs(t, err, database.ErrNotFound)
|
|
})
|
|
|
|
t.Run("database error", func(t *testing.T) {
|
|
db.Close()
|
|
err := db.chats.Detach(t.Context(), user.ID, "telegram")
|
|
assert.Error(t, err)
|
|
assert.NotErrorIs(t, err, database.ErrNotFound)
|
|
})
|
|
}
|
|
|
|
func TestChats_List_ScanError(t *testing.T) {
|
|
db := setupTestDB(t)
|
|
user := setupTestUser(t, db)
|
|
|
|
_, err := db.conn.ExecContext(t.Context(), `
|
|
ALTER TABLE chats ALTER COLUMN identifier DROP NOT NULL
|
|
`)
|
|
assert.NoError(t, err)
|
|
|
|
_, err = db.conn.ExecContext(t.Context(), `
|
|
INSERT INTO chats (user_id, platform, identifier)
|
|
VALUES ($1, 'telegram', NULL)
|
|
`, user.ID)
|
|
assert.NoError(t, err)
|
|
|
|
t.Cleanup(func() {
|
|
db.conn.ExecContext(t.Context(), `
|
|
DELETE FROM chats WHERE user_id = $1 AND platform = 'telegram'
|
|
`, user.ID)
|
|
db.conn.ExecContext(t.Context(), `
|
|
ALTER TABLE chats ALTER COLUMN identifier SET NOT NULL
|
|
`)
|
|
})
|
|
|
|
_, err = db.chats.List(t.Context(), user.ID)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestChats_List_RowsErr(t *testing.T) {
|
|
conn, mock, err := sqlmock.New()
|
|
assert.NoError(t, err)
|
|
defer conn.Close()
|
|
|
|
db := &Chats{conn: conn}
|
|
userID := uuid.New()
|
|
|
|
rows := sqlmock.NewRows([]string{"user_id", "platform", "identifier"}).
|
|
AddRow(uuid.New(), "telegram", "@test").
|
|
RowError(0, errors.New("connection lost"))
|
|
|
|
mock.ExpectQuery(`SELECT user_id, platform, identifier FROM chats WHERE user_id = \$1`).
|
|
WithArgs(userID).
|
|
WillReturnRows(rows)
|
|
|
|
_, err = db.List(t.Context(), userID)
|
|
assert.Error(t, err)
|
|
}
|