138 lines
3.5 KiB
Go
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)
|
|
}
|