From b6e3fb85962e565cc90f7e9236bf724b7f43699a Mon Sep 17 00:00:00 2001 From: Fedorov Vladimir Date: Sat, 14 Jun 2025 23:18:05 +0700 Subject: [PATCH] add teams tests --- Makefile | 2 +- go.mod | 19 ++++++-- internal/services/mappers.go | 7 ++- internal/services/repository.go | 11 ++++- internal/tests/client.go | 34 ++++++++++++++ internal/tests/teams_test.go | 79 +++++++++++++++++++++++++++++++++ 6 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 internal/tests/teams_test.go diff --git a/Makefile b/Makefile index 4d0cbda..de883b9 100644 --- a/Makefile +++ b/Makefile @@ -23,4 +23,4 @@ clear: rm ./internal/tests/store.db test: - go test ./... + DB_FILENAME=store.db go test -count=1 ./... diff --git a/go.mod b/go.mod index 1931743..6e4b8a0 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,29 @@ module evening_detective -go 1.22 +go 1.23 + +toolchain go1.23.10 require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 google.golang.org/grpc v1.64.0 ) +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/stretchr/testify v1.10.0 + gopkg.in/yaml.v3 v3.0.1 // indirect +) + require ( github.com/mattn/go-sqlite3 v1.14.28 golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.26.0 // indirect golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/protobuf v1.34.1 ) diff --git a/internal/services/mappers.go b/internal/services/mappers.go index 248a123..c09d209 100644 --- a/internal/services/mappers.go +++ b/internal/services/mappers.go @@ -4,6 +4,7 @@ import ( "evening_detective/internal/models" "evening_detective/internal/services/story_service" "evening_detective/proto" + "strings" ) func mapTeamsToTeamAdvanced(team *models.Team) *proto.TeamAdvanced { @@ -24,7 +25,7 @@ func mapTeamsToTeamFull(team *models.Team) *proto.TeamFull { func mapProtoTeamsToTeam(team *proto.Team) *models.Team { return &models.Team{ - Name: team.Name, + Name: clearTeamName(team.Name), } } @@ -85,3 +86,7 @@ func mapProtoApplicationToApplication(items *proto.Application) *models.Applicat ID: items.Id, } } + +func clearTeamName(code string) string { + return strings.TrimSpace(code) +} diff --git a/internal/services/repository.go b/internal/services/repository.go index 8abc42e..1c3d0af 100644 --- a/internal/services/repository.go +++ b/internal/services/repository.go @@ -20,7 +20,7 @@ func NewRepository(filepath string) (*Repository, error) { return nil, err } log.Printf("load db from: %s", filepath) - _, err = db.Exec("CREATE TABLE IF NOT EXISTS teams (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, password TEXT);") + _, err = db.Exec("CREATE TABLE IF NOT EXISTS teams (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL CHECK(length(trim(name)) > 0), password TEXT);") if err != nil { return nil, err } @@ -39,6 +39,10 @@ func NewRepository(filepath string) (*Repository, error) { return &Repository{db: db}, nil } +func (r *Repository) Close() { + r.db.Close() +} + func (r *Repository) GetTeams(ctx context.Context) ([]*models.Team, error) { rows, err := r.db.Query("select id, name, password from teams") if err != nil { @@ -192,3 +196,8 @@ func (r *Repository) GameUpdateState(ctx context.Context, state string) error { _, err := r.db.Exec("update games set state = $1", state) return err } + +func (r *Repository) DeleteAllTeams(ctx context.Context) error { + _, err := r.db.Exec("delete from teams where 1") + return err +} diff --git a/internal/tests/client.go b/internal/tests/client.go index c649451..90f29d9 100644 --- a/internal/tests/client.go +++ b/internal/tests/client.go @@ -3,10 +3,14 @@ package tests import ( "context" "log" + "testing" "time" + "evening_detective/internal/config" + "evening_detective/internal/services" pb "evening_detective/proto" + "github.com/stretchr/testify/assert" "google.golang.org/grpc" ) @@ -21,3 +25,33 @@ func getClient() (pb.EveningDetectiveClient, func() error) { func getContext() (context.Context, context.CancelFunc) { return context.WithTimeout(context.Background(), time.Second) } + +func deleteTeams(t *testing.T) { + dbFilepath := config.GetDBFilepath() + repository, err := services.NewRepository(dbFilepath) + if err != nil { + assert.Nil(t, err, "подключение к базе") + } + defer repository.Close() + + err = repository.DeleteAllTeams(context.Background()) + assert.Nil(t, err, "команды удалены") +} + +func createTeam(client pb.EveningDetectiveClient, name string) (*pb.AddTeamsRsp, error) { + ctx, cancel := getContext() + defer cancel() + req := &pb.AddTeamsReq{ + Teams: []*pb.Team{ + {Name: name}, + }, + } + return client.AddTeams(ctx, req) +} + +func getTeams(client pb.EveningDetectiveClient) (*pb.GetTeamsRsp, error) { + ctx, cancel := getContext() + defer cancel() + req := &pb.GetTeamsReq{} + return client.GetTeams(ctx, req) +} diff --git a/internal/tests/teams_test.go b/internal/tests/teams_test.go new file mode 100644 index 0000000..ab7cb5f --- /dev/null +++ b/internal/tests/teams_test.go @@ -0,0 +1,79 @@ +package tests + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCreateTeam(t *testing.T) { + client, close := getClient() + defer close() + + createTeamResp, err := createTeam(client, "Тестовая команда") + assert.Nil(t, err, "запрос отправлен успешно") + assert.Equal(t, len(createTeamResp.Teams), 1, "количество команд равно 1") + assert.Equal(t, createTeamResp.Teams[0].Name, "Тестовая команда") + + getTeamsResp, err := getTeams(client) + assert.Nil(t, err, "запрос отправлен успешно") + assert.Equal(t, len(getTeamsResp.Teams), 1, "количество команд равно 1") + assert.Equal(t, getTeamsResp.Teams[0].Name, "Тестовая команда") + + deleteTeams(t) +} + +func TestCreateTeamWithEmptyName(t *testing.T) { + client, close := getClient() + defer close() + + _, err := createTeam(client, "") + assert.NotNil(t, err, "запрос не удался") + + deleteTeams(t) +} + +func TestCreateTwoTeam(t *testing.T) { + client, close := getClient() + defer close() + + _, err := createTeam(client, "Тестовая команда 1") + assert.Nil(t, err, "запрос отправлен успешно") + + _, err = createTeam(client, "Тестовая команда 2") + assert.Nil(t, err, "запрос отправлен успешно") + + getTeamsResp, err := getTeams(client) + assert.Nil(t, err, "запрос отправлен успешно") + assert.Equal(t, len(getTeamsResp.Teams), 2, "количество команд равно 2") + assert.Equal(t, getTeamsResp.Teams[0].Name, "Тестовая команда 1") + assert.Equal(t, getTeamsResp.Teams[1].Name, "Тестовая команда 2") + + deleteTeams(t) +} + +func TestCreateTwoEqTeam(t *testing.T) { + client, close := getClient() + defer close() + + _, err := createTeam(client, "Тестовая команда") + assert.Nil(t, err, "запрос отправлен успешно") + + _, err = createTeam(client, "Тестовая команда") + assert.NotNil(t, err, "запрос не удался") + + deleteTeams(t) +} + +func TestCreateTwoBadTeam(t *testing.T) { + client, close := getClient() + defer close() + + _, err := createTeam(client, "Тестовая команда") + assert.Nil(t, err, "запрос отправлен успешно") + + _, err = createTeam(client, "Тестовая команда ") + assert.NotNil(t, err, "запрос не удался") + + deleteTeams(t) +}