Implements GET /categories
Adds type to OpenAPI. Feature done and tested E2E. Adds common utilities package named "golang" to overcome language deficiencies. Issue #27
This commit is contained in:
parent
18c93b6c0f
commit
9ac249199b
@ -160,6 +160,22 @@ paths:
|
|||||||
"404":
|
"404":
|
||||||
description: Bank not found
|
description: Bank not found
|
||||||
|
|
||||||
|
/categories:
|
||||||
|
get:
|
||||||
|
summary: Retrive existing categories
|
||||||
|
operationId: getCategories
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: Successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/Category"
|
||||||
|
"204":
|
||||||
|
description: No categories
|
||||||
|
|
||||||
components:
|
components:
|
||||||
schemas:
|
schemas:
|
||||||
Transaction:
|
Transaction:
|
||||||
@ -204,3 +220,19 @@ components:
|
|||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
$ref: "#/components/schemas/Bank"
|
$ref: "#/components/schemas/Bank"
|
||||||
|
Category:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
group:
|
||||||
|
$ref: "#/components/schemas/CategoryGroup"
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
CategoryGroup:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
|||||||
@ -53,3 +53,18 @@ func convertBanks(bs entity.Banks) Banks {
|
|||||||
}
|
}
|
||||||
return ans
|
return ans
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func entity2category(cat entity.Category) Category {
|
||||||
|
if cat.Group != nil {
|
||||||
|
return Category{Name: cat.Name, Group: &CategoryGroup{*cat.Group}}
|
||||||
|
}
|
||||||
|
return Category{Name: cat.Name}
|
||||||
|
}
|
||||||
|
|
||||||
|
func entities2categories(cats entity.Categories) []Category {
|
||||||
|
var ans []Category
|
||||||
|
for _, cat := range cats {
|
||||||
|
ans = append(ans, entity2category(cat))
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|||||||
@ -117,3 +117,16 @@ func (server *ServerImpl) UpdateTransaction(ctx echo.Context, transactionId int6
|
|||||||
|
|
||||||
return ctx.JSON(http.StatusOK, entity2transaction(transaction))
|
return ctx.JSON(http.StatusOK, entity2transaction(transaction))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (server *ServerImpl) GetCategories(ctx echo.Context) error {
|
||||||
|
categories, err := server.Dal.Categories()
|
||||||
|
if err != nil {
|
||||||
|
return ctx.NoContent(http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(categories) == 0 {
|
||||||
|
return ctx.NoContent(http.StatusNoContent)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.JSON(http.StatusOK, entities2categories(categories))
|
||||||
|
}
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
"git.rosemyrtle.work/personal-finance/server/internal/dal"
|
"git.rosemyrtle.work/personal-finance/server/internal/dal"
|
||||||
"git.rosemyrtle.work/personal-finance/server/internal/entity"
|
"git.rosemyrtle.work/personal-finance/server/internal/entity"
|
||||||
|
"git.rosemyrtle.work/personal-finance/server/internal/golang"
|
||||||
"git.rosemyrtle.work/personal-finance/server/internal/mock"
|
"git.rosemyrtle.work/personal-finance/server/internal/mock"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
@ -363,3 +364,86 @@ func TestServerImpl_UpdateTransaction(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestServerImpl_GetCategories(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
defer ctrl.Finish()
|
||||||
|
|
||||||
|
m := mock.NewMockDAL(ctrl)
|
||||||
|
e := m.EXPECT()
|
||||||
|
|
||||||
|
type fields struct {
|
||||||
|
fn any // func(...any) *gomock.Call
|
||||||
|
args []any
|
||||||
|
returns any
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
type args struct {
|
||||||
|
method string
|
||||||
|
request string
|
||||||
|
}
|
||||||
|
type want struct {
|
||||||
|
status int
|
||||||
|
body string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
fields []fields
|
||||||
|
args args
|
||||||
|
want want
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"GetCategorySuccessful",
|
||||||
|
[]fields{
|
||||||
|
{e.Categories, []any{}, entity.Categories{{Name: "C1", Group: golang.StrPtr("G1")}}, nil},
|
||||||
|
},
|
||||||
|
args{"GET", ""},
|
||||||
|
want{200, `[{"group":{"name":"G1"},"name":"C1"}]`},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GetMultipleCategoriesSuccessful",
|
||||||
|
[]fields{
|
||||||
|
{e.Categories, []any{}, entity.Categories{{Name: "C1", Group: golang.StrPtr("G1")}, {Name: "C2"}}, nil},
|
||||||
|
},
|
||||||
|
args{"GET", ""},
|
||||||
|
want{200, `[{"group":{"name":"G1"},"name":"C1"},{"name":"C2"}]`},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GetNoCategories",
|
||||||
|
[]fields{
|
||||||
|
{e.Categories, []any{}, entity.Categories{}, nil},
|
||||||
|
},
|
||||||
|
args{"GET", ""},
|
||||||
|
want{204, ""},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
server := &ServerImpl{
|
||||||
|
Dal: m,
|
||||||
|
}
|
||||||
|
for _, expect := range tt.fields {
|
||||||
|
golang.Call(expect.fn, expect.args...).Return(expect.returns, expect.err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
req := httptest.NewRequest(tt.args.method, "/", strings.NewReader(tt.args.request))
|
||||||
|
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
|
||||||
|
ctx := echo.New().NewContext(req, rec)
|
||||||
|
|
||||||
|
if err := server.GetCategories(ctx); (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("ServerImpl.GetCategories() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
}
|
||||||
|
if got := rec.Code; !reflect.DeepEqual(got, tt.want.status) {
|
||||||
|
t.Errorf("ServerImpl.GetCategories() = %v, want %v", got, tt.name)
|
||||||
|
}
|
||||||
|
if got := strings.TrimSpace(rec.Body.String()); !reflect.DeepEqual(got, tt.want.body) {
|
||||||
|
t.Errorf("ServerImpl.GetCategories() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -29,6 +29,17 @@ type Bank struct {
|
|||||||
// Banks defines model for Banks.
|
// Banks defines model for Banks.
|
||||||
type Banks = []Bank
|
type Banks = []Bank
|
||||||
|
|
||||||
|
// Category defines model for Category.
|
||||||
|
type Category struct {
|
||||||
|
Group *CategoryGroup `json:"group,omitempty"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CategoryGroup defines model for CategoryGroup.
|
||||||
|
type CategoryGroup struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
// Transaction defines model for Transaction.
|
// Transaction defines model for Transaction.
|
||||||
type Transaction struct {
|
type Transaction struct {
|
||||||
Category *string `json:"category,omitempty"`
|
Category *string `json:"category,omitempty"`
|
||||||
@ -73,6 +84,9 @@ type ServerInterface interface {
|
|||||||
// Find bank by ID
|
// Find bank by ID
|
||||||
// (GET /banks/{bankId})
|
// (GET /banks/{bankId})
|
||||||
GetBankById(ctx echo.Context, bankId string) error
|
GetBankById(ctx echo.Context, bankId string) error
|
||||||
|
// Retrive existing categories
|
||||||
|
// (GET /categories)
|
||||||
|
GetCategories(ctx echo.Context) error
|
||||||
// Retrieve existing transactions
|
// Retrieve existing transactions
|
||||||
// (GET /transactions)
|
// (GET /transactions)
|
||||||
GetTransactions(ctx echo.Context, params GetTransactionsParams) error
|
GetTransactions(ctx echo.Context, params GetTransactionsParams) error
|
||||||
@ -117,6 +131,15 @@ func (w *ServerInterfaceWrapper) GetBankById(ctx echo.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetCategories converts echo context to params.
|
||||||
|
func (w *ServerInterfaceWrapper) GetCategories(ctx echo.Context) error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// Invoke the callback with all the unmarshaled arguments
|
||||||
|
err = w.Handler.GetCategories(ctx)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// GetTransactions converts echo context to params.
|
// GetTransactions converts echo context to params.
|
||||||
func (w *ServerInterfaceWrapper) GetTransactions(ctx echo.Context) error {
|
func (w *ServerInterfaceWrapper) GetTransactions(ctx echo.Context) error {
|
||||||
var err error
|
var err error
|
||||||
@ -234,6 +257,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
|
|||||||
|
|
||||||
router.GET(baseURL+"/banks", wrapper.GetBanks)
|
router.GET(baseURL+"/banks", wrapper.GetBanks)
|
||||||
router.GET(baseURL+"/banks/:bankId", wrapper.GetBankById)
|
router.GET(baseURL+"/banks/:bankId", wrapper.GetBankById)
|
||||||
|
router.GET(baseURL+"/categories", wrapper.GetCategories)
|
||||||
router.GET(baseURL+"/transactions", wrapper.GetTransactions)
|
router.GET(baseURL+"/transactions", wrapper.GetTransactions)
|
||||||
router.POST(baseURL+"/transactions", wrapper.CreateTransaction)
|
router.POST(baseURL+"/transactions", wrapper.CreateTransaction)
|
||||||
router.GET(baseURL+"/transactions/:transactionId", wrapper.GetTransactionById)
|
router.GET(baseURL+"/transactions/:transactionId", wrapper.GetTransactionById)
|
||||||
@ -244,23 +268,24 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
|
|||||||
// Base64 encoded, gzipped, json marshaled Swagger object
|
// Base64 encoded, gzipped, json marshaled Swagger object
|
||||||
var swaggerSpec = []string{
|
var swaggerSpec = []string{
|
||||||
|
|
||||||
"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",
|
||||||
"AP//Ba56DmsPAAA=",
|
"rzREr/piMOb+6PtBjHn/mpDQzs6w+qmrJsP246Tarv/v5jVIfQMluHwLJQigVsQc2knsntUagWvC5Kwi",
|
||||||
|
"+8r/DwAA//8OAsybgxEAAA==",
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSwagger returns the content of the embedded swagger specification file
|
// GetSwagger returns the content of the embedded swagger specification file
|
||||||
|
|||||||
@ -10,6 +10,7 @@ type DAL interface {
|
|||||||
TransactionExists(uint64) (bool, error)
|
TransactionExists(uint64) (bool, error)
|
||||||
Bank(bankId string) (*entity.Bank, error)
|
Bank(bankId string) (*entity.Bank, error)
|
||||||
Banks() (entity.Banks, error)
|
Banks() (entity.Banks, error)
|
||||||
|
Categories() (entity.Categories, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:generate go run go.uber.org/mock/mockgen@latest -destination=../mock/mock_dal.gen.go -package=mock . DAL
|
//go:generate go run go.uber.org/mock/mockgen@latest -destination=../mock/mock_dal.gen.go -package=mock . DAL
|
||||||
|
|||||||
@ -157,3 +157,18 @@ func (dal *DalImpl) Banks() (entity.Banks, error) {
|
|||||||
|
|
||||||
return convert[entity.Bank](rows), nil
|
return convert[entity.Bank](rows), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (dal *DalImpl) Categories() (entity.Categories, error) {
|
||||||
|
log.Print("DAL::Categories")
|
||||||
|
|
||||||
|
if dal.Db == nil {
|
||||||
|
log.Panic("database not available")
|
||||||
|
}
|
||||||
|
|
||||||
|
rows, err := dal.Db.Query("SELECT c.name, c.group FROM pfbudget.categories c")
|
||||||
|
if err != nil {
|
||||||
|
return []entity.Category{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return convert[entity.Category](rows), nil
|
||||||
|
}
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosemyrtle.work/personal-finance/server/internal/entity"
|
"git.rosemyrtle.work/personal-finance/server/internal/entity"
|
||||||
|
"git.rosemyrtle.work/personal-finance/server/internal/golang"
|
||||||
"github.com/DATA-DOG/go-sqlmock"
|
"github.com/DATA-DOG/go-sqlmock"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/shopspring/decimal"
|
"github.com/shopspring/decimal"
|
||||||
@ -424,3 +425,64 @@ func TestDalImpl_TransactionExists(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDalImpl_Categories(t *testing.T) {
|
||||||
|
db, mock, err := sqlmock.New()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type fields struct {
|
||||||
|
Db *sql.DB
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
fields fields
|
||||||
|
mocks [][]driver.Value
|
||||||
|
want entity.Categories
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"SelectCategories",
|
||||||
|
fields{db},
|
||||||
|
[][]driver.Value{{"C1", "G1"}},
|
||||||
|
entity.Categories{{Name: "C1", Group: golang.StrPtr("G1")}},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"SelectMutipleCategories",
|
||||||
|
fields{db},
|
||||||
|
[][]driver.Value{{"C1", "G1"}, {"C2", nil}},
|
||||||
|
entity.Categories{{Name: "C1", Group: golang.StrPtr("G1")}, {Name: "C2"}},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"SelectNoCategories",
|
||||||
|
fields{db},
|
||||||
|
[][]driver.Value{},
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
dal := &DalImpl{
|
||||||
|
Db: tt.fields.Db,
|
||||||
|
}
|
||||||
|
|
||||||
|
mock.
|
||||||
|
ExpectQuery(`SELECT \w+\.name, \w+\.group FROM \w+.categories \w+`).
|
||||||
|
WithoutArgs().
|
||||||
|
WillReturnRows(mock.NewRows([]string{"name", "group"}).AddRows(tt.mocks...))
|
||||||
|
|
||||||
|
got, err := dal.Categories()
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("DalImpl.Categories() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got, tt.want) {
|
||||||
|
t.Errorf("DalImpl.Categories() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -25,3 +25,16 @@ type Bank struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Banks = []Bank
|
type Banks = []Bank
|
||||||
|
|
||||||
|
type Category struct {
|
||||||
|
Name string
|
||||||
|
Group *string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Categories = []Category
|
||||||
|
|
||||||
|
type CategoryGroup struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
type CategoryGroups = []CategoryGroup
|
||||||
|
|||||||
17
internal/golang/type.go
Normal file
17
internal/golang/type.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package golang
|
||||||
|
|
||||||
|
import "go.uber.org/mock/gomock"
|
||||||
|
|
||||||
|
func StrPtr(s string) *string { return &s }
|
||||||
|
|
||||||
|
func Call(fn any, args ...any) *gomock.Call {
|
||||||
|
switch fn := fn.(type) {
|
||||||
|
case func() *gomock.Call:
|
||||||
|
return fn()
|
||||||
|
case func(any) *gomock.Call:
|
||||||
|
return fn(args[0])
|
||||||
|
case func(any, any) *gomock.Call:
|
||||||
|
return fn(args[0], args[1])
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@ -69,6 +69,21 @@ func (mr *MockDALMockRecorder) Banks() *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Banks", reflect.TypeOf((*MockDAL)(nil).Banks))
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Banks", reflect.TypeOf((*MockDAL)(nil).Banks))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Categories mocks base method.
|
||||||
|
func (m *MockDAL) Categories() ([]entity.Category, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Categories")
|
||||||
|
ret0, _ := ret[0].([]entity.Category)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Categories indicates an expected call of Categories.
|
||||||
|
func (mr *MockDALMockRecorder) Categories() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Categories", reflect.TypeOf((*MockDAL)(nil).Categories))
|
||||||
|
}
|
||||||
|
|
||||||
// InsertTransaction mocks base method.
|
// InsertTransaction mocks base method.
|
||||||
func (m *MockDAL) InsertTransaction(arg0 entity.Transaction) (entity.Transaction, error) {
|
func (m *MockDAL) InsertTransaction(arg0 entity.Transaction) (entity.Transaction, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user