Add dao. Simple sql task.

This commit is contained in:
Fedor Korotkiy 2022-03-26 20:41:17 +03:00
parent 1fcb89a4c6
commit 293bce6150
4 changed files with 96 additions and 0 deletions

10
dao/README.md Normal file
View file

@ -0,0 +1,10 @@
# dao
В этой задаче вам нужно реализовать data access object для доступа к таблице пользователей.
- Функция `CreateDao` должна создавать таблицу в базе данных.
- Метод `Create` должен создавать нового пользователя и назначать его `ID`.
- Метод `Update` меняет `Name` пользователя.
- Метод `Delete` удаляет пользователя из таблицы.
- Метод `Lookup` возвращает `Name` пользователя по `ID`.
- Метод `List` возвращает список все пользователей в таблице.

9
dao/dao.go Normal file
View file

@ -0,0 +1,9 @@
//go:build !solution
package dao
import "context"
func CreateDao(ctx context.Context, dsn string) (Dao, error) {
panic("not implemented")
}

55
dao/dao_test.go Normal file
View file

@ -0,0 +1,55 @@
package dao
import (
"context"
"database/sql"
"sort"
"testing"
"github.com/stretchr/testify/require"
"gitlab.com/slon/shad-go/pgfixture"
)
func TestDao(t *testing.T) {
dsn := pgfixture.Start(t)
ctx := context.Background()
dao, err := CreateDao(ctx, dsn)
require.NoError(t, err)
_, err = dao.Lookup(ctx, 42)
require.ErrorIs(t, err, sql.ErrNoRows)
aliceID, err := dao.Create(ctx, &User{Name: "Alice"})
require.NoError(t, err)
bobID, err := dao.Create(ctx, &User{Name: "Bob"})
require.NoError(t, err)
charlieID, err := dao.Create(ctx, &User{Name: "Charie"})
require.NoError(t, err)
require.Len(t, map[UserID]struct{}{aliceID: {}, bobID: {}, charlieID: {}}, 3)
alice, err := dao.Lookup(ctx, aliceID)
require.NoError(t, err)
require.Equal(t, alice, User{ID: aliceID, Name: "Alice"})
require.NoError(t, dao.Delete(ctx, bobID))
_, err = dao.Lookup(ctx, bobID)
require.ErrorIs(t, err, sql.ErrNoRows)
require.NoError(t, dao.Update(ctx, &User{ID: charlieID, Name: "Chaplin"}))
users, err := dao.List(ctx)
require.NoError(t, err)
sort.Slice(users, func(i, j int) bool {
return users[i].Name < users[j].Name
})
require.Equal(t, users, []User{
{ID: aliceID, Name: "Alice"},
{ID: charlieID, Name: "Chaplin"},
})
}

22
dao/model.go Normal file
View file

@ -0,0 +1,22 @@
package dao
import (
"context"
)
type (
UserID int
User struct {
ID UserID
Name string
}
Dao interface {
Create(ctx context.Context, u *User) (UserID, error)
Update(ctx context.Context, u *User) error
Delete(ctx context.Context, id UserID) error
Lookup(ctx context.Context, id UserID) (User, error)
List(ctx context.Context) ([]User, error)
}
)