diff --git a/Makefile b/Makefile index f2ef7a7..96ea0e7 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ -mockgen: - go install github.com/golang/mock/mockgen@v1.6.0 - mockgen -source=internal/repository/public.go -destination=internal/repository/public_mock.gen.go -package=repository - mockgen -source=internal/kafka/writer/writer.go -destination=internal/kafka/writer/riter.gen.go -package=kafka +#mockgen: +# go install github.com/golang/mock/mockgen@v1.6.0 +# mockgen -source=internal/repository/public.go -destination=internal/repository/public_mock.gen.go -package=repository +# mockgen -source=internal/kafka/writer/writer.go -destination=internal/kafka/writer/riter.gen.go -package=kafka lint: golangci-lint run @@ -11,6 +11,6 @@ test: pre-commit: go mod tidy - make mockgen + #make mockgen make lint make test diff --git a/go.mod b/go.mod index 802eba3..979202f 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,6 @@ require ( github.com/golang/mock v1.6.0 github.com/google/uuid v1.5.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 - github.com/ory/dockertest/v3 v3.10.0 github.com/segmentio/kafka-go v0.4.46 github.com/spf13/viper v1.18.1 github.com/stretchr/testify v1.8.4 @@ -19,38 +18,20 @@ require ( ) require ( - github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect - github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect - github.com/cenkalti/backoff/v4 v4.2.0 // indirect - github.com/containerd/continuity v0.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/docker/cli v23.0.1+incompatible // indirect - github.com/docker/docker v23.0.3+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.5.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/imdario/mergo v0.3.13 // indirect github.com/klauspost/compress v1.17.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect github.com/montanaflynn/stats v0.7.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/opencontainers/runc v1.1.5 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/pierrec/lz4/v4 v4.1.15 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect @@ -59,22 +40,16 @@ require ( github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect go.uber.org/goleak v1.2.1 // indirect go.uber.org/multierr v1.10.0 // indirect golang.org/x/crypto v0.16.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.19.0 // indirect golang.org/x/sync v0.5.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 3d63380..68c0f2d 100644 --- a/go.sum +++ b/go.sum @@ -1,66 +1,26 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= -github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy13Ul2Q5oM= -github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/docker v23.0.3+incompatible h1:9GhVsShNWz1hO//9BNg/dpMnZW25KydO4wtVxWAIbho= -github.com/docker/docker v23.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/emortalmc/proto-specs/gen/go v0.0.0-20230603170831-d1d6d4a9b1de h1:AZiQFaPNVRhHb7ZnL10zffrpM5gzKZ7GL39T4nxGimA= -github.com/emortalmc/proto-specs/gen/go v0.0.0-20230603170831-d1d6d4a9b1de/go.mod h1:se+tHcK9FWxeadkxLF5uj+SPauEye0X+Iq6cGczXGJY= -github.com/emortalmc/proto-specs/gen/go v0.0.0-20240310012521-7e46547dec25 h1:f2JreFNFYNJnpRS1bIa3M69rPIAD0RiiENOKXoytDBU= -github.com/emortalmc/proto-specs/gen/go v0.0.0-20240310012521-7e46547dec25/go.mod h1:se+tHcK9FWxeadkxLF5uj+SPauEye0X+Iq6cGczXGJY= -github.com/emortalmc/proto-specs/gen/go v0.0.0-20240310103901-003ec6771eaf h1:Nt0+6ja94XP7jssxjiZqM3Hy+J2cEmauN/c+SVYs8Xw= -github.com/emortalmc/proto-specs/gen/go v0.0.0-20240310103901-003ec6771eaf/go.mod h1:se+tHcK9FWxeadkxLF5uj+SPauEye0X+Iq6cGczXGJY= -github.com/emortalmc/proto-specs/gen/go v0.0.0-20240310221119-1bb5cb9ec298 h1:R50l96MA07LDAV8K3Mth9hXMMey3+zvQ3rE7AO1vems= -github.com/emortalmc/proto-specs/gen/go v0.0.0-20240310221119-1bb5cb9ec298/go.mod h1:se+tHcK9FWxeadkxLF5uj+SPauEye0X+Iq6cGczXGJY= github.com/emortalmc/proto-specs/gen/go v0.0.0-20240310231042-f1d48f31684e h1:mqGh9hgRF6A4UsVyjM1qO+rQQROstH2C5qMZhRDnqGE= github.com/emortalmc/proto-specs/gen/go v0.0.0-20240310231042-f1d48f31684e/go.mod h1:se+tHcK9FWxeadkxLF5uj+SPauEye0X+Iq6cGczXGJY= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -78,20 +38,15 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -100,63 +55,38 @@ github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJw github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2 h1:hRGSmZu7j271trc9sneMrpOW7GN5ngLm8YUZIPzf394= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= -github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/segmentio/kafka-go v0.4.46 h1:Sx8/kvtY+/G8nM0roTNnFezSJj3bT2sW0Xy/YY3CgBI= github.com/segmentio/kafka-go v0.4.46/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= @@ -181,23 +111,12 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= @@ -240,8 +159,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -250,7 +167,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -275,22 +191,14 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h 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-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -324,8 +232,6 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= @@ -346,7 +252,6 @@ google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -357,14 +262,9 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= -gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/app/event/scheduler.go b/internal/app/event/scheduler.go index 67e915c..a37a999 100644 --- a/internal/app/event/scheduler.go +++ b/internal/app/event/scheduler.go @@ -41,6 +41,7 @@ func (h *handler) run(ctx context.Context, wg *sync.WaitGroup) { return case <-ticker.C: h.runDisplayEvent(ctx) + h.runStartEvent(ctx) } } }() @@ -96,9 +97,10 @@ func (h *handler) runStartEvent(ctx context.Context) { return } } - } else { // todo create a party as they are not online - } + //else { // todo create a party as they are not online + // + //} // We now have a party that is open with only the owner of the event in it. diff --git a/internal/grpc/party.go b/internal/grpc/party.go index 578278f..ac4c763 100644 --- a/internal/grpc/party.go +++ b/internal/grpc/party.go @@ -290,8 +290,8 @@ var ( WithDetails(&pb.KickPlayerErrorResponse{ErrorType: pb.KickPlayerErrorResponse_SELF_NOT_LEADER})).Err() // todo this error is no longer used. was stupid it existed in the first place oopsies - kickTargetIsLeaderErr = panicIfErr(status.New(codes.FailedPrecondition, "target is the leader of the party"). - WithDetails(&pb.KickPlayerErrorResponse{ErrorType: pb.KickPlayerErrorResponse_TARGET_IS_LEADER})).Err() + //kickTargetIsLeaderErr = panicIfErr(status.New(codes.FailedPrecondition, "target is the leader of the party"). + // WithDetails(&pb.KickPlayerErrorResponse{ErrorType: pb.KickPlayerErrorResponse_TARGET_IS_LEADER})).Err() kickTargetNotInPartyErr = panicIfErr(status.New(codes.FailedPrecondition, "target is not in the party"). WithDetails(&pb.KickPlayerErrorResponse{ErrorType: pb.KickPlayerErrorResponse_TARGET_NOT_IN_PARTY})).Err() diff --git a/internal/grpc/party_test.go b/internal/grpc/party_test.go index d662f84..3b4a696 100644 --- a/internal/grpc/party_test.go +++ b/internal/grpc/party_test.go @@ -1,441 +1,442 @@ package grpc -import ( - "context" - pb "github.com/emortalmc/proto-specs/gen/go/grpc/party" - pbmodel "github.com/emortalmc/proto-specs/gen/go/model/party" - "github.com/golang/mock/gomock" - "github.com/google/uuid" - "github.com/stretchr/testify/assert" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/mongo" - "party-manager/internal/kafka/writer" - "party-manager/internal/repository" - "party-manager/internal/repository/model" - "testing" - "time" -) - -func TestPartyService_EmptyParty(t *testing.T) { - partyId := primitive.NewObjectID() - memberId := uuid.New() - - test := []struct { - name string - req *pb.EmptyPartyRequest - - getPartyByIdReq primitive.ObjectID - getPartyByIdRes *model.Party - getPartyByIdErr error - - getPartyByMemberIdReq uuid.UUID - getPartyByMemberIdRes *model.Party - getPartyByMemberIdErr error - - deletePartyReq primitive.ObjectID - deletePartyErr error - - deletePartyInvitesByPartyIdReq bool - deletePartyInvitesByPartyIdErr error - - wantErr error - }{ - { - name: "success_by_party_id", - req: &pb.EmptyPartyRequest{ - Id: &pb.EmptyPartyRequest_PartyId{PartyId: partyId.Hex()}, - }, - - getPartyByIdReq: partyId, - getPartyByIdRes: &model.Party{ID: partyId, LeaderId: memberId, Members: []*model.PartyMember{{PlayerID: memberId, Username: "test"}}}, - - deletePartyReq: partyId, - - deletePartyInvitesByPartyIdReq: true, - }, - { - name: "success_by_member_id", - req: &pb.EmptyPartyRequest{ - Id: &pb.EmptyPartyRequest_PlayerId{PlayerId: memberId.String()}, - }, - - getPartyByMemberIdReq: memberId, - getPartyByMemberIdRes: &model.Party{ID: partyId, LeaderId: memberId, Members: []*model.PartyMember{{PlayerID: memberId, Username: "test"}}}, - - deletePartyReq: partyId, - - deletePartyInvitesByPartyIdReq: true, - }, - } - - for _, tt := range test { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - - // Create mock r - mockCntrl := gomock.NewController(t) - defer mockCntrl.Finish() - - repo := repository.NewMockRepository(mockCntrl) - - if tt.req.GetPartyId() != "" { - repo.EXPECT().GetPartyById(ctx, tt.getPartyByIdReq).Return(tt.getPartyByIdRes, tt.getPartyByIdErr) - } - if tt.getPartyByMemberIdReq != uuid.Nil { - repo.EXPECT().GetPartyByMemberId(ctx, tt.getPartyByMemberIdReq).Return(tt.getPartyByMemberIdRes, tt.getPartyByMemberIdErr) - } - if tt.deletePartyReq != primitive.NilObjectID { - var party *model.Party - if tt.getPartyByIdRes != nil { - party = tt.getPartyByIdRes - } else if tt.getPartyByMemberIdRes != nil { - party = tt.getPartyByMemberIdRes - } - - leader, ok := party.GetMember(party.LeaderId) - - if ok { - repo.EXPECT().SetPartyMembers(ctx, tt.deletePartyReq, []*model.PartyMember{leader}).Return(tt.deletePartyErr) - } - } - if tt.deletePartyInvitesByPartyIdReq { - repo.EXPECT().DeletePartyInvitesByPartyId(ctx, tt.deletePartyReq).Return(tt.deletePartyInvitesByPartyIdErr) - } - - notif := writer.NewMockNotifier(mockCntrl) - // If there are no errors yet, expect a notification - if tt.deletePartyErr == nil && tt.getPartyByIdErr == nil && tt.getPartyByMemberIdErr == nil { - var party *model.Party - if tt.getPartyByIdRes != nil { - party = tt.getPartyByIdRes - } else if tt.getPartyByMemberIdRes != nil { - party = tt.getPartyByMemberIdRes - } - notif.EXPECT().PartyEmptied(ctx, party) - } - - s := newPartyService(notif, repo) - - res, err := s.EmptyParty(ctx, tt.req) - assert.Equalf(t, tt.wantErr, err, "wantErr: %+v, got: %+v", tt.wantErr, err) - assert.Empty(t, res) - }) - } -} - -func TestPartyService_GetParty(t *testing.T) { - partyId := primitive.NewObjectID() - memberId := uuid.New() - memberId2 := uuid.New() - - test := []struct { - name string - req *pb.GetPartyRequest - - getPartyByIdReq primitive.ObjectID - getPartyByIdRes *model.Party - getPartyByIdErr error - - getPartyByMemberIdReq uuid.UUID - getPartyByMemberIdRes *model.Party - getPartyByMemberIdErr error - - wantRes *pb.GetPartyResponse - wantErr error - }{ - { - name: "success_by_party_id", - req: &pb.GetPartyRequest{ - Id: &pb.GetPartyRequest_PartyId{PartyId: partyId.Hex()}, - }, - - getPartyByIdReq: partyId, - getPartyByIdRes: &model.Party{ - ID: partyId, - LeaderId: memberId, - Members: []*model.PartyMember{{PlayerID: memberId, Username: "t"}, {PlayerID: memberId2, Username: "t2"}}, - }, - - wantRes: &pb.GetPartyResponse{ - Party: &pbmodel.Party{ - Id: partyId.Hex(), - LeaderId: memberId.String(), - Members: []*pbmodel.PartyMember{{Id: memberId.String(), Username: "t"}, {Id: memberId2.String(), Username: "t2"}}, - }, - }, - }, - { - name: "success_by_member_id", - req: &pb.GetPartyRequest{ - Id: &pb.GetPartyRequest_PlayerId{PlayerId: memberId.String()}, - }, - - getPartyByMemberIdReq: memberId, - getPartyByMemberIdRes: &model.Party{ - ID: partyId, - LeaderId: memberId, - Members: []*model.PartyMember{{PlayerID: memberId, Username: "t"}, {PlayerID: memberId2, Username: "t2"}}, - }, - - wantRes: &pb.GetPartyResponse{ - Party: &pbmodel.Party{ - Id: partyId.Hex(), - LeaderId: memberId.String(), - Members: []*pbmodel.PartyMember{{Id: memberId.String(), Username: "t"}, {Id: memberId2.String(), Username: "t2"}}, - }, - }, - }, - { - name: "party_not_found_by_party_id", - req: &pb.GetPartyRequest{ - Id: &pb.GetPartyRequest_PartyId{PartyId: partyId.Hex()}, - }, - - getPartyByIdReq: partyId, - getPartyByIdErr: mongo.ErrNoDocuments, - - wantErr: partyNotFoundErr, - }, - { - name: "party_not_found_by_member_id", - req: &pb.GetPartyRequest{ - Id: &pb.GetPartyRequest_PlayerId{PlayerId: memberId.String()}, - }, - - getPartyByMemberIdReq: memberId, - getPartyByMemberIdErr: mongo.ErrNoDocuments, - - wantErr: playerNotInPartyErr, - }, - } - - for _, tt := range test { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - - // Create mock r - mockCntrl := gomock.NewController(t) - defer mockCntrl.Finish() - - repo := repository.NewMockRepository(mockCntrl) - - if tt.getPartyByIdReq != primitive.NilObjectID { - repo.EXPECT().GetPartyById(ctx, tt.getPartyByIdReq).Return(tt.getPartyByIdRes, tt.getPartyByIdErr) - } - if tt.getPartyByMemberIdReq != uuid.Nil { - repo.EXPECT().GetPartyByMemberId(ctx, tt.getPartyByMemberIdReq).Return(tt.getPartyByMemberIdRes, tt.getPartyByMemberIdErr) - } - - notif := writer.NewMockNotifier(mockCntrl) - - s := newPartyService(notif, repo) - - res, err := s.GetParty(ctx, tt.req) - assert.Equalf(t, tt.wantErr, err, "wantErr: %+v, got: %+v", tt.wantErr, err) - assert.Equalf(t, tt.wantRes, res, "wantRes: %+v, got: %+v", tt.wantRes, res) - }) - } -} - -func TestPartyService_GetPartyInvites(t *testing.T) { - partyId := primitive.NewObjectID() - memberId := uuid.New() - memberId2 := uuid.New() - - validPartyInvite := &model.PartyInvite{ - ID: primitive.NewObjectID(), - InviterID: memberId, - InviterUsername: "t", - TargetID: memberId2, - TargetUsername: "t2", - ExpiresAt: time.Now().Add(time.Hour), - } - - var test = []struct { - name string - req *pb.GetPartyInvitesRequest - - getPartyIdByMemberIdReq uuid.UUID - getPartyIdByMemberIdRes primitive.ObjectID - getPartyIdByMemberIdErr error - - getPartyInvitesByPartyIdReq primitive.ObjectID - getPartyInvitesByPartyIdRes []*model.PartyInvite - getPartyInvitesByPartyIdErr error - - wantRes *pb.GetPartyInvitesResponse - wantErr error - }{ - { - name: "success_by_party_id", - req: &pb.GetPartyInvitesRequest{ - Id: &pb.GetPartyInvitesRequest_PartyId{PartyId: partyId.Hex()}, - }, - - getPartyInvitesByPartyIdReq: partyId, - getPartyInvitesByPartyIdRes: []*model.PartyInvite{validPartyInvite}, - - wantRes: &pb.GetPartyInvitesResponse{ - Invites: []*pbmodel.PartyInvite{validPartyInvite.ToProto()}, - }, - }, - { - name: "success_by_member_id", - req: &pb.GetPartyInvitesRequest{ - Id: &pb.GetPartyInvitesRequest_PlayerId{PlayerId: memberId.String()}, - }, - - getPartyIdByMemberIdReq: memberId, - getPartyIdByMemberIdRes: partyId, - - getPartyInvitesByPartyIdReq: partyId, - getPartyInvitesByPartyIdRes: []*model.PartyInvite{validPartyInvite}, - - wantRes: &pb.GetPartyInvitesResponse{ - Invites: []*pbmodel.PartyInvite{validPartyInvite.ToProto()}, - }, - }, - { - name: "party_not_found_by_party_id", - req: &pb.GetPartyInvitesRequest{ - Id: &pb.GetPartyInvitesRequest_PartyId{PartyId: partyId.Hex()}, - }, - - getPartyInvitesByPartyIdReq: partyId, - getPartyInvitesByPartyIdErr: mongo.ErrNoDocuments, - - wantErr: partyNotFoundErr, - }, - { - name: "party_not_found_by_member_id", - req: &pb.GetPartyInvitesRequest{ - Id: &pb.GetPartyInvitesRequest_PlayerId{PlayerId: memberId.String()}, - }, - - getPartyIdByMemberIdReq: memberId, - getPartyIdByMemberIdErr: mongo.ErrNoDocuments, - - wantErr: playerNotInPartyErr, - }, - } - - for _, tt := range test { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - - // Create mock r - mockCntrl := gomock.NewController(t) - defer mockCntrl.Finish() - - repo := repository.NewMockRepository(mockCntrl) - - if tt.getPartyIdByMemberIdReq != uuid.Nil { - repo.EXPECT().GetPartyIdByMemberId(ctx, tt.getPartyIdByMemberIdReq).Return(tt.getPartyIdByMemberIdRes, tt.getPartyIdByMemberIdErr) - } - if tt.getPartyInvitesByPartyIdReq != primitive.NilObjectID { - repo.EXPECT().GetPartyInvitesByPartyId(ctx, tt.getPartyInvitesByPartyIdReq).Return(tt.getPartyInvitesByPartyIdRes, tt.getPartyInvitesByPartyIdErr) - } - - notif := writer.NewMockNotifier(mockCntrl) - - s := newPartyService(notif, repo) - - res, err := s.GetPartyInvites(ctx, tt.req) - assert.Equalf(t, tt.wantErr, err, "wantErr: %+v, got: %+v", tt.wantErr, err) - assert.Equalf(t, tt.wantRes, res, "wantRes: %+v, got: %+v", tt.wantRes, res) - }) - } -} - -// TODO -//func TestPartyService_InvitePlayer(t *testing.T) { -// playerIds := []uuid.UUID{uuid.New(), uuid.New(), uuid.New()} -// playerUsernames := []string{"t", "t2", "t3"} // +//import ( +// "context" +// pb "github.com/emortalmc/proto-specs/gen/go/grpc/party" +// pbmodel "github.com/emortalmc/proto-specs/gen/go/model/party" +// "github.com/golang/mock/gomock" +// "github.com/google/uuid" +// "github.com/stretchr/testify/assert" +// "go.mongodb.org/mongo-driver/bson/primitive" +// "go.mongodb.org/mongo-driver/mongo" +// "party-manager/internal/kafka/writer" +// "party-manager/internal/repository" +// "party-manager/internal/repository/model" +// "testing" +// "time" +//) +// +//func TestPartyService_EmptyParty(t *testing.T) { // partyId := primitive.NewObjectID() +// memberId := uuid.New() // -// var test = []struct { +// test := []struct { // name string -// req *pb.InvitePlayerRequest +// req *pb.EmptyPartyRequest +// +// getPartyByIdReq primitive.ObjectID +// getPartyByIdRes *model.Party +// getPartyByIdErr error // // getPartyByMemberIdReq uuid.UUID // getPartyByMemberIdRes *model.Party // getPartyByMemberIdErr error // -// // Note, will only ever get called if requester != leader -// getPartySettingsRes *model.PartySettings -// getPartySettingsErr error +// deletePartyReq primitive.ObjectID +// deletePartyErr error +// +// deletePartyInvitesByPartyIdReq bool +// deletePartyInvitesByPartyIdErr error +// +// wantErr error +// }{ +// { +// name: "success_by_party_id", +// req: &pb.EmptyPartyRequest{ +// Id: &pb.EmptyPartyRequest_PartyId{PartyId: partyId.Hex()}, +// }, +// +// getPartyByIdReq: partyId, +// getPartyByIdRes: &model.Party{ID: partyId, LeaderId: memberId, Members: []*model.PartyMember{{PlayerID: memberId, Username: "test"}}}, +// +// deletePartyReq: partyId, +// +// deletePartyInvitesByPartyIdReq: true, +// }, +// { +// name: "success_by_member_id", +// req: &pb.EmptyPartyRequest{ +// Id: &pb.EmptyPartyRequest_PlayerId{PlayerId: memberId.String()}, +// }, +// +// getPartyByMemberIdReq: memberId, +// getPartyByMemberIdRes: &model.Party{ID: partyId, LeaderId: memberId, Members: []*model.PartyMember{{PlayerID: memberId, Username: "test"}}}, +// +// deletePartyReq: partyId, +// +// deletePartyInvitesByPartyIdReq: true, +// }, +// } +// +// for _, tt := range test { +// t.Run(tt.name, func(t *testing.T) { +// ctx := context.Background() // -// getPartyIdOfTargetReq uuid.UUID -// getPartyIdOfTargetRes primitive.ObjectID -// getPartyIdOfTargetErr error +// // Create mock r +// mockCntrl := gomock.NewController(t) +// defer mockCntrl.Finish() // -// doesPartyInviteExistReqPartyId primitive.ObjectID -// doesPartyInviteExistReqTargetId uuid.UUID -// doesPartyInviteExistRes bool -// doesPartyInviteExistErr error +// repo := repository.NewMockRepository(mockCntrl) // -// createPartyInviteReq *model.PartyInvite -// createPartyInviteErr error +// if tt.req.GetPartyId() != "" { +// repo.EXPECT().GetPartyById(ctx, tt.getPartyByIdReq).Return(tt.getPartyByIdRes, tt.getPartyByIdErr) +// } +// if tt.getPartyByMemberIdReq != uuid.Nil { +// repo.EXPECT().GetPartyByMemberId(ctx, tt.getPartyByMemberIdReq).Return(tt.getPartyByMemberIdRes, tt.getPartyByMemberIdErr) +// } +// if tt.deletePartyReq != primitive.NilObjectID { +// var party *model.Party +// if tt.getPartyByIdRes != nil { +// party = tt.getPartyByIdRes +// } else if tt.getPartyByMemberIdRes != nil { +// party = tt.getPartyByMemberIdRes +// } +// +// leader, ok := party.GetMember(party.LeaderId) +// +// if ok { +// repo.EXPECT().SetPartyMembers(ctx, tt.deletePartyReq, []*model.PartyMember{leader}).Return(tt.deletePartyErr) +// } +// } +// if tt.deletePartyInvitesByPartyIdReq { +// repo.EXPECT().DeletePartyInvitesByPartyId(ctx, tt.deletePartyReq).Return(tt.deletePartyInvitesByPartyIdErr) +// } +// +// notif := writer.NewMockNotifier(mockCntrl) +// // If there are no errors yet, expect a notification +// if tt.deletePartyErr == nil && tt.getPartyByIdErr == nil && tt.getPartyByMemberIdErr == nil { +// var party *model.Party +// if tt.getPartyByIdRes != nil { +// party = tt.getPartyByIdRes +// } else if tt.getPartyByMemberIdRes != nil { +// party = tt.getPartyByMemberIdRes +// } +// notif.EXPECT().PartyEmptied(ctx, party) +// } +// +// s := newPartyService(notif, repo) +// +// res, err := s.EmptyParty(ctx, tt.req) +// assert.Equalf(t, tt.wantErr, err, "wantErr: %+v, got: %+v", tt.wantErr, err) +// assert.Empty(t, res) +// }) +// } +//} +// +//func TestPartyService_GetParty(t *testing.T) { +// partyId := primitive.NewObjectID() +// memberId := uuid.New() +// memberId2 := uuid.New() +// +// test := []struct { +// name string +// req *pb.GetPartyRequest +// +// getPartyByIdReq primitive.ObjectID +// getPartyByIdRes *model.Party +// getPartyByIdErr error // -// wantRes *pb.InvitePlayerResponse +// getPartyByMemberIdReq uuid.UUID +// getPartyByMemberIdRes *model.Party +// getPartyByMemberIdErr error +// +// wantRes *pb.GetPartyResponse // wantErr error // }{ // { -// name: "success", -// req: &pb.InvitePlayerRequest{ -// IssuerId: playerIds[0].String(), -// IssuerUsername: playerUsernames[0], +// name: "success_by_party_id", +// req: &pb.GetPartyRequest{ +// Id: &pb.GetPartyRequest_PartyId{PartyId: partyId.Hex()}, +// }, // -// TargetID: playerIds[0].String(), -// TargetUsername: playerUsernames[0], +// getPartyByIdReq: partyId, +// getPartyByIdRes: &model.Party{ +// ID: partyId, +// LeaderId: memberId, +// Members: []*model.PartyMember{{PlayerID: memberId, Username: "t"}, {PlayerID: memberId2, Username: "t2"}}, // }, // -// getPartyByMemberIdReq: playerIds[0], +// wantRes: &pb.GetPartyResponse{ +// Party: &pbmodel.Party{ +// Id: partyId.Hex(), +// LeaderId: memberId.String(), +// Members: []*pbmodel.PartyMember{{Id: memberId.String(), Username: "t"}, {Id: memberId2.String(), Username: "t2"}}, +// }, +// }, +// }, +// { +// name: "success_by_member_id", +// req: &pb.GetPartyRequest{ +// Id: &pb.GetPartyRequest_PlayerId{PlayerId: memberId.String()}, +// }, +// +// getPartyByMemberIdReq: memberId, // getPartyByMemberIdRes: &model.Party{ -// PlayerID: partyId, -// LeaderId: playerIds[0], -// Members: []*model.PartyMember{{PlayerID: playerIds[0], Username: playerUsernames[0]}}, +// ID: partyId, +// LeaderId: memberId, +// Members: []*model.PartyMember{{PlayerID: memberId, Username: "t"}, {PlayerID: memberId2, Username: "t2"}}, // }, // -// getPartyIdOfTargetReq: playerIds[1], -// getPartyIdOfTargetRes: primitive.NilObjectID, +// wantRes: &pb.GetPartyResponse{ +// Party: &pbmodel.Party{ +// Id: partyId.Hex(), +// LeaderId: memberId.String(), +// Members: []*pbmodel.PartyMember{{Id: memberId.String(), Username: "t"}, {Id: memberId2.String(), Username: "t2"}}, +// }, +// }, +// }, +// { +// name: "party_not_found_by_party_id", +// req: &pb.GetPartyRequest{ +// Id: &pb.GetPartyRequest_PartyId{PartyId: partyId.Hex()}, +// }, // -// doesPartyInviteExistReqPartyId: partyId, -// doesPartyInviteExistReqTargetId: playerIds[1], -// doesPartyInviteExistRes: false, +// getPartyByIdReq: partyId, +// getPartyByIdErr: mongo.ErrNoDocuments, // -// createPartyInviteReq: &model.PartyInvite{ -// PartyID: partyId, -// } +// wantErr: partyNotFoundErr, // }, -// // Player 0 is inviting player 1 to the party. Player 2 is the leader and the party has all invites enabled. // { -// name: "success_member_inviting", -// req: &pb.InvitePlayerRequest{ -// IssuerId: playerIds[0].String(), -// IssuerUsername: playerUsernames[0], +// name: "party_not_found_by_member_id", +// req: &pb.GetPartyRequest{ +// Id: &pb.GetPartyRequest_PlayerId{PlayerId: memberId.String()}, +// }, +// +// getPartyByMemberIdReq: memberId, +// getPartyByMemberIdErr: mongo.ErrNoDocuments, +// +// wantErr: playerNotInPartyErr, +// }, +// } +// +// for _, tt := range test { +// t.Run(tt.name, func(t *testing.T) { +// ctx := context.Background() +// +// // Create mock r +// mockCntrl := gomock.NewController(t) +// defer mockCntrl.Finish() +// +// repo := repository.NewMockRepository(mockCntrl) +// +// if tt.getPartyByIdReq != primitive.NilObjectID { +// repo.EXPECT().GetPartyById(ctx, tt.getPartyByIdReq).Return(tt.getPartyByIdRes, tt.getPartyByIdErr) +// } +// if tt.getPartyByMemberIdReq != uuid.Nil { +// repo.EXPECT().GetPartyByMemberId(ctx, tt.getPartyByMemberIdReq).Return(tt.getPartyByMemberIdRes, tt.getPartyByMemberIdErr) +// } +// +// notif := writer.NewMockNotifier(mockCntrl) +// +// s := newPartyService(notif, repo) +// +// res, err := s.GetParty(ctx, tt.req) +// assert.Equalf(t, tt.wantErr, err, "wantErr: %+v, got: %+v", tt.wantErr, err) +// assert.Equalf(t, tt.wantRes, res, "wantRes: %+v, got: %+v", tt.wantRes, res) +// }) +// } +//} +// +//func TestPartyService_GetPartyInvites(t *testing.T) { +// partyId := primitive.NewObjectID() +// memberId := uuid.New() +// memberId2 := uuid.New() +// +// validPartyInvite := &model.PartyInvite{ +// ID: primitive.NewObjectID(), +// InviterID: memberId, +// InviterUsername: "t", +// TargetID: memberId2, +// TargetUsername: "t2", +// ExpiresAt: time.Now().Add(time.Hour), +// } +// +// var test = []struct { +// name string +// req *pb.GetPartyInvitesRequest +// +// getPartyIdByMemberIdReq uuid.UUID +// getPartyIdByMemberIdRes primitive.ObjectID +// getPartyIdByMemberIdErr error +// +// getPartyInvitesByPartyIdReq primitive.ObjectID +// getPartyInvitesByPartyIdRes []*model.PartyInvite +// getPartyInvitesByPartyIdErr error +// +// wantRes *pb.GetPartyInvitesResponse +// wantErr error +// }{ +// { +// name: "success_by_party_id", +// req: &pb.GetPartyInvitesRequest{ +// Id: &pb.GetPartyInvitesRequest_PartyId{PartyId: partyId.Hex()}, +// }, +// +// getPartyInvitesByPartyIdReq: partyId, +// getPartyInvitesByPartyIdRes: []*model.PartyInvite{validPartyInvite}, // -// TargetID: playerIds[1].String(), -// TargetUsername: playerUsernames[1], +// wantRes: &pb.GetPartyInvitesResponse{ +// Invites: []*pbmodel.PartyInvite{validPartyInvite.ToProto()}, +// }, +// }, +// { +// name: "success_by_member_id", +// req: &pb.GetPartyInvitesRequest{ +// Id: &pb.GetPartyInvitesRequest_PlayerId{PlayerId: memberId.String()}, // }, // -// getPartyByMemberIdReq: playerIds[0], -// getPartyByMemberIdRes: &model.Party{ -// PlayerID: partyId, -// LeaderId: playerIds[2], -// Members: []*model.PartyMember{{PlayerID: playerIds[0], Username: playerUsernames[0]}, {PlayerID: playerIds[2], Username: playerUsernames[2]}}, +// getPartyIdByMemberIdReq: memberId, +// getPartyIdByMemberIdRes: partyId, +// +// getPartyInvitesByPartyIdReq: partyId, +// getPartyInvitesByPartyIdRes: []*model.PartyInvite{validPartyInvite}, +// +// wantRes: &pb.GetPartyInvitesResponse{ +// Invites: []*pbmodel.PartyInvite{validPartyInvite.ToProto()}, // }, +// }, +// { +// name: "party_not_found_by_party_id", +// req: &pb.GetPartyInvitesRequest{ +// Id: &pb.GetPartyInvitesRequest_PartyId{PartyId: partyId.Hex()}, +// }, +// +// getPartyInvitesByPartyIdReq: partyId, +// getPartyInvitesByPartyIdErr: mongo.ErrNoDocuments, // -// getPartySettingsReq: partyId, -// getPartySettingsRes: &model.PartySettings{ -// AllowMemberInvite: true, +// wantErr: partyNotFoundErr, +// }, +// { +// name: "party_not_found_by_member_id", +// req: &pb.GetPartyInvitesRequest{ +// Id: &pb.GetPartyInvitesRequest_PlayerId{PlayerId: memberId.String()}, // }, // -// getPartyIdOfTargetReq: playerIds[1], -// getPartyIdOfTargetRes: primitive.NilObjectID, +// getPartyIdByMemberIdReq: memberId, +// getPartyIdByMemberIdErr: mongo.ErrNoDocuments, // -// doesPartyInviteExistReq: &model.PartyInvite{}, +// wantErr: playerNotInPartyErr, // }, // } +// +// for _, tt := range test { +// t.Run(tt.name, func(t *testing.T) { +// ctx := context.Background() +// +// // Create mock r +// mockCntrl := gomock.NewController(t) +// defer mockCntrl.Finish() +// +// repo := repository.NewMockRepository(mockCntrl) +// +// if tt.getPartyIdByMemberIdReq != uuid.Nil { +// repo.EXPECT().GetPartyIdByMemberId(ctx, tt.getPartyIdByMemberIdReq).Return(tt.getPartyIdByMemberIdRes, tt.getPartyIdByMemberIdErr) +// } +// if tt.getPartyInvitesByPartyIdReq != primitive.NilObjectID { +// repo.EXPECT().GetPartyInvitesByPartyId(ctx, tt.getPartyInvitesByPartyIdReq).Return(tt.getPartyInvitesByPartyIdRes, tt.getPartyInvitesByPartyIdErr) +// } +// +// notif := writer.NewMockNotifier(mockCntrl) +// +// s := newPartyService(notif, repo) +// +// res, err := s.GetPartyInvites(ctx, tt.req) +// assert.Equalf(t, tt.wantErr, err, "wantErr: %+v, got: %+v", tt.wantErr, err) +// assert.Equalf(t, tt.wantRes, res, "wantRes: %+v, got: %+v", tt.wantRes, res) +// }) +// } //} +// +//// TODO +////func TestPartyService_InvitePlayer(t *testing.T) { +//// playerIds := []uuid.UUID{uuid.New(), uuid.New(), uuid.New()} +//// playerUsernames := []string{"t", "t2", "t3"} +//// +//// partyId := primitive.NewObjectID() +//// +//// var test = []struct { +//// name string +//// req *pb.InvitePlayerRequest +//// +//// getPartyByMemberIdReq uuid.UUID +//// getPartyByMemberIdRes *model.Party +//// getPartyByMemberIdErr error +//// +//// // Note, will only ever get called if requester != leader +//// getPartySettingsRes *model.PartySettings +//// getPartySettingsErr error +//// +//// getPartyIdOfTargetReq uuid.UUID +//// getPartyIdOfTargetRes primitive.ObjectID +//// getPartyIdOfTargetErr error +//// +//// doesPartyInviteExistReqPartyId primitive.ObjectID +//// doesPartyInviteExistReqTargetId uuid.UUID +//// doesPartyInviteExistRes bool +//// doesPartyInviteExistErr error +//// +//// createPartyInviteReq *model.PartyInvite +//// createPartyInviteErr error +//// +//// wantRes *pb.InvitePlayerResponse +//// wantErr error +//// }{ +//// { +//// name: "success", +//// req: &pb.InvitePlayerRequest{ +//// IssuerId: playerIds[0].String(), +//// IssuerUsername: playerUsernames[0], +//// +//// TargetID: playerIds[0].String(), +//// TargetUsername: playerUsernames[0], +//// }, +//// +//// getPartyByMemberIdReq: playerIds[0], +//// getPartyByMemberIdRes: &model.Party{ +//// PlayerID: partyId, +//// LeaderId: playerIds[0], +//// Members: []*model.PartyMember{{PlayerID: playerIds[0], Username: playerUsernames[0]}}, +//// }, +//// +//// getPartyIdOfTargetReq: playerIds[1], +//// getPartyIdOfTargetRes: primitive.NilObjectID, +//// +//// doesPartyInviteExistReqPartyId: partyId, +//// doesPartyInviteExistReqTargetId: playerIds[1], +//// doesPartyInviteExistRes: false, +//// +//// createPartyInviteReq: &model.PartyInvite{ +//// PartyID: partyId, +//// } +//// }, +//// // Player 0 is inviting player 1 to the party. Player 2 is the leader and the party has all invites enabled. +//// { +//// name: "success_member_inviting", +//// req: &pb.InvitePlayerRequest{ +//// IssuerId: playerIds[0].String(), +//// IssuerUsername: playerUsernames[0], +//// +//// TargetID: playerIds[1].String(), +//// TargetUsername: playerUsernames[1], +//// }, +//// +//// getPartyByMemberIdReq: playerIds[0], +//// getPartyByMemberIdRes: &model.Party{ +//// PlayerID: partyId, +//// LeaderId: playerIds[2], +//// Members: []*model.PartyMember{{PlayerID: playerIds[0], Username: playerUsernames[0]}, {PlayerID: playerIds[2], Username: playerUsernames[2]}}, +//// }, +//// +//// getPartySettingsReq: partyId, +//// getPartySettingsRes: &model.PartySettings{ +//// AllowMemberInvite: true, +//// }, +//// +//// getPartyIdOfTargetReq: playerIds[1], +//// getPartyIdOfTargetRes: primitive.NilObjectID, +//// +//// doesPartyInviteExistReq: &model.PartyInvite{}, +//// }, +//// } +////} diff --git a/internal/kafka/consumer/consumer_test.go b/internal/kafka/consumer/consumer_test.go index c4d5e83..4ede3e9 100644 --- a/internal/kafka/consumer/consumer_test.go +++ b/internal/kafka/consumer/consumer_test.go @@ -1,83 +1,84 @@ package consumer -import ( - "party-manager/internal/repository/model" - "party-manager/internal/utils" - "testing" -) - -var testUuids = utils.RandomUuidSlice(15) - -func createPartyWithMemberCount(mCount int) *model.Party { - members := make([]*model.PartyMember, mCount) - for i := 0; i < mCount; i++ { - members[i] = &model.PartyMember{PlayerID: testUuids[i]} - } - - return &model.Party{Members: members, LeaderId: testUuids[0]} -} - -func TestElectNewPartyLeader(t *testing.T) { - partyMap := make(map[int]*model.Party) - for i := 1; i <= 10; i++ { // parties with 1-10 members - partyMap[i] = createPartyWithMemberCount(i) - } - - tests := []struct { - name string - repeats int - - party *model.Party - - acceptableResults []*model.PartyMember - wantErr error - }{ - { - name: "one member", - party: partyMap[1], - wantErr: leaderElectionNotEnoughMembersErr, - }, - { - name: "two members", - party: partyMap[2], - }, - { - name: "three members", - repeats: 300, - party: partyMap[3], - }, - { - name: "four members", - repeats: 400, - party: partyMap[4], - }, - { - name: "10 members", - repeats: 750, - party: partyMap[10], - }, - } - - for _, test := range tests { - for i := 0; i < test.repeats; i++ { - t.Run(test.name, func(t *testing.T) { - res, err := electNewPartyLeader(test.party) - if err != test.wantErr { - t.Errorf("got err %v, want %v", err, test.wantErr) - } - - if test.wantErr != nil { - return - } - - for _, acceptableResult := range test.party.Members[1:] { - if res == acceptableResult { - return - } - } - - t.Errorf("got %v, want one of %v", res, test.acceptableResults) - }) - } - } -} +// +//import ( +// "party-manager/internal/repository/model" +// "party-manager/internal/utils" +// "testing" +//) +// +//var testUuids = utils.RandomUuidSlice(15) +// +//func createPartyWithMemberCount(mCount int) *model.Party { +// members := make([]*model.PartyMember, mCount) +// for i := 0; i < mCount; i++ { +// members[i] = &model.PartyMember{PlayerID: testUuids[i]} +// } +// +// return &model.Party{Members: members, LeaderId: testUuids[0]} +//} +// +//func TestElectNewPartyLeader(t *testing.T) { +// partyMap := make(map[int]*model.Party) +// for i := 1; i <= 10; i++ { // parties with 1-10 members +// partyMap[i] = createPartyWithMemberCount(i) +// } +// +// tests := []struct { +// name string +// repeats int +// +// party *model.Party +// +// acceptableResults []*model.PartyMember +// wantErr error +// }{ +// { +// name: "one member", +// party: partyMap[1], +// wantErr: leaderElectionNotEnoughMembersErr, +// }, +// { +// name: "two members", +// party: partyMap[2], +// }, +// { +// name: "three members", +// repeats: 300, +// party: partyMap[3], +// }, +// { +// name: "four members", +// repeats: 400, +// party: partyMap[4], +// }, +// { +// name: "10 members", +// repeats: 750, +// party: partyMap[10], +// }, +// } +// +// for _, test := range tests { +// for i := 0; i < test.repeats; i++ { +// t.Run(test.name, func(t *testing.T) { +// res, err := electNewPartyLeader(test.party) +// if err != test.wantErr { +// t.Errorf("got err %v, want %v", err, test.wantErr) +// } +// +// if test.wantErr != nil { +// return +// } +// +// for _, acceptableResult := range test.party.Members[1:] { +// if res == acceptableResult { +// return +// } +// } +// +// t.Errorf("got %v, want one of %v", res, test.acceptableResults) +// }) +// } +// } +//} diff --git a/internal/repository/mongo_test.go b/internal/repository/mongo_test.go index 5eecd34..6fcce94 100644 --- a/internal/repository/mongo_test.go +++ b/internal/repository/mongo_test.go @@ -1,1180 +1,1181 @@ package repository -import ( - "context" - "fmt" - "github.com/google/uuid" - "github.com/ory/dockertest/v3" - "github.com/ory/dockertest/v3/docker" - "github.com/stretchr/testify/assert" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" - "go.uber.org/zap" - "log" - "os" - "party-manager/internal/config" - "party-manager/internal/repository/model" - "sync" - "testing" - "time" -) - -const ( - mongoUri = "mongodb://root:password@localhost:%s" -) - -var ( - dbClient *mongo.Client - database *mongo.Database - repo Repository -) - -// TODO some of the tests here don't check the database after operations are performed. -// TODO This should be done. - -func TestMain(m *testing.M) { - pool, err := dockertest.NewPool("") - if err != nil { - log.Fatalf("could not constuct pool: %s", err) - } - - err = pool.Client.Ping() - if err != nil { - log.Fatalf("could not connect to docker: %s", err) - } - - resource, err := pool.RunWithOptions(&dockertest.RunOptions{ - Repository: "mongo", - Tag: "6.0.5", - Env: []string{ - "MONGO_INITDB_ROOT_USERNAME=root", - "MONGO_INITDB_ROOT_PASSWORD=password", - }, - }, func(cfg *docker.HostConfig) { - cfg.AutoRemove = true - cfg.RestartPolicy = docker.RestartPolicy{ - Name: "no", - } - }) - if err != nil { - log.Fatalf("could not start resource: %s", err) - } - - unsugaredLogger, err := zap.NewDevelopment() - if err != nil { - log.Fatalf("could not create logger: %s", err) - } - logger := unsugaredLogger.Sugar() - - uri := fmt.Sprintf(mongoUri, resource.GetPort("27017/tcp")) - - err = pool.Retry(func() (err error) { - dbClient, err = mongo.Connect(context.Background(), options.Client().ApplyURI(uri).SetRegistry(createCodecRegistry())) - if err != nil { - return - } - err = dbClient.Ping(context.Background(), nil) - if err != nil { - return - } - - // Ping was successful, let's create the mongo repo - repo, err = NewMongoRepository(context.Background(), logger, &sync.WaitGroup{}, &config.MongoDBConfig{URI: uri}) - database = dbClient.Database(databaseName) - - return - }) - - if err != nil { - log.Fatalf("could not connect to docker: %s", err) - } - - code := m.Run() - - if err := pool.Purge(resource); err != nil { - log.Fatalf("could not purge resource: %s", err) - } - - os.Exit(code) -} - -func TestMongoRepository_IsInParty(t *testing.T) { - playerId := uuid.New() - playerUsername := "test" - - tests := []struct { - name string - - dbModel *model.Party - - player uuid.UUID - - want bool - wantErr error - }{ - { - name: "in_party", - dbModel: &model.Party{ - LeaderId: playerId, - Members: []*model.PartyMember{{PlayerID: playerId, Username: playerUsername}}, - }, - - player: playerId, - - want: true, - wantErr: nil, - }, - { - name: "not_in_party", - dbModel: &model.Party{ - LeaderId: playerId, - Members: []*model.PartyMember{{PlayerID: playerId, Username: playerUsername}}, - }, - - player: uuid.New(), - - want: false, - wantErr: nil, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbModel) - assert.NoError(t, err) - - got, err := repo.IsInParty(ctx, tt.player) - assert.Equal(t, tt.wantErr, err) - assert.Equal(t, tt.want, got) - }) - } -} - -func TestMongoRepository_CreateParty(t *testing.T) { - playerId := uuid.New() - playerUsername := "test" - - tests := []struct { - name string - - party *model.Party - - wantErr error - }{ - { - name: "success", - party: &model.Party{ - LeaderId: playerId, - Members: []*model.PartyMember{{PlayerID: playerId, Username: playerUsername}}, - }, - - wantErr: nil, - }, - { - name: "failure_id_set", - party: &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: playerId, - Members: []*model.PartyMember{{PlayerID: playerId, Username: playerUsername}}, - }, - wantErr: ErrIdMustBeNil, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - originalId := tt.party.ID - - err := repo.CreateParty(ctx, tt.party) - assert.Equal(t, tt.wantErr, err) - - // Check the ID has been set - if originalId == primitive.NilObjectID { - assert.NotEmpty(t, tt.party.ID) - } - - if tt.wantErr != nil { - return - } - // Check if the party was created and is valid - collection := database.Collection(partyCollectionName) - var party model.Party - - err = collection.FindOne(ctx, bson.M{"_id": tt.party.ID}).Decode(&party) - assert.NoError(t, err) - assert.Equal(t, tt.party, &party) - }) - } -} - -// todo -//func TestMongoRepository_SetPartyMembers(t *testing.T) { +// +//import ( +// "context" +// "fmt" +// "github.com/google/uuid" +// "github.com/ory/dockertest/v3" +// "github.com/ory/dockertest/v3/docker" +// "github.com/stretchr/testify/assert" +// "go.mongodb.org/mongo-driver/bson" +// "go.mongodb.org/mongo-driver/bson/primitive" +// "go.mongodb.org/mongo-driver/mongo" +// "go.mongodb.org/mongo-driver/mongo/options" +// "go.uber.org/zap" +// "log" +// "os" +// "party-manager/internal/config" +// "party-manager/internal/repository/model" +// "sync" +// "testing" +// "time" +//) +// +//const ( +// mongoUri = "mongodb://root:password@localhost:%s" +//) +// +//var ( +// dbClient *mongo.Client +// database *mongo.Database +// repo Repository +//) +// +//// TODO some of the tests here don't check the database after operations are performed. +//// TODO This should be done. +// +//func TestMain(m *testing.M) { +// pool, err := dockertest.NewPool("") +// if err != nil { +// log.Fatalf("could not constuct pool: %s", err) +// } +// +// err = pool.Client.Ping() +// if err != nil { +// log.Fatalf("could not connect to docker: %s", err) +// } +// +// resource, err := pool.RunWithOptions(&dockertest.RunOptions{ +// Repository: "mongo", +// Tag: "6.0.5", +// Env: []string{ +// "MONGO_INITDB_ROOT_USERNAME=root", +// "MONGO_INITDB_ROOT_PASSWORD=password", +// }, +// }, func(cfg *docker.HostConfig) { +// cfg.AutoRemove = true +// cfg.RestartPolicy = docker.RestartPolicy{ +// Name: "no", +// } +// }) +// if err != nil { +// log.Fatalf("could not start resource: %s", err) +// } +// +// unsugaredLogger, err := zap.NewDevelopment() +// if err != nil { +// log.Fatalf("could not create logger: %s", err) +// } +// logger := unsugaredLogger.Sugar() +// +// uri := fmt.Sprintf(mongoUri, resource.GetPort("27017/tcp")) +// +// err = pool.Retry(func() (err error) { +// dbClient, err = mongo.Connect(context.Background(), options.Client().ApplyURI(uri).SetRegistry(createCodecRegistry())) +// if err != nil { +// return +// } +// err = dbClient.Ping(context.Background(), nil) +// if err != nil { +// return +// } +// +// // Ping was successful, let's create the mongo repo +// repo, err = NewMongoRepository(context.Background(), logger, &sync.WaitGroup{}, &config.MongoDBConfig{URI: uri}) +// database = dbClient.Database(databaseName) +// +// return +// }) +// +// if err != nil { +// log.Fatalf("could not connect to docker: %s", err) +// } +// +// code := m.Run() +// +// if err := pool.Purge(resource); err != nil { +// log.Fatalf("could not purge resource: %s", err) +// } +// +// os.Exit(code) +//} +// +//func TestMongoRepository_IsInParty(t *testing.T) { +// playerId := uuid.New() +// playerUsername := "test" +// +// tests := []struct { +// name string +// +// dbModel *model.Party +// +// player uuid.UUID +// +// want bool +// wantErr error +// }{ +// { +// name: "in_party", +// dbModel: &model.Party{ +// LeaderId: playerId, +// Members: []*model.PartyMember{{PlayerID: playerId, Username: playerUsername}}, +// }, +// +// player: playerId, +// +// want: true, +// wantErr: nil, +// }, +// { +// name: "not_in_party", +// dbModel: &model.Party{ +// LeaderId: playerId, +// Members: []*model.PartyMember{{PlayerID: playerId, Username: playerUsername}}, +// }, +// +// player: uuid.New(), +// +// want: false, +// wantErr: nil, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbModel) +// assert.NoError(t, err) +// +// got, err := repo.IsInParty(ctx, tt.player) +// assert.Equal(t, tt.wantErr, err) +// assert.Equal(t, tt.want, got) +// }) +// } +//} +// +//func TestMongoRepository_CreateParty(t *testing.T) { +// playerId := uuid.New() +// playerUsername := "test" +// +// tests := []struct { +// name string +// +// party *model.Party +// +// wantErr error +// }{ +// { +// name: "success", +// party: &model.Party{ +// LeaderId: playerId, +// Members: []*model.PartyMember{{PlayerID: playerId, Username: playerUsername}}, +// }, +// +// wantErr: nil, +// }, +// { +// name: "failure_id_set", +// party: &model.Party{ +// ID: primitive.NewObjectID(), +// LeaderId: playerId, +// Members: []*model.PartyMember{{PlayerID: playerId, Username: playerUsername}}, +// }, +// wantErr: ErrIdMustBeNil, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// originalId := tt.party.ID +// +// err := repo.CreateParty(ctx, tt.party) +// assert.Equal(t, tt.wantErr, err) +// +// // Check the ID has been set +// if originalId == primitive.NilObjectID { +// assert.NotEmpty(t, tt.party.ID) +// } +// +// if tt.wantErr != nil { +// return +// } +// // Check if the party was created and is valid +// collection := database.Collection(partyCollectionName) +// var party model.Party +// +// err = collection.FindOne(ctx, bson.M{"_id": tt.party.ID}).Decode(&party) +// assert.NoError(t, err) +// assert.Equal(t, tt.party, &party) +// }) +// } +//} +// +//// todo +////func TestMongoRepository_SetPartyMembers(t *testing.T) { +//// party := &model.Party{ +//// ID: primitive.NewObjectID(), +//// LeaderId: uuid.New(), +//// Members: []*model.PartyMember{{PlayerID: uuid.New(), Username: "test"}}, +//// } +////} +// +//func TestMongoRepository_DeleteParty(t *testing.T) { // party := &model.Party{ // ID: primitive.NewObjectID(), // LeaderId: uuid.New(), // Members: []*model.PartyMember{{PlayerID: uuid.New(), Username: "test"}}, // } +// +// tests := []struct { +// name string +// +// dbParty *model.Party +// +// partyId primitive.ObjectID +// +// wantErr error +// }{ +// { +// name: "success", +// dbParty: party, +// partyId: party.ID, +// wantErr: nil, +// }, +// { +// name: "failure_not_exists", +// dbParty: party, +// partyId: primitive.NewObjectID(), +// wantErr: mongo.ErrNoDocuments, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbParty) +// assert.NoError(t, err) +// +// err = repo.DeleteParty(ctx, tt.partyId) +// assert.Equal(t, tt.wantErr, err) +// +// // Check the party was deleted in the database +// if tt.wantErr == nil { +// count, err := collection.CountDocuments(ctx, bson.M{"_id": tt.partyId}) +// assert.NoError(t, err) +// assert.Equal(t, int64(0), count) +// } +// }) +// } +//} +// +//func TestMongoRepository_AddPartyMember(t *testing.T) { +// partyMembers := []model.PartyMember{ +// {PlayerID: uuid.New(), Username: "test1"}, +// {PlayerID: uuid.New(), Username: "test2"}, +// } +// +// party := &model.Party{ +// ID: primitive.NewObjectID(), +// LeaderId: partyMembers[0].PlayerID, +// Members: []*model.PartyMember{&partyMembers[0]}, +// } +// +// tests := []struct { +// name string +// +// dbParty *model.Party +// +// partyId primitive.ObjectID +// addedMember *model.PartyMember +// +// wantErr error +// }{ +// { +// name: "success", +// +// dbParty: party, +// +// partyId: party.ID, +// addedMember: &partyMembers[1], +// +// wantErr: nil, +// }, +// { +// name: "failure_party_not_exists", +// +// dbParty: party, +// +// partyId: primitive.NewObjectID(), +// addedMember: &partyMembers[1], +// +// wantErr: mongo.ErrNoDocuments, +// }, +// { +// name: "failure_member_already_in_party", +// +// dbParty: party, +// +// partyId: party.ID, +// addedMember: &partyMembers[0], +// +// wantErr: ErrAlreadyInParty, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbParty) +// assert.NoError(t, err) +// +// err = repo.AddPartyMember(ctx, tt.partyId, tt.addedMember) +// assert.Equal(t, tt.wantErr, err) +// +// // Check the party was updated in the database +// if tt.wantErr == nil { +// party := model.Party{} +// err = collection.FindOne(ctx, bson.M{"_id": tt.partyId}).Decode(&party) +// assert.NoError(t, err) +// assert.Contains(t, party.Members, tt.addedMember) +// } +// }) +// } +//} +// +//func TestMongoRepository_SetPartyLeader(t *testing.T) { +// partyMembers := []*model.PartyMember{ +// {PlayerID: uuid.New(), Username: "test1"}, +// {PlayerID: uuid.New(), Username: "test2"}, +// } +// +// party := &model.Party{ +// ID: primitive.NewObjectID(), +// LeaderId: partyMembers[0].PlayerID, +// Members: partyMembers, +// } +// +// tests := []struct { +// name string +// +// dbParty *model.Party +// +// partyId primitive.ObjectID +// setLeaderId uuid.UUID +// +// wantErr error +// }{ +// { +// name: "success", +// +// dbParty: party, +// +// partyId: party.ID, +// setLeaderId: partyMembers[1].PlayerID, +// +// wantErr: nil, +// }, +// { +// name: "failure_party_not_exists", +// +// dbParty: party, +// +// partyId: primitive.NewObjectID(), +// setLeaderId: partyMembers[1].PlayerID, +// +// wantErr: mongo.ErrNoDocuments, +// }, +// { +// name: "failure_already_leader", +// +// dbParty: party, +// +// partyId: party.ID, +// setLeaderId: partyMembers[0].PlayerID, +// +// wantErr: ErrAlreadyLeader, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbParty) +// assert.NoError(t, err) +// +// err = repo.SetPartyLeader(ctx, tt.partyId, tt.setLeaderId) +// assert.Equal(t, tt.wantErr, err) +// +// // Check the party was updated in the database +// if tt.wantErr == nil { +// party := model.Party{} +// err = collection.FindOne(ctx, bson.M{"_id": tt.partyId}).Decode(&party) +// assert.NoError(t, err) +// assert.Equal(t, tt.setLeaderId, party.LeaderId) +// } +// }) +// } +//} +// +//func TestMongoRepository_GetPartyById(t *testing.T) { +// member := &model.PartyMember{PlayerID: uuid.New(), Username: "test"} +// +// party := &model.Party{ +// ID: primitive.NewObjectID(), +// LeaderId: member.PlayerID, +// Members: []*model.PartyMember{member}, +// } +// +// tests := []struct { +// name string +// +// dbParty *model.Party +// +// partyId primitive.ObjectID +// +// wantParty *model.Party +// wantErr error +// }{ +// { +// name: "success", +// dbParty: party, +// partyId: party.ID, +// +// wantParty: party, +// }, +// { +// name: "failure_party_not_exists", +// dbParty: party, +// partyId: primitive.NewObjectID(), +// +// wantErr: mongo.ErrNoDocuments, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbParty) +// assert.NoError(t, err) +// +// party, err := repo.GetPartyByID(ctx, tt.partyId) +// assert.Equal(t, tt.wantErr, err) +// assert.Equal(t, tt.wantParty, party) +// }) +// } +//} +// +//func TestMongoRepository_GetPartyByMemberId(t *testing.T) { +// member := &model.PartyMember{PlayerID: uuid.New(), Username: "test"} +// +// party := &model.Party{ +// ID: primitive.NewObjectID(), +// LeaderId: member.PlayerID, +// Members: []*model.PartyMember{member}, +// } +// +// tests := []struct { +// name string +// +// dbParty *model.Party +// +// memberId uuid.UUID +// +// wantParty *model.Party +// wantErr error +// }{ +// { +// name: "success", +// dbParty: party, +// memberId: member.PlayerID, +// +// wantParty: party, +// }, +// { +// name: "failure_party_not_exists", +// dbParty: party, +// memberId: uuid.New(), +// +// wantErr: mongo.ErrNoDocuments, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbParty) +// assert.NoError(t, err) +// +// party, err := repo.GetPartyByMemberID(ctx, tt.memberId) +// assert.Equal(t, tt.wantErr, err) +// assert.Equal(t, tt.wantParty, party) +// }) +// } +//} +// +//func TestMongoRepository_GetPartyIdByMemberId(t *testing.T) { +// member := &model.PartyMember{PlayerID: uuid.New(), Username: "test"} +// +// party := &model.Party{ +// ID: primitive.NewObjectID(), +// LeaderId: member.PlayerID, +// Members: []*model.PartyMember{member}, +// } +// +// tests := []struct { +// name string +// +// dbParty *model.Party +// +// memberId uuid.UUID +// +// wantPartyId primitive.ObjectID +// wantErr error +// }{ +// { +// name: "success", +// dbParty: party, +// memberId: member.PlayerID, +// +// wantPartyId: party.ID, +// }, +// { +// name: "failure_party_not_exists", +// dbParty: party, +// memberId: uuid.New(), +// +// wantErr: mongo.ErrNoDocuments, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbParty) +// assert.NoError(t, err) +// +// partyId, err := repo.GetPartyIdByMemberId(ctx, tt.memberId) +// assert.Equal(t, tt.wantErr, err) +// assert.Equal(t, tt.wantPartyId, partyId) +// }) +// } +//} +// +//func TestMongoRepository_GetPartyLeaderIdByMemberId(t *testing.T) { +// members := []*model.PartyMember{{PlayerID: uuid.New(), Username: "test1"}, {PlayerID: uuid.New(), Username: "test2"}} +// +// party := &model.Party{ +// ID: primitive.NewObjectID(), +// LeaderId: members[0].PlayerID, +// Members: members, +// } +// +// tests := []struct { +// name string +// +// dbParty *model.Party +// +// targetId uuid.UUID +// +// wantLeaderId uuid.UUID +// wantErr error +// }{ +// { +// name: "success", +// dbParty: party, +// targetId: members[0].PlayerID, +// +// wantLeaderId: party.LeaderId, +// }, +// { +// name: "success_not_leader", +// dbParty: party, +// targetId: members[1].PlayerID, +// +// wantLeaderId: party.LeaderId, +// }, +// { +// name: "failure_party_not_exists", +// dbParty: party, +// targetId: uuid.New(), +// +// wantErr: mongo.ErrNoDocuments, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbParty) +// assert.NoError(t, err) +// +// leaderId, err := repo.GetPartyLeaderIdByMemberId(ctx, tt.targetId) +// assert.Equal(t, tt.wantErr, err) +// assert.Equal(t, tt.wantLeaderId, leaderId) +// }) +// } +//} +// +//func TestMongoRepository_RemoveMemberFromParty(t *testing.T) { +// partyMembers := []*model.PartyMember{{PlayerID: uuid.New(), Username: "test1"}, {PlayerID: uuid.New(), Username: "test2"}} +// party := &model.Party{ +// ID: primitive.NewObjectID(), +// LeaderId: partyMembers[0].PlayerID, +// Members: partyMembers, +// } +// +// tests := []struct { +// name string +// +// dbParty *model.Party +// +// partyId primitive.ObjectID +// memberId uuid.UUID +// +// wantParty *model.Party +// wantErr error +// }{ +// { +// name: "success", +// dbParty: party, +// partyId: party.ID, +// memberId: partyMembers[1].PlayerID, +// +// wantParty: &model.Party{ +// ID: party.ID, +// LeaderId: party.LeaderId, +// Members: []*model.PartyMember{partyMembers[0]}, +// }, +// }, +// { +// name: "failure_party_not_exists", +// dbParty: party, +// partyId: primitive.NewObjectID(), +// memberId: partyMembers[1].PlayerID, +// +// wantParty: party, +// wantErr: mongo.ErrNoDocuments, +// }, +// { +// name: "failure_member_not_in_party", +// dbParty: party, +// partyId: party.ID, +// memberId: uuid.New(), +// +// wantParty: party, +// wantErr: ErrNotInParty, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbParty) +// assert.NoError(t, err) +// +// err = repo.RemoveMemberFromParty(ctx, tt.partyId, tt.memberId) +// assert.Equal(t, tt.wantErr, err) +// +// var party *model.Party +// err = collection.FindOne(ctx, bson.M{"_id": tt.dbParty.ID}).Decode(&party) +// assert.NoError(t, err) +// assert.Equal(t, tt.wantParty, party) +// }) +// } +//} +// +//func TestMongoRepository_RemoveMemberFromSelfParty(t *testing.T) { +// members := []*model.PartyMember{{PlayerID: uuid.New(), Username: "test1"}, {PlayerID: uuid.New(), Username: "test2"}} +// party := &model.Party{ +// ID: primitive.NewObjectID(), +// LeaderId: members[0].PlayerID, +// Members: members, +// } +// +// tests := []struct { +// name string +// +// dbParty *model.Party +// +// memberId uuid.UUID +// +// wantParty *model.Party +// wantErr error +// }{ +// { +// name: "success", +// dbParty: party, +// memberId: members[1].PlayerID, +// +// wantParty: &model.Party{ +// ID: party.ID, +// LeaderId: party.LeaderId, +// Members: []*model.PartyMember{members[0]}, +// }, +// }, +// { +// name: "failure_member_not_in_party", +// dbParty: party, +// memberId: uuid.New(), +// +// wantParty: party, +// wantErr: mongo.ErrNoDocuments, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbParty) +// assert.NoError(t, err) +// +// err = repo.RemoveMemberFromSelfParty(ctx, tt.memberId) +// assert.Equal(t, tt.wantErr, err) +// +// var party *model.Party +// err = collection.FindOne(ctx, bson.M{"_id": tt.dbParty.ID}).Decode(&party) +// assert.NoError(t, err) +// assert.Equal(t, tt.wantParty, party) +// }) +// } +//} +// +//func TestMongoRepository_CreatePartyInvite(t *testing.T) { +// invite := &model.PartyInvite{ +// InviterID: uuid.New(), +// InviterUsername: "test", +// +// TargetID: uuid.New(), +// TargetUsername: "test2", +// +// ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), +// } +// +// tests := []struct { +// name string +// invite *model.PartyInvite +// wantErr error +// }{ +// { +// name: "success", +// invite: invite, +// }, +// { +// name: "failure_id_specified", +// invite: &model.PartyInvite{ +// ID: primitive.NewObjectID(), +// }, +// wantErr: ErrIdMustBeNil, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// err := repo.CreatePartyInvite(ctx, tt.invite) +// assert.Equal(t, tt.wantErr, err) +// assert.NotEqual(t, primitive.NilObjectID, tt.invite.ID) +// +// if tt.wantErr == nil { +// // Retrieve the invite from the database and compare it to the one we created +// collection := database.Collection(partyInviteCollectionName) +// var dbInvite *model.PartyInvite +// err = collection.FindOne(ctx, bson.M{"_id": tt.invite.ID}).Decode(&dbInvite) +// assert.NoError(t, err) +// assert.Equal(t, tt.invite, dbInvite) +// } +// }) +// } +//} +// +//func TestMongoRepository_DeletePartyInvite(t *testing.T) { +// invite := &model.PartyInvite{ +// InviterID: uuid.New(), +// InviterUsername: "test", +// +// TargetID: uuid.New(), +// TargetUsername: "test2", +// +// ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), +// } +// +// tests := []struct { +// name string +// +// dbInvite *model.PartyInvite +// +// partyId primitive.ObjectID +// targetId uuid.UUID +// +// wantErr error +// wantPresent bool +// }{ +// { +// name: "success", +// +// dbInvite: invite, +// +// partyId: invite.PartyID, +// targetId: invite.TargetID, +// +// wantPresent: false, +// }, +// { +// name: "failure_wrong_party_id", +// +// dbInvite: invite, +// +// partyId: primitive.NewObjectID(), +// targetId: invite.TargetID, +// +// wantErr: mongo.ErrNoDocuments, +// wantPresent: true, +// }, +// { +// name: "failure_wrong_target_id", +// +// dbInvite: invite, +// +// partyId: invite.PartyID, +// targetId: uuid.New(), +// +// wantErr: mongo.ErrNoDocuments, +// wantPresent: true, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyInviteCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbInvite) +// assert.NoError(t, err) +// +// err = repo.DeletePartyInvite(ctx, tt.partyId, tt.targetId) +// assert.Equal(t, tt.wantErr, err) +// +// count, err := collection.CountDocuments(ctx, bson.M{"_id": tt.dbInvite.ID}) +// assert.NoError(t, err) +// assert.Equal(t, tt.wantPresent, count > 0) +// }) +// } +//} +// +//func TestMongoRepository_GetPartyInvitesByPartyId(t *testing.T) { +// partyId := primitive.NewObjectID() +// +// invites := []*model.PartyInvite{ +// { +// ID: primitive.NewObjectID(), +// PartyID: partyId, +// InviterID: uuid.New(), +// InviterUsername: "test", +// TargetID: uuid.New(), +// TargetUsername: "test2", +// ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), +// }, +// { +// ID: primitive.NewObjectID(), +// PartyID: partyId, +// InviterID: uuid.New(), +// InviterUsername: "test", +// TargetID: uuid.New(), +// TargetUsername: "test3", +// ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), +// }, +// { +// ID: primitive.NewObjectID(), +// PartyID: primitive.NewObjectID(), +// InviterID: uuid.New(), +// InviterUsername: "otherPartyTest", +// TargetID: uuid.New(), +// TargetUsername: "otherPartyTest2", +// ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), +// }, +// } +// +// tests := []struct { +// name string +// +// dbInvites []*model.PartyInvite +// +// partyId primitive.ObjectID +// +// wantInvites []*model.PartyInvite +// }{ +// { +// name: "success", +// dbInvites: invites, +// partyId: partyId, +// +// wantInvites: invites[:2], +// }, +// { +// name: "failure_party_not_found", +// dbInvites: invites, +// partyId: primitive.NewObjectID(), +// +// wantInvites: nil, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyInviteCollectionName) +// for _, invite := range tt.dbInvites { +// _, err := collection.InsertOne(ctx, invite) +// assert.NoError(t, err) +// } +// +// invites, err := repo.GetPartyInvitesByPartyId(ctx, tt.partyId) +// assert.Nil(t, err) +// assert.ElementsMatch(t, tt.wantInvites, invites) +// }) +// } +//} +// +//func TestMongoRepository_DoesPartyInviteExist(t *testing.T) { +// invites := []*model.PartyInvite{ +// { +// ID: primitive.NewObjectID(), +// PartyID: primitive.NewObjectID(), +// InviterID: uuid.New(), +// InviterUsername: "test", +// TargetID: uuid.New(), +// TargetUsername: "test2", +// ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), +// }, +// { +// ID: primitive.NewObjectID(), +// PartyID: primitive.NewObjectID(), +// InviterID: uuid.New(), +// InviterUsername: "test3", +// TargetID: uuid.New(), +// TargetUsername: "test4", +// ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), +// }, +// } +// +// tests := []struct { +// name string +// +// dbInvites []*model.PartyInvite +// +// partyId primitive.ObjectID +// targetId uuid.UUID +// +// wantExists bool +// }{ +// { +// name: "success", +// +// dbInvites: invites, +// +// partyId: invites[0].PartyID, +// targetId: invites[0].TargetID, +// +// wantExists: true, +// }, +// { +// name: "failure_party_not_found", +// +// dbInvites: invites, +// +// partyId: primitive.NewObjectID(), +// targetId: invites[0].TargetID, +// +// wantExists: false, +// }, +// { +// name: "failure_target_not_invited", +// +// dbInvites: invites, +// +// partyId: invites[0].PartyID, +// targetId: uuid.New(), +// +// wantExists: false, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partyInviteCollectionName) +// for _, invite := range tt.dbInvites { +// _, err := collection.InsertOne(ctx, invite) +// assert.NoError(t, err) +// } +// +// exists, err := repo.DoesPartyInviteExist(ctx, tt.partyId, tt.targetId) +// assert.NoError(t, err) +// assert.Equal(t, tt.wantExists, exists) +// }) +// } +//} +// +//func TestMongoRepository_GetPartySettings(t *testing.T) { +// settings := model.NewPartySettings(uuid.New()) +// +// tests := []struct { +// name string +// +// dbSettings *model.PartySettings +// +// playerId uuid.UUID +// +// wantSettings *model.PartySettings +// wantErr error +// }{ +// { +// name: "success", +// dbSettings: settings, +// +// playerId: settings.PlayerID, +// +// wantSettings: settings, +// }, +// { +// name: "failure_not_found", +// dbSettings: settings, +// +// playerId: uuid.New(), +// +// wantSettings: nil, +// wantErr: mongo.ErrNoDocuments, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partySettingsCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbSettings) +// assert.NoError(t, err) +// +// settings, err := repo.GetPartySettings(ctx, tt.playerId) +// assert.Equal(t, tt.wantErr, err) +// assert.Equal(t, tt.wantSettings, settings) +// }) +// } +//} +// +//func TestMongoRepository_UpdatePartySettings(t *testing.T) { +// settings := model.NewPartySettings(uuid.New()) +// +// settings.AllowMemberDequeue = !settings.AllowMemberDequeue +// settings.AllowMemberInvite = !settings.AllowMemberInvite +// +// tests := []struct { +// name string +// +// dbSettings *model.PartySettings +// +// updateSettings *model.PartySettings +// +// wantErr bool +// }{ +// { +// name: "success", +// dbSettings: settings, +// +// updateSettings: settings, +// wantErr: false, +// }, +// { +// name: "success_no_changes", +// dbSettings: settings, +// +// updateSettings: settings, +// wantErr: false, +// }, +// { +// name: "success_no_found", +// dbSettings: settings, +// +// updateSettings: model.NewPartySettings(uuid.New()), +// wantErr: false, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// t.Cleanup(cleanup) +// ctx := context.Background() +// +// collection := database.Collection(partySettingsCollectionName) +// _, err := collection.InsertOne(ctx, tt.dbSettings) +// assert.NoError(t, err) +// +// err = repo.UpdatePartySettings(ctx, tt.updateSettings) +// if tt.wantErr { +// assert.Error(t, err) +// } else { +// assert.NoError(t, err) +// } +// +// if !tt.wantErr { +// settings, err := repo.GetPartySettings(ctx, tt.updateSettings.PlayerID) +// assert.NoError(t, err) +// assert.Equal(t, tt.updateSettings, settings) +// +// // If the player IDs are different, ensure both settings are in the database +// if tt.updateSettings.PlayerID != tt.dbSettings.PlayerID { +// settings, err := repo.GetPartySettings(ctx, tt.dbSettings.PlayerID) +// assert.NoError(t, err) +// assert.Equal(t, tt.dbSettings, settings) +// } +// } +// }) +// } +//} +// +//func cleanup() { +// ctx := context.Background() +// if err := database.Drop(ctx); err != nil { +// log.Panicf("could not drop database: %s", err) +// } //} - -func TestMongoRepository_DeleteParty(t *testing.T) { - party := &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: uuid.New(), - Members: []*model.PartyMember{{PlayerID: uuid.New(), Username: "test"}}, - } - - tests := []struct { - name string - - dbParty *model.Party - - partyId primitive.ObjectID - - wantErr error - }{ - { - name: "success", - dbParty: party, - partyId: party.ID, - wantErr: nil, - }, - { - name: "failure_not_exists", - dbParty: party, - partyId: primitive.NewObjectID(), - wantErr: mongo.ErrNoDocuments, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbParty) - assert.NoError(t, err) - - err = repo.DeleteParty(ctx, tt.partyId) - assert.Equal(t, tt.wantErr, err) - - // Check the party was deleted in the database - if tt.wantErr == nil { - count, err := collection.CountDocuments(ctx, bson.M{"_id": tt.partyId}) - assert.NoError(t, err) - assert.Equal(t, int64(0), count) - } - }) - } -} - -func TestMongoRepository_AddPartyMember(t *testing.T) { - partyMembers := []model.PartyMember{ - {PlayerID: uuid.New(), Username: "test1"}, - {PlayerID: uuid.New(), Username: "test2"}, - } - - party := &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: partyMembers[0].PlayerID, - Members: []*model.PartyMember{&partyMembers[0]}, - } - - tests := []struct { - name string - - dbParty *model.Party - - partyId primitive.ObjectID - addedMember *model.PartyMember - - wantErr error - }{ - { - name: "success", - - dbParty: party, - - partyId: party.ID, - addedMember: &partyMembers[1], - - wantErr: nil, - }, - { - name: "failure_party_not_exists", - - dbParty: party, - - partyId: primitive.NewObjectID(), - addedMember: &partyMembers[1], - - wantErr: mongo.ErrNoDocuments, - }, - { - name: "failure_member_already_in_party", - - dbParty: party, - - partyId: party.ID, - addedMember: &partyMembers[0], - - wantErr: ErrAlreadyInParty, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbParty) - assert.NoError(t, err) - - err = repo.AddPartyMember(ctx, tt.partyId, tt.addedMember) - assert.Equal(t, tt.wantErr, err) - - // Check the party was updated in the database - if tt.wantErr == nil { - party := model.Party{} - err = collection.FindOne(ctx, bson.M{"_id": tt.partyId}).Decode(&party) - assert.NoError(t, err) - assert.Contains(t, party.Members, tt.addedMember) - } - }) - } -} - -func TestMongoRepository_SetPartyLeader(t *testing.T) { - partyMembers := []*model.PartyMember{ - {PlayerID: uuid.New(), Username: "test1"}, - {PlayerID: uuid.New(), Username: "test2"}, - } - - party := &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: partyMembers[0].PlayerID, - Members: partyMembers, - } - - tests := []struct { - name string - - dbParty *model.Party - - partyId primitive.ObjectID - setLeaderId uuid.UUID - - wantErr error - }{ - { - name: "success", - - dbParty: party, - - partyId: party.ID, - setLeaderId: partyMembers[1].PlayerID, - - wantErr: nil, - }, - { - name: "failure_party_not_exists", - - dbParty: party, - - partyId: primitive.NewObjectID(), - setLeaderId: partyMembers[1].PlayerID, - - wantErr: mongo.ErrNoDocuments, - }, - { - name: "failure_already_leader", - - dbParty: party, - - partyId: party.ID, - setLeaderId: partyMembers[0].PlayerID, - - wantErr: ErrAlreadyLeader, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbParty) - assert.NoError(t, err) - - err = repo.SetPartyLeader(ctx, tt.partyId, tt.setLeaderId) - assert.Equal(t, tt.wantErr, err) - - // Check the party was updated in the database - if tt.wantErr == nil { - party := model.Party{} - err = collection.FindOne(ctx, bson.M{"_id": tt.partyId}).Decode(&party) - assert.NoError(t, err) - assert.Equal(t, tt.setLeaderId, party.LeaderId) - } - }) - } -} - -func TestMongoRepository_GetPartyById(t *testing.T) { - member := &model.PartyMember{PlayerID: uuid.New(), Username: "test"} - - party := &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: member.PlayerID, - Members: []*model.PartyMember{member}, - } - - tests := []struct { - name string - - dbParty *model.Party - - partyId primitive.ObjectID - - wantParty *model.Party - wantErr error - }{ - { - name: "success", - dbParty: party, - partyId: party.ID, - - wantParty: party, - }, - { - name: "failure_party_not_exists", - dbParty: party, - partyId: primitive.NewObjectID(), - - wantErr: mongo.ErrNoDocuments, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbParty) - assert.NoError(t, err) - - party, err := repo.GetPartyByID(ctx, tt.partyId) - assert.Equal(t, tt.wantErr, err) - assert.Equal(t, tt.wantParty, party) - }) - } -} - -func TestMongoRepository_GetPartyByMemberId(t *testing.T) { - member := &model.PartyMember{PlayerID: uuid.New(), Username: "test"} - - party := &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: member.PlayerID, - Members: []*model.PartyMember{member}, - } - - tests := []struct { - name string - - dbParty *model.Party - - memberId uuid.UUID - - wantParty *model.Party - wantErr error - }{ - { - name: "success", - dbParty: party, - memberId: member.PlayerID, - - wantParty: party, - }, - { - name: "failure_party_not_exists", - dbParty: party, - memberId: uuid.New(), - - wantErr: mongo.ErrNoDocuments, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbParty) - assert.NoError(t, err) - - party, err := repo.GetPartyByMemberID(ctx, tt.memberId) - assert.Equal(t, tt.wantErr, err) - assert.Equal(t, tt.wantParty, party) - }) - } -} - -func TestMongoRepository_GetPartyIdByMemberId(t *testing.T) { - member := &model.PartyMember{PlayerID: uuid.New(), Username: "test"} - - party := &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: member.PlayerID, - Members: []*model.PartyMember{member}, - } - - tests := []struct { - name string - - dbParty *model.Party - - memberId uuid.UUID - - wantPartyId primitive.ObjectID - wantErr error - }{ - { - name: "success", - dbParty: party, - memberId: member.PlayerID, - - wantPartyId: party.ID, - }, - { - name: "failure_party_not_exists", - dbParty: party, - memberId: uuid.New(), - - wantErr: mongo.ErrNoDocuments, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbParty) - assert.NoError(t, err) - - partyId, err := repo.GetPartyIdByMemberId(ctx, tt.memberId) - assert.Equal(t, tt.wantErr, err) - assert.Equal(t, tt.wantPartyId, partyId) - }) - } -} - -func TestMongoRepository_GetPartyLeaderIdByMemberId(t *testing.T) { - members := []*model.PartyMember{{PlayerID: uuid.New(), Username: "test1"}, {PlayerID: uuid.New(), Username: "test2"}} - - party := &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: members[0].PlayerID, - Members: members, - } - - tests := []struct { - name string - - dbParty *model.Party - - targetId uuid.UUID - - wantLeaderId uuid.UUID - wantErr error - }{ - { - name: "success", - dbParty: party, - targetId: members[0].PlayerID, - - wantLeaderId: party.LeaderId, - }, - { - name: "success_not_leader", - dbParty: party, - targetId: members[1].PlayerID, - - wantLeaderId: party.LeaderId, - }, - { - name: "failure_party_not_exists", - dbParty: party, - targetId: uuid.New(), - - wantErr: mongo.ErrNoDocuments, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbParty) - assert.NoError(t, err) - - leaderId, err := repo.GetPartyLeaderIdByMemberId(ctx, tt.targetId) - assert.Equal(t, tt.wantErr, err) - assert.Equal(t, tt.wantLeaderId, leaderId) - }) - } -} - -func TestMongoRepository_RemoveMemberFromParty(t *testing.T) { - partyMembers := []*model.PartyMember{{PlayerID: uuid.New(), Username: "test1"}, {PlayerID: uuid.New(), Username: "test2"}} - party := &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: partyMembers[0].PlayerID, - Members: partyMembers, - } - - tests := []struct { - name string - - dbParty *model.Party - - partyId primitive.ObjectID - memberId uuid.UUID - - wantParty *model.Party - wantErr error - }{ - { - name: "success", - dbParty: party, - partyId: party.ID, - memberId: partyMembers[1].PlayerID, - - wantParty: &model.Party{ - ID: party.ID, - LeaderId: party.LeaderId, - Members: []*model.PartyMember{partyMembers[0]}, - }, - }, - { - name: "failure_party_not_exists", - dbParty: party, - partyId: primitive.NewObjectID(), - memberId: partyMembers[1].PlayerID, - - wantParty: party, - wantErr: mongo.ErrNoDocuments, - }, - { - name: "failure_member_not_in_party", - dbParty: party, - partyId: party.ID, - memberId: uuid.New(), - - wantParty: party, - wantErr: ErrNotInParty, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbParty) - assert.NoError(t, err) - - err = repo.RemoveMemberFromParty(ctx, tt.partyId, tt.memberId) - assert.Equal(t, tt.wantErr, err) - - var party *model.Party - err = collection.FindOne(ctx, bson.M{"_id": tt.dbParty.ID}).Decode(&party) - assert.NoError(t, err) - assert.Equal(t, tt.wantParty, party) - }) - } -} - -func TestMongoRepository_RemoveMemberFromSelfParty(t *testing.T) { - members := []*model.PartyMember{{PlayerID: uuid.New(), Username: "test1"}, {PlayerID: uuid.New(), Username: "test2"}} - party := &model.Party{ - ID: primitive.NewObjectID(), - LeaderId: members[0].PlayerID, - Members: members, - } - - tests := []struct { - name string - - dbParty *model.Party - - memberId uuid.UUID - - wantParty *model.Party - wantErr error - }{ - { - name: "success", - dbParty: party, - memberId: members[1].PlayerID, - - wantParty: &model.Party{ - ID: party.ID, - LeaderId: party.LeaderId, - Members: []*model.PartyMember{members[0]}, - }, - }, - { - name: "failure_member_not_in_party", - dbParty: party, - memberId: uuid.New(), - - wantParty: party, - wantErr: mongo.ErrNoDocuments, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyCollectionName) - _, err := collection.InsertOne(ctx, tt.dbParty) - assert.NoError(t, err) - - err = repo.RemoveMemberFromSelfParty(ctx, tt.memberId) - assert.Equal(t, tt.wantErr, err) - - var party *model.Party - err = collection.FindOne(ctx, bson.M{"_id": tt.dbParty.ID}).Decode(&party) - assert.NoError(t, err) - assert.Equal(t, tt.wantParty, party) - }) - } -} - -func TestMongoRepository_CreatePartyInvite(t *testing.T) { - invite := &model.PartyInvite{ - InviterID: uuid.New(), - InviterUsername: "test", - - TargetID: uuid.New(), - TargetUsername: "test2", - - ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), - } - - tests := []struct { - name string - invite *model.PartyInvite - wantErr error - }{ - { - name: "success", - invite: invite, - }, - { - name: "failure_id_specified", - invite: &model.PartyInvite{ - ID: primitive.NewObjectID(), - }, - wantErr: ErrIdMustBeNil, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - err := repo.CreatePartyInvite(ctx, tt.invite) - assert.Equal(t, tt.wantErr, err) - assert.NotEqual(t, primitive.NilObjectID, tt.invite.ID) - - if tt.wantErr == nil { - // Retrieve the invite from the database and compare it to the one we created - collection := database.Collection(partyInviteCollectionName) - var dbInvite *model.PartyInvite - err = collection.FindOne(ctx, bson.M{"_id": tt.invite.ID}).Decode(&dbInvite) - assert.NoError(t, err) - assert.Equal(t, tt.invite, dbInvite) - } - }) - } -} - -func TestMongoRepository_DeletePartyInvite(t *testing.T) { - invite := &model.PartyInvite{ - InviterID: uuid.New(), - InviterUsername: "test", - - TargetID: uuid.New(), - TargetUsername: "test2", - - ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), - } - - tests := []struct { - name string - - dbInvite *model.PartyInvite - - partyId primitive.ObjectID - targetId uuid.UUID - - wantErr error - wantPresent bool - }{ - { - name: "success", - - dbInvite: invite, - - partyId: invite.PartyID, - targetId: invite.TargetID, - - wantPresent: false, - }, - { - name: "failure_wrong_party_id", - - dbInvite: invite, - - partyId: primitive.NewObjectID(), - targetId: invite.TargetID, - - wantErr: mongo.ErrNoDocuments, - wantPresent: true, - }, - { - name: "failure_wrong_target_id", - - dbInvite: invite, - - partyId: invite.PartyID, - targetId: uuid.New(), - - wantErr: mongo.ErrNoDocuments, - wantPresent: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyInviteCollectionName) - _, err := collection.InsertOne(ctx, tt.dbInvite) - assert.NoError(t, err) - - err = repo.DeletePartyInvite(ctx, tt.partyId, tt.targetId) - assert.Equal(t, tt.wantErr, err) - - count, err := collection.CountDocuments(ctx, bson.M{"_id": tt.dbInvite.ID}) - assert.NoError(t, err) - assert.Equal(t, tt.wantPresent, count > 0) - }) - } -} - -func TestMongoRepository_GetPartyInvitesByPartyId(t *testing.T) { - partyId := primitive.NewObjectID() - - invites := []*model.PartyInvite{ - { - ID: primitive.NewObjectID(), - PartyID: partyId, - InviterID: uuid.New(), - InviterUsername: "test", - TargetID: uuid.New(), - TargetUsername: "test2", - ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), - }, - { - ID: primitive.NewObjectID(), - PartyID: partyId, - InviterID: uuid.New(), - InviterUsername: "test", - TargetID: uuid.New(), - TargetUsername: "test3", - ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), - }, - { - ID: primitive.NewObjectID(), - PartyID: primitive.NewObjectID(), - InviterID: uuid.New(), - InviterUsername: "otherPartyTest", - TargetID: uuid.New(), - TargetUsername: "otherPartyTest2", - ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), - }, - } - - tests := []struct { - name string - - dbInvites []*model.PartyInvite - - partyId primitive.ObjectID - - wantInvites []*model.PartyInvite - }{ - { - name: "success", - dbInvites: invites, - partyId: partyId, - - wantInvites: invites[:2], - }, - { - name: "failure_party_not_found", - dbInvites: invites, - partyId: primitive.NewObjectID(), - - wantInvites: nil, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyInviteCollectionName) - for _, invite := range tt.dbInvites { - _, err := collection.InsertOne(ctx, invite) - assert.NoError(t, err) - } - - invites, err := repo.GetPartyInvitesByPartyId(ctx, tt.partyId) - assert.Nil(t, err) - assert.ElementsMatch(t, tt.wantInvites, invites) - }) - } -} - -func TestMongoRepository_DoesPartyInviteExist(t *testing.T) { - invites := []*model.PartyInvite{ - { - ID: primitive.NewObjectID(), - PartyID: primitive.NewObjectID(), - InviterID: uuid.New(), - InviterUsername: "test", - TargetID: uuid.New(), - TargetUsername: "test2", - ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), - }, - { - ID: primitive.NewObjectID(), - PartyID: primitive.NewObjectID(), - InviterID: uuid.New(), - InviterUsername: "test3", - TargetID: uuid.New(), - TargetUsername: "test4", - ExpiresAt: time.UnixMilli(time.Now().UnixMilli()).In(time.UTC), - }, - } - - tests := []struct { - name string - - dbInvites []*model.PartyInvite - - partyId primitive.ObjectID - targetId uuid.UUID - - wantExists bool - }{ - { - name: "success", - - dbInvites: invites, - - partyId: invites[0].PartyID, - targetId: invites[0].TargetID, - - wantExists: true, - }, - { - name: "failure_party_not_found", - - dbInvites: invites, - - partyId: primitive.NewObjectID(), - targetId: invites[0].TargetID, - - wantExists: false, - }, - { - name: "failure_target_not_invited", - - dbInvites: invites, - - partyId: invites[0].PartyID, - targetId: uuid.New(), - - wantExists: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partyInviteCollectionName) - for _, invite := range tt.dbInvites { - _, err := collection.InsertOne(ctx, invite) - assert.NoError(t, err) - } - - exists, err := repo.DoesPartyInviteExist(ctx, tt.partyId, tt.targetId) - assert.NoError(t, err) - assert.Equal(t, tt.wantExists, exists) - }) - } -} - -func TestMongoRepository_GetPartySettings(t *testing.T) { - settings := model.NewPartySettings(uuid.New()) - - tests := []struct { - name string - - dbSettings *model.PartySettings - - playerId uuid.UUID - - wantSettings *model.PartySettings - wantErr error - }{ - { - name: "success", - dbSettings: settings, - - playerId: settings.PlayerID, - - wantSettings: settings, - }, - { - name: "failure_not_found", - dbSettings: settings, - - playerId: uuid.New(), - - wantSettings: nil, - wantErr: mongo.ErrNoDocuments, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partySettingsCollectionName) - _, err := collection.InsertOne(ctx, tt.dbSettings) - assert.NoError(t, err) - - settings, err := repo.GetPartySettings(ctx, tt.playerId) - assert.Equal(t, tt.wantErr, err) - assert.Equal(t, tt.wantSettings, settings) - }) - } -} - -func TestMongoRepository_UpdatePartySettings(t *testing.T) { - settings := model.NewPartySettings(uuid.New()) - - settings.AllowMemberDequeue = !settings.AllowMemberDequeue - settings.AllowMemberInvite = !settings.AllowMemberInvite - - tests := []struct { - name string - - dbSettings *model.PartySettings - - updateSettings *model.PartySettings - - wantErr bool - }{ - { - name: "success", - dbSettings: settings, - - updateSettings: settings, - wantErr: false, - }, - { - name: "success_no_changes", - dbSettings: settings, - - updateSettings: settings, - wantErr: false, - }, - { - name: "success_no_found", - dbSettings: settings, - - updateSettings: model.NewPartySettings(uuid.New()), - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Cleanup(cleanup) - ctx := context.Background() - - collection := database.Collection(partySettingsCollectionName) - _, err := collection.InsertOne(ctx, tt.dbSettings) - assert.NoError(t, err) - - err = repo.UpdatePartySettings(ctx, tt.updateSettings) - if tt.wantErr { - assert.Error(t, err) - } else { - assert.NoError(t, err) - } - - if !tt.wantErr { - settings, err := repo.GetPartySettings(ctx, tt.updateSettings.PlayerID) - assert.NoError(t, err) - assert.Equal(t, tt.updateSettings, settings) - - // If the player IDs are different, ensure both settings are in the database - if tt.updateSettings.PlayerID != tt.dbSettings.PlayerID { - settings, err := repo.GetPartySettings(ctx, tt.dbSettings.PlayerID) - assert.NoError(t, err) - assert.Equal(t, tt.dbSettings, settings) - } - } - }) - } -} - -func cleanup() { - ctx := context.Background() - if err := database.Drop(ctx); err != nil { - log.Panicf("could not drop database: %s", err) - } -}