Files
2026-06-06 18:52:20 +03:00

138 lines
3.5 KiB
Go

package postgres
import (
"errors"
"testing"
"github.com/DATA-DOG/go-sqlmock"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"m8sh.su/d/jules/database"
)
func TestContacts_Add(t *testing.T) {
db := setupTestDB(t)
owner := setupTestUser(t, db)
target := setupTestUser(t, db)
contact := &database.Contact{
OwnerID: owner.ID,
TargetID: target.ID,
Name: "брат",
}
t.Run("success", func(t *testing.T) {
err := db.contacts.Add(t.Context(), contact)
require.NoError(t, err)
})
t.Run("already exists", func(t *testing.T) {
err := db.contacts.Add(t.Context(), contact)
assert.ErrorIs(t, err, database.ErrAlreadyExists)
})
t.Run("database error", func(t *testing.T) {
db.Close()
err := db.contacts.Add(t.Context(), contact)
assert.Error(t, err)
assert.NotErrorIs(t, err, database.ErrAlreadyExists)
})
}
func TestContacts_List(t *testing.T) {
db := setupTestDB(t)
owner := setupTestUser(t, db)
target1 := setupTestUser(t, db)
target2 := setupTestUser(t, db)
db.contacts.Add(t.Context(), &database.Contact{OwnerID: owner.ID, TargetID: target1.ID, Name: "брат"})
db.contacts.Add(t.Context(), &database.Contact{OwnerID: owner.ID, TargetID: target2.ID, Name: "друг"})
t.Run("success", func(t *testing.T) {
contacts, err := db.contacts.List(t.Context(), owner.ID)
require.NoError(t, err)
assert.Len(t, contacts, 2)
})
t.Run("empty", func(t *testing.T) {
other := setupTestUser(t, db)
contacts, err := db.contacts.List(t.Context(), other.ID)
require.NoError(t, err)
assert.Empty(t, contacts)
})
t.Run("database error", func(t *testing.T) {
db.Close()
_, err := db.contacts.List(t.Context(), owner.ID)
assert.Error(t, err)
})
}
func TestContacts_Delete(t *testing.T) {
db := setupTestDB(t)
owner := setupTestUser(t, db)
target := setupTestUser(t, db)
db.contacts.Add(t.Context(), &database.Contact{OwnerID: owner.ID, TargetID: target.ID, Name: "брат"})
t.Run("success", func(t *testing.T) {
err := db.contacts.Delete(t.Context(), owner.ID, target.ID)
require.NoError(t, err)
contacts, _ := db.contacts.List(t.Context(), owner.ID)
assert.Empty(t, contacts)
})
t.Run("not found", func(t *testing.T) {
err := db.contacts.Delete(t.Context(), owner.ID, uuid.New())
assert.ErrorIs(t, err, database.ErrNotFound)
})
t.Run("database error", func(t *testing.T) {
db.Close()
err := db.contacts.Delete(t.Context(), owner.ID, target.ID)
assert.Error(t, err)
assert.NotErrorIs(t, err, database.ErrNotFound)
})
}
func TestContacts_List_ScanError(t *testing.T) {
conn, mock, err := sqlmock.New()
require.NoError(t, err)
defer conn.Close()
db := &Contacts{conn: conn}
ownerID := uuid.New()
rows := sqlmock.NewRows([]string{"owner_id", "target_id", "name"}).
AddRow(uuid.New(), uuid.New(), nil) // NULL в name
mock.ExpectQuery(`SELECT owner_id, target_id, name FROM contacts WHERE owner_id = \$1`).
WithArgs(ownerID).
WillReturnRows(rows)
_, err = db.List(t.Context(), ownerID)
assert.Error(t, err)
}
func TestContacts_List_RowsErr(t *testing.T) {
conn, mock, err := sqlmock.New()
require.NoError(t, err)
defer conn.Close()
db := &Contacts{conn: conn}
ownerID := uuid.New()
rows := sqlmock.NewRows([]string{"owner_id", "target_id", "name"}).
AddRow(uuid.New(), uuid.New(), "брат").
RowError(0, errors.New("connection lost"))
mock.ExpectQuery(`SELECT owner_id, target_id, name FROM contacts WHERE owner_id = \$1`).
WithArgs(ownerID).
WillReturnRows(rows)
_, err = db.List(t.Context(), ownerID)
assert.Error(t, err)
}