Skip to content

Commit

Permalink
Write unit tests for owned vehicles
Browse files Browse the repository at this point in the history
  • Loading branch information
0xdev22 committed Jul 26, 2023
1 parent 270ca1d commit 274f419
Show file tree
Hide file tree
Showing 4 changed files with 295 additions and 0 deletions.
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,13 @@ require (
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 // indirect
github.com/aws/aws-sdk-go-v2/service/kms v1.20.7 // indirect
github.com/aws/smithy-go v1.13.5 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/containerd/containerd v1.6.19 // indirect
github.com/cpuguy83/dockercfg v0.3.1 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/docker/distribution v2.8.2+incompatible // indirect
github.com/docker/docker v23.0.6+incompatible // indirect
github.com/docker/go-units v0.5.0 // indirect
Expand All @@ -56,6 +58,7 @@ require (
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.3 // indirect
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect
github.com/imdario/mergo v0.3.15 // indirect
github.com/jcmturner/aescts/v2 v2.0.0 // indirect
github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect
Expand Down
9 changes: 9 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,9 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
Expand Down Expand Up @@ -154,6 +157,10 @@ github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g=
github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
Expand Down Expand Up @@ -357,6 +364,8 @@ github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/
github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8=
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw=
github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
Expand Down
269 changes: 269 additions & 0 deletions internal/repositories/owned_vehicles_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,269 @@
package repositories

import (
"context"
"fmt"
"testing"
"time"

gmodel "github.com/DIMO-Network/identity-api/graph/model"
"github.com/DIMO-Network/identity-api/internal/config"
"github.com/DIMO-Network/identity-api/internal/test"
"github.com/DIMO-Network/identity-api/models"
"github.com/DIMO-Network/shared/db"
"github.com/ethereum/go-ethereum/common"
"github.com/segmentio/ksuid"
"github.com/stretchr/testify/suite"
"github.com/testcontainers/testcontainers-go"
"github.com/volatiletech/null/v8"
"github.com/volatiletech/sqlboiler/v4/boil"
)

type OwnedVehiclesRepoTestSuite struct {
suite.Suite
ctx context.Context
pdb db.Store
container testcontainers.Container
repo VehiclesRepo
settings config.Settings
}

func (o *OwnedVehiclesRepoTestSuite) SetupSuite() {
o.ctx = context.Background()
o.pdb, o.container = test.StartContainerDatabase(o.ctx, o.T(), test.MigrationsDirRelPath)

o.settings = config.Settings{
DIMORegistryAddr: "0x4de1bcf2b7e851e31216fc07989caa902a604784",
DIMORegistryChainID: 80001,
}
o.repo = NewVehiclesRepo(o.pdb)
/* c := client.New(handler.NewDefaultServer(graph.NewExecutableSchema(graph.Config{Resolvers: &graph.Resolver{
Repo: ov,
}}))) */

}

// TearDownTest after each test truncate tables
func (s *OwnedVehiclesRepoTestSuite) TearDownTest() {
test.TruncateTables(s.pdb.DBS().Writer.DB, s.T())
}

// TearDownSuite cleanup at end by terminating container
func (o *OwnedVehiclesRepoTestSuite) TearDownSuite() {
fmt.Printf("shutting down postgres at with session: %s \n", o.container.SessionID())

if err := o.container.Terminate(o.ctx); err != nil {
o.T().Fatal(err)
}
}

// Test Runner
func TestOwnedVehiclesRepoTestSuite(t *testing.T) {
suite.Run(t, new(OwnedVehiclesRepoTestSuite))
}

/* Actual Tests */
func (o *OwnedVehiclesRepoTestSuite) Test_GetOwnedVehicles_Success() {
_, wallet, err := test.GenerateWallet()
o.NoError(err)

_, wallet2, err := test.GenerateWallet()
o.NoError(err)

currTime := time.Now().UTC().Truncate(time.Microsecond)
vehicles := []models.Vehicle{
{
ID: 1,
OwnerAddress: wallet.Bytes(),
Make: null.StringFrom("Toyota"),
Model: null.StringFrom("Camry"),
Year: null.IntFrom(2020),
MintedAt: currTime,
},
{
ID: 2,
OwnerAddress: wallet.Bytes(),
Make: null.StringFrom("Toyota"),
Model: null.StringFrom("Camry"),
Year: null.IntFrom(2022),
MintedAt: currTime,
},
}

for _, v := range vehicles {
if err := v.Insert(o.ctx, o.pdb.DBS().Writer, boil.Infer()); err != nil {
o.NoError(err)
}
}

privileges := []models.Privilege{
{
ID: ksuid.New().String(),
TokenID: 1,
PrivilegeID: 1,
GrantedToAddress: wallet2.Bytes(),
GrantedAt: currTime,
ExpiresAt: currTime,
},
}

for _, p := range privileges {
if err := p.Insert(o.ctx, o.pdb.DBS().Writer, boil.Infer()); err != nil {
o.NoError(err)
}
}

first := 3
res, err := o.repo.GetOwnedVehicles(o.ctx, *wallet, &first, nil)
o.NoError(err)

o.Equal(2, res.TotalCount)
o.Equal(res.PageInfo.HasNextPage, false)

expected := []*gmodel.VehicleEdge{
{
Node: &gmodel.Vehicle{
ID: "2",
Owner: common.BytesToAddress(wallet.Bytes()),
Make: &vehicles[1].Make.String,
Model: &vehicles[1].Model.String,
Year: &vehicles[1].Year.Int,
MintedAt: vehicles[1].MintedAt,
Privileges: []*gmodel.Privilege{},
},
Cursor: "Mg==",
},
{
Node: &gmodel.Vehicle{
ID: "1",
Owner: common.BytesToAddress(wallet.Bytes()),
Make: &vehicles[0].Make.String,
Model: &vehicles[0].Model.String,
Year: &vehicles[0].Year.Int,
MintedAt: vehicles[0].MintedAt,
Privileges: []*gmodel.Privilege{
{
ID: privileges[0].PrivilegeID,
GrantedToAddress: common.BytesToAddress(privileges[0].GrantedToAddress),
GrantedAt: privileges[0].GrantedAt,
ExpiresAt: privileges[0].ExpiresAt,
},
},
},
Cursor: "MQ==",
},
}

o.Exactly(expected, res.Edges)
}

func (o *OwnedVehiclesRepoTestSuite) Test_GetOwnedVehicles_Pagination() {
_, wallet, err := test.GenerateWallet()
o.NoError(err)

currTime := time.Now().UTC().Truncate(time.Microsecond)
vehicles := []models.Vehicle{
{
ID: 1,
OwnerAddress: wallet.Bytes(),
Make: null.StringFrom("Toyota"),
Model: null.StringFrom("Camry"),
Year: null.IntFrom(2020),
MintedAt: currTime,
},
{
ID: 2,
OwnerAddress: wallet.Bytes(),
Make: null.StringFrom("Toyota"),
Model: null.StringFrom("Camry"),
Year: null.IntFrom(2022),
MintedAt: currTime,
},
}

for _, v := range vehicles {
if err := v.Insert(o.ctx, o.pdb.DBS().Writer, boil.Infer()); err != nil {
o.NoError(err)
}
}

first := 1
res, err := o.repo.GetOwnedVehicles(o.ctx, *wallet, &first, nil)
o.NoError(err)

o.Equal(len(vehicles), res.TotalCount)
o.Equal(res.PageInfo.HasNextPage, true)

expected := []*gmodel.VehicleEdge{
{
Node: &gmodel.Vehicle{
ID: "2",
Owner: common.BytesToAddress(wallet.Bytes()),
Make: &vehicles[1].Make.String,
Model: &vehicles[1].Model.String,
Year: &vehicles[1].Year.Int,
MintedAt: vehicles[1].MintedAt,
Privileges: []*gmodel.Privilege{},
},
Cursor: "Mg==",
},
}

o.Exactly(expected, res.Edges)
}

func (o *OwnedVehiclesRepoTestSuite) Test_GetOwnedVehicles_Pagination_NextPage() {
_, wallet, err := test.GenerateWallet()
o.NoError(err)

currTime := time.Now().UTC().Truncate(time.Microsecond)
vehicles := []models.Vehicle{
{
ID: 1,
OwnerAddress: wallet.Bytes(),
Make: null.StringFrom("Toyota"),
Model: null.StringFrom("Camry"),
Year: null.IntFrom(2020),
MintedAt: currTime,
},
{
ID: 2,
OwnerAddress: wallet.Bytes(),
Make: null.StringFrom("Toyota"),
Model: null.StringFrom("Camry"),
Year: null.IntFrom(2022),
MintedAt: currTime,
},
}

for _, v := range vehicles {
if err := v.Insert(o.ctx, o.pdb.DBS().Writer, boil.Infer()); err != nil {
o.NoError(err)
}
}

first := 1
after := "Mg=="
res, err := o.repo.GetOwnedVehicles(o.ctx, *wallet, &first, &after)
o.NoError(err)

o.Equal(len(vehicles), res.TotalCount)
o.Equal(res.PageInfo.HasNextPage, false)

expected := []*gmodel.VehicleEdge{
{
Node: &gmodel.Vehicle{
ID: "1",
Owner: common.BytesToAddress(wallet.Bytes()),
Make: &vehicles[0].Make.String,
Model: &vehicles[0].Model.String,
Year: &vehicles[0].Year.Int,
MintedAt: vehicles[0].MintedAt,
Privileges: []*gmodel.Privilege{},
},
Cursor: "MQ==",
},
}

o.Exactly(expected, res.Edges)
}
14 changes: 14 additions & 0 deletions internal/test/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package test

import (
"context"
"crypto/ecdsa"
"database/sql"
"fmt"
"net/http"
Expand All @@ -12,6 +13,8 @@ import (

"github.com/DIMO-Network/shared/db"
"github.com/docker/go-connections/nat"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/gofiber/fiber/v2"
"github.com/golang-jwt/jwt/v5"
"github.com/pkg/errors"
Expand Down Expand Up @@ -172,3 +175,14 @@ func Logger() *zerolog.Logger {
Logger()
return &l
}

func GenerateWallet() (*ecdsa.PrivateKey, *common.Address, error) {
privateKey, err := crypto.GenerateKey()
if err != nil {
return nil, nil, err
}

userAddr := crypto.PubkeyToAddress(privateKey.PublicKey)

return privateKey, &userAddr, nil
}

0 comments on commit 274f419

Please sign in to comment.