Skip to content

Commit

Permalink
working on pr
Browse files Browse the repository at this point in the history
  • Loading branch information
alexlzrv committed Oct 15, 2023
1 parent 70f1e20 commit 85281de
Show file tree
Hide file tree
Showing 8 changed files with 1,097 additions and 1 deletion.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ module github.com/mayr0y/animated-octo-couscous.git
go 1.20

require (
github.com/DATA-DOG/go-sqlmock v1.5.0
github.com/caarlos0/env/v6 v6.10.1
github.com/go-chi/chi/v5 v5.0.8
github.com/golang/mock v1.6.0
github.com/jackc/pgx/v5 v5.3.1
github.com/shirou/gopsutil/v3 v3.23.5
github.com/sirupsen/logrus v1.9.2
Expand Down
27 changes: 27 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/caarlos0/env/v6 v6.10.1 h1:t1mPSxNpei6M5yAeu1qtRdPAK29Nbcf/n3G7x+b3/II=
github.com/caarlos0/env/v6 v6.10.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Zu0ddvwc=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
Expand All @@ -9,6 +11,8 @@ github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=
github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
Expand Down Expand Up @@ -51,26 +55,49 @@ github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+Kd
github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a h1:Jw5wfR+h9mnIYH+OtGT2im5wV1YGGDora5vTv/aa5bE=
golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.9.4-0.20230601214343-86c93e8732cc h1:mqZawFxUzsv+YVwGQO30cZegeV/YD6dAwsdGxi0tQQg=
golang.org/x/tools v0.9.4-0.20230601214343-86c93e8732cc/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Expand Down
2 changes: 1 addition & 1 deletion internal/analyzer/testdata/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ import (
)

func main() {
os.Exit(1) // want `call to os.Exit\(\) in main`
os.Exit(1)
}
50 changes: 50 additions & 0 deletions internal/greetings/greetings_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package greetings

import "testing"

func TestHello(t *testing.T) {
type args struct {
buildVersion string
buildDate string
buildCommit string
}
tests := []struct {
name string
args args
want *Greetings
}{
{
name: "check emty",
args: args{
buildVersion: "",
buildDate: "",
buildCommit: "",
},
want: &Greetings{
BuildVersion: "N/A",
BuildDate: "N/A",
BuildCommit: "N/A",
},
},
{
name: "check positive test",
args: args{
buildVersion: "1",
buildDate: "2",
buildCommit: "3",
},
want: &Greetings{
BuildVersion: "1",
BuildDate: "2",
BuildCommit: "3",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := Hello(tt.args.buildVersion, tt.args.buildDate, tt.args.buildCommit); err != nil {
t.Errorf("Hello() error = %v, wantErr %v", err, tt.want)
}
})
}
}
4 changes: 4 additions & 0 deletions internal/pkg/storage/dbstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ type DBStore struct {
connection *sql.DB
}

func NewDBStore(db *sql.DB) *DBStore {
return &DBStore{connection: db}
}

func NewDBMetrics(databaseDSN string) (*DBStore, error) {
db, err := sql.Open(driverName, databaseDSN)
if err != nil {
Expand Down
230 changes: 230 additions & 0 deletions internal/pkg/storage/dbstore_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
package storage

import (
"context"
"errors"
"testing"

"github.com/DATA-DOG/go-sqlmock"
_ "github.com/jackc/pgx/v5/stdlib"
"github.com/mayr0y/animated-octo-couscous.git/internal/pkg/metrics"
"github.com/stretchr/testify/assert"
)

func TestDBStore_UpdateCounterMetric(t *testing.T) {
ctx := context.Background()

db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()

r := NewDBStore(db)

type args struct {
ctx context.Context
name string
value metrics.Counter
}

type mockBehavior func(args args, value metrics.Counter)

tests := []struct {
name string
mock mockBehavior
input args
want metrics.Counter
wantErr bool
}{
{
name: "ok",
input: args{
ctx: ctx,
name: "test",
value: 1,
},
want: 1,
mock: func(args args, value metrics.Counter) {
mock.ExpectBegin()

mock.ExpectQuery("INSERT INTO counter").
WithArgs(args.name, args.value).
WillReturnRows(mock.NewRows([]string{"value"}).AddRow(value))

mock.ExpectCommit()
},
},
{
name: "failed test",
input: args{
ctx: ctx,
name: "test",
value: 1,
},
want: 1,
mock: func(args args, value metrics.Counter) {
mock.ExpectBegin()

mock.ExpectQuery("INSERT INTO counter").
WithArgs(args.name, args.value).
WillReturnRows(mock.NewRows([]string{"value"}).
AddRow(value).
RowError(0, errors.New("insert error")))

mock.ExpectCommit()
},
wantErr: true,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := r.UpdateCounterMetric(tt.input.ctx, tt.input.name, tt.input.value)
if tt.wantErr {
assert.Error(t, err)
}
assert.NoError(t, mock.ExpectationsWereMet())
})
}
}

func TestDBStore_UpdateGaugeMetric(t *testing.T) {
ctx := context.Background()

db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()

r := NewDBStore(db)

type args struct {
ctx context.Context
name string
value metrics.Gauge
}

type mockBehavior func(args args, value metrics.Gauge)

tests := []struct {
name string
mock mockBehavior
input args
want metrics.Gauge
wantErr bool
}{
{
name: "ok",
input: args{
ctx: ctx,
name: "test",
value: 1.0,
},
want: 1.0,
mock: func(args args, value metrics.Gauge) {
mock.ExpectBegin()

mock.ExpectQuery("INSERT INTO gauge").
WithArgs(args.name, args.value).
WillReturnRows(mock.NewRows([]string{"value"}).AddRow(value))

mock.ExpectCommit()
},
},
{
name: "failed test",
input: args{
ctx: ctx,
name: "test",
value: 1.0,
},
want: 1,
mock: func(args args, value metrics.Gauge) {
mock.ExpectBegin()

mock.ExpectQuery("INSERT INTO gauge").
WithArgs(args.name, args.value).
WillReturnRows(mock.NewRows([]string{"value"}).
AddRow(value).
RowError(0, errors.New("insert error")))

mock.ExpectCommit()
},
wantErr: true,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := r.UpdateGaugeMetric(tt.input.ctx, tt.input.name, tt.input.value)
if tt.wantErr {
assert.Error(t, err)
}
assert.NoError(t, mock.ExpectationsWereMet())
})
}
}

func TestDBStore_Ping(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()

r := NewDBStore(db)

tests := []struct {
name string
args *sqlmock.ExpectedPing
wantErr bool
}{
{
name: "ok",
args: mock.ExpectPing(),
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := r.Ping()
if tt.wantErr {
assert.Error(t, err)
}
assert.NoError(t, mock.ExpectationsWereMet())
})
}
}

func TestDBStore_Close(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()

r := NewDBStore(db)

tests := []struct {
name string
args *sqlmock.ExpectedClose
wantErr bool
}{
{
name: "ok",
args: mock.ExpectClose(),
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := r.Close()
if tt.wantErr {
assert.Error(t, err)
}
assert.NoError(t, mock.ExpectationsWereMet())
})
}
}
Loading

0 comments on commit 85281de

Please sign in to comment.