From 751a69b98003b3042f3a46e62937a5fa26be3835 Mon Sep 17 00:00:00 2001 From: Kathurima Kimathi <41376826+KathurimaKimathi@users.noreply.github.com> Date: Mon, 4 Oct 2021 09:50:55 +0300 Subject: [PATCH] add patient usecases integration tests (#51) Signed-off-by: Kathurima Kimathi --- go.mod | 10 +- go.sum | 31 +- .../services/onboarding/onboarding.go | 9 +- pkg/clinical/presentation/config.go | 47 + pkg/clinical/usecases/config_test.go | 255 ++- pkg/clinical/usecases/patient.go | 38 +- .../usecases/patient_integration_test.go | 1386 +++++++++++++++++ pkg/clinical/usecases/patient_unit_test.go | 2 +- tests/acceptance_test.go | 238 +-- 9 files changed, 1855 insertions(+), 161 deletions(-) create mode 100644 pkg/clinical/usecases/patient_integration_test.go diff --git a/go.mod b/go.mod index 7b8516d9..45ec17f3 100644 --- a/go.mod +++ b/go.mod @@ -5,22 +5,16 @@ go 1.16 require ( cloud.google.com/go v0.87.0 // indirect cloud.google.com/go/firestore v1.5.0 - cloud.google.com/go/storage v1.16.0 // indirect - contrib.go.opencensus.io/exporter/stackdriver v0.13.8 // indirect firebase.google.com/go v3.13.0+incompatible github.com/99designs/gqlgen v0.13.0 - github.com/agnivade/levenshtein v1.1.1 // indirect github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d github.com/aws/aws-sdk-go v1.40.0 // indirect github.com/brianvoe/gofakeit v3.18.0+incompatible github.com/casbin/casbin/v2 v2.37.2 - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/uuid v1.3.0 github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 - github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/imroc/req v0.3.0 - github.com/kr/pretty v0.2.0 // indirect github.com/mitchellh/mapstructure v1.4.1 github.com/pkg/errors v0.9.1 github.com/rs/xid v1.3.0 @@ -29,6 +23,7 @@ require ( github.com/savannahghi/feedlib v0.0.6 // indirect github.com/savannahghi/firebasetools v0.0.15 github.com/savannahghi/interserviceclient v0.0.18 + github.com/savannahghi/onboarding v0.0.22 github.com/savannahghi/profileutils v0.0.17 github.com/savannahghi/scalarutils v0.0.4 github.com/savannahghi/serverutils v0.0.4 @@ -36,10 +31,7 @@ require ( github.com/sirupsen/logrus v1.8.1 github.com/stretchr/testify v1.7.0 github.com/vektah/gqlparser/v2 v2.1.0 - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect - golang.org/x/tools v0.1.5 // indirect google.golang.org/api v0.50.0 google.golang.org/genproto v0.0.0-20210714021259-044028024a4f // indirect ) diff --git a/go.sum b/go.sum index 3cb18e79..0b4ec1b7 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,10 @@ cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPT cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.86.0/go.mod h1:YG2MRW8zzPSZaztnTZtxbMPK2VYaHg4NTDYZMG+5ZqQ= cloud.google.com/go v0.87.0 h1:8ZtzmY4a2JIO2sljMbpqkDYxA8aJQveYr3AMa+X40oc= cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= @@ -39,6 +41,8 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.11.0/go.mod h1:6ZBO0JxLGueyjTqUz7FB1TIbvMep49WcCiiZcG2Tmu0= +cloud.google.com/go/pubsub v1.12.2/go.mod h1:BmI/dqa6eXfm8WTp+JIN6d6vtVGq+vcsnglFKn/aVkY= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -77,13 +81,16 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.39.4/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go v1.40.0 h1:nTCSQAeahNt15SOYxuDwJ8XvMhOU3Uqe7eJUPv7+Vsk= github.com/aws/aws-sdk-go v1.40.0/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/brianvoe/gofakeit v3.18.0+incompatible h1:wDOmHc9DLG4nRjUVVaxA+CEglKOW72Y5+4WNxUIkjM8= github.com/brianvoe/gofakeit v3.18.0+incompatible/go.mod h1:kfwdRA90vvNhPutZWfH7WPaDzUjz+CZFqG+rPkOjGOc= +github.com/brianvoe/gofakeit/v5 v5.11.2/go.mod h1:/ZENnKqX+XrN8SORLe/fu5lZDIo1tuPncWuRD+eyhSI= github.com/casbin/casbin/v2 v2.37.2 h1:0EFqGW52zId3jKCWv8qp2uXOjVFDPdtmzZTVTA4klus= github.com/casbin/casbin/v2 v2.37.2/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -99,9 +106,7 @@ github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcju github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -222,6 +227,7 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9 h1:2tft2559dNwKl2znYB58oVTql0grRB+Ml3LWIBbc4WM= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -339,11 +345,11 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/savannahghi/converterandformatter v0.0.3/go.mod h1:0o7yieYU10WabPqKuqj+5QL52eTL1eGElxjb+A68bbA= +github.com/savannahghi/converterandformatter v0.0.9/go.mod h1:DNqyfHojHOrll1/l6Y9UUSl97/TBiB08zcRWjaXbXRM= github.com/savannahghi/converterandformatter v0.0.10/go.mod h1:DNqyfHojHOrll1/l6Y9UUSl97/TBiB08zcRWjaXbXRM= github.com/savannahghi/converterandformatter v0.0.11 h1:N9UPNhabmrxKAnM4E68qrP6/urijMBr0/1EzSWPX3C4= github.com/savannahghi/converterandformatter v0.0.11/go.mod h1:PjKS+eAlw+z/3aZFN1brsX+jxpTlLgs7boOY7EbUbhs= @@ -359,13 +365,19 @@ github.com/savannahghi/feedlib v0.0.6 h1:0emrdZvtByxtebN4MRtEZ+7s48DWovIJMIXVSOe github.com/savannahghi/feedlib v0.0.6/go.mod h1:PzEP7gw4w1Xuw36uIRr1H2ffd+kozWHyJCuGWO06AtQ= github.com/savannahghi/firebasetools v0.0.5/go.mod h1:obAxyBfPaGTx/g86LF19gSmmEh5x+Tbnziatk514mUQ= github.com/savannahghi/firebasetools v0.0.6/go.mod h1:obAxyBfPaGTx/g86LF19gSmmEh5x+Tbnziatk514mUQ= +github.com/savannahghi/firebasetools v0.0.13/go.mod h1:0xgpolbK6P2GzUveYSeF9DcMTkJvF8pIWLes1LLtTEE= github.com/savannahghi/firebasetools v0.0.15 h1:/i/VyddxLmBO1Fn4W1rcj6nKUut2x+mgX4BOU0ogiPY= github.com/savannahghi/firebasetools v0.0.15/go.mod h1:2Qhj483I+CiKzObf+T3cKhf1YYsEQWz8e+KPE+6LyBk= +github.com/savannahghi/interserviceclient v0.0.13/go.mod h1:aGGEc+40bBVHVDs1k0CzK5uPb5080vv4fb25T/cuXQk= github.com/savannahghi/interserviceclient v0.0.18 h1:jv27OMYBU7OD7r7hVlnfFbVvBeCAOtJ9zM7UbtscIDA= github.com/savannahghi/interserviceclient v0.0.18/go.mod h1:QXr6xZ+sV/xDB2CxS7fzHKPOqdDWj0/HmFdav1cUCKs= +github.com/savannahghi/onboarding v0.0.22 h1:s+hWsMUyGA72W/E8DewI6xnNHqgbnOp6rt71fYnQRC4= +github.com/savannahghi/onboarding v0.0.22/go.mod h1:kn+yrdfhjgeCmzs9AfP9+cVJWi3kfmgj/kn7pNor0xY= +github.com/savannahghi/profileutils v0.0.6/go.mod h1:Ct0sjzOW9zjDN58ynT5GTV6M2hHMY3nsFDV08I6gpO4= github.com/savannahghi/profileutils v0.0.16/go.mod h1:Ct0sjzOW9zjDN58ynT5GTV6M2hHMY3nsFDV08I6gpO4= github.com/savannahghi/profileutils v0.0.17 h1:Zgk3n+ZtgQjI8vLTde4/c2U/t/Zh+q9jXZqVRL5ptRg= github.com/savannahghi/profileutils v0.0.17/go.mod h1:Sq/2fK2iVntGqwC0EFe5SED0+AkdOrxp7gra9KmWPQQ= +github.com/savannahghi/pubsubtools v0.0.2/go.mod h1:FQ+BxO4uA1ZkcziY4dR0uT9CKHVHb+4L1lUURBV2UD0= github.com/savannahghi/scalarutils v0.0.0-20210622091443-bad5089abdad/go.mod h1:Z+Dl3wc3vy5zKvthctHAtYzol1p8w27zEVRfOYueoks= github.com/savannahghi/scalarutils v0.0.4 h1:UT0a5zl1ByzV4+W7hYjGlIyLmILmpJV/Wgc39sGVc6U= github.com/savannahghi/scalarutils v0.0.4/go.mod h1:Z+Dl3wc3vy5zKvthctHAtYzol1p8w27zEVRfOYueoks= @@ -383,7 +395,6 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= @@ -415,7 +426,6 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -455,8 +465,10 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.21.0 h1:RMJ6GlUVzLYp/zmItxTTdAmr1gnpO/HHMFmvjAhvJQM= go.opentelemetry.io/contrib v0.21.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM= +go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.21.0/go.mod h1:5AzE+FZKYuWjQ6F8ovP8yngH/+oTFrSLH8PUMS1m2pM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.21.0 h1:G1vNyNfKknFvrKVC8ga8EYIECy0s5D/QPW4QPRSMhwc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.21.0/go.mod h1:JQAtechjxLEL81EjmbRwxBq/XEzGaHcsPuDHAx54hg4= +go.opentelemetry.io/contrib/propagators v0.21.0/go.mod h1:7QCSkXB+JDNZfohtRS0z3qnY+zPjFbe01o4iyEoPmRk= go.opentelemetry.io/otel v1.0.0-RC1 h1:4CeoX93DNTWt8awGK9JmNXzF9j7TyOu9upscEdtcdXc= go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I= go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC1 h1:tVhw2BMSAk248rhdeirOe9hlXKwGHDvVtF7P8F+H2DU= @@ -480,6 +492,7 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -654,6 +667,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -799,12 +814,16 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210524142926-3e3a6030be83/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/genproto v0.0.0-20210624174822-c5cf32407d0a/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210701133433-6b8dcf568a95/go.mod h1:yiaVoXHpRzHGyxV3o4DktVWY4mSUErTKaeEOq6C3t3U= +google.golang.org/genproto v0.0.0-20210707164411-8c882eb9abba/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210708141623-e76da96a951f/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210714021259-044028024a4f h1:UUQZ0BNnLgSI3v/uqq0hjdxwctexOPwnvKA5AA/Aze4= google.golang.org/genproto v0.0.0-20210714021259-044028024a4f/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= diff --git a/pkg/clinical/infrastructure/services/onboarding/onboarding.go b/pkg/clinical/infrastructure/services/onboarding/onboarding.go index 9bb8efd1..7cca5b6d 100644 --- a/pkg/clinical/infrastructure/services/onboarding/onboarding.go +++ b/pkg/clinical/infrastructure/services/onboarding/onboarding.go @@ -5,8 +5,9 @@ import ( "fmt" "net/http" - "github.com/savannahghi/clinical/pkg/clinical/application/dto" "github.com/savannahghi/clinical/pkg/clinical/application/extensions" + "github.com/savannahghi/onboarding/pkg/onboarding/application/dto" + "github.com/sirupsen/logrus" ) // internal apis definitions @@ -33,16 +34,18 @@ func NewServiceOnboardingImpl( // ServiceOnboarding represents onboarding usecases type ServiceOnboarding interface { - CreateUserProfile(ctx context.Context, payload dto.RegisterUserPayload) error + CreateUserProfile(ctx context.Context, payload *dto.RegisterUserInput) error } //CreateUserProfile makes the request to register a user -func (on *ServiceOnboardingImpl) CreateUserProfile(ctx context.Context, payload dto.RegisterUserPayload) error { +func (on *ServiceOnboardingImpl) CreateUserProfile(ctx context.Context, payload *dto.RegisterUserInput) error { res, err := on.Onboarding.MakeRequest(ctx, http.MethodPost, registerUserURL, payload) if err != nil { return fmt.Errorf("unable to send request, error: %v", err) } + logrus.Printf("47: THE RESP IS: %v", res) + logrus.Printf("48: THE ERROR IS: %v", err) if res.StatusCode != http.StatusOK { return fmt.Errorf("register user failed with status code: %v", res.StatusCode) diff --git a/pkg/clinical/presentation/config.go b/pkg/clinical/presentation/config.go index b0279d66..86c72b66 100644 --- a/pkg/clinical/presentation/config.go +++ b/pkg/clinical/presentation/config.go @@ -12,6 +12,7 @@ import ( "github.com/99designs/gqlgen/graphql/playground" "github.com/gorilla/handlers" "github.com/gorilla/mux" + "github.com/savannahghi/clinical/pkg/clinical/domain" "github.com/savannahghi/clinical/pkg/clinical/infrastructure" "github.com/savannahghi/clinical/pkg/clinical/presentation/graph" "github.com/savannahghi/clinical/pkg/clinical/presentation/graph/generated" @@ -146,3 +147,49 @@ func GQLHandler(ctx context.Context, server.ServeHTTP(w, r) } } + +// DeleteFHIRPatientByPhone handler exposes an endpoint that takes a +// patient's phone number and deletes the patient's FHIR compartment +func DeleteFHIRPatientByPhone(ctx context.Context) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + infra := infrastructure.NewInfrastructureInteractor() + s := usecases.NewUsecasesInteractor(infra) + + payload := &domain.PhoneNumberPayload{} + type errResponse struct { + Err string `json:"error"` + } + serverutils.DecodeJSONToTargetStruct(w, r, payload) + if payload.PhoneNumber == "" { + serverutils.WriteJSONResponse( + w, + errResponse{ + Err: "expected a phone number to be defined", + }, + http.StatusBadRequest, + ) + return + } + deleted, err := s.DeleteFHIRPatientByPhone(ctx, payload.PhoneNumber) + if err != nil { + err := fmt.Sprintf("unable to delete patient: %v", err.Error()) + serverutils.WriteJSONResponse( + w, + errResponse{ + Err: err, + }, + http.StatusInternalServerError, + ) + return + } + + type response struct { + Deleted bool `json:"deleted"` + } + serverutils.WriteJSONResponse( + w, + response{Deleted: deleted}, + http.StatusOK, + ) + } +} diff --git a/pkg/clinical/usecases/config_test.go b/pkg/clinical/usecases/config_test.go index 53afe91c..64e94e2e 100644 --- a/pkg/clinical/usecases/config_test.go +++ b/pkg/clinical/usecases/config_test.go @@ -2,18 +2,28 @@ package usecases_test import ( "context" + "fmt" "os" + "strconv" "testing" "cloud.google.com/go/firestore" "firebase.google.com/go/auth" + "github.com/brianvoe/gofakeit" + "github.com/savannahghi/clinical/pkg/clinical/application/common/helpers" + "github.com/savannahghi/clinical/pkg/clinical/domain" "github.com/savannahghi/clinical/pkg/clinical/infrastructure" fb "github.com/savannahghi/clinical/pkg/clinical/infrastructure/datastore/firebase" "github.com/savannahghi/clinical/pkg/clinical/presentation/interactor" "github.com/savannahghi/clinical/pkg/clinical/usecases" usecaseMock "github.com/savannahghi/clinical/pkg/clinical/usecases/mock" + "github.com/savannahghi/converterandformatter" + "github.com/savannahghi/enumutils" "github.com/savannahghi/firebasetools" + "github.com/savannahghi/interserviceclient" + "github.com/savannahghi/scalarutils" "github.com/savannahghi/serverutils" + "github.com/segmentio/ksuid" log "github.com/sirupsen/logrus" ) @@ -21,6 +31,7 @@ const ( // Repo the env to identify which repo to use Repo = "REPOSITORY" //FirebaseRepository is the value of the env when using firebase FirebaseRepository = "firebase" + testPhotoBase64 = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMtheItheIVFRMVFRAQEBIQFQ8PDxIQFREWFhURFRUYHSggGBolHRUVItheJSkrLi4uFx8zODMsOCgtLi0BCgoKDg0OFQ8PFS0dFR0rKysrLS0tKy0rKy0tLS0rKystLS0tNy0tKy0rLSsrKy0tKysrLS0tLTc3LTc3KystK//AABEIAKgBLAMBIgACEQEDEQH/xAAbAAACAwEBAQAAAAAAAAAAAAAEBQIDBgEAB//EAEEQAAEDAwIDBgMECQIFBQAAAAEAAhEDBCESMQVBURMiYXGBkQYyobHB0fAHFCNCUnKCkuEzohVDYmPxU3Oy4uP/xAAYAQEBAQEBAAAAAAAAAAAAAAAAAQIDBP/EAB0RAQEBAQEBAQADAAAAAAAAAAABEQIhMUEDEmH/2gAMAwEAAhEDEQA/ANbU4pBgKyjxGd0np0pyi7RklEGVSCVFjCEfSs12tRwpqO2lSExFRImvIKIF2s2Bp26my6Sd12pMuFMDi64loYXdF8y+KOOvqu3IA2haP4hvdNMysLcU9bDUG2y3zDTThfGXFhY4lx2BOcJb8VXWkU3RyLQfIkub4fM3KP4HagUS87k4Sf4ycTSptaN3knqTENj/AHK1Z9IrKuX1C476c9MH/wC30V3F6ANOeaH4e3QMjLuvTkjrikXQFrnxOvrNcM4NWr1AymwuJ6BfTuCfCOml2dV3eOIYNRn6BF2JZaWvcaA9wBc6BJLj3W/y84TPht2GGQ+oHEQXnvNE8oWOu3Tn+PWT4n+juq8HspgZhw0lYW94LWoOLHAh3Qr77RvnOcQ0knS5wmO8QJIgdc/RZz4y4cLmj2rB+0p5dH71Mxn0JH1V571nvj+r45bO0Oh26+y/o04uHUxTnLTjyJx/uDf7l8pvrSeeU2+D7021dku7riGuPQHn6b+i3Z4xKZ/pUs9FwcYdDm+REj7Ug4VwJ7gHBw8l9I/Slw7t7Vldo7zDpdHIGSPYh49l8mtr9zcBxx4pzfE6gjjjDTfpJ5ckNRsqlUYwOpUL6oXnVMnxXGXtSImB4LTP+gb61NN2kojht0GEQMrl82QCd0Gxh/OFi+V0nsbfh7i7vGPUhGsqd4FIPh+swf6hx4LX2/DadQTTqA+BWmMXVxqAKFbbAnKur0n0R3hI8Mpa2tUqnAhqguuLNmqWCXDkFVNVztLhjoU7tLXs8xOMrrhmYU1YDba6YBbH2IeuGzBwU/a4OAkIS9sGnMQi4SVqe0IO6sy843Rt2ACAzPig70PEGY8QqYVX/CqrTlhjyKXi2Tu4u6hGKzj4ZQJcOZzzVR9AZfkYlM7C+WX1IqjUhZx0buhxPEK79fCxjLohSdfOCziNKa+p5hcuagYJKS8LvKocdI1cyDlH1+Kh7S19MA+yYCaVQOEhXsBCV8NcWtcemyPtbjUFmwI/i687hbCStrAWQHijvjV4ws6L0dj2a3PiGfw7VNQaJwMwqvihwP6vQGHFzi9w37MkNj6O/JVXwr85hU/E9SL1o/haB5HTP2lKsB1bQmqI2+5NLW2l7WDJJCAo15Dsp18M0P2hqH91pjxcRAHtPsrfiSbR/wAStDW0v4Q5od/S2J+hSu2savaAtrmCRqbqc4uaXRBb8rfD7VoeNsbVpnO7Q5vWYJE+oA9UipU9Fma1V9VgJ7Ol2IBrOeCZIkER3T/hcLHo4s/RfDbCvSvqdR9Yvax/cbL2d0mA0Ad04Mea0HCrvXVdSMHvXNLzb3iJ9h/cs/YvdVtnGg+o+swSG3ADKu+7SABjYeW6q+Erwte0HDxpcA7EkHvA9D+Hgtcs92MJxmadxVYdg9wHlKH7eHA9CvqHx/8ACLK4/WKPdcf9RvKf4vBfObng9Vm4nxC7SvP1H1zgVyLuyLDkvYWH/wBxsR6k6P7yvil1b9lWe0jZx+1bz9G/Eix76TjAPeb4OG/0JP8ASEm/SbY9ldlwENqQ4dM7j0yPRSeVfsJHBhVNWgutoFwBBVxMCCtsAq5BaBzQtWgQJVz2HdFUhLcouo8IpasStRbXDKbCGkh/IjbyWUp4mMJhZk7bqB/wriVRzwHP1A8jlan9VMao+kBYzh7Oze145GYOy3P64+qwEnHQYCzVTju5Q9CzLj4K59RoEuPohRxR73aWshvXYqEW13spefRDVnF4zt0V91bNPWfHKqps2VaAvtOgQnFqRAHOVohTBQfFLaQIKKy4scSRlLavDCSU7uajhhLnB0omHjmqbSj7q1DTCFLUaX0QiezEZQ1FD8QujGkKBlbXoYZaYKNq8TZUYQ9ve5OasuGuLJG65bX8d1+EDyzuiMTgpjQeYMbLPtqRkIy2v+7HJRAPHqmpwBQdO0bur+JgahzVlFgIjmVQw4FZtblm7jHusPxW5dUurh/Jj6oB8NZA+xbn4f8A2dVoJ2Id7ZWG4Pbdo2uSYlx+yfvUUZwtgdSk8ytRww6GgRzDvoWgf7ll6FXs6YG4DvdaO0qlzS6MkNA6gjM/7SnRyMrh5BY0d5xIaf4WTk+Cnxh4DW0xEMDGt8CXCT9AqbjiApnAxjV1IE58sEjzQN0/tGVHZwBg7kg7+omPCVzrZjZOLe+3k4+HgW/Q/RMOKWbanZ3FPuvxqG05HePj8s+HklNnX/ZnO0A+DgNvvTy0cKjH0nGGuAc12xbPTxBVg5c8QJaabnQ2Gta6IzGBOZ5jI/dCzNa/bTqClUh8gbRrBPLUO67lggFG0bkkVKdYCWmoxxB3qUjBdjnOoj0XzxlYNe4EyxzntJOSO8dL59itMVvqHDKQqNr03QAcjYg9COSb/EfBqV3bh1QmaQOW7kfnP9SxlLicUQ90drSd2VZp/wCbScJa+eojfyWq+GOOUqss1QxwDHa4EOd3QJ550+yazIwNG6oNcabaRJBgF7t/ZB1HtcTHpExHqtVf8HYyrXLQC9gIjfLhgeo+nmsbSkOIO5JXSVmwVb2JfLWCSVZdUadJmiS6rzLflb4Kx/Fezp6KYhx+d/M+ASN1d5OEF9OkSUxY8NwN+qSOc7qmPDn9fqgdWdHm44R1XjLiBTpDwlLmHXCdcLshqCgu4Hbuc79oSfNaL9XAcIGFQ2lpcCAmLWlxwFBRXYEDUZElMrmq2mJOT0SG9uS+eQViqat46YBQ1SsTuV4BRIVxdVVGgqoUArqhURKBrVJdLpVLSu6SosCy0u1dEFScTWx6g7EdEw0YSM1HB5IQaO7pMZDm/LzHQ9Er4nbNqDUMFDtuXO+ZQqVyggx7j3eQTG0AIhA2ByZ2Rug7tQB3TS10yvWF6e032VF3JkFD2ohxQaNnEiDUdI7tKs7luKbo+sLL8FcTSJI+cuOMc4+5drVC2jcunJa1g9ajZ+krluwsoMPgCoJXNPS2HDmnfDLloBDjp7g9C4ODfU6voUq7btBLvlbkxuejR4lQ4pUFNj3n+aNpdoDabR4BoB9Sp1fxZDN/eZ/c0+Ra2fbTH9SmyvqLQBuaTiPDtDTcPTUD6FV8KrB1MO/iIB5jS802n2keyD7VzX6jgHrsCHQ4+8GP+khZU54c2TUIIguLBPNvec6f6TCPsLiA8E/KHRP8IBIPkIInySThl0WPIOQNTtO+puotdI5mf/kheLXRFN4Bw4dmOpBOD7Bx/qQLeK8VLmP0YFRzi92xJqO1PIHKSY8kkZlvnPuP8fYjbsfsx7+xS22fu3nuPMbfgqwNpVpYQTkDSfFo29Qmlo2kLXRTJdWrCHggthwOc7aWjn4pGHN35HMTHuh3XbmukHlEDADegRY1PBLipQqtbrnU8Cpklri4gF3n+CP+O+GNY6nWYIa8d4DYPgEx4EOafU9Fk7LiZdUpNMialJvKBLwJ+q+qX1AVLYteJ0ta/wDtqPpOj10BXnYdSfj5A8kyvWoyt/T4NQc0w3MLJ07YNqOHQlblYB3NCAu0eSIrZJUaDMoHFjiFpeGtJgpVwqyNSAB6rWUXU6DY3cloNoW+JdhXVK5iGD1QNpVNQyTjomkABZXCG+pnmgXsTevlyErsErRhYApaFe+mqy1NXAz6KiWol5UAwKaYuqEQq6e0oJt3G6urVu5KKYisISx1MAkqu07+7ldc27w0wCfEZQCv4g0A92fHkgTdB56BW0LpzZEY5giQiX9i9uzQ/wAJblANXfEZwnTK/cEBZRs6y1xwOfJODXJYAzbqglxCsJjmgNPzFWBhc4CJO3ir7hg0lux2PmilF20m3qO5a6Y99R+5NqlImg3IAAAlxDRMdShuK22i1pN51K30Yz/9EL8YPcHtYI0MAa1oIOYBJI5E/cs2+i+g9stph2x1ueJ07ZHjABztv6puO8Y7UuJALJIYNsTuoPHZs7MH9pU/1D/C0Z0D7T4wOSW35EADrj0H+VJ9Go+GuIAMLf8ApcA12zhyz05eEznk8qNY0u1uBDiNGqN3au6fHJ/JKw7aQ7JhYXdoDJiQGicEEc1feXL6ghxJ0gEbbwM48yhrTcVumUADEvI0025+aNTnHnpBd6wEov7nWcbbhvJpMT57ILh9o+vVDS6SAAC8z3QMBPnfDVUCe6fIqJSbiP8ApHwaPqUibVyJ35p7xhpDHN5lzW+0FEstA+g3U0EdiHtxkPDmyQd5Or6KxCAMDs+8c1c2yzgGOZRlrw5rW6tRA/exIHQ+SsrmAIeHeWCqpY+20PY9u7XMfHi1wP3L7xw/hZcGOJHZ1DdOaAf+XWaagP8Ac4lfEawX2P4M4qHcNpvJzRp1KJ8HNhrfoWn1SjLXlHs2uLXgnOBKytrba3FzqrRJMgzK01Qh8wd5WYvaGioY2Wowlc2wDoa4O8RsvWtDKlQhG2xMgUxLt+qqnXDXP0w0aRzccBdccmTPil76rwYe6T5yAjKdXUGjGMCMe6iw04dcxhPKdeWpNa8OqHkI6yEyc7sxEZUorrHmgarpKve4ndUlqKqVbyiwxBVwiojK72arYrw9RSbQja1FvZklwBAwOZQHC363Qi+IVQA4HkFplnhXcx3MLQcO40A2HFZqo8uMk+A8kc3Tog4QML2+bmHSDySsXwpu1R6JXWuNLvBDVqhcZ5K4COIXOtxft4JzwW6lkLKVmuc4AbLQ2VRlNoYJk7kclKo6pWAdg58EOOH1ax7k9SVw2Unuuk+OCm3EnmjZPa2Q54a1xHzaS4NcB5hyl8CzjtyQLam0h3Z0y/U3Op7ySCPQMSJtTSDUJyZInrPzHxT65qOce1Lg54Ac17qb6A+UdNx7LOVbjtHFx845auX4rG6tmIOdEud8x5dB080BVMkfnmrLmpqMKDiREbjZajJ3wS+FJ3e+QiHAiUy4oLdw1UiQYALCMbcvZIqHEnkQ7SfNoJXn18bZMQRvjf0hQwXbSHFwMQ0beMfgmNG8qYGt0eZSywJ0PneWgdYAP4o6gRjOwyoJXFEvazmS6oR4uc1zWj3I9k4fRDaZA+UNbSbG2lsAHzJFQ+UJdRqgikHDua20nPP7rnzpPlMz5rQVuGNa0gOmcRAAxJnzEEeqsQitnaQcSDuEHfWjfmZjq3l6J5YWQe/TqDfNQ4pwl9OZEt5OGy2My9qffCHEHNFe3nu1WOe0f9ymNRI82Nd/aFBlq17DqGRsRuEDwtpZXpuH7r2knYaQ7M+kqKZW5LJSy8u8kkLQWzWuLukmJ6ckl4raZJGyIXMrkoi3qGcTPhuqqFBMuF1TRcXaA48tWY8UVc22qNAc5pAOxKb2DWjvOPogX3tSqZeZHIcgiKNOVDDhvECcNwEVRM7mUBb0MI63plFwU7wVenwV9ORyRVGiD80+iBeUJUpSYHNO302D90nzVNaozT3acO8copI+2cDBGVc2xPUe669jiea5B6IMrwkwSRyVd3dE6iVKwq6WuKCuasgrTKhjZTD9WDmiTEJRJRFCoThULL8QTCFfUcACQYOx5FFXTO8VO2udI0PbqpndvMeLTyKACjdEJvwoanJPeUAHHsyS3kTg+RTThVNzWmNyosN6jgHAA5TvR29I0T82kwTzEZHp839KyzaZBwZPNOxcmha1KpMVKk06Q5hoGqo/ygBv9RU6CCpxE02kaMt7p1PquztHzJM1/d8Tn3TL4kZFSqP+9V+jnfiloomB+cLOFuqW74V9Oj1RFK3gKyFdRX+rjSYEHkfFD0GmRO+Qjx8vqqo0y47nYeH+fs81BaHaRA/8nr+eiLouj88krpuk+ATOypasnb7UDurYfsaYmWVtbHH+GoTDfYtb+Sm1jX1sa5x5AnkdYLWu+x39yC4We0pVqB3B10+smBj+oU/cqNtVkPHIltQeVRve/wBwKID4pScyo4dDiF2nxmtoNMmQcZyUXxJuumypzzTf/M2M+oI+qDtLUHJcB4ZJWxZZElhCFt2nUQn1CgwA6TJ8oCXilDlBe1unAQPEQUyDJQ9zR6qKU06SLbSJCvFILjah2UUVZUGkZdB8dkwp2RGZBHggLWg4mYMdU5s7coq6iyAr6byFcy1MIh1o2MEg9DsUAoqlEU3u5KoUD0RVs0t3CoqfVdzVWtyMuX5w33VGp/IewQUOqEbheD3HZv0TWjZiJILnLzzVGzAB0wiPk7zDR4oS5YUVRfJAPJW1WgnOy0AG0SVLUG+ancVwMBAvB90Ey2cwoG15wiqFKRsrS2FUAC1zspNc4EgckayJXGUu8cboR7htqCXVKhIps7zo3PRo8ScfXkqris65rMacdo+nQa0fKxr3hoaB0Ert6/Zo2GPXmfz0R3BKQaTWIxTB0T/6hB0n0yfMBc7fQr49UD6tSpydUqPA6y6UFRdKv4nSJa3pJP1Q9syDCuAtjDExhSqW7nDUG4xMfnyTa2pAsDRzS+pXcHvDDDcgDw2CKEcMD1P1VBYHAnnMfVFVRt5IZmJHXb71EctreSBMCU3tBGOn4pdbjvAzAkZKdaKY/eJJyIEBUWU6xpVWvb/5BTStbgPOn5XBxZ/I8dpTHodQ9ErrNloPp+CZ8MuA6mGn5mFpZ4s1Zb6Ek/1FQQsM9pT/AIhrH8zf8E+yro2uVbbjRUY7kDnyOCPYlG3NJrHkfMZ8grBRRpkGAudl3kS57o6DwwoMagmacBDXTNoRcyomOY9lFha5q7SEEQPdMqbWk/IPUlE07AEzgeSKjR1EfcMBEWzSjmWbQJlSp0SchBBlV3VcdcHqrnUT0QbpB2VBdOs7qrnVIbJdk7AfehWNJ5Kw2jueB4oK3XLkVT4u4CIEoWpSA2MqhwQGVuM1OseSAdfVDmSrXWDiNUgDxKr/AFZo3qBBg7RkklU8QeQia9lUGQPZUPtXncFbZCVCIHVeptkhGjhzjyTK24SYEDKgCt2Ec154JO4TQWDubVS7h5M90ooexpScqVRmXEbgYjcnwXnUXs/dIXKTXOcInOEQto25qOgDHVOHAdm9rflYAB4vLmgmfzsjRw9zGyGiI+U5XKdsw0HmdBL2gA5aSJJ+73WcVmLugXc8BBsbCZ3tBzXEH6ZCop28rSG/DyBTJ5xjz5Je6j33eE/TCY27cUx/1sB8pVGjLj1cR7LF+qVXW6ppNzPTV9RCKvqcOVVuz7FUR7KTARVs6W+Ix6K6hRgTzP2Kj5HzyO6tDKwqAnSeaIth2dSHbSJ/lO5Hohuz2LfNv4I//Upg/vsGR1ZzHpv7rIKuaUEjoTkc/FW1stY7nAafMf4hQJkNPVrfoI+5XWzZa4dIP3feEFrWS2VBrVZbEkQASi6Vkf3iGjx39kUK6ljCpFEpv2LJwcdVe21aeaKSNpGUdQomUeOH5wrqVoQgGdRKtpS0YRXYFeFs7kCgFfUKhSAmXfREGkommqJNuSPlAH2qTrgncSqw1T1wMDPVBWWncgAeKGqVBMfVdrSdyqdCC1xYd3Id7aM7lWNtZ2Q77TKBSy+B3bhEPuKZb8qufwwDZWM4aCMqshrO6pHuluTsfFWMv6YMRCr/AOFwcKL+FyZJRR7eIUla67peCXu4WIxuo/qHIoDXV6bhCooUqbTIhCusHDZRdaujZENnvDsSEj45Tgspt5d4x1JJ+wN9lbStn+Kto0g64M5Ax7Q38UUlfZN5uIPkoC2Ztr+hW8/4NSO5+iHrfD9LJCaM1Z2bSW/tBiXbHpA+pCGq0gDjIbJnr+SjrRo1O6RjykfgqAzFTwH3rITX1KWzzH2KmzozPl+fsTNzMx1EKjh1KNX8wb9s/aqJBuFRVozj2Relce1UD2DyO6dvsPgm9OmQQ9m43HX/AClbqfMIm2uD6qBuHN0hzRAM4/hcPmb9h9UTw+v3ogQQRH1+5B21w0yHc4yORGxj8/RX02FrmnlIMjYhQG9q84GB0bhTp0Tmd02trcHMK8WgKikgoJhQt4RTuHhRNuQqOZRNKlzLwPqVQGFWBhQFC4a3YT4lcdfuPQDwVbaGJUBSVHDU8F5zx0XCxRLUHA4dFyppXCFB6CBa1d7FvVRKmGqDrqIPMId9EzuroXNCAfSuwvLy0jzqeFXoXl5ESDVMQvLyCQAXiwLy8g4WgAnoCT6JV8PUpdUcfAepJJ+5eXlFaFrUNxqrooujd3dHrv8ASVxeUGXtW970P3Lgbl/i0/RdXlAuqN2KtbQhsjm4n6BeXlRVVblR0Lq8qqstgqDmRkLy8iCKLkdb1iMcuh2Xl5Sq1fCLqWCDtg9UzbXXl5EEMcCFF7PFeXlFD0qsu0ptRtGEb5XV5WAevSgxMhUPaOU+q8vIO06Y5rrqTeq8vKimtbjkhX0V5eUFOjKmGLy8gsbQxKpJXl5B/9k=" ) var ( @@ -87,29 +98,30 @@ func TestMain(m *testing.M) { purgeRecords() // run the tests - log.Printf("about to run tests") + log.Printf("about to run tests\n") code := m.Run() - log.Printf("finished running tests") + log.Printf("finished running tests\n") // cleanup here os.Exit(code) } -func InitializeTestService( - ctx context.Context, - infra infrastructure.Infrastructure, -) (interactor.Usecases, error) { +func InitializeTestService(ctx context.Context, infra infrastructure.Infrastructure) (interactor.Usecases, error) { i := interactor.NewUsecasesInteractor(infra) return i, nil } -func InitializeTestInfrastructure( - ctx context.Context, -) (infrastructure.Infrastructure, error) { +func InitializeTestInfrastructure(ctx context.Context) (infrastructure.Infrastructure, error) { return infrastructure.NewInfrastructureInteractor(), nil } +func generateTestOTP(t *testing.T, msisdn string) (string, error) { + ctx := context.Background() + infra := infrastructure.NewInfrastructureInteractor() + return infra.Engagement.RequestOTP(ctx, msisdn) +} + func InitializeTestFirebaseClient( ctx context.Context, ) (*firestore.Client, *auth.Client) { @@ -131,10 +143,7 @@ func InitializeTestFirebaseClient( return fsc, fbc } -func InitializeFakeTestService( - patient usecases.ClinicalUseCase, - fhir usecases.FHIRUseCase, -) ( +func InitializeFakeTestService(patient usecases.ClinicalUseCase, fhir usecases.FHIRUseCase) ( usecases.Interactor, error, ) { @@ -144,3 +153,223 @@ func InitializeFakeTestService( } return itr, nil } + +// makes an ISC call to the onboarding service +func onboardingISCClient(t *testing.T) *interserviceclient.InterServiceClient { + deps, err := interserviceclient.LoadDepsFromYAML() + if err != nil { + t.Errorf("can't load inter-service config from YAML: %v", err) + return nil + } + + profileClient, err := interserviceclient.SetupISCclient(*deps, "onboarding") + if err != nil { + t.Errorf("can't set up onboarding interservice client: %v", err) + return nil + } + + return profileClient +} + +func simplePatientRegistration() (*domain.SimplePatientRegistrationInput, error) { + otherNames := gofakeit.Name() + dob := gofakeit.Date() + msisdn := interserviceclient.TestUserPhoneNumber + birthDate, err := scalarutils.NewDate(dob.Day(), int(dob.Month()), dob.Year()) + if err != nil { + return nil, fmt.Errorf("can't create valid birth date: %v", err) + + } + patientInput := &domain.SimplePatientRegistrationInput{ + ID: ksuid.New().String(), + Names: []*domain.NameInput{ + { + FirstName: gofakeit.FirstName(), + LastName: gofakeit.LastName(), + OtherNames: &otherNames, + }, + }, + IdentificationDocuments: []*domain.IdentificationDocument{ + { + DocumentType: domain.IDDocumentTypeNationalID, + DocumentNumber: strconv.Itoa(gofakeit.Number(11111111, 111111111)), + }, + }, + BirthDate: *birthDate, + PhoneNumbers: []*domain.PhoneNumberInput{ + { + Msisdn: msisdn, + VerificationCode: ksuid.New().String(), + IsUssd: true, + CommunicationOptIn: true, + }, + }, + Photos: []*domain.PhotoInput{ + { + PhotoContentType: enumutils.ContentTypeJpg, + PhotoBase64data: testPhotoBase64, + PhotoFilename: fmt.Sprintf("%s.jpg", gofakeit.Name()), + }, + }, + Emails: []*domain.EmailInput{ + { + Email: "test@bewell.co.ke", + CommunicationOptIn: true, + }, + }, + PhysicalAddresses: []*domain.PhysicalAddress{ + { + PhysicalAddress: gofakeit.Address().Address, + MapsCode: gofakeit.Address().Zip, + }, + }, + PostalAddresses: []*domain.PostalAddress{ + { + PostalAddress: gofakeit.Address().Address, + PostalCode: gofakeit.Address().City, + }, + }, + Gender: enumutils.GenderFemale.String(), + Active: true, + MaritalStatus: domain.MaritalStatusS, + Languages: []enumutils.Language{ + enumutils.LanguageEn, + enumutils.LanguageSw, + }, + } + return patientInput, nil +} + +func getTestEpisodeOfCare( + ctx context.Context, + msisdn string, + fullAccess bool, + providerCode string, +) (*domain.FHIREpisodeOfCare, *domain.FHIRPatient, error) { + normalized, err := converterandformatter.NormalizeMSISDN(msisdn) + if err != nil { + return nil, nil, fmt.Errorf("can't normalize phone number: %w", err) + } + + patient, _, err := getTestPatient(ctx) + if err != nil { + return nil, nil, fmt.Errorf("can't create test patient: %w", err) + } + + orgID, err := testUsecaseInteractor.GetORCreateOrganization(ctx, providerCode) + if err != nil { + return nil, nil, fmt.Errorf("can't get or create test organization : %v", err) + } + + ep := helpers.ComposeOneHealthEpisodeOfCare( + *normalized, + fullAccess, + *orgID, + providerCode, + *patient.ID, + ) + epPayload, err := testUsecaseInteractor.CreateEpisodeOfCare(ctx, ep) + if err != nil { + return nil, nil, fmt.Errorf("can't create episode of care: %w", err) + } + return epPayload.EpisodeOfCare, patient, nil +} + +func getTestEncounterID( + ctx context.Context, + msisdn string, + fullAccess bool, + providerCode string, +) (*domain.FHIREpisodeOfCare, *domain.FHIRPatient, string, error) { + episode, patient, err := getTestEpisodeOfCare( + ctx, msisdn, fullAccess, providerCode) + if err != nil { + return nil, nil, "", fmt.Errorf("can't create episode of care: %w", err) + } + + encounterID, err := testUsecaseInteractor.StartEncounter(ctx, *episode.ID) + if err != nil { + return nil, nil, "", fmt.Errorf("unable to start encounter: %w", err) + } + + return episode, patient, encounterID, nil +} + +func getTestSimplePatientRegistration() (*domain.SimplePatientRegistrationInput, string, error) { + otherNames := gofakeit.Name() + dob := gofakeit.Date() + msisdn := interserviceclient.TestUserPhoneNumber + birthDate, err := scalarutils.NewDate(dob.Day(), int(dob.Month()), dob.Year()) + if err != nil { + return nil, "", fmt.Errorf("can't create valid birth date: %w", err) + } + return &domain.SimplePatientRegistrationInput{ + ID: ksuid.New().String(), + Names: []*domain.NameInput{ + { + FirstName: gofakeit.FirstName(), + LastName: gofakeit.LastName(), + OtherNames: &otherNames, + }, + }, + IdentificationDocuments: []*domain.IdentificationDocument{ + { + DocumentType: domain.IDDocumentTypeNationalID, + DocumentNumber: strconv.Itoa(gofakeit.Number(11111111, 111111111)), + }, + }, + BirthDate: *birthDate, + PhoneNumbers: []*domain.PhoneNumberInput{ + { + Msisdn: msisdn, + VerificationCode: ksuid.New().String(), + IsUssd: true, // this will turn off OTP verification + CommunicationOptIn: true, + }, + }, + Photos: []*domain.PhotoInput{ + { + PhotoContentType: enumutils.ContentTypeJpg, + PhotoBase64data: testPhotoBase64, + PhotoFilename: fmt.Sprintf("%s.jpg", gofakeit.Name()), + }, + }, + Emails: []*domain.EmailInput{ + { + Email: "test@bewell.co.ke", + CommunicationOptIn: true, + }, + }, + PhysicalAddresses: []*domain.PhysicalAddress{ + { + PhysicalAddress: gofakeit.Address().Address, + MapsCode: gofakeit.Address().Zip, + }, + }, + PostalAddresses: []*domain.PostalAddress{ + { + PostalAddress: gofakeit.Address().Address, + PostalCode: gofakeit.Address().City, + }, + }, + Gender: enumutils.GenderFemale.String(), + Active: true, + MaritalStatus: domain.MaritalStatusS, + Languages: []enumutils.Language{ + enumutils.LanguageEn, + enumutils.LanguageSw, + }, + }, msisdn, nil +} + +func getTestPatient(ctx context.Context) (*domain.FHIRPatient, string, error) { + simplePatientRegInput, msisdn, err := getTestSimplePatientRegistration() + if err != nil { + return nil, "", fmt.Errorf("can't genereate simple patient reg input: %v", err) + } + patientPayload, err := testUsecaseInteractor.RegisterPatient(ctx, *simplePatientRegInput) + if err != nil { + return nil, "", fmt.Errorf("can't register patient: %v", err) + } + return patientPayload.PatientRecord, msisdn, nil +} diff --git a/pkg/clinical/usecases/patient.go b/pkg/clinical/usecases/patient.go index 148e746f..28588d0a 100644 --- a/pkg/clinical/usecases/patient.go +++ b/pkg/clinical/usecases/patient.go @@ -12,7 +12,6 @@ import ( auth "github.com/savannahghi/clinical/pkg/clinical/application/authorization" "github.com/savannahghi/clinical/pkg/clinical/application/common" "github.com/savannahghi/clinical/pkg/clinical/application/common/helpers" - "github.com/savannahghi/clinical/pkg/clinical/application/dto" "github.com/savannahghi/clinical/pkg/clinical/application/utils" "github.com/savannahghi/clinical/pkg/clinical/domain" "github.com/savannahghi/clinical/pkg/clinical/infrastructure" @@ -20,6 +19,7 @@ import ( "github.com/savannahghi/enumutils" "github.com/savannahghi/firebasetools" "github.com/savannahghi/interserviceclient" + "github.com/savannahghi/onboarding/pkg/onboarding/application/dto" "github.com/savannahghi/profileutils" "github.com/savannahghi/scalarutils" log "github.com/sirupsen/logrus" @@ -593,6 +593,10 @@ func (c *ClinicalUseCaseImpl) CreatePatient(ctx context.Context, input domain.FH input.ID = &newID } + if input.Gender == nil { + return nil, fmt.Errorf("please provide the patients gender") + } + // set or add the default record identifier if input.Identifier == nil { input.Identifier = []*domain.FHIRIdentifierInput{common.DefaultIdentifier()} @@ -627,6 +631,9 @@ func (c *ClinicalUseCaseImpl) CreatePatient(ctx context.Context, input domain.FH // FindPatientByID retrieves a single patient by their ID func (c *ClinicalUseCaseImpl) FindPatientByID(ctx context.Context, id string) (*domain.PatientPayload, error) { + if id == "" { + return nil, fmt.Errorf("patient ID cannot be empty") + } user, err := profileutils.GetLoggedInUser(ctx) if err != nil { return nil, fmt.Errorf("unable to get user: %w", err) @@ -965,6 +972,10 @@ func (c *ClinicalUseCaseImpl) AddNHIF(ctx context.Context, input *domain.SimpleN // RegisterUser implements creates a user profile and simple patient registration func (c *ClinicalUseCaseImpl) RegisterUser(ctx context.Context, input domain.SimplePatientRegistrationInput) (*domain.PatientPayload, error) { + if input.ID == "" { + return nil, fmt.Errorf("unable to register patient") + } + user, err := profileutils.GetLoggedInUser(ctx) if err != nil { @@ -978,17 +989,18 @@ func (c *ClinicalUseCaseImpl) RegisterUser(ctx context.Context, input domain.Sim primaryEmail = input.Emails[0].Email } - payload := dto.RegisterUserPayload{ - UID: user.UID, - FirstName: input.Names[0].FirstName, - LastName: input.Names[0].LastName, - PhoneNumber: input.PhoneNumbers[0].Msisdn, - Gender: enumutils.Gender(input.Gender), - Email: primaryEmail, - DateOfBirth: input.BirthDate, + gender := input.Gender + payload := dto.RegisterUserInput{ + UID: &user.UID, + FirstName: &input.Names[0].FirstName, + LastName: &input.Names[0].LastName, + PhoneNumber: &input.PhoneNumbers[0].Msisdn, + Gender: (*enumutils.Gender)(&gender), + Email: &primaryEmail, + DateOfBirth: &input.BirthDate, } - err = c.infrastructure.Onboarding.CreateUserProfile(ctx, payload) + err = c.infrastructure.Onboarding.CreateUserProfile(ctx, &payload) if err != nil { return nil, fmt.Errorf("failed to create a user profile: %v", err) } @@ -1004,6 +1016,9 @@ func (c *ClinicalUseCaseImpl) RegisterUser(ctx context.Context, input domain.Sim // CreateUpdatePatientExtraInformation updates a patient's extra info func (c *ClinicalUseCaseImpl) CreateUpdatePatientExtraInformation( ctx context.Context, input domain.PatientExtraInformationInput) (bool, error) { + if input.PatientID == "" { + return false, fmt.Errorf("patient ID cannot empty: %v", input.PatientID) + } user, err := profileutils.GetLoggedInUser(ctx) if err != nil { return false, fmt.Errorf("unable to get user: %w", err) @@ -1080,6 +1095,9 @@ func (c *ClinicalUseCaseImpl) CreateUpdatePatientExtraInformation( // AllergySummary returns a short list of the patient's active and confirmed // allergies (by name) func (c *ClinicalUseCaseImpl) AllergySummary(ctx context.Context, patientID string) ([]string, error) { + if patientID == "" { + return nil, fmt.Errorf("patient ID cannot be empty") + } params := map[string]interface{}{ "clinical-status": "active", "verification-status": "confirmed", diff --git a/pkg/clinical/usecases/patient_integration_test.go b/pkg/clinical/usecases/patient_integration_test.go new file mode 100644 index 00000000..dc37fae0 --- /dev/null +++ b/pkg/clinical/usecases/patient_integration_test.go @@ -0,0 +1,1386 @@ +package usecases_test + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/brianvoe/gofakeit" + "github.com/savannahghi/clinical/pkg/clinical/application/common/helpers" + "github.com/savannahghi/clinical/pkg/clinical/domain" + "github.com/savannahghi/converterandformatter" + "github.com/savannahghi/firebasetools" + "github.com/savannahghi/interserviceclient" + "github.com/savannahghi/scalarutils" + "github.com/segmentio/ksuid" + log "github.com/sirupsen/logrus" +) + +const testProviderCode = "1234" + +func TestClinicalUseCaseImpl_ProblemSummary(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + type args struct { + ctx context.Context + patientID string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + patientID: ksuid.New().String(), + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: context.Background(), + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.ProblemSummary(tt.args.ctx, tt.args.patientID) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.ProblemSummary() error = %v, wantErr %v", err, tt.wantErr) + return + } + + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_VisitSummary(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + msisdn := interserviceclient.TestUserPhoneNumber + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + _, err = u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + normalized, err := converterandformatter.NormalizeMSISDN(msisdn) + if err != nil { + fmt.Printf("can't normalize phone number: %v \n", err) + } + _, patient, _, err := getTestEncounterID( + ctx, + msisdn, + false, + testProviderCode, + ) + if err != nil { + log.Printf("cant get test encounter id: %v\n", err) + return + } + orgID, err := u.GetORCreateOrganization(ctx, testProviderCode) + if err != nil { + log.Printf("can't get or create test organization : %v\n", err) + } + + episode := helpers.ComposeOneHealthEpisodeOfCare( + *normalized, + false, + *orgID, + testProviderCode, + *patient.ID, + ) + + ep, err := u.CreateEpisodeOfCare(ctx, episode) + if err != nil { + t.Errorf("unable to get episode with ID %s: %v", *ep.EpisodeOfCare.ID, err) + return + } + + episodePayload, err := u.GetFHIREpisodeOfCare(ctx, *ep.EpisodeOfCare.ID) + if err != nil { + t.Errorf("unable to get episode with ID %s: %v", *ep.EpisodeOfCare.ID, err) + return + } + + activeEpisodeStatus := domain.EpisodeOfCareStatusEnumActive + activeEncounterStatus := domain.EncounterStatusEnumInProgress + if episodePayload.Resource.Status.String() != activeEpisodeStatus.String() { + t.Errorf("an encounter can only be started for an active episode") + return + } + episodeRef := fmt.Sprintf("EpisodeOfCare/%s", *episodePayload.Resource.ID) + + now := time.Now() + startTime := scalarutils.DateTime(now.Format("2006-01-02T15:04:05+03:00")) + + encounterClassCode := scalarutils.Code("AMB") + encounterClassSystem := scalarutils.URI("http://terminology.hl7.org/CodeSystem/v3-ActCode") + encounterClassVersion := "2018-08-12" + encounterClassDisplay := "ambulatory" + encounterClassUserSelected := false + + encounterInput := domain.FHIREncounterInput{ + Status: activeEncounterStatus, + Class: domain.FHIRCodingInput{ + System: &encounterClassSystem, + Version: &encounterClassVersion, + Code: encounterClassCode, + Display: encounterClassDisplay, + UserSelected: &encounterClassUserSelected, + }, + Subject: &domain.FHIRReferenceInput{ + Reference: episodePayload.Resource.Patient.Reference, + Display: episodePayload.Resource.Patient.Display, + Type: episodePayload.Resource.Patient.Type, + }, + EpisodeOfCare: []*domain.FHIRReferenceInput{ + { + Reference: &episodeRef, + }, + }, + ServiceProvider: &domain.FHIRReferenceInput{ + Display: episodePayload.Resource.ManagingOrganization.Display, + Type: episodePayload.Resource.ManagingOrganization.Type, + }, + Period: &domain.FHIRPeriodInput{ + Start: startTime, + }, + } + + enc, err := u.CreateFHIREncounter(ctx, encounterInput) + if err != nil { + t.Errorf("unable to CreateFHIREncounter: %v", err) + } + + type args struct { + ctx context.Context + encounterID string + count int + } + tests := []struct { + name string + args args + want map[string]interface{} + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + encounterID: *enc.Resource.ID, + count: 0, + }, + wantErr: false, + }, + + { + name: "Sad case: nil encounter ID", + args: args{ + ctx: ctx, + count: 0, + }, + wantErr: true, + }, + + { + name: "Sad case: no count", + args: args{ + ctx: ctx, + encounterID: ksuid.New().String(), + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.VisitSummary(tt.args.ctx, tt.args.encounterID, tt.args.count) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.VisitSummary() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_PatientTimelineWithCount(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + u := testUsecaseInteractor + + msisdn := interserviceclient.TestUserPhoneNumber + + normalized, err := converterandformatter.NormalizeMSISDN(msisdn) + if err != nil { + fmt.Printf("can't normalize phone number: %v \n", err) + } + _, patient, _, err := getTestEncounterID( + ctx, + *normalized, + false, + testProviderCode, + ) + if err != nil { + log.Printf("cant get test encounter id: %v\n", err) + return + } + orgID, err := u.GetORCreateOrganization(ctx, testProviderCode) + if err != nil { + log.Printf("can't get or create test organization : %v\n", err) + } + + episode := helpers.ComposeOneHealthEpisodeOfCare( + *normalized, + false, + *orgID, + testProviderCode, + *patient.ID, + ) + + ep, err := u.CreateEpisodeOfCare(ctx, episode) + if err != nil { + t.Errorf("unable to get episode with ID %s: %v", *ep.EpisodeOfCare.ID, err) + return + } + + episodePayload, err := u.GetFHIREpisodeOfCare(ctx, *ep.EpisodeOfCare.ID) + if err != nil { + t.Errorf("unable to get episode with ID %s: %v", *ep.EpisodeOfCare.ID, err) + return + } + + activeEpisodeStatus := domain.EpisodeOfCareStatusEnumActive + activeEncounterStatus := domain.EncounterStatusEnumInProgress + if episodePayload.Resource.Status.String() != activeEpisodeStatus.String() { + t.Errorf("an encounter can only be started for an active episode") + return + } + episodeRef := fmt.Sprintf("EpisodeOfCare/%s", *episodePayload.Resource.ID) + + now := time.Now() + startTime := scalarutils.DateTime(now.Format("2006-01-02T15:04:05+03:00")) + + encounterClassCode := scalarutils.Code("AMB") + encounterClassSystem := scalarutils.URI("http://terminology.hl7.org/CodeSystem/v3-ActCode") + encounterClassVersion := "2018-08-12" + encounterClassDisplay := "ambulatory" + encounterClassUserSelected := false + + encounterInput := domain.FHIREncounterInput{ + Status: activeEncounterStatus, + Class: domain.FHIRCodingInput{ + System: &encounterClassSystem, + Version: &encounterClassVersion, + Code: encounterClassCode, + Display: encounterClassDisplay, + UserSelected: &encounterClassUserSelected, + }, + Subject: &domain.FHIRReferenceInput{ + Reference: episodePayload.Resource.Patient.Reference, + Display: episodePayload.Resource.Patient.Display, + Type: episodePayload.Resource.Patient.Type, + }, + EpisodeOfCare: []*domain.FHIRReferenceInput{ + { + Reference: &episodeRef, + }, + }, + ServiceProvider: &domain.FHIRReferenceInput{ + Display: episodePayload.Resource.ManagingOrganization.Display, + Type: episodePayload.Resource.ManagingOrganization.Type, + }, + Period: &domain.FHIRPeriodInput{ + Start: startTime, + }, + } + + encounter, err := u.CreateFHIREncounter(ctx, encounterInput) + if err != nil { + t.Errorf("unable to CreateFHIREncounter: %v", err) + } + + _, err = u.GetFHIREncounter(ctx, *encounter.Resource.ID) + if err != nil { + t.Errorf("unable to GetFHIREncounter: %v", err) + } + + type args struct { + ctx context.Context + episodeID string + count int + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + episodeID: *ep.EpisodeOfCare.ID, + count: 0, + }, + wantErr: false, + }, + + { + name: "Sad case: nil episode ID", + args: args{ + ctx: ctx, + count: 0, + }, + wantErr: true, + }, + + { + name: "Sad case: no count", + args: args{ + ctx: ctx, + episodeID: ksuid.New().String(), + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.PatientTimelineWithCount(tt.args.ctx, tt.args.episodeID, tt.args.count) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.PatientTimelineWithCount() error = %v, wantErr %v", err, tt.wantErr) + return + } + + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_PatientSearch(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + searchPatient := "Test user" + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + _, err = u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + type args struct { + ctx context.Context + search string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + search: searchPatient, + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: ctx, + search: "", + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.PatientSearch(tt.args.ctx, tt.args.search) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.PatientSearch() error = %v, wantErr %v", err, tt.wantErr) + return + } + + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_ContactsToContactPointInput(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + _, err = u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + phone := &domain.PhoneNumberInput{ + Msisdn: interserviceclient.TestUserPhoneNumber, + VerificationCode: "300300", + IsUssd: true, + CommunicationOptIn: false, + } + + type args struct { + ctx context.Context + phones []*domain.PhoneNumberInput + emails []*domain.EmailInput + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + phones: []*domain.PhoneNumberInput{ + phone, + }, + emails: []*domain.EmailInput{}, + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: ctx, + phones: nil, + }, + //should not return an error but a nil + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.ContactsToContactPointInput(tt.args.ctx, tt.args.phones, tt.args.emails) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.ContactsToContactPointInput() error = %v, wantErr %v", err, tt.wantErr) + return + } + + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_CreatePatient(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + ID := ksuid.New().String() + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + _, err = u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + gender := domain.PatientGenderEnumMale + identifier := &domain.FHIRIdentifierInput{ + ID: &ID, + } + + active := true + + humanName := &domain.FHIRHumanNameInput{ + ID: &ID, + Use: domain.HumanNameUseEnumNickname, + } + + type args struct { + ctx context.Context + input domain.FHIRPatientInput + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + input: domain.FHIRPatientInput{ + ID: &ID, + Identifier: []*domain.FHIRIdentifierInput{ + identifier, + }, + Active: &active, + Name: []*domain.FHIRHumanNameInput{ + humanName, + }, + Gender: &gender, + }, + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: ctx, + input: domain.FHIRPatientInput{ + ID: &ID, + Identifier: []*domain.FHIRIdentifierInput{ + identifier, + }, + Active: &active, + Name: []*domain.FHIRHumanNameInput{ + humanName, + }, + Gender: nil, + }, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.CreatePatient(tt.args.ctx, tt.args.input) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.CreatePatient() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_FindPatientByID(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + patient, err := u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + type args struct { + ctx context.Context + id string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + id: *patient.PatientRecord.ID, + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: ctx, + id: "", + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.FindPatientByID(tt.args.ctx, tt.args.id) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.FindPatientByID() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_UpdatePatient(t *testing.T) { + TestClinicalUseCaseImpl_DeleteFHIRPatientByPhone(t) + + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + patient, err := u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + updatePhone := interserviceclient.TestUserPhoneNumber + otp, err := generateTestOTP(t, updatePhone) + if err != nil { + log.Errorf("unable to get verified phone number and OTP") + return + } + + phone := &domain.PhoneNumberInput{ + Msisdn: updatePhone, + VerificationCode: otp, + } + patientInput.PhoneNumbers = []*domain.PhoneNumberInput{phone} + date := scalarutils.Date{ + Year: 1900, + Month: 12, + Day: 20, + } + + type args struct { + ctx context.Context + input domain.SimplePatientRegistrationInput + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + input: domain.SimplePatientRegistrationInput{ + ID: *patient.PatientRecord.ID, + BirthDate: date, + PhoneNumbers: patientInput.PhoneNumbers, + Gender: "male", + }, + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: ctx, + input: domain.SimplePatientRegistrationInput{ + ID: "", + PhoneNumbers: patientInput.PhoneNumbers, + Gender: "male", + }, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.UpdatePatient(tt.args.ctx, tt.args.input) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.UpdatePatient() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_AddNextOfKin(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + patient, err := u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + otherTestName := "other test names" + name := &domain.NameInput{ + FirstName: gofakeit.FirstName(), + LastName: gofakeit.LastName(), + OtherNames: &otherTestName, + } + date := scalarutils.Date{ + Year: 1900, + Month: 12, + Day: 20, + } + + type args struct { + ctx context.Context + input domain.SimpleNextOfKinInput + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + input: domain.SimpleNextOfKinInput{ + PatientID: *patient.PatientRecord.ID, + Names: []*domain.NameInput{ + name, + }, + PhoneNumbers: []*domain.PhoneNumberInput{}, + Emails: []*domain.EmailInput{}, + PhysicalAddresses: []*domain.PhysicalAddress{}, + PostalAddresses: []*domain.PostalAddress{}, + Gender: "male", + Relationship: "", + Active: false, + BirthDate: date, + }, + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: ctx, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.AddNextOfKin(tt.args.ctx, tt.args.input) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.AddNextOfKin() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_AddNHIF(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + testInput := ksuid.New().String() + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + patient, err := u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + type args struct { + ctx context.Context + input *domain.SimpleNHIFInput + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + input: &domain.SimpleNHIFInput{ + PatientID: *patient.PatientRecord.ID, + MembershipNumber: ksuid.New().String(), + FrontImageBase64: &testInput, + RearImageBase64: &testInput, + }, + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: ctx, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.AddNHIF(tt.args.ctx, tt.args.input) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.AddNHIF() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_CreateUpdatePatientExtraInformation(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + maritalStatus := ksuid.New().String() + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + patient, err := u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + pid, err := u.FindPatientByID(ctx, *patient.PatientRecord.ID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + type args struct { + ctx context.Context + input domain.PatientExtraInformationInput + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + input: domain.PatientExtraInformationInput{ + PatientID: *pid.PatientRecord.ID, + MaritalStatus: (*domain.MaritalStatus)(&maritalStatus), + }, + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: ctx, + input: domain.PatientExtraInformationInput{ + PatientID: "", + MaritalStatus: (*domain.MaritalStatus)(&maritalStatus), + }, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.CreateUpdatePatientExtraInformation(tt.args.ctx, tt.args.input) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.CreateUpdatePatientExtraInformation() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_AllergySummary(t *testing.T) { + + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + patient, err := u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + type args struct { + ctx context.Context + patientID string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + patientID: *patient.PatientRecord.ID, + }, + wantErr: false, + }, + + { + name: "Sad case", + args: args{ + ctx: ctx, + patientID: "", + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := u.AllergySummary(tt.args.ctx, tt.args.patientID) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.AllergySummary() error = %v, wantErr %v", err, tt.wantErr) + return + } + if tt.wantErr && got != nil { + t.Errorf("the error was not expected") + return + } + + if !tt.wantErr && got == nil { + t.Errorf("an error was expected: %v", err) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_DeleteFHIRPatientByPhone(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + _, err = u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + type args struct { + ctx context.Context + phoneNumber string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + phoneNumber: interserviceclient.TestUserPhoneNumber, + }, + wantErr: false, + }, + { + name: "Sad case: empty phone", + args: args{ + ctx: ctx, + phoneNumber: "", + }, + wantErr: true, + }, + + { + name: "Sad case: invalid phone", + args: args{ + ctx: ctx, + phoneNumber: "+254", + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.DeleteFHIRPatientByPhone(tt.args.ctx, tt.args.phoneNumber) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.DeleteFHIRPatientByPhone() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} + +func TestClinicalUseCaseImpl_StartEpisodeByBreakGlass(t *testing.T) { + onboardingClient := onboardingISCClient(t) + ctx, token, err := interserviceclient.GetPhoneNumberAuthenticatedContextAndToken(t, onboardingClient) + if err != nil { + t.Errorf("cant get phone number authenticated context token: %v", err) + return + } + + _, err = firebasetools.GetAuthenticatedContextFromUID(ctx, token.UID) + if err != nil { + t.Errorf("cant get authenticated context from UID: %v", err) + return + } + + u := testUsecaseInteractor + + phone := interserviceclient.TestUserPhoneNumber + otp, err := generateTestOTP(t, phone) + if err != nil { + log.Errorf("unable to get verified phone number and OTP") + return + } + + patientInput, err := simplePatientRegistration() + if err != nil { + t.Errorf("an error occurred: %v\n", err) + return + } + + patient, err := u.RegisterPatient(ctx, *patientInput) + if err != nil { + fmt.Printf("unable to create patient: %v", err) + return + } + + type args struct { + ctx context.Context + input domain.BreakGlassEpisodeCreationInput + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case", + args: args{ + ctx: ctx, + input: domain.BreakGlassEpisodeCreationInput{ + PatientID: *patient.PatientRecord.ID, + ProviderCode: ksuid.New().String(), + PractitionerUID: ksuid.New().String(), + ProviderPhone: phone, + Otp: otp, + FullAccess: true, + PatientPhone: phone, + }, + }, + wantErr: false, + }, + + { + name: "Sad case: empty patient ID", + args: args{ + ctx: ctx, + input: domain.BreakGlassEpisodeCreationInput{ + PatientID: "", + ProviderCode: ksuid.New().String(), + PractitionerUID: ksuid.New().String(), + ProviderPhone: ksuid.New().String(), + Otp: otp, + FullAccess: true, + PatientPhone: ksuid.New().String(), + }, + }, + wantErr: true, + }, + + { + name: "Sad case: no input", + args: args{ + ctx: ctx, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := u.StartEpisodeByBreakGlass(tt.args.ctx, tt.args.input) + if (err != nil) != tt.wantErr { + t.Errorf("ClinicalUseCaseImpl.StartEpisodeByBreakGlass() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } + + _, err = u.DeleteFHIRPatientByPhone(ctx, interserviceclient.TestUserPhoneNumber) + if err != nil { + fmt.Printf("unable to delete FHIR patient by phone: %v", err) + return + } +} diff --git a/pkg/clinical/usecases/patient_unit_test.go b/pkg/clinical/usecases/patient_unit_test.go index 07910f05..8a5d2eaa 100644 --- a/pkg/clinical/usecases/patient_unit_test.go +++ b/pkg/clinical/usecases/patient_unit_test.go @@ -253,7 +253,7 @@ func TestClinicalUseCaseImpl_PatientSearch_Unittest(t *testing.T) { } } -func TestClinicalUseCaseImpl_ContactsToContactPointInput(t *testing.T) { +func TestClinicalUseCaseImpl_ContactsToContactPointInput_Unittest(t *testing.T) { ctx := context.Background() i := fakeUsecaseIntr diff --git a/tests/acceptance_test.go b/tests/acceptance_test.go index dd0a1980..97a83561 100644 --- a/tests/acceptance_test.go +++ b/tests/acceptance_test.go @@ -38,7 +38,7 @@ const ( func mapToJSONReader(m map[string]interface{}) (io.Reader, error) { bs, err := json.Marshal(m) if err != nil { - return nil, fmt.Errorf("unable to marshal map to JSON: %w", err) + return nil, fmt.Errorf("unable to marshal map to JSON: %v", err) } buf := bytes.NewBuffer(bs) @@ -100,7 +100,7 @@ const ( // msisdn := interserviceclient.TestUserPhoneNumberWithPin // birthDate, err := scalarutils.NewDate(dob.Day(), int(dob.Month()), dob.Year()) // if err != nil { -// return nil, "", fmt.Errorf("can't create valid birth date: %w", err) +// return nil, "", fmt.Errorf("can't create valid birth date: %v", err) // } // return &domain.SimplePatientRegistrationInput{ // ID: ksuid.New().String(), @@ -167,7 +167,7 @@ func getTestSimplePatientRegistration() (*domain.SimplePatientRegistrationInput, msisdn := gofakeit.Phone() birthDate, err := scalarutils.NewDate(dob.Day(), int(dob.Month()), dob.Year()) if err != nil { - return nil, "", fmt.Errorf("can't create valid birth date: %w", err) + return nil, "", fmt.Errorf("can't create valid birth date: %v", err) } return &domain.SimplePatientRegistrationInput{ ID: ksuid.New().String(), @@ -251,7 +251,7 @@ func TestGraphQLRegisterPatient(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -534,13 +534,13 @@ func TestGraphQFindPatientsByMSISDN(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, msisdn, err := getTestPatient(ctx) if err != nil { - t.Errorf("error in getting test patient: %w", err) + t.Errorf("error in getting test patient: %v", err) return } @@ -681,7 +681,7 @@ func TestGraphQFindPatientsByMSISDN(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } } @@ -709,7 +709,7 @@ func TestGraphQLFindPatients(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -836,7 +836,7 @@ func TestGraphQLFindPatients(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } for key := range data { @@ -901,13 +901,13 @@ func TestGraphQGetPatient(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } patient, _, err := getTestPatient(ctx) if err != nil { - t.Errorf("can't get test patient: %w", err) + t.Errorf("can't get test patient: %v", err) return } @@ -1034,7 +1034,7 @@ func TestGraphQGetPatient(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } } @@ -1061,7 +1061,7 @@ func TestGraphQLStartEpisodeByOTP(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } msisdn := interserviceclient.TestUserPhoneNumber @@ -1213,7 +1213,7 @@ func TestGraphQLStartEpisodeByOTP(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -1274,7 +1274,7 @@ func TestGraphQLStartEpisodeByBreakGlass(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -1404,7 +1404,7 @@ func TestGraphQLStartEpisodeByBreakGlass(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -1445,7 +1445,7 @@ func TestGraphQLUpgradeEpisode(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } msisdn := interserviceclient.TestUserPhoneNumber @@ -1462,7 +1462,7 @@ func TestGraphQLUpgradeEpisode(t *testing.T) { false, testProviderCode, ) if err != nil { - t.Errorf("can't create test episode: %w", err) + t.Errorf("can't create test episode: %v", err) return } @@ -1578,7 +1578,7 @@ func TestGraphQLUpgradeEpisode(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -1616,7 +1616,7 @@ func TestGraphQLEndEpisode(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -1626,7 +1626,7 @@ func TestGraphQLEndEpisode(t *testing.T) { false, testProviderCode, ) if err != nil { - t.Errorf("can't create test episode: %w", err) + t.Errorf("can't create test episode: %v", err) return } @@ -1732,7 +1732,7 @@ func TestGraphQLEndEpisode(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -1768,13 +1768,13 @@ func TestGraphQLStartEncounter(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } episode, _, _, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, true, testProviderCode) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } @@ -1881,7 +1881,7 @@ func TestGraphQLStartEncounter(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } for key := range data { @@ -1921,14 +1921,14 @@ func TestGraphQLEndEncounter(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, true, testProviderCode) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } @@ -2034,7 +2034,7 @@ func TestGraphQLEndEncounter(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } } @@ -2061,7 +2061,7 @@ func TestGraphQLOpenEpisodes(t *testing.T) { false, testProviderCode, ) if err != nil { - t.Errorf("can't create test episode: %w", err) + t.Errorf("can't create test episode: %v", err) return } if patient.ID == nil { @@ -2073,7 +2073,7 @@ func TestGraphQLOpenEpisodes(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } patientRef := fmt.Sprintf("Patient/%s", patientID) @@ -2191,7 +2191,7 @@ func TestGraphQLOpenEpisodes(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } for key := range data { @@ -2229,14 +2229,14 @@ func TestGraphQLSearchFHIREncounter(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } episode, _, _, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, true, testProviderCode) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } @@ -2408,7 +2408,7 @@ func TestGraphqlOpenOrganizationEpisodes(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -2418,7 +2418,7 @@ func TestGraphqlOpenOrganizationEpisodes(t *testing.T) { false, testProviderCode, ) if err != nil { - t.Errorf("can't create test episode: %w", err) + t.Errorf("can't create test episode: %v", err) return } @@ -2536,7 +2536,7 @@ func TestGraphqlOpenOrganizationEpisodes(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } } @@ -2561,7 +2561,7 @@ func TestGraphQLAddNextOfKin(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } msisdn := interserviceclient.TestUserPhoneNumber @@ -2709,7 +2709,7 @@ func TestGraphQLAddNextOfKin(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } for key := range data { @@ -2764,13 +2764,13 @@ func TestGraphQLUpdatePatient(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } patient, _, err := getTestPatient(ctx) if err != nil { - t.Errorf("can't get test patient: %w", err) + t.Errorf("can't get test patient: %v", err) return } @@ -3035,7 +3035,7 @@ func TestGraphQLUpdatePatient(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } } @@ -3062,13 +3062,13 @@ func TestGraphQLAddNHIF(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } patient, _, err := getTestPatient(ctx) if err != nil { - t.Errorf("error in getting test patient: %w", err) + t.Errorf("error in getting test patient: %v", err) return } @@ -3180,7 +3180,7 @@ func TestGraphQLAddNHIF(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } } @@ -3208,7 +3208,7 @@ func TestGraphQLCreateUpdatePatientExtraInformation(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -3337,7 +3337,7 @@ func TestGraphQLCreateUpdatePatientExtraInformation(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -3379,7 +3379,7 @@ func TestGraphQLVisitSummary(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -3491,7 +3491,7 @@ func TestGraphQLVisitSummary(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } for key := range data { @@ -3701,7 +3701,7 @@ func TestGraphQLPatientTimelineWithCount(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -3814,7 +3814,7 @@ func TestGraphQLPatientTimelineWithCount(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } for key := range data { @@ -4030,14 +4030,14 @@ func TestGraphQLProblemSummary(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, true, testProviderCode) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } @@ -4218,14 +4218,14 @@ func TestGraphQLCreateFHIRMedicationRequest(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } @@ -4387,7 +4387,7 @@ func TestGraphQLCreateFHIRMedicationRequest(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -4454,7 +4454,7 @@ func TestGraphQLUpdateFHIRMedicationRequest(t *testing.T) { _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } @@ -4465,7 +4465,7 @@ func TestGraphQLUpdateFHIRMedicationRequest(t *testing.T) { return } if medicationRequestID == "" { - t.Errorf("failed to create medication request: %w", err) + t.Errorf("failed to create medication request: %v", err) return } @@ -4476,7 +4476,7 @@ func TestGraphQLUpdateFHIRMedicationRequest(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -4652,7 +4652,7 @@ func TestGraphQLUpdateFHIRMedicationRequest(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -4719,14 +4719,14 @@ func TestGraphQLDeleteFHIRMedicationRequest(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } @@ -4864,7 +4864,7 @@ func TestGraphQLDeleteFHIRMedicationRequest(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -4916,7 +4916,7 @@ func TestGraphQSearchFHIRMedicationRequest(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -4924,7 +4924,7 @@ func TestGraphQSearchFHIRMedicationRequest(t *testing.T) { _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } @@ -5138,7 +5138,7 @@ func TestGraphQSearchFHIRMedicationRequest(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -5198,14 +5198,14 @@ func TestGraphQLCreateFHIRAllergyIntolerance(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } @@ -5412,7 +5412,7 @@ func TestGraphQLCreateFHIRAllergyIntolerance(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -5473,14 +5473,14 @@ func TestGraphQLUpdateFHIRAllergyIntolerance(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } @@ -5634,7 +5634,7 @@ func TestGraphQLUpdateFHIRAllergyIntolerance(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -5704,14 +5704,14 @@ func TestGraphQSearchFHIRAllergyIntolerance(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } allergyID, err := createTestAllergy(ctx, patient, encounterID) @@ -5902,7 +5902,7 @@ func TestGraphQSearchFHIRAllergyIntolerance(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -5961,14 +5961,14 @@ func TestGraphQLCreateFHIRCondition(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, true, testProviderCode) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } @@ -6149,7 +6149,7 @@ func TestGraphQLCreateFHIRCondition(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } } @@ -6173,14 +6173,14 @@ func TestGraphQUpdateFHIRCondition(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } @@ -6366,7 +6366,7 @@ func TestGraphQUpdateFHIRCondition(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } for key := range data { @@ -6424,7 +6424,7 @@ func TestGraphQSearchFHIRCondition(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -6616,7 +6616,7 @@ func TestGraphQSearchFHIRCondition(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -6671,14 +6671,14 @@ func TestGraphQLCreateFHIRServiceRequest(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } @@ -6838,7 +6838,7 @@ func TestGraphQLCreateFHIRServiceRequest(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } for key := range data { @@ -6897,19 +6897,19 @@ func TestGraphQLDeleteFHIRServiceRequest(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } serviceRequest, _, err := getTestServiceRequest(ctx, encounterID) if err != nil { - t.Errorf("error creating test service request: %w", err) + t.Errorf("error creating test service request: %v", err) return } @@ -7020,7 +7020,7 @@ func TestGraphQLDeleteFHIRServiceRequest(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } for key := range data { @@ -7058,19 +7058,19 @@ func TestGraphQLSearchFHIRServiceRequest(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("error creating test encounter ID: %w", err) + t.Errorf("error creating test encounter ID: %v", err) return } serviceRequest, patientID, err := getTestServiceRequest(ctx, encounterID) if err != nil { - t.Errorf("error creating test service request: %w", err) + t.Errorf("error creating test service request: %v", err) return } @@ -7226,7 +7226,7 @@ func TestGraphQLSearchFHIRServiceRequest(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -7264,7 +7264,7 @@ func TestGraphQCreateFHIRObservation(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } @@ -7272,7 +7272,7 @@ func TestGraphQCreateFHIRObservation(t *testing.T) { _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("can't create test encounter: %w", err) + t.Errorf("can't create test encounter: %v", err) return } @@ -7466,7 +7466,7 @@ func TestGraphQCreateFHIRObservation(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } } @@ -7490,19 +7490,19 @@ func TestGraphQSearchFHIRObservation(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("can't create test encounter: %w", err) + t.Errorf("can't create test encounter: %v", err) return } _, patient, status, err := createFHIRTestObservation(ctx, encounterID) if err != nil { - t.Errorf("can't create FHIR test observation: %w", err) + t.Errorf("can't create FHIR test observation: %v", err) return } @@ -7686,7 +7686,7 @@ func TestGraphQSearchFHIRObservation(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } } @@ -7710,14 +7710,14 @@ func TestGraphQCreateFHIRComposition(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, true, testProviderCode) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } @@ -7929,20 +7929,20 @@ func TestGraphQUpdateFHIRComposition(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, patient, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, false, testProviderCode) if err != nil { - t.Errorf("can't create test encounter: %w", err) + t.Errorf("can't create test encounter: %v", err) return } composition, _, err := createTestFHIRComposition(ctx, encounterID) if err != nil { - t.Errorf("can't create test composition: %w", err) + t.Errorf("can't create test composition: %v", err) return } recorded := time.Now().Format(dateFormat) @@ -8105,7 +8105,7 @@ func TestGraphQUpdateFHIRComposition(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -8156,19 +8156,19 @@ func TestGraphQLDeleteFHIRComposition(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, true, testProviderCode) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } composition, _, err := createTestFHIRComposition(ctx, encounterID) if err != nil { - t.Errorf("can't create test composition: %w", err) + t.Errorf("can't create test composition: %v", err) return } @@ -8295,7 +8295,7 @@ func TestGraphQLDeleteFHIRComposition(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -8347,19 +8347,19 @@ func TestGraphQlSearchFHIRComposition(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, true, testProviderCode) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } _, patient, err := createTestFHIRComposition(ctx, encounterID) if err != nil { - t.Errorf("can't create test composition: %w", err) + t.Errorf("can't create test composition: %v", err) return } @@ -8504,7 +8504,7 @@ func TestGraphQlSearchFHIRComposition(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return } @@ -8550,14 +8550,14 @@ func TestGraphQLAllergySummary(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } _, _, encounterID, err := getTestEncounterID( ctx, interserviceclient.TestUserPhoneNumber, true, testProviderCode) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } @@ -8738,13 +8738,13 @@ func TestGraphQLDeleteFHIRPatient(t *testing.T) { graphQLURL := fmt.Sprintf("%s/%s", baseURL, "graphql") headers, err := GetGraphQLHeaders(ctx) if err != nil { - t.Errorf("error in getting GraphQL headers: %w", err) + t.Errorf("error in getting GraphQL headers: %v", err) return } patient, _, err := getTestPatient(ctx) if err != nil { - t.Errorf("unable to generate test encounter ID: %w", err) + t.Errorf("unable to generate test encounter ID: %v", err) return } @@ -8854,7 +8854,7 @@ func TestGraphQLDeleteFHIRPatient(t *testing.T) { if !tt.wantErr { errMsg, ok := data["errors"] if ok { - t.Errorf("error not expected got: %w", errMsg) + t.Errorf("error not expected got: %v", errMsg) return }