diff options
author | Joe Chen <jc@unknwon.io> | 2022-06-10 19:54:36 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-10 19:54:36 +0800 |
commit | 9776bdc9b8b441ebd73c100bfe2aa4e495c233ca (patch) | |
tree | fb12111e0a8b5580df806d28ebad0e7e472d0eb6 | |
parent | 94059f291dc85bfe222ca8d9094fd11334c0dd53 (diff) |
db: use `context` and go-mockgen for login sources (#7041)
-rw-r--r-- | go.mod | 4 | ||||
-rw-r--r-- | go.sum | 55 | ||||
-rw-r--r-- | internal/db/login_source_files_test.go | 13 | ||||
-rw-r--r-- | internal/db/login_sources.go | 75 | ||||
-rw-r--r-- | internal/db/login_sources_test.go | 454 | ||||
-rw-r--r-- | internal/db/mock_gen.go | 47 | ||||
-rw-r--r-- | internal/db/mocks.go | 1790 | ||||
-rw-r--r-- | internal/db/models.go | 5 | ||||
-rw-r--r-- | internal/db/users.go | 5 | ||||
-rw-r--r-- | internal/route/admin/admin.go | 2 | ||||
-rw-r--r-- | internal/route/admin/auths.go | 32 | ||||
-rw-r--r-- | internal/route/admin/users.go | 8 | ||||
-rw-r--r-- | internal/route/api/v1/admin/user.go | 2 | ||||
-rw-r--r-- | internal/route/user/auth.go | 4 |
14 files changed, 2132 insertions, 364 deletions
@@ -5,6 +5,7 @@ go 1.16 require ( github.com/Masterminds/semver/v3 v3.1.1 github.com/bgentry/speakeasy v0.1.0 // indirect + github.com/derision-test/go-mockgen v1.2.0 github.com/editorconfig/editorconfig-core-go/v2 v2.4.4 github.com/fatih/color v1.9.0 // indirect github.com/go-ldap/ldap/v3 v3.4.3 @@ -52,8 +53,7 @@ require ( github.com/unknwon/paginater v0.0.0-20170405233947-45e5d631308e github.com/urfave/cli v1.22.9 golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 - golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/net v0.0.0-20220325170049-de3da57026de golang.org/x/text v0.3.7 gopkg.in/DATA-DOG/go-sqlmock.v2 v2.0.0-20180914054222-c19298f520d0 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect @@ -44,12 +44,14 @@ github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0 github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/alecthomas/chroma/v2 v2.0.1/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= +github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= @@ -84,12 +86,22 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSY github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= +github.com/dave/astrid v0.0.0-20170323122508-8c2895878b14/go.mod h1:Sth2QfxfATb/nW4EsrSi2KyJmbcniZ8TgTaji17D6ms= +github.com/dave/brenda v1.1.0/go.mod h1:4wCUr6gSlu5/1Tk7akE5X7UorwiQ8Rij0SKH3/BGMOM= +github.com/dave/courtney v0.3.0/go.mod h1:BAv3hA06AYfNUjfjQr+5gc6vxeBVOupLqrColj+QSD8= +github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= +github.com/dave/jennifer v1.5.0/go.mod h1:4MnyiFIlZS3l5tSDn8VnzE6ffAhYBMB2SZntBsZGUok= +github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= +github.com/dave/patsy v0.0.0-20210517141501-957256f50cba/go.mod h1:qfR88CgEGLoiqDaE+xxDCi5QA5v4vUoW0UCX2Nd5Tlc= +github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/derision-test/go-mockgen v1.2.0 h1:SCF7p4FuO6IZId3CMjSHH9K0SMDVXNz7jc3AOeJaBd8= +github.com/derision-test/go-mockgen v1.2.0/go.mod h1:/TXUePlhtHmDDCaDAi/a4g6xOHqMDz3Wf0r2NPGskB4= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -108,6 +120,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -143,6 +156,7 @@ github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y= github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= @@ -225,6 +239,7 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -242,6 +257,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/issue9/assert/v2 v2.0.0 h1:vN7fr70g5ND6zM39tPZk/E4WCyjGMqApmFbujSTmEo0= github.com/issue9/assert/v2 v2.0.0/go.mod h1:rKr1eVGzXUhAo2af1thiKAhIA8uiSK9Wyn7mcZ4BzAg= github.com/issue9/identicon v1.2.1 h1:9RUq3DcmDJvfXAYZWJDaq/Bi45oS/Fr79W0CazbXNaY= @@ -365,6 +381,7 @@ github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 h1:YocNLcTBdEd github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo= github.com/microcosm-cc/bluemonday v1.0.18 h1:6HcxvXDAi3ARt3slx6nTesbvorIc3QeTzBNRvWktHBo= github.com/microcosm-cc/bluemonday v1.0.18/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -381,13 +398,22 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niklasfasching/go-org v1.6.5 h1:5YAIqNTdl6lAOb7lD2AyQ1RuFGPVrAKvUexphk8PGbo= github.com/niklasfasching/go-org v1.6.5/go.mod h1:ybv0eGDnxylFUfFE+ySaQc734j/L3+/ChKZ/h63a2wM= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -474,6 +500,7 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= @@ -492,6 +519,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= @@ -559,8 +587,9 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -588,6 +617,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -595,11 +625,15 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de h1:pZB1TWnKi+o4bENlbzAgLrEbY4RMYmUIRobMcSmfeYc= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -636,9 +670,12 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -660,16 +697,21 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 h1:eJv7u3ksNXoLbGSKuv2s/SIO4tJVxc/A+MTpzxDgz/Q= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -730,8 +772,11 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78 h1:M8tBwCtWD/cZV9DZpFYRUgaymAYAr+aIUTWzDaM3uPs= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/db/login_source_files_test.go b/internal/db/login_source_files_test.go index d9cdc788..9f66f582 100644 --- a/internal/db/login_source_files_test.go +++ b/internal/db/login_source_files_test.go @@ -9,11 +9,12 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "gogs.io/gogs/internal/errutil" ) -func Test_loginSourceFiles_GetByID(t *testing.T) { +func TestLoginSourceFiles_GetByID(t *testing.T) { store := &loginSourceFiles{ sources: []*LoginSource{ {ID: 101}, @@ -28,14 +29,12 @@ func Test_loginSourceFiles_GetByID(t *testing.T) { t.Run("source exists", func(t *testing.T) { source, err := store.GetByID(101) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) assert.Equal(t, int64(101), source.ID) }) } -func Test_loginSourceFiles_Len(t *testing.T) { +func TestLoginSourceFiles_Len(t *testing.T) { store := &loginSourceFiles{ sources: []*LoginSource{ {ID: 101}, @@ -45,7 +44,7 @@ func Test_loginSourceFiles_Len(t *testing.T) { assert.Equal(t, 1, store.Len()) } -func Test_loginSourceFiles_List(t *testing.T) { +func TestLoginSourceFiles_List(t *testing.T) { store := &loginSourceFiles{ sources: []*LoginSource{ {ID: 101, IsActived: true}, @@ -65,7 +64,7 @@ func Test_loginSourceFiles_List(t *testing.T) { }) } -func Test_loginSourceFiles_Update(t *testing.T) { +func TestLoginSourceFiles_Update(t *testing.T) { store := &loginSourceFiles{ sources: []*LoginSource{ {ID: 101, IsActived: true, IsDefault: true}, diff --git a/internal/db/login_sources.go b/internal/db/login_sources.go index 79a23662..aab50dee 100644 --- a/internal/db/login_sources.go +++ b/internal/db/login_sources.go @@ -5,6 +5,7 @@ package db import ( + "context" "fmt" "strconv" "time" @@ -25,24 +26,24 @@ import ( // // NOTE: All methods are sorted in alphabetical order. type LoginSourcesStore interface { - // Create creates a new login source and persist to database. - // It returns ErrLoginSourceAlreadyExist when a login source with same name already exists. - Create(opts CreateLoginSourceOpts) (*LoginSource, error) + // Create creates a new login source and persist to database. It returns + // ErrLoginSourceAlreadyExist when a login source with same name already exists. + Create(ctx context.Context, opts CreateLoginSourceOpts) (*LoginSource, error) // Count returns the total number of login sources. - Count() int64 - // DeleteByID deletes a login source by given ID. - // It returns ErrLoginSourceInUse if at least one user is associated with the login source. - DeleteByID(id int64) error - // GetByID returns the login source with given ID. - // It returns ErrLoginSourceNotExist when not found. - GetByID(id int64) (*LoginSource, error) + Count(ctx context.Context) int64 + // DeleteByID deletes a login source by given ID. It returns ErrLoginSourceInUse + // if at least one user is associated with the login source. + DeleteByID(ctx context.Context, id int64) error + // GetByID returns the login source with given ID. It returns + // ErrLoginSourceNotExist when not found. + GetByID(ctx context.Context, id int64) (*LoginSource, error) // List returns a list of login sources filtered by options. - List(opts ListLoginSourceOpts) ([]*LoginSource, error) + List(ctx context.Context, opts ListLoginSourceOpts) ([]*LoginSource, error) // ResetNonDefault clears default flag for all the other login sources. - ResetNonDefault(source *LoginSource) error - // Save persists all values of given login source to database or local file. - // The Updated field is set to current time automatically. - Save(t *LoginSource) error + ResetNonDefault(ctx context.Context, source *LoginSource) error + // Save persists all values of given login source to database or local file. The + // Updated field is set to current time automatically. + Save(ctx context.Context, t *LoginSource) error } var LoginSources LoginSourcesStore @@ -65,7 +66,7 @@ type LoginSource struct { File loginSourceFileStore `xorm:"-" gorm:"-" json:"-"` } -// NOTE: This is a GORM save hook. +// BeforeSave implements the GORM save hook. func (s *LoginSource) BeforeSave(_ *gorm.DB) (err error) { if s.Provider == nil { return nil @@ -74,7 +75,7 @@ func (s *LoginSource) BeforeSave(_ *gorm.DB) (err error) { return err } -// NOTE: This is a GORM create hook. +// BeforeCreate implements the GORM create hook. func (s *LoginSource) BeforeCreate(tx *gorm.DB) error { if s.CreatedUnix == 0 { s.CreatedUnix = tx.NowFunc().Unix() @@ -83,13 +84,13 @@ func (s *LoginSource) BeforeCreate(tx *gorm.DB) error { return nil } -// NOTE: This is a GORM update hook. +// BeforeUpdate implements the GORM update hook. func (s *LoginSource) BeforeUpdate(tx *gorm.DB) error { s.UpdatedUnix = tx.NowFunc().Unix() return nil } -// NOTE: This is a GORM query hook. +// AfterFind implements the GORM query hook. func (s *LoginSource) AfterFind(_ *gorm.DB) error { s.Created = time.Unix(s.CreatedUnix, 0).Local() s.Updated = time.Unix(s.UpdatedUnix, 0).Local() @@ -209,8 +210,8 @@ func (err ErrLoginSourceAlreadyExist) Error() string { return fmt.Sprintf("login source already exists: %v", err.args) } -func (db *loginSources) Create(opts CreateLoginSourceOpts) (*LoginSource, error) { - err := db.Where("name = ?", opts.Name).First(new(LoginSource)).Error +func (db *loginSources) Create(ctx context.Context, opts CreateLoginSourceOpts) (*LoginSource, error) { + err := db.WithContext(ctx).Where("name = ?", opts.Name).First(new(LoginSource)).Error if err == nil { return nil, ErrLoginSourceAlreadyExist{args: errutil.Args{"name": opts.Name}} } else if err != gorm.ErrRecordNotFound { @@ -227,12 +228,12 @@ func (db *loginSources) Create(opts CreateLoginSourceOpts) (*LoginSource, error) if err != nil { return nil, err } - return source, db.DB.Create(source).Error + return source, db.WithContext(ctx).Create(source).Error } -func (db *loginSources) Count() int64 { +func (db *loginSources) Count(ctx context.Context) int64 { var count int64 - db.Model(new(LoginSource)).Count(&count) + db.WithContext(ctx).Model(new(LoginSource)).Count(&count) return count + int64(db.files.Len()) } @@ -249,21 +250,21 @@ func (err ErrLoginSourceInUse) Error() string { return fmt.Sprintf("login source is still used by some users: %v", err.args) } -func (db *loginSources) DeleteByID(id int64) error { +func (db *loginSources) DeleteByID(ctx context.Context, id int64) error { var count int64 - err := db.Model(new(User)).Where("login_source = ?", id).Count(&count).Error + err := db.WithContext(ctx).Model(new(User)).Where("login_source = ?", id).Count(&count).Error if err != nil { return err } else if count > 0 { return ErrLoginSourceInUse{args: errutil.Args{"id": id}} } - return db.Where("id = ?", id).Delete(new(LoginSource)).Error + return db.WithContext(ctx).Where("id = ?", id).Delete(new(LoginSource)).Error } -func (db *loginSources) GetByID(id int64) (*LoginSource, error) { +func (db *loginSources) GetByID(ctx context.Context, id int64) (*LoginSource, error) { source := new(LoginSource) - err := db.Where("id = ?", id).First(source).Error + err := db.WithContext(ctx).Where("id = ?", id).First(source).Error if err != nil { if err == gorm.ErrRecordNotFound { return db.files.GetByID(id) @@ -278,9 +279,9 @@ type ListLoginSourceOpts struct { OnlyActivated bool } -func (db *loginSources) List(opts ListLoginSourceOpts) ([]*LoginSource, error) { +func (db *loginSources) List(ctx context.Context, opts ListLoginSourceOpts) ([]*LoginSource, error) { var sources []*LoginSource - query := db.Order("id ASC") + query := db.WithContext(ctx).Order("id ASC") if opts.OnlyActivated { query = query.Where("is_actived = ?", true) } @@ -292,8 +293,12 @@ func (db *loginSources) List(opts ListLoginSourceOpts) ([]*LoginSource, error) { return append(sources, db.files.List(opts)...), nil } -func (db *loginSources) ResetNonDefault(dflt *LoginSource) error { - err := db.Model(new(LoginSource)).Where("id != ?", dflt.ID).Updates(map[string]interface{}{"is_default": false}).Error +func (db *loginSources) ResetNonDefault(ctx context.Context, dflt *LoginSource) error { + err := db.WithContext(ctx). + Model(new(LoginSource)). + Where("id != ?", dflt.ID). + Updates(map[string]interface{}{"is_default": false}). + Error if err != nil { return err } @@ -311,9 +316,9 @@ func (db *loginSources) ResetNonDefault(dflt *LoginSource) error { return nil } -func (db *loginSources) Save(source *LoginSource) error { +func (db *loginSources) Save(ctx context.Context, source *LoginSource) error { if source.File == nil { - return db.DB.Save(source).Error + return db.WithContext(ctx).Save(source).Error } source.File.SetGeneral("name", source.Name) diff --git a/internal/db/login_sources_test.go b/internal/db/login_sources_test.go index f8f9a0c5..9e14caf9 100644 --- a/internal/db/login_sources_test.go +++ b/internal/db/login_sources_test.go @@ -5,10 +5,13 @@ package db import ( + "context" "testing" "time" + mockrequire "github.com/derision-test/go-mockgen/testutil/require" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "gorm.io/gorm" "gogs.io/gogs/internal/auth" @@ -31,9 +34,7 @@ func TestLoginSource_BeforeSave(t *testing.T) { t.Run("Config has not been set", func(t *testing.T) { s := &LoginSource{} err := s.BeforeSave(db) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) assert.Empty(t, s.Config) }) @@ -44,9 +45,7 @@ func TestLoginSource_BeforeSave(t *testing.T) { }), } err := s.BeforeSave(db) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) assert.Equal(t, `{"ServiceName":"pam_service"}`, s.Config) }) } @@ -93,20 +92,18 @@ func Test_loginSources(t *testing.T) { name string test func(*testing.T, *loginSources) }{ - {"Create", test_loginSources_Create}, - {"Count", test_loginSources_Count}, - {"DeleteByID", test_loginSources_DeleteByID}, - {"GetByID", test_loginSources_GetByID}, - {"List", test_loginSources_List}, - {"ResetNonDefault", test_loginSources_ResetNonDefault}, - {"Save", test_loginSources_Save}, + {"Create", loginSourcesCreate}, + {"Count", loginSourcesCount}, + {"DeleteByID", loginSourcesDeleteByID}, + {"GetByID", loginSourcesGetByID}, + {"List", loginSourcesList}, + {"ResetNonDefault", loginSourcesResetNonDefault}, + {"Save", loginSourcesSave}, } { t.Run(tc.name, func(t *testing.T) { t.Cleanup(func() { err := clearTables(t, db.DB, tables...) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) }) tc.test(t, db) }) @@ -116,62 +113,41 @@ func Test_loginSources(t *testing.T) { } } -func test_loginSources_Create(t *testing.T, db *loginSources) { +func loginSourcesCreate(t *testing.T, db *loginSources) { + ctx := context.Background() + // Create first login source with name "GitHub" - source, err := db.Create(CreateLoginSourceOpts{ - Type: auth.GitHub, - Name: "GitHub", - Activated: true, - Default: false, - Config: &github.Config{ - APIEndpoint: "https://api.github.com", + source, err := db.Create(ctx, + CreateLoginSourceOpts{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: false, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, }, - }) - if err != nil { - t.Fatal(err) - } + ) + require.NoError(t, err) // Get it back and check the Created field - source, err = db.GetByID(source.ID) - if err != nil { - t.Fatal(err) - } + source, err = db.GetByID(ctx, source.ID) + require.NoError(t, err) assert.Equal(t, db.NowFunc().Format(time.RFC3339), source.Created.UTC().Format(time.RFC3339)) assert.Equal(t, db.NowFunc().Format(time.RFC3339), source.Updated.UTC().Format(time.RFC3339)) // Try create second login source with same name should fail - _, err = db.Create(CreateLoginSourceOpts{Name: source.Name}) + _, err = db.Create(ctx, CreateLoginSourceOpts{Name: source.Name}) expErr := ErrLoginSourceAlreadyExist{args: errutil.Args{"name": source.Name}} assert.Equal(t, expErr, err) } -func test_loginSources_Count(t *testing.T, db *loginSources) { - // Create two login sources, one in database and one as source file. - _, err := db.Create(CreateLoginSourceOpts{ - Type: auth.GitHub, - Name: "GitHub", - Activated: true, - Default: false, - Config: &github.Config{ - APIEndpoint: "https://api.github.com", - }, - }) - if err != nil { - t.Fatal(err) - } - - setMockLoginSourceFilesStore(t, db, &mockLoginSourceFilesStore{ - MockLen: func() int { - return 2 - }, - }) - - assert.Equal(t, int64(3), db.Count()) -} +func loginSourcesCount(t *testing.T, db *loginSources) { + ctx := context.Background() -func test_loginSources_DeleteByID(t *testing.T, db *loginSources) { - t.Run("delete but in used", func(t *testing.T) { - source, err := db.Create(CreateLoginSourceOpts{ + // Create two login sources, one in database and one as source file. + _, err := db.Create(ctx, + CreateLoginSourceOpts{ Type: auth.GitHub, Name: "GitHub", Activated: true, @@ -179,279 +155,271 @@ func test_loginSources_DeleteByID(t *testing.T, db *loginSources) { Config: &github.Config{ APIEndpoint: "https://api.github.com", }, - }) - if err != nil { - t.Fatal(err) - } + }, + ) + require.NoError(t, err) + + mock := NewMockLoginSourceFilesStore() + mock.LenFunc.SetDefaultReturn(2) + setMockLoginSourceFilesStore(t, db, mock) + + assert.Equal(t, int64(3), db.Count(ctx)) +} + +func loginSourcesDeleteByID(t *testing.T, db *loginSources) { + ctx := context.Background() + + t.Run("delete but in used", func(t *testing.T) { + source, err := db.Create(ctx, + CreateLoginSourceOpts{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: false, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, + }, + ) + require.NoError(t, err) // Create a user that uses this login source _, err = (&users{DB: db.DB}).Create("alice", "", CreateUserOpts{ LoginSource: source.ID, }) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) // Delete the login source will result in error - err = db.DeleteByID(source.ID) + err = db.DeleteByID(ctx, source.ID) expErr := ErrLoginSourceInUse{args: errutil.Args{"id": source.ID}} assert.Equal(t, expErr, err) }) - setMockLoginSourceFilesStore(t, db, &mockLoginSourceFilesStore{ - MockGetByID: func(id int64) (*LoginSource, error) { - return nil, ErrLoginSourceNotExist{args: errutil.Args{"id": id}} - }, + mock := NewMockLoginSourceFilesStore() + mock.GetByIDFunc.SetDefaultHook(func(id int64) (*LoginSource, error) { + return nil, ErrLoginSourceNotExist{args: errutil.Args{"id": id}} }) + setMockLoginSourceFilesStore(t, db, mock) // Create a login source with name "GitHub2" - source, err := db.Create(CreateLoginSourceOpts{ - Type: auth.GitHub, - Name: "GitHub2", - Activated: true, - Default: false, - Config: &github.Config{ - APIEndpoint: "https://api.github.com", + source, err := db.Create(ctx, + CreateLoginSourceOpts{ + Type: auth.GitHub, + Name: "GitHub2", + Activated: true, + Default: false, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, }, - }) - if err != nil { - t.Fatal(err) - } + ) + require.NoError(t, err) // Delete a non-existent ID is noop - err = db.DeleteByID(9999) - if err != nil { - t.Fatal(err) - } + err = db.DeleteByID(ctx, 9999) + require.NoError(t, err) // We should be able to get it back - _, err = db.GetByID(source.ID) - if err != nil { - t.Fatal(err) - } + _, err = db.GetByID(ctx, source.ID) + require.NoError(t, err) // Now delete this login source with ID - err = db.DeleteByID(source.ID) - if err != nil { - t.Fatal(err) - } + err = db.DeleteByID(ctx, source.ID) + require.NoError(t, err) // We should get token not found error - _, err = db.GetByID(source.ID) + _, err = db.GetByID(ctx, source.ID) expErr := ErrLoginSourceNotExist{args: errutil.Args{"id": source.ID}} assert.Equal(t, expErr, err) } -func test_loginSources_GetByID(t *testing.T, db *loginSources) { - setMockLoginSourceFilesStore(t, db, &mockLoginSourceFilesStore{ - MockGetByID: func(id int64) (*LoginSource, error) { - if id != 101 { - return nil, ErrLoginSourceNotExist{args: errutil.Args{"id": id}} - } - return &LoginSource{ID: id}, nil - }, +func loginSourcesGetByID(t *testing.T, db *loginSources) { + ctx := context.Background() + + mock := NewMockLoginSourceFilesStore() + mock.GetByIDFunc.SetDefaultHook(func(id int64) (*LoginSource, error) { + if id != 101 { + return nil, ErrLoginSourceNotExist{args: errutil.Args{"id": id}} + } + return &LoginSource{ID: id}, nil }) + setMockLoginSourceFilesStore(t, db, mock) expConfig := &github.Config{ APIEndpoint: "https://api.github.com", } // Create a login source with name "GitHub" - source, err := db.Create(CreateLoginSourceOpts{ - Type: auth.GitHub, - Name: "GitHub", - Activated: true, - Default: false, - Config: expConfig, - }) - if err != nil { - t.Fatal(err) - } + source, err := db.Create(ctx, + CreateLoginSourceOpts{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: false, + Config: expConfig, + }, + ) + require.NoError(t, err) // Get the one in the database and test the read/write hooks - source, err = db.GetByID(source.ID) - if err != nil { - t.Fatal(err) - } + source, err = db.GetByID(ctx, source.ID) + require.NoError(t, err) assert.Equal(t, expConfig, source.Provider.Config()) // Get the one in source file store - _, err = db.GetByID(101) - if err != nil { - t.Fatal(err) - } + _, err = db.GetByID(ctx, 101) + require.NoError(t, err) } -func test_loginSources_List(t *testing.T, db *loginSources) { - setMockLoginSourceFilesStore(t, db, &mockLoginSourceFilesStore{ - MockList: func(opts ListLoginSourceOpts) []*LoginSource { - if opts.OnlyActivated { - return []*LoginSource{ - {ID: 1}, - } - } +func loginSourcesList(t *testing.T, db *loginSources) { + ctx := context.Background() + + mock := NewMockLoginSourceFilesStore() + mock.ListFunc.SetDefaultHook(func(opts ListLoginSourceOpts) []*LoginSource { + if opts.OnlyActivated { return []*LoginSource{ {ID: 1}, - {ID: 2}, } - }, + } + return []*LoginSource{ + {ID: 1}, + {ID: 2}, + } }) + setMockLoginSourceFilesStore(t, db, mock) // Create two login sources in database, one activated and the other one not - _, err := db.Create(CreateLoginSourceOpts{ - Type: auth.PAM, - Name: "PAM", - Config: &pam.Config{ - ServiceName: "PAM", + _, err := db.Create(ctx, + CreateLoginSourceOpts{ + Type: auth.PAM, + Name: "PAM", + Config: &pam.Config{ + ServiceName: "PAM", + }, }, - }) - if err != nil { - t.Fatal(err) - } - _, err = db.Create(CreateLoginSourceOpts{ - Type: auth.GitHub, - Name: "GitHub", - Activated: true, - Config: &github.Config{ - APIEndpoint: "https://api.github.com", + ) + require.NoError(t, err) + _, err = db.Create(ctx, + CreateLoginSourceOpts{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, }, - }) - if err != nil { - t.Fatal(err) - } + ) + require.NoError(t, err) // List all login sources - sources, err := db.List(ListLoginSourceOpts{}) - if err != nil { - t.Fatal(err) - } + sources, err := db.List(ctx, ListLoginSourceOpts{}) + require.NoError(t, err) assert.Equal(t, 4, len(sources), "number of sources") // Only list activated login sources - sources, err = db.List(ListLoginSourceOpts{OnlyActivated: true}) - if err != nil { - t.Fatal(err) - } + sources, err = db.List(ctx, ListLoginSourceOpts{OnlyActivated: true}) + require.NoError(t, err) assert.Equal(t, 2, len(sources), "number of sources") } -func test_loginSources_ResetNonDefault(t *testing.T, db *loginSources) { - setMockLoginSourceFilesStore(t, db, &mockLoginSourceFilesStore{ - MockList: func(opts ListLoginSourceOpts) []*LoginSource { - return []*LoginSource{ - { - File: &mockLoginSourceFileStore{ - MockSetGeneral: func(name, value string) { - assert.Equal(t, "is_default", name) - assert.Equal(t, "false", value) - }, - MockSave: func() error { - return nil - }, - }, - }, - } - }, - MockUpdate: func(source *LoginSource) {}, +func loginSourcesResetNonDefault(t *testing.T, db *loginSources) { + ctx := context.Background() + + mock := NewMockLoginSourceFilesStore() + mock.ListFunc.SetDefaultHook(func(opts ListLoginSourceOpts) []*LoginSource { + mockFile := NewMockLoginSourceFileStore() + mockFile.SetGeneralFunc.SetDefaultHook(func(name, value string) { + assert.Equal(t, "is_default", name) + assert.Equal(t, "false", value) + }) + return []*LoginSource{ + { + File: mockFile, + }, + } }) + setMockLoginSourceFilesStore(t, db, mock) // Create two login sources both have default on - source1, err := db.Create(CreateLoginSourceOpts{ - Type: auth.PAM, - Name: "PAM", - Default: true, - Config: &pam.Config{ - ServiceName: "PAM", + source1, err := db.Create(ctx, + CreateLoginSourceOpts{ + Type: auth.PAM, + Name: "PAM", + Default: true, + Config: &pam.Config{ + ServiceName: "PAM", + }, }, - }) - if err != nil { - t.Fatal(err) - } - source2, err := db.Create(CreateLoginSourceOpts{ - Type: auth.GitHub, - Name: "GitHub", - Activated: true, - Default: true, - Config: &github.Config{ - APIEndpoint: "https://api.github.com", + ) + require.NoError(t, err) + source2, err := db.Create(ctx, + CreateLoginSourceOpts{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: true, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, }, - }) - if err != nil { - t.Fatal(err) - } + ) + require.NoError(t, err) // Set source 1 as default - err = db.ResetNonDefault(source1) - if err != nil { - t.Fatal(err) - } + err = db.ResetNonDefault(ctx, source1) + require.NoError(t, err) // Verify the default state - source1, err = db.GetByID(source1.ID) - if err != nil { - t.Fatal(err) - } + source1, err = db.GetByID(ctx, source1.ID) + require.NoError(t, err) assert.True(t, source1.IsDefault) - source2, err = db.GetByID(source2.ID) - if err != nil { - t.Fatal(err) - } + source2, err = db.GetByID(ctx, source2.ID) + require.NoError(t, err) assert.False(t, source2.IsDefault) } -func test_loginSources_Save(t *testing.T, db *loginSources) { +func loginSourcesSave(t *testing.T, db *loginSources) { + ctx := context.Background() + t.Run("save to database", func(t *testing.T) { // Create a login source with name "GitHub" - source, err := db.Create(CreateLoginSourceOpts{ - Type: auth.GitHub, - Name: "GitHub", - Activated: true, - Default: false, - Config: &github.Config{ - APIEndpoint: "https://api.github.com", + source, err := db.Create(ctx, + CreateLoginSourceOpts{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: false, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, }, - }) - if err != nil { - t.Fatal(err) - } + ) + require.NoError(t, err) source.IsActived = false source.Provider = github.NewProvider(&github.Config{ APIEndpoint: "https://api2.github.com", }) - err = db.Save(source) - if err != nil { - t.Fatal(err) - } + err = db.Save(ctx, source) + require.NoError(t, err) - source, err = db.GetByID(source.ID) - if err != nil { - t.Fatal(err) - } + source, err = db.GetByID(ctx, source.ID) + require.NoError(t, err) assert.False(t, source.IsActived) assert.Equal(t, "https://api2.github.com", source.GitHub().APIEndpoint) }) t.Run("save to file", func(t *testing.T) { - calledSave := false + mockFile := NewMockLoginSourceFileStore() source := &LoginSource{ Provider: github.NewProvider(&github.Config{ APIEndpoint: "https://api.github.com", }), - File: &mockLoginSourceFileStore{ - MockSetGeneral: func(name, value string) {}, - MockSetConfig: func(cfg interface{}) error { return nil }, - MockSave: func() error { - calledSave = true - return nil - }, - }, - } - err := db.Save(source) - if err != nil { - t.Fatal(err) + File: mockFile, } - assert.True(t, calledSave) + err := db.Save(ctx, source) + require.NoError(t, err) + mockrequire.Called(t, mockFile.SaveFunc) }) } diff --git a/internal/db/mock_gen.go b/internal/db/mock_gen.go index b3821287..a73f10d0 100644 --- a/internal/db/mock_gen.go +++ b/internal/db/mock_gen.go @@ -8,7 +8,7 @@ import ( "testing" ) -//go:generate go-mockgen -f gogs.io/gogs/internal/db -i AccessTokensStore -i LFSStore -i PermsStore -o mocks.go +//go:generate go-mockgen -f gogs.io/gogs/internal/db -i AccessTokensStore -i LFSStore -i LoginSourcesStore -i LoginSourceFilesStore -i loginSourceFileStore -i PermsStore -o mocks.go func SetMockAccessTokensStore(t *testing.T, mock AccessTokensStore) { before := AccessTokens @@ -26,31 +26,6 @@ func SetMockLFSStore(t *testing.T, mock LFSStore) { }) } -var _ loginSourceFilesStore = (*mockLoginSourceFilesStore)(nil) - -type mockLoginSourceFilesStore struct { - MockGetByID func(id int64) (*LoginSource, error) - MockLen func() int - MockList func(opts ListLoginSourceOpts) []*LoginSource - MockUpdate func(source *LoginSource) -} - -func (m *mockLoginSourceFilesStore) GetByID(id int64) (*LoginSource, error) { - return m.MockGetByID(id) -} - -func (m *mockLoginSourceFilesStore) Len() int { - return m.MockLen() -} - -func (m *mockLoginSourceFilesStore) List(opts ListLoginSourceOpts) []*LoginSource { - return m.MockList(opts) -} - -func (m *mockLoginSourceFilesStore) Update(source *LoginSource) { - m.MockUpdate(source) -} - func setMockLoginSourceFilesStore(t *testing.T, db *loginSources, mock loginSourceFilesStore) { before := db.files db.files = mock @@ -59,26 +34,6 @@ func setMockLoginSourceFilesStore(t *testing.T, db *loginSources, mock loginSour }) } -var _ loginSourceFileStore = (*mockLoginSourceFileStore)(nil) - -type mockLoginSourceFileStore struct { - MockSetGeneral func(name, value string) - MockSetConfig func(cfg interface{}) error - MockSave func() error -} - -func (m *mockLoginSourceFileStore) SetGeneral(name, value string) { - m.MockSetGeneral(name, value) -} - -func (m *mockLoginSourceFileStore) SetConfig(cfg interface{}) error { - return m.MockSetConfig(cfg) -} - -func (m *mockLoginSourceFileStore) Save() error { - return m.MockSave() -} - func SetMockPermsStore(t *testing.T, mock PermsStore) { before := Perms Perms = mock diff --git a/internal/db/mocks.go b/internal/db/mocks.go index e5a24d06..87f3c2c3 100644 --- a/internal/db/mocks.go +++ b/internal/db/mocks.go @@ -1077,6 +1077,893 @@ func (c LFSStoreGetObjectsByOIDsFuncCall) Results() []interface{} { return []interface{}{c.Result0, c.Result1} } +// MockLoginSourcesStore is a mock implementation of the LoginSourcesStore +// interface (from the package gogs.io/gogs/internal/db) used for unit +// testing. +type MockLoginSourcesStore struct { + // CountFunc is an instance of a mock function object controlling the + // behavior of the method Count. + CountFunc *LoginSourcesStoreCountFunc + // CreateFunc is an instance of a mock function object controlling the + // behavior of the method Create. + CreateFunc *LoginSourcesStoreCreateFunc + // DeleteByIDFunc is an instance of a mock function object controlling + // the behavior of the method DeleteByID. + DeleteByIDFunc *LoginSourcesStoreDeleteByIDFunc + // GetByIDFunc is an instance of a mock function object controlling the + // behavior of the method GetByID. + GetByIDFunc *LoginSourcesStoreGetByIDFunc + // ListFunc is an instance of a mock function object controlling the + // behavior of the method List. + ListFunc *LoginSourcesStoreListFunc + // ResetNonDefaultFunc is an instance of a mock function object + // controlling the behavior of the method ResetNonDefault. + ResetNonDefaultFunc *LoginSourcesStoreResetNonDefaultFunc + // SaveFunc is an instance of a mock function object controlling the + // behavior of the method Save. + SaveFunc *LoginSourcesStoreSaveFunc +} + +// NewMockLoginSourcesStore creates a new mock of the LoginSourcesStore +// interface. All methods return zero values for all results, unless +// overwritten. +func NewMockLoginSourcesStore() *MockLoginSourcesStore { + return &MockLoginSourcesStore{ + CountFunc: &LoginSourcesStoreCountFunc{ + defaultHook: func(context.Context) (r0 int64) { + return + }, + }, + CreateFunc: &LoginSourcesStoreCreateFunc{ + defaultHook: func(context.Context, CreateLoginSourceOpts) (r0 *LoginSource, r1 error) { + return + }, + }, + DeleteByIDFunc: &LoginSourcesStoreDeleteByIDFunc{ + defaultHook: func(context.Context, int64) (r0 error) { + return + }, + }, + GetByIDFunc: &LoginSourcesStoreGetByIDFunc{ + defaultHook: func(context.Context, int64) (r0 *LoginSource, r1 error) { + return + }, + }, + ListFunc: &LoginSourcesStoreListFunc{ + defaultHook: func(context.Context, ListLoginSourceOpts) (r0 []*LoginSource, r1 error) { + return + }, + }, + ResetNonDefaultFunc: &LoginSourcesStoreResetNonDefaultFunc{ + defaultHook: func(context.Context, *LoginSource) (r0 error) { + return + }, + }, + SaveFunc: &LoginSourcesStoreSaveFunc{ + defaultHook: func(context.Context, *LoginSource) (r0 error) { + return + }, + }, + } +} + +// NewStrictMockLoginSourcesStore creates a new mock of the +// LoginSourcesStore interface. All methods panic on invocation, unless +// overwritten. +func NewStrictMockLoginSourcesStore() *MockLoginSourcesStore { + return &MockLoginSourcesStore{ + CountFunc: &LoginSourcesStoreCountFunc{ + defaultHook: func(context.Context) int64 { + panic("unexpected invocation of MockLoginSourcesStore.Count") + }, + }, + CreateFunc: &LoginSourcesStoreCreateFunc{ + defaultHook: func(context.Context, CreateLoginSourceOpts) (*LoginSource, error) { + panic("unexpected invocation of MockLoginSourcesStore.Create") + }, + }, + DeleteByIDFunc: &LoginSourcesStoreDeleteByIDFunc{ + defaultHook: func(context.Context, int64) error { + panic("unexpected invocation of MockLoginSourcesStore.DeleteByID") + }, + }, + GetByIDFunc: &LoginSourcesStoreGetByIDFunc{ + defaultHook: func(context.Context, int64) (*LoginSource, error) { + panic("unexpected invocation of MockLoginSourcesStore.GetByID") + }, + }, + ListFunc: &LoginSourcesStoreListFunc{ + defaultHook: func(context.Context, ListLoginSourceOpts) ([]*LoginSource, error) { + panic("unexpected invocation of MockLoginSourcesStore.List") + }, + }, + ResetNonDefaultFunc: &LoginSourcesStoreResetNonDefaultFunc{ + defaultHook: func(context.Context, *LoginSource) error { + panic("unexpected invocation of MockLoginSourcesStore.ResetNonDefault") + }, + }, + SaveFunc: &LoginSourcesStoreSaveFunc{ + defaultHook: func(context.Context, *LoginSource) error { + panic("unexpected invocation of MockLoginSourcesStore.Save") + }, + }, + } +} + +// NewMockLoginSourcesStoreFrom creates a new mock of the +// MockLoginSourcesStore interface. All methods delegate to the given +// implementation, unless overwritten. +func NewMockLoginSourcesStoreFrom(i LoginSourcesStore) *MockLoginSourcesStore { + return &MockLoginSourcesStore{ + CountFunc: &LoginSourcesStoreCountFunc{ + defaultHook: i.Count, + }, + CreateFunc: &LoginSourcesStoreCreateFunc{ + defaultHook: i.Create, + }, + DeleteByIDFunc: &LoginSourcesStoreDeleteByIDFunc{ + defaultHook: i.DeleteByID, + }, + GetByIDFunc: &LoginSourcesStoreGetByIDFunc{ + defaultHook: i.GetByID, + }, + ListFunc: &LoginSourcesStoreListFunc{ + defaultHook: i.List, + }, + ResetNonDefaultFunc: &LoginSourcesStoreResetNonDefaultFunc{ + defaultHook: i.ResetNonDefault, + }, + SaveFunc: &LoginSourcesStoreSaveFunc{ + defaultHook: i.Save, + }, + } +} + +// LoginSourcesStoreCountFunc describes the behavior when the Count method +// of the parent MockLoginSourcesStore instance is invoked. +type LoginSourcesStoreCountFunc struct { + defaultHook func(context.Context) int64 + hooks []func(context.Context) int64 + history []LoginSourcesStoreCountFuncCall + mutex sync.Mutex +} + +// Count delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourcesStore) Count(v0 context.Context) int64 { + r0 := m.CountFunc.nextHook()(v0) + m.CountFunc.appendCall(LoginSourcesStoreCountFuncCall{v0, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the Count method of the +// parent MockLoginSourcesStore instance is invoked and the hook queue is +// empty. +func (f *LoginSourcesStoreCountFunc) SetDefaultHook(hook func(context.Context) int64) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Count method of the parent MockLoginSourcesStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *LoginSourcesStoreCountFunc) PushHook(hook func(context.Context) int64) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourcesStoreCountFunc) SetDefaultReturn(r0 int64) { + f.SetDefaultHook(func(context.Context) int64 { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourcesStoreCountFunc) PushReturn(r0 int64) { + f.PushHook(func(context.Context) int64 { + return r0 + }) +} + +func (f *LoginSourcesStoreCountFunc) nextHook() func(context.Context) int64 { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourcesStoreCountFunc) appendCall(r0 LoginSourcesStoreCountFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourcesStoreCountFuncCall objects +// describing the invocations of this function. +func (f *LoginSourcesStoreCountFunc) History() []LoginSourcesStoreCountFuncCall { + f.mutex.Lock() + history := make([]LoginSourcesStoreCountFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourcesStoreCountFuncCall is an object that describes an invocation +// of method Count on an instance of MockLoginSourcesStore. +type LoginSourcesStoreCountFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 int64 +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourcesStoreCountFuncCall) Args() []interface{} { + return []interface{}{c.Arg0} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourcesStoreCountFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourcesStoreCreateFunc describes the behavior when the Create method +// of the parent MockLoginSourcesStore instance is invoked. +type LoginSourcesStoreCreateFunc struct { + defaultHook func(context.Context, CreateLoginSourceOpts) (*LoginSource, error) + hooks []func(context.Context, CreateLoginSourceOpts) (*LoginSource, error) + history []LoginSourcesStoreCreateFuncCall + mutex sync.Mutex +} + +// Create delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourcesStore) Create(v0 context.Context, v1 CreateLoginSourceOpts) (*LoginSource, error) { + r0, r1 := m.CreateFunc.nextHook()(v0, v1) + m.CreateFunc.appendCall(LoginSourcesStoreCreateFuncCall{v0, v1, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the Create method of the +// parent MockLoginSourcesStore instance is invoked and the hook queue is +// empty. +func (f *LoginSourcesStoreCreateFunc) SetDefaultHook(hook func(context.Context, CreateLoginSourceOpts) (*LoginSource, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Create method of the parent MockLoginSourcesStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *LoginSourcesStoreCreateFunc) PushHook(hook func(context.Context, CreateLoginSourceOpts) (*LoginSource, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourcesStoreCreateFunc) SetDefaultReturn(r0 *LoginSource, r1 error) { + f.SetDefaultHook(func(context.Context, CreateLoginSourceOpts) (*LoginSource, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourcesStoreCreateFunc) PushReturn(r0 *LoginSource, r1 error) { + f.PushHook(func(context.Context, CreateLoginSourceOpts) (*LoginSource, error) { + return r0, r1 + }) +} + +func (f *LoginSourcesStoreCreateFunc) nextHook() func(context.Context, CreateLoginSourceOpts) (*LoginSource, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourcesStoreCreateFunc) appendCall(r0 LoginSourcesStoreCreateFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourcesStoreCreateFuncCall objects +// describing the invocations of this function. +func (f *LoginSourcesStoreCreateFunc) History() []LoginSourcesStoreCreateFuncCall { + f.mutex.Lock() + history := make([]LoginSourcesStoreCreateFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourcesStoreCreateFuncCall is an object that describes an invocation +// of method Create on an instance of MockLoginSourcesStore. +type LoginSourcesStoreCreateFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 CreateLoginSourceOpts + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *LoginSource + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourcesStoreCreateFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourcesStoreCreateFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// LoginSourcesStoreDeleteByIDFunc describes the behavior when the +// DeleteByID method of the parent MockLoginSourcesStore instance is +// invoked. +type LoginSourcesStoreDeleteByIDFunc struct { + defaultHook func(context.Context, int64) error + hooks []func(context.Context, int64) error + history []LoginSourcesStoreDeleteByIDFuncCall + mutex sync.Mutex +} + +// DeleteByID delegates to the next hook function in the queue and stores +// the parameter and result values of this invocation. +func (m *MockLoginSourcesStore) DeleteByID(v0 context.Context, v1 int64) error { + r0 := m.DeleteByIDFunc.nextHook()(v0, v1) + m.DeleteByIDFunc.appendCall(LoginSourcesStoreDeleteByIDFuncCall{v0, v1, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the DeleteByID method of +// the parent MockLoginSourcesStore instance is invoked and the hook queue +// is empty. +func (f *LoginSourcesStoreDeleteByIDFunc) SetDefaultHook(hook func(context.Context, int64) error) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// DeleteByID method of the parent MockLoginSourcesStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *LoginSourcesStoreDeleteByIDFunc) PushHook(hook func(context.Context, int64) error) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourcesStoreDeleteByIDFunc) SetDefaultReturn(r0 error) { + f.SetDefaultHook(func(context.Context, int64) error { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourcesStoreDeleteByIDFunc) PushReturn(r0 error) { + f.PushHook(func(context.Context, int64) error { + return r0 + }) +} + +func (f *LoginSourcesStoreDeleteByIDFunc) nextHook() func(context.Context, int64) error { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourcesStoreDeleteByIDFunc) appendCall(r0 LoginSourcesStoreDeleteByIDFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourcesStoreDeleteByIDFuncCall objects +// describing the invocations of this function. +func (f *LoginSourcesStoreDeleteByIDFunc) History() []LoginSourcesStoreDeleteByIDFuncCall { + f.mutex.Lock() + history := make([]LoginSourcesStoreDeleteByIDFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourcesStoreDeleteByIDFuncCall is an object that describes an +// invocation of method DeleteByID on an instance of MockLoginSourcesStore. +type LoginSourcesStoreDeleteByIDFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourcesStoreDeleteByIDFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourcesStoreDeleteByIDFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourcesStoreGetByIDFunc describes the behavior when the GetByID +// method of the parent MockLoginSourcesStore instance is invoked. +type LoginSourcesStoreGetByIDFunc struct { + defaultHook func(context.Context, int64) (*LoginSource, error) + hooks []func(context.Context, int64) (*LoginSource, error) + history []LoginSourcesStoreGetByIDFuncCall + mutex sync.Mutex +} + +// GetByID delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourcesStore) GetByID(v0 context.Context, v1 int64) (*LoginSource, error) { + r0, r1 := m.GetByIDFunc.nextHook()(v0, v1) + m.GetByIDFunc.appendCall(LoginSourcesStoreGetByIDFuncCall{v0, v1, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the GetByID method of +// the parent MockLoginSourcesStore instance is invoked and the hook queue +// is empty. +func (f *LoginSourcesStoreGetByIDFunc) SetDefaultHook(hook func(context.Context, int64) (*LoginSource, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// GetByID method of the parent MockLoginSourcesStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *LoginSourcesStoreGetByIDFunc) PushHook(hook func(context.Context, int64) (*LoginSource, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourcesStoreGetByIDFunc) SetDefaultReturn(r0 *LoginSource, r1 error) { + f.SetDefaultHook(func(context.Context, int64) (*LoginSource, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourcesStoreGetByIDFunc) PushReturn(r0 *LoginSource, r1 error) { + f.PushHook(func(context.Context, int64) (*LoginSource, error) { + return r0, r1 + }) +} + +func (f *LoginSourcesStoreGetByIDFunc) nextHook() func(context.Context, int64) (*LoginSource, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourcesStoreGetByIDFunc) appendCall(r0 LoginSourcesStoreGetByIDFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourcesStoreGetByIDFuncCall objects +// describing the invocations of this function. +func (f *LoginSourcesStoreGetByIDFunc) History() []LoginSourcesStoreGetByIDFuncCall { + f.mutex.Lock() + history := make([]LoginSourcesStoreGetByIDFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourcesStoreGetByIDFuncCall is an object that describes an +// invocation of method GetByID on an instance of MockLoginSourcesStore. +type LoginSourcesStoreGetByIDFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *LoginSource + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourcesStoreGetByIDFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourcesStoreGetByIDFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// LoginSourcesStoreListFunc describes the behavior when the List method of +// the parent MockLoginSourcesStore instance is invoked. +type LoginSourcesStoreListFunc struct { + defaultHook func(context.Context, ListLoginSourceOpts) ([]*LoginSource, error) + hooks []func(context.Context, ListLoginSourceOpts) ([]*LoginSource, error) + history []LoginSourcesStoreListFuncCall + mutex sync.Mutex +} + +// List delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourcesStore) List(v0 context.Context, v1 ListLoginSourceOpts) ([]*LoginSource, error) { + r0, r1 := m.ListFunc.nextHook()(v0, v1) + m.ListFunc.appendCall(LoginSourcesStoreListFuncCall{v0, v1, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the List method of the +// parent MockLoginSourcesStore instance is invoked and the hook queue is +// empty. +func (f *LoginSourcesStoreListFunc) SetDefaultHook(hook func(context.Context, ListLoginSourceOpts) ([]*LoginSource, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// List method of the parent MockLoginSourcesStore instance invokes the hook +// at the front of the queue and discards it. After the queue is empty, the +// default hook function is invoked for any future action. +func (f *LoginSourcesStoreListFunc) PushHook(hook func(context.Context, ListLoginSourceOpts) ([]*LoginSource, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourcesStoreListFunc) SetDefaultReturn(r0 []*LoginSource, r1 error) { + f.SetDefaultHook(func(context.Context, ListLoginSourceOpts) ([]*LoginSource, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourcesStoreListFunc) PushReturn(r0 []*LoginSource, r1 error) { + f.PushHook(func(context.Context, ListLoginSourceOpts) ([]*LoginSource, error) { + return r0, r1 + }) +} + +func (f *LoginSourcesStoreListFunc) nextHook() func(context.Context, ListLoginSourceOpts) ([]*LoginSource, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourcesStoreListFunc) appendCall(r0 LoginSourcesStoreListFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourcesStoreListFuncCall objects +// describing the invocations of this function. +func (f *LoginSourcesStoreListFunc) History() []LoginSourcesStoreListFuncCall { + f.mutex.Lock() + history := make([]LoginSourcesStoreListFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourcesStoreListFuncCall is an object that describes an invocation +// of method List on an instance of MockLoginSourcesStore. +type LoginSourcesStoreListFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 ListLoginSourceOpts + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 []*LoginSource + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourcesStoreListFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourcesStoreListFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// LoginSourcesStoreResetNonDefaultFunc describes the behavior when the +// ResetNonDefault method of the parent MockLoginSourcesStore instance is +// invoked. +type LoginSourcesStoreResetNonDefaultFunc struct { + defaultHook func(context.Context, *LoginSource) error + hooks []func(context.Context, *LoginSource) error + history []LoginSourcesStoreResetNonDefaultFuncCall + mutex sync.Mutex +} + +// ResetNonDefault delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockLoginSourcesStore) ResetNonDefault(v0 context.Context, v1 *LoginSource) error { + r0 := m.ResetNonDefaultFunc.nextHook()(v0, v1) + m.ResetNonDefaultFunc.appendCall(LoginSourcesStoreResetNonDefaultFuncCall{v0, v1, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the ResetNonDefault +// method of the parent MockLoginSourcesStore instance is invoked and the +// hook queue is empty. +func (f *LoginSourcesStoreResetNonDefaultFunc) SetDefaultHook(hook func(context.Context, *LoginSource) error) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// ResetNonDefault method of the parent MockLoginSourcesStore instance +// invokes the hook at the front of the queue and discards it. After the +// queue is empty, the default hook function is invoked for any future +// action. +func (f *LoginSourcesStoreResetNonDefaultFunc) PushHook(hook func(context.Context, *LoginSource) error) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourcesStoreResetNonDefaultFunc) SetDefaultReturn(r0 error) { + f.SetDefaultHook(func(context.Context, *LoginSource) error { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourcesStoreResetNonDefaultFunc) PushReturn(r0 error) { + f.PushHook(func(context.Context, *LoginSource) error { + return r0 + }) +} + +func (f *LoginSourcesStoreResetNonDefaultFunc) nextHook() func(context.Context, *LoginSource) error { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourcesStoreResetNonDefaultFunc) appendCall(r0 LoginSourcesStoreResetNonDefaultFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourcesStoreResetNonDefaultFuncCall +// objects describing the invocations of this function. +func (f *LoginSourcesStoreResetNonDefaultFunc) History() []LoginSourcesStoreResetNonDefaultFuncCall { + f.mutex.Lock() + history := make([]LoginSourcesStoreResetNonDefaultFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourcesStoreResetNonDefaultFuncCall is an object that describes an +// invocation of method ResetNonDefault on an instance of +// MockLoginSourcesStore. +type LoginSourcesStoreResetNonDefaultFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 *LoginSource + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourcesStoreResetNonDefaultFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourcesStoreResetNonDefaultFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourcesStoreSaveFunc describes the behavior when the Save method of +// the parent MockLoginSourcesStore instance is invoked. +type LoginSourcesStoreSaveFunc struct { + defaultHook func(context.Context, *LoginSource) error + hooks []func(context.Context, *LoginSource) error + history []LoginSourcesStoreSaveFuncCall + mutex sync.Mutex +} + +// Save delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourcesStore) Save(v0 context.Context, v1 *LoginSource) error { + r0 := m.SaveFunc.nextHook()(v0, v1) + m.SaveFunc.appendCall(LoginSourcesStoreSaveFuncCall{v0, v1, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the Save method of the +// parent MockLoginSourcesStore instance is invoked and the hook queue is +// empty. +func (f *LoginSourcesStoreSaveFunc) SetDefaultHook(hook func(context.Context, *LoginSource) error) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Save method of the parent MockLoginSourcesStore instance invokes the hook +// at the front of the queue and discards it. After the queue is empty, the +// default hook function is invoked for any future action. +func (f *LoginSourcesStoreSaveFunc) PushHook(hook func(context.Context, *LoginSource) error) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourcesStoreSaveFunc) SetDefaultReturn(r0 error) { + f.SetDefaultHook(func(context.Context, *LoginSource) error { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourcesStoreSaveFunc) PushReturn(r0 error) { + f.PushHook(func(context.Context, *LoginSource) error { + return r0 + }) +} + +func (f *LoginSourcesStoreSaveFunc) nextHook() func(context.Context, *LoginSource) error { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourcesStoreSaveFunc) appendCall(r0 LoginSourcesStoreSaveFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourcesStoreSaveFuncCall objects +// describing the invocations of this function. +func (f *LoginSourcesStoreSaveFunc) History() []LoginSourcesStoreSaveFuncCall { + f.mutex.Lock() + history := make([]LoginSourcesStoreSaveFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourcesStoreSaveFuncCall is an object that describes an invocation +// of method Save on an instance of MockLoginSourcesStore. +type LoginSourcesStoreSaveFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 *LoginSource + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourcesStoreSaveFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourcesStoreSaveFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + // MockPermsStore is a mock implementation of the PermsStore interface (from // the package gogs.io/gogs/internal/db) used for unit testing. type MockPermsStore struct { @@ -1483,3 +2370,906 @@ func (c PermsStoreSetRepoPermsFuncCall) Args() []interface{} { func (c PermsStoreSetRepoPermsFuncCall) Results() []interface{} { return []interface{}{c.Result0} } + +// MockLoginSourceFileStore is a mock implementation of the +// loginSourceFileStore interface (from the package +// gogs.io/gogs/internal/db) used for unit testing. +type MockLoginSourceFileStore struct { + // SaveFunc is an instance of a mock function object controlling the + // behavior of the method Save. + SaveFunc *LoginSourceFileStoreSaveFunc + // SetConfigFunc is an instance of a mock function object controlling + // the behavior of the method SetConfig. + SetConfigFunc *LoginSourceFileStoreSetConfigFunc + // SetGeneralFunc is an instance of a mock function object controlling + // the behavior of the method SetGeneral. + SetGeneralFunc *LoginSourceFileStoreSetGeneralFunc +} + +// NewMockLoginSourceFileStore creates a new mock of the +// loginSourceFileStore interface. All methods return zero values for all +// results, unless overwritten. +func NewMockLoginSourceFileStore() *MockLoginSourceFileStore { + return &MockLoginSourceFileStore{ + SaveFunc: &LoginSourceFileStoreSaveFunc{ + defaultHook: func() (r0 error) { + return + }, + }, + SetConfigFunc: &LoginSourceFileStoreSetConfigFunc{ + defaultHook: func(interface{}) (r0 error) { + return + }, + }, + SetGeneralFunc: &LoginSourceFileStoreSetGeneralFunc{ + defaultHook: func(string, string) { + return + }, + }, + } +} + +// NewStrictMockLoginSourceFileStore creates a new mock of the +// loginSourceFileStore interface. All methods panic on invocation, unless +// overwritten. +func NewStrictMockLoginSourceFileStore() *MockLoginSourceFileStore { + return &MockLoginSourceFileStore{ + SaveFunc: &LoginSourceFileStoreSaveFunc{ + defaultHook: func() error { + panic("unexpected invocation of MockLoginSourceFileStore.Save") + }, + }, + SetConfigFunc: &LoginSourceFileStoreSetConfigFunc{ + defaultHook: func(interface{}) error { + panic("unexpected invocation of MockLoginSourceFileStore.SetConfig") + }, + }, + SetGeneralFunc: &LoginSourceFileStoreSetGeneralFunc{ + defaultHook: func(string, string) { + panic("unexpected invocation of MockLoginSourceFileStore.SetGeneral") + }, + }, + } +} + +// surrogateMockLoginSourceFileStore is a copy of the loginSourceFileStore +// interface (from the package gogs.io/gogs/internal/db). It is redefined +// here as it is unexported in the source package. +type surrogateMockLoginSourceFileStore interface { + Save() error + SetConfig(interface{}) error + SetGeneral(string, string) +} + +// NewMockLoginSourceFileStoreFrom creates a new mock of the +// MockLoginSourceFileStore interface. All methods delegate to the given +// implementation, unless overwritten. +func NewMockLoginSourceFileStoreFrom(i surrogateMockLoginSourceFileStore) *MockLoginSourceFileStore { + return &MockLoginSourceFileStore{ + SaveFunc: &LoginSourceFileStoreSaveFunc{ + defaultHook: i.Save, + }, + SetConfigFunc: &LoginSourceFileStoreSetConfigFunc{ + defaultHook: i.SetConfig, + }, + SetGeneralFunc: &LoginSourceFileStoreSetGeneralFunc{ + defaultHook: i.SetGeneral, + }, + } +} + +// LoginSourceFileStoreSaveFunc describes the behavior when the Save method +// of the parent MockLoginSourceFileStore instance is invoked. +type LoginSourceFileStoreSaveFunc struct { + defaultHook func() error + hooks []func() error + history []LoginSourceFileStoreSaveFuncCall + mutex sync.Mutex +} + +// Save delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFileStore) Save() error { + r0 := m.SaveFunc.nextHook()() + m.SaveFunc.appendCall(LoginSourceFileStoreSaveFuncCall{r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the Save method of the +// parent MockLoginSourceFileStore instance is invoked and the hook queue is +// empty. +func (f *LoginSourceFileStoreSaveFunc) SetDefaultHook(hook func() error) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Save method of the parent MockLoginSourceFileStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *LoginSourceFileStoreSaveFunc) PushHook(hook func() error) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFileStoreSaveFunc) SetDefaultReturn(r0 error) { + f.SetDefaultHook(func() error { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFileStoreSaveFunc) PushReturn(r0 error) { + f.PushHook(func() error { + return r0 + }) +} + +func (f *LoginSourceFileStoreSaveFunc) nextHook() func() error { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFileStoreSaveFunc) appendCall(r0 LoginSourceFileStoreSaveFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFileStoreSaveFuncCall objects +// describing the invocations of this function. +func (f *LoginSourceFileStoreSaveFunc) History() []LoginSourceFileStoreSaveFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFileStoreSaveFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFileStoreSaveFuncCall is an object that describes an +// invocation of method Save on an instance of MockLoginSourceFileStore. +type LoginSourceFileStoreSaveFuncCall struct { + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFileStoreSaveFuncCall) Args() []interface{} { + return []interface{}{} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFileStoreSaveFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourceFileStoreSetConfigFunc describes the behavior when the +// SetConfig method of the parent MockLoginSourceFileStore instance is +// invoked. +type LoginSourceFileStoreSetConfigFunc struct { + defaultHook func(interface{}) error + hooks []func(interface{}) error + history []LoginSourceFileStoreSetConfigFuncCall + mutex sync.Mutex +} + +// SetConfig delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFileStore) SetConfig(v0 interface{}) error { + r0 := m.SetConfigFunc.nextHook()(v0) + m.SetConfigFunc.appendCall(LoginSourceFileStoreSetConfigFuncCall{v0, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the SetConfig method of +// the parent MockLoginSourceFileStore instance is invoked and the hook +// queue is empty. +func (f *LoginSourceFileStoreSetConfigFunc) SetDefaultHook(hook func(interface{}) error) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// SetConfig method of the parent MockLoginSourceFileStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *LoginSourceFileStoreSetConfigFunc) PushHook(hook func(interface{}) error) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFileStoreSetConfigFunc) SetDefaultReturn(r0 error) { + f.SetDefaultHook(func(interface{}) error { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFileStoreSetConfigFunc) PushReturn(r0 error) { + f.PushHook(func(interface{}) error { + return r0 + }) +} + +func (f *LoginSourceFileStoreSetConfigFunc) nextHook() func(interface{}) error { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFileStoreSetConfigFunc) appendCall(r0 LoginSourceFileStoreSetConfigFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFileStoreSetConfigFuncCall +// objects describing the invocations of this function. +func (f *LoginSourceFileStoreSetConfigFunc) History() []LoginSourceFileStoreSetConfigFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFileStoreSetConfigFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFileStoreSetConfigFuncCall is an object that describes an +// invocation of method SetConfig on an instance of +// MockLoginSourceFileStore. +type LoginSourceFileStoreSetConfigFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 interface{} + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFileStoreSetConfigFuncCall) Args() []interface{} { + return []interface{}{c.Arg0} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFileStoreSetConfigFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourceFileStoreSetGeneralFunc describes the behavior when the +// SetGeneral method of the parent MockLoginSourceFileStore instance is +// invoked. +type LoginSourceFileStoreSetGeneralFunc struct { + defaultHook func(string, string) + hooks []func(string, string) + history []LoginSourceFileStoreSetGeneralFuncCall + mutex sync.Mutex +} + +// SetGeneral delegates to the next hook function in the queue and stores +// the parameter and result values of this invocation. +func (m *MockLoginSourceFileStore) SetGeneral(v0 string, v1 string) { + m.SetGeneralFunc.nextHook()(v0, v1) + m.SetGeneralFunc.appendCall(LoginSourceFileStoreSetGeneralFuncCall{v0, v1}) + return +} + +// SetDefaultHook sets function that is called when the SetGeneral method of +// the parent MockLoginSourceFileStore instance is invoked and the hook +// queue is empty. +func (f *LoginSourceFileStoreSetGeneralFunc) SetDefaultHook(hook func(string, string)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// SetGeneral method of the parent MockLoginSourceFileStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *LoginSourceFileStoreSetGeneralFunc) PushHook(hook func(string, string)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFileStoreSetGeneralFunc) SetDefaultReturn() { + f.SetDefaultHook(func(string, string) { + return + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFileStoreSetGeneralFunc) PushReturn() { + f.PushHook(func(string, string) { + return + }) +} + +func (f *LoginSourceFileStoreSetGeneralFunc) nextHook() func(string, string) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFileStoreSetGeneralFunc) appendCall(r0 LoginSourceFileStoreSetGeneralFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFileStoreSetGeneralFuncCall +// objects describing the invocations of this function. +func (f *LoginSourceFileStoreSetGeneralFunc) History() []LoginSourceFileStoreSetGeneralFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFileStoreSetGeneralFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFileStoreSetGeneralFuncCall is an object that describes an +// invocation of method SetGeneral on an instance of +// MockLoginSourceFileStore. +type LoginSourceFileStoreSetGeneralFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 string + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 string +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFileStoreSetGeneralFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFileStoreSetGeneralFuncCall) Results() []interface{} { + return []interface{}{} +} + +// MockLoginSourceFilesStore is a mock implementation of the +// loginSourceFilesStore interface (from the package +// gogs.io/gogs/internal/db) used for unit testing. +type MockLoginSourceFilesStore struct { + // GetByIDFunc is an instance of a mock function object controlling the + // behavior of the method GetByID. + GetByIDFunc *LoginSourceFilesStoreGetByIDFunc + // LenFunc is an instance of a mock function object controlling the + // behavior of the method Len. + LenFunc *LoginSourceFilesStoreLenFunc + // ListFunc is an instance of a mock function object controlling the + // behavior of the method List. + ListFunc *LoginSourceFilesStoreListFunc + // UpdateFunc is an instance of a mock function object controlling the + // behavior of the method Update. + UpdateFunc *LoginSourceFilesStoreUpdateFunc +} + +// NewMockLoginSourceFilesStore creates a new mock of the +// loginSourceFilesStore interface. All methods return zero values for all +// results, unless overwritten. +func NewMockLoginSourceFilesStore() *MockLoginSourceFilesStore { + return &MockLoginSourceFilesStore{ + GetByIDFunc: &LoginSourceFilesStoreGetByIDFunc{ + defaultHook: func(int64) (r0 *LoginSource, r1 error) { + return + }, + }, + LenFunc: &LoginSourceFilesStoreLenFunc{ + defaultHook: func() (r0 int) { + return + }, + }, + ListFunc: &LoginSourceFilesStoreListFunc{ + defaultHook: func(ListLoginSourceOpts) (r0 []*LoginSource) { + return + }, + }, + UpdateFunc: &LoginSourceFilesStoreUpdateFunc{ + defaultHook: func(*LoginSource) { + return + }, + }, + } +} + +// NewStrictMockLoginSourceFilesStore creates a new mock of the +// loginSourceFilesStore interface. All methods panic on invocation, unless +// overwritten. +func NewStrictMockLoginSourceFilesStore() *MockLoginSourceFilesStore { + return &MockLoginSourceFilesStore{ + GetByIDFunc: &LoginSourceFilesStoreGetByIDFunc{ + defaultHook: func(int64) (*LoginSource, error) { + panic("unexpected invocation of MockLoginSourceFilesStore.GetByID") + }, + }, + LenFunc: &LoginSourceFilesStoreLenFunc{ + defaultHook: func() int { + panic("unexpected invocation of MockLoginSourceFilesStore.Len") + }, + }, + ListFunc: &LoginSourceFilesStoreListFunc{ + defaultHook: func(ListLoginSourceOpts) []*LoginSource { + panic("unexpected invocation of MockLoginSourceFilesStore.List") + }, + }, + UpdateFunc: &LoginSourceFilesStoreUpdateFunc{ + defaultHook: func(*LoginSource) { + panic("unexpected invocation of MockLoginSourceFilesStore.Update") + }, + }, + } +} + +// surrogateMockLoginSourceFilesStore is a copy of the loginSourceFilesStore +// interface (from the package gogs.io/gogs/internal/db). It is redefined +// here as it is unexported in the source package. +type surrogateMockLoginSourceFilesStore interface { + GetByID(int64) (*LoginSource, error) + Len() int + List(ListLoginSourceOpts) []*LoginSource + Update(*LoginSource) +} + +// NewMockLoginSourceFilesStoreFrom creates a new mock of the +// MockLoginSourceFilesStore interface. All methods delegate to the given +// implementation, unless overwritten. +func NewMockLoginSourceFilesStoreFrom(i surrogateMockLoginSourceFilesStore) *MockLoginSourceFilesStore { + return &MockLoginSourceFilesStore{ + GetByIDFunc: &LoginSourceFilesStoreGetByIDFunc{ + defaultHook: i.GetByID, + }, + LenFunc: &LoginSourceFilesStoreLenFunc{ + defaultHook: i.Len, + }, + ListFunc: &LoginSourceFilesStoreListFunc{ + defaultHook: i.List, + }, + UpdateFunc: &LoginSourceFilesStoreUpdateFunc{ + defaultHook: i.Update, + }, + } +} + +// LoginSourceFilesStoreGetByIDFunc describes the behavior when the GetByID +// method of the parent MockLoginSourceFilesStore instance is invoked. +type LoginSourceFilesStoreGetByIDFunc struct { + defaultHook func(int64) (*LoginSource, error) + hooks []func(int64) (*LoginSource, error) + history []LoginSourceFilesStoreGetByIDFuncCall + mutex sync.Mutex +} + +// GetByID delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFilesStore) GetByID(v0 int64) (*LoginSource, error) { + r0, r1 := m.GetByIDFunc.nextHook()(v0) + m.GetByIDFunc.appendCall(LoginSourceFilesStoreGetByIDFuncCall{v0, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the GetByID method of +// the parent MockLoginSourceFilesStore instance is invoked and the hook +// queue is empty. +func (f *LoginSourceFilesStoreGetByIDFunc) SetDefaultHook(hook func(int64) (*LoginSource, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// GetByID method of the parent MockLoginSourceFilesStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *LoginSourceFilesStoreGetByIDFunc) PushHook(hook func(int64) (*LoginSource, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFilesStoreGetByIDFunc) SetDefaultReturn(r0 *LoginSource, r1 error) { + f.SetDefaultHook(func(int64) (*LoginSource, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFilesStoreGetByIDFunc) PushReturn(r0 *LoginSource, r1 error) { + f.PushHook(func(int64) (*LoginSource, error) { + return r0, r1 + }) +} + +func (f *LoginSourceFilesStoreGetByIDFunc) nextHook() func(int64) (*LoginSource, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFilesStoreGetByIDFunc) appendCall(r0 LoginSourceFilesStoreGetByIDFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFilesStoreGetByIDFuncCall +// objects describing the invocations of this function. +func (f *LoginSourceFilesStoreGetByIDFunc) History() []LoginSourceFilesStoreGetByIDFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFilesStoreGetByIDFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFilesStoreGetByIDFuncCall is an object that describes an +// invocation of method GetByID on an instance of MockLoginSourceFilesStore. +type LoginSourceFilesStoreGetByIDFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 int64 + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *LoginSource + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFilesStoreGetByIDFuncCall) Args() []interface{} { + return []interface{}{c.Arg0} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFilesStoreGetByIDFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// LoginSourceFilesStoreLenFunc describes the behavior when the Len method +// of the parent MockLoginSourceFilesStore instance is invoked. +type LoginSourceFilesStoreLenFunc struct { + defaultHook func() int + hooks []func() int + history []LoginSourceFilesStoreLenFuncCall + mutex sync.Mutex +} + +// Len delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFilesStore) Len() int { + r0 := m.LenFunc.nextHook()() + m.LenFunc.appendCall(LoginSourceFilesStoreLenFuncCall{r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the Len method of the +// parent MockLoginSourceFilesStore instance is invoked and the hook queue +// is empty. +func (f *LoginSourceFilesStoreLenFunc) SetDefaultHook(hook func() int) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Len method of the parent MockLoginSourceFilesStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *LoginSourceFilesStoreLenFunc) PushHook(hook func() int) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFilesStoreLenFunc) SetDefaultReturn(r0 int) { + f.SetDefaultHook(func() int { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFilesStoreLenFunc) PushReturn(r0 int) { + f.PushHook(func() int { + return r0 + }) +} + +func (f *LoginSourceFilesStoreLenFunc) nextHook() func() int { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFilesStoreLenFunc) appendCall(r0 LoginSourceFilesStoreLenFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFilesStoreLenFuncCall objects +// describing the invocations of this function. +func (f *LoginSourceFilesStoreLenFunc) History() []LoginSourceFilesStoreLenFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFilesStoreLenFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFilesStoreLenFuncCall is an object that describes an +// invocation of method Len on an instance of MockLoginSourceFilesStore. +type LoginSourceFilesStoreLenFuncCall struct { + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 int +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFilesStoreLenFuncCall) Args() []interface{} { + return []interface{}{} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFilesStoreLenFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourceFilesStoreListFunc describes the behavior when the List method +// of the parent MockLoginSourceFilesStore instance is invoked. +type LoginSourceFilesStoreListFunc struct { + defaultHook func(ListLoginSourceOpts) []*LoginSource + hooks []func(ListLoginSourceOpts) []*LoginSource + history []LoginSourceFilesStoreListFuncCall + mutex sync.Mutex +} + +// List delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFilesStore) List(v0 ListLoginSourceOpts) []*LoginSource { + r0 := m.ListFunc.nextHook()(v0) + m.ListFunc.appendCall(LoginSourceFilesStoreListFuncCall{v0, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the List method of the +// parent MockLoginSourceFilesStore instance is invoked and the hook queue +// is empty. +func (f *LoginSourceFilesStoreListFunc) SetDefaultHook(hook func(ListLoginSourceOpts) []*LoginSource) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// List method of the parent MockLoginSourceFilesStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *LoginSourceFilesStoreListFunc) PushHook(hook func(ListLoginSourceOpts) []*LoginSource) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFilesStoreListFunc) SetDefaultReturn(r0 []*LoginSource) { + f.SetDefaultHook(func(ListLoginSourceOpts) []*LoginSource { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFilesStoreListFunc) PushReturn(r0 []*LoginSource) { + f.PushHook(func(ListLoginSourceOpts) []*LoginSource { + return r0 + }) +} + +func (f *LoginSourceFilesStoreListFunc) nextHook() func(ListLoginSourceOpts) []*LoginSource { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFilesStoreListFunc) appendCall(r0 LoginSourceFilesStoreListFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFilesStoreListFuncCall objects +// describing the invocations of this function. +func (f *LoginSourceFilesStoreListFunc) History() []LoginSourceFilesStoreListFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFilesStoreListFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFilesStoreListFuncCall is an object that describes an +// invocation of method List on an instance of MockLoginSourceFilesStore. +type LoginSourceFilesStoreListFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 ListLoginSourceOpts + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 []*LoginSource +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFilesStoreListFuncCall) Args() []interface{} { + return []interface{}{c.Arg0} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFilesStoreListFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourceFilesStoreUpdateFunc describes the behavior when the Update +// method of the parent MockLoginSourceFilesStore instance is invoked. +type LoginSourceFilesStoreUpdateFunc struct { + defaultHook func(*LoginSource) + hooks []func(*LoginSource) + history []LoginSourceFilesStoreUpdateFuncCall + mutex sync.Mutex +} + +// Update delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFilesStore) Update(v0 *LoginSource) { + m.UpdateFunc.nextHook()(v0) + m.UpdateFunc.appendCall(LoginSourceFilesStoreUpdateFuncCall{v0}) + return +} + +// SetDefaultHook sets function that is called when the Update method of the +// parent MockLoginSourceFilesStore instance is invoked and the hook queue +// is empty. +func (f *LoginSourceFilesStoreUpdateFunc) SetDefaultHook(hook func(*LoginSource)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Update method of the parent MockLoginSourceFilesStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *LoginSourceFilesStoreUpdateFunc) PushHook(hook func(*LoginSource)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFilesStoreUpdateFunc) SetDefaultReturn() { + f.SetDefaultHook(func(*LoginSource) { + return + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFilesStoreUpdateFunc) PushReturn() { + f.PushHook(func(*LoginSource) { + return + }) +} + +func (f *LoginSourceFilesStoreUpdateFunc) nextHook() func(*LoginSource) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFilesStoreUpdateFunc) appendCall(r0 LoginSourceFilesStoreUpdateFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFilesStoreUpdateFuncCall objects +// describing the invocations of this function. +func (f *LoginSourceFilesStoreUpdateFunc) History() []LoginSourceFilesStoreUpdateFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFilesStoreUpdateFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFilesStoreUpdateFuncCall is an object that describes an +// invocation of method Update on an instance of MockLoginSourceFilesStore. +type LoginSourceFilesStoreUpdateFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 *LoginSource +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFilesStoreUpdateFuncCall) Args() []interface{} { + return []interface{}{c.Arg0} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFilesStoreUpdateFuncCall) Results() []interface{} { + return []interface{}{} +} diff --git a/internal/db/models.go b/internal/db/models.go index 73a8363f..f0e4d564 100644 --- a/internal/db/models.go +++ b/internal/db/models.go @@ -5,6 +5,7 @@ package db import ( + "context" "database/sql" "fmt" "os" @@ -208,7 +209,7 @@ type Statistic struct { } } -func GetStatistic() (stats Statistic) { +func GetStatistic(ctx context.Context) (stats Statistic) { stats.Counter.User = CountUsers() stats.Counter.Org = CountOrganizations() stats.Counter.PublicKey, _ = x.Count(new(PublicKey)) @@ -223,7 +224,7 @@ func GetStatistic() (stats Statistic) { stats.Counter.Follow, _ = x.Count(new(Follow)) stats.Counter.Mirror, _ = x.Count(new(Mirror)) stats.Counter.Release, _ = x.Count(new(Release)) - stats.Counter.LoginSource = LoginSources.Count() + stats.Counter.LoginSource = LoginSources.Count(ctx) stats.Counter.Webhook, _ = x.Count(new(Webhook)) stats.Counter.Milestone, _ = x.Count(new(Milestone)) stats.Counter.Label, _ = x.Count(new(Label)) diff --git a/internal/db/users.go b/internal/db/users.go index 096a2702..5c8f2d38 100644 --- a/internal/db/users.go +++ b/internal/db/users.go @@ -5,6 +5,7 @@ package db import ( + "context" "fmt" "strings" "time" @@ -80,6 +81,8 @@ func (err ErrLoginSourceMismatch) Error() string { } func (db *users) Authenticate(login, password string, loginSourceID int64) (*User, error) { + ctx := context.TODO() + login = strings.ToLower(login) var query *gorm.DB @@ -127,7 +130,7 @@ func (db *users) Authenticate(login, password string, loginSourceID int64) (*Use createNewUser = true } - source, err := LoginSources.GetByID(authSourceID) + source, err := LoginSources.GetByID(ctx, authSourceID) if err != nil { return nil, errors.Wrap(err, "get login source") } diff --git a/internal/route/admin/admin.go b/internal/route/admin/admin.go index 325876d9..8fde8da8 100644 --- a/internal/route/admin/admin.go +++ b/internal/route/admin/admin.go @@ -119,7 +119,7 @@ func Dashboard(c *context.Context) { c.Data["BuildTime"] = conf.BuildTime c.Data["BuildCommit"] = conf.BuildCommit - c.Data["Stats"] = db.GetStatistic() + c.Data["Stats"] = db.GetStatistic(c.Req.Context()) // FIXME: update periodically updateSystemStatus() c.Data["SysStatus"] = sysStatus diff --git a/internal/route/admin/auths.go b/internal/route/admin/auths.go index ff8fd656..014da37a 100644 --- a/internal/route/admin/auths.go +++ b/internal/route/admin/auths.go @@ -35,13 +35,13 @@ func Authentications(c *context.Context) { c.PageIs("AdminAuthentications") var err error - c.Data["Sources"], err = db.LoginSources.List(db.ListLoginSourceOpts{}) + c.Data["Sources"], err = db.LoginSources.List(c.Req.Context(), db.ListLoginSourceOpts{}) if err != nil { c.Error(err, "list login sources") return } - c.Data["Total"] = db.LoginSources.Count() + c.Data["Total"] = db.LoginSources.Count(c.Req.Context()) c.Success(AUTHS) } @@ -159,13 +159,15 @@ func NewAuthSourcePost(c *context.Context, f form.Authentication) { return } - source, err := db.LoginSources.Create(db.CreateLoginSourceOpts{ - Type: auth.Type(f.Type), - Name: f.Name, - Activated: f.IsActive, - Default: f.IsDefault, - Config: config, - }) + source, err := db.LoginSources.Create(c.Req.Context(), + db.CreateLoginSourceOpts{ + Type: auth.Type(f.Type), + Name: f.Name, + Activated: f.IsActive, + Default: f.IsDefault, + Config: config, + }, + ) if err != nil { if db.IsErrLoginSourceAlreadyExist(err) { c.FormErr("Name") @@ -177,7 +179,7 @@ func NewAuthSourcePost(c *context.Context, f form.Authentication) { } if source.IsDefault { - err = db.LoginSources.ResetNonDefault(source) + err = db.LoginSources.ResetNonDefault(c.Req.Context(), source) if err != nil { c.Error(err, "reset non-default login sources") return @@ -198,7 +200,7 @@ func EditAuthSource(c *context.Context) { c.Data["SecurityProtocols"] = securityProtocols c.Data["SMTPAuths"] = smtp.AuthTypes - source, err := db.LoginSources.GetByID(c.ParamsInt64(":authid")) + source, err := db.LoginSources.GetByID(c.Req.Context(), c.ParamsInt64(":authid")) if err != nil { c.Error(err, "get login source by ID") return @@ -216,7 +218,7 @@ func EditAuthSourcePost(c *context.Context, f form.Authentication) { c.Data["SMTPAuths"] = smtp.AuthTypes - source, err := db.LoginSources.GetByID(c.ParamsInt64(":authid")) + source, err := db.LoginSources.GetByID(c.Req.Context(), c.ParamsInt64(":authid")) if err != nil { c.Error(err, "get login source by ID") return @@ -255,13 +257,13 @@ func EditAuthSourcePost(c *context.Context, f form.Authentication) { source.IsActived = f.IsActive source.IsDefault = f.IsDefault source.Provider = provider - if err := db.LoginSources.Save(source); err != nil { + if err := db.LoginSources.Save(c.Req.Context(), source); err != nil { c.Error(err, "update login source") return } if source.IsDefault { - err = db.LoginSources.ResetNonDefault(source) + err = db.LoginSources.ResetNonDefault(c.Req.Context(), source) if err != nil { c.Error(err, "reset non-default login sources") return @@ -276,7 +278,7 @@ func EditAuthSourcePost(c *context.Context, f form.Authentication) { func DeleteAuthSource(c *context.Context) { id := c.ParamsInt64(":authid") - if err := db.LoginSources.DeleteByID(id); err != nil { + if err := db.LoginSources.DeleteByID(c.Req.Context(), id); err != nil { if db.IsErrLoginSourceInUse(err) { c.Flash.Error(c.Tr("admin.auths.still_in_used")) } else { diff --git a/internal/route/admin/users.go b/internal/route/admin/users.go index 8a09690d..26619516 100644 --- a/internal/route/admin/users.go +++ b/internal/route/admin/users.go @@ -46,7 +46,7 @@ func NewUser(c *context.Context) { c.Data["login_type"] = "0-0" - sources, err := db.LoginSources.List(db.ListLoginSourceOpts{}) + sources, err := db.LoginSources.List(c.Req.Context(), db.ListLoginSourceOpts{}) if err != nil { c.Error(err, "list login sources") return @@ -62,7 +62,7 @@ func NewUserPost(c *context.Context, f form.AdminCrateUser) { c.Data["PageIsAdmin"] = true c.Data["PageIsAdminUsers"] = true - sources, err := db.LoginSources.List(db.ListLoginSourceOpts{}) + sources, err := db.LoginSources.List(c.Req.Context(), db.ListLoginSourceOpts{}) if err != nil { c.Error(err, "list login sources") return @@ -127,7 +127,7 @@ func prepareUserInfo(c *context.Context) *db.User { c.Data["User"] = u if u.LoginSource > 0 { - c.Data["LoginSource"], err = db.LoginSources.GetByID(u.LoginSource) + c.Data["LoginSource"], err = db.LoginSources.GetByID(c.Req.Context(), u.LoginSource) if err != nil { c.Error(err, "get login source by ID") return nil @@ -136,7 +136,7 @@ func prepareUserInfo(c *context.Context) *db.User { c.Data["LoginSource"] = &db.LoginSource{} } - sources, err := db.LoginSources.List(db.ListLoginSourceOpts{}) + sources, err := db.LoginSources.List(c.Req.Context(), db.ListLoginSourceOpts{}) if err != nil { c.Error(err, "list login sources") return nil diff --git a/internal/route/api/v1/admin/user.go b/internal/route/api/v1/admin/user.go index ef004261..543220db 100644 --- a/internal/route/api/v1/admin/user.go +++ b/internal/route/api/v1/admin/user.go @@ -22,7 +22,7 @@ func parseLoginSource(c *context.APIContext, u *db.User, sourceID int64, loginNa return } - source, err := db.LoginSources.GetByID(sourceID) + source, err := db.LoginSources.GetByID(c.Req.Context(), sourceID) if err != nil { if db.IsErrLoginSourceNotExist(err) { c.ErrorStatus(http.StatusUnprocessableEntity, err) diff --git a/internal/route/user/auth.go b/internal/route/user/auth.go index 87e23b4b..f8bbe7ab 100644 --- a/internal/route/user/auth.go +++ b/internal/route/user/auth.go @@ -102,7 +102,7 @@ func Login(c *context.Context) { } // Display normal login page - loginSources, err := db.LoginSources.List(db.ListLoginSourceOpts{OnlyActivated: true}) + loginSources, err := db.LoginSources.List(c.Req.Context(), db.ListLoginSourceOpts{OnlyActivated: true}) if err != nil { c.Error(err, "list activated login sources") return @@ -149,7 +149,7 @@ func afterLogin(c *context.Context, u *db.User, remember bool) { func LoginPost(c *context.Context, f form.SignIn) { c.Title("sign_in") - loginSources, err := db.LoginSources.List(db.ListLoginSourceOpts{OnlyActivated: true}) + loginSources, err := db.LoginSources.List(c.Req.Context(), db.ListLoginSourceOpts{OnlyActivated: true}) if err != nil { c.Error(err, "list activated login sources") return |