From 293bce6150e3dc5161ff1b4b21c98dde5e992913 Mon Sep 17 00:00:00 2001 From: Fedor Korotkiy Date: Sat, 26 Mar 2022 20:41:17 +0300 Subject: [PATCH] Add dao. Simple sql task. --- dao/README.md | 10 +++++++++ dao/dao.go | 9 ++++++++ dao/dao_test.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ dao/model.go | 22 ++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 dao/README.md create mode 100644 dao/dao.go create mode 100644 dao/dao_test.go create mode 100644 dao/model.go diff --git a/dao/README.md b/dao/README.md new file mode 100644 index 0000000..9725811 --- /dev/null +++ b/dao/README.md @@ -0,0 +1,10 @@ +# dao + +В этой задаче вам нужно реализовать data access object для доступа к таблице пользователей. + +- Функция `CreateDao` должна создавать таблицу в базе данных. +- Метод `Create` должен создавать нового пользователя и назначать его `ID`. +- Метод `Update` меняет `Name` пользователя. +- Метод `Delete` удаляет пользователя из таблицы. +- Метод `Lookup` возвращает `Name` пользователя по `ID`. +- Метод `List` возвращает список все пользователей в таблице. diff --git a/dao/dao.go b/dao/dao.go new file mode 100644 index 0000000..4cadf5e --- /dev/null +++ b/dao/dao.go @@ -0,0 +1,9 @@ +//go:build !solution + +package dao + +import "context" + +func CreateDao(ctx context.Context, dsn string) (Dao, error) { + panic("not implemented") +} diff --git a/dao/dao_test.go b/dao/dao_test.go new file mode 100644 index 0000000..ebb1a4f --- /dev/null +++ b/dao/dao_test.go @@ -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"}, + }) +} diff --git a/dao/model.go b/dao/model.go new file mode 100644 index 0000000..d2cebbe --- /dev/null +++ b/dao/model.go @@ -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) + } +)