Add dao. Simple sql task.
This commit is contained in:
parent
1fcb89a4c6
commit
293bce6150
4 changed files with 96 additions and 0 deletions
10
dao/README.md
Normal file
10
dao/README.md
Normal 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
9
dao/dao.go
Normal 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
55
dao/dao_test.go
Normal 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
22
dao/model.go
Normal 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)
|
||||||
|
}
|
||||||
|
)
|
Loading…
Reference in a new issue