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