diff --git a/go.mod b/go.mod index 95da25c..a811cf9 100644 --- a/go.mod +++ b/go.mod @@ -4,27 +4,38 @@ go 1.21.4 require ( github.com/gofiber/fiber/v2 v2.52.0 + github.com/golang-jwt/jwt/v5 v5.2.0 + github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.9 + github.com/pioz/faker v1.7.3 github.com/skeris/appInit v1.0.2 + github.com/stretchr/testify v1.8.4 github.com/tealeg/xlsx v1.0.5 + github.com/themakers/bdd v0.0.0-20210316111417-6b1dfe326f33 github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf go.uber.org/zap v1.26.0 penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240202120244-c4ef330cfe5d penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240313164312-4560248259a0 + penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240313171802-7da5fbb4caf3 ) require ( github.com/andybalholm/brotli v1.0.5 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/fatih/color v1.10.0 // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/golang-migrate/migrate/v4 v4.17.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/klauspost/compress v1.17.0 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/rs/xid v1.5.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -32,6 +43,11 @@ require ( github.com/valyala/tcplisten v1.0.0 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.10.0 // indirect + golang.org/x/net v0.18.0 // indirect golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/grpc v1.61.1 // indirect google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 98809af..a0404e9 100644 --- a/go.sum +++ b/go.sum @@ -5,9 +5,13 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dhui/dktest v0.4.0 h1:z05UmuXZHO/bgj/ds2bGMBu8FI4WA+Ag/m3ghL+om7M= github.com/dhui/dktest v0.4.0/go.mod h1:v/Dbz1LgCBOi2Uki2nUqLBGa83hWBGFMu5MrgMDCc78= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= @@ -18,6 +22,12 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/gofiber/fiber/v2 v2.52.0 h1:S+qXi7y+/Pgvqq4DrSmREGiFwtB7Bu6+QFLuIHYw/UE= github.com/gofiber/fiber/v2 v2.52.0/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -29,8 +39,9 @@ github.com/golang-migrate/migrate/v4 v4.17.0/go.mod h1:+Cp2mtLP4/aXDTKb9wmXYitdr github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -39,9 +50,11 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= -github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -50,8 +63,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -61,10 +76,18 @@ github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/pioz/faker v1.7.3 h1:Tez8Emuq0UN+/d6mo3a9m/9ZZ/zdfJk0c5RtRatrceM= +github.com/pioz/faker v1.7.3/go.mod h1:xSpay5w/oz1a6+ww0M3vfpe40pSIykeUPeWEc3TvVlc= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -80,10 +103,13 @@ github.com/skeris/appInit v1.0.2/go.mod h1:4ElEeXWVGzU3dlYq/eMWJ/U5hd+LKisc1z3+y github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE= github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM= +github.com/themakers/bdd v0.0.0-20210316111417-6b1dfe326f33 h1:N9f/Q+2Ssa+yDcbfaoLTYvXmdeyUUxsJKdPUVsjSmiA= +github.com/themakers/bdd v0.0.0-20210316111417-6b1dfe326f33/go.mod h1:rpcH99JknBh8seZmlOlUg51gasZH6QH34oXNsIwYT6E= github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf h1:TJJm6KcBssmbWzplF5lzixXl1RBAi/ViPs1GaSOkhwo= github.com/themakers/hlog v0.0.0-20191205140925-235e0e4baddf/go.mod h1:1FsorU3vnXO9xS9SrhUp8fRb/6H/Zfll0rPt1i4GWaA= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -118,11 +144,16 @@ golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -131,8 +162,10 @@ golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= +google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= @@ -142,7 +175,12 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= @@ -150,3 +188,5 @@ penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240202120244-c4ef penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240202120244-c4ef330cfe5d/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM= penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240313164312-4560248259a0 h1:YbffFOWneoINvEqCWClf5Zatu/a0VNo9RM0nYveCzhk= penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240313164312-4560248259a0/go.mod h1:JgbH8cdAJBr3jx3BuY5nnuTyMdZ1XkRxo8a3w4Y3C0Y= +penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240313171802-7da5fbb4caf3 h1:BLHIUnJAttW9OAW7A63H9ON/HPhXdpBa/YPUQWD4ORA= +penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240313171802-7da5fbb4caf3/go.mod h1:/BFcX4F10DRuFuAHlwkKO+1QAXPL4i49x1tsrTwxlqE= diff --git a/tests/Dockerfile b/tests/Dockerfile new file mode 100644 index 0000000..2e23938 --- /dev/null +++ b/tests/Dockerfile @@ -0,0 +1,6 @@ +FROM golang:alpine +WORKDIR /app +COPY . . +RUN ls +RUN apk add --no-cache git && go mod download +CMD ["go", "test", "./tests"] diff --git a/tests/chunk.css b/tests/chunk.css new file mode 100644 index 0000000..2f957c9 --- /dev/null +++ b/tests/chunk.css @@ -0,0 +1,10 @@ +@font-face{font-family:"Gilroy-UltraLight";src:url(/static/media/gilroy-ultralight.e7028e6c.eot);src:url(/static/media/gilroy-ultralight.e7028e6c.eot?#iefix) format("embedded-opentype"),url(/static/media/gilroy-ultralight.af5f82c8.woff2) format("woff2"),url(/static/media/gilroy-ultralight.d23a0edf.woff) format("woff"),url(/static/media/gilroy-ultralight.68e17ccd.ttf) format("truetype"),url(/static/media/gilroy-ultralight.b06ae671.svg#gilroy-ultralight) format("svg")}@font-face{font-family:"Gilroy-Bold";src:url(/static/media/gilroy-bold.a732fed1.eot);src:url(/static/media/gilroy-bold.a732fed1.eot?#iefix) format("embedded-opentype"),url(/static/media/gilroy-bold.0ad1eb91.woff2) format("woff2"),url(/static/media/gilroy-bold.5fb38b9f.woff) format("woff"),url(/static/media/gilroy-bold.b900325e.ttf) format("truetype"),url(/static/media/gilroy-bold.dc2b9be1.svg#gilroy-bold) format("svg")}@font-face{font-family:"Gilroy-Regular";src:url(/static/media/gilroy-regular.1d051d9d.eot);src:url(/static/media/gilroy-regular.1d051d9d.eot?#iefix) format("embedded-opentype"),url(/static/media/gilroy-regular.00b02679.woff2) format("woff2"),url(/static/media/gilroy-regular.31d54a4b.woff) format("woff"),url(/static/media/gilroy-regular.b91b0127.ttf) format("truetype"),url(/static/media/gilroy-regular.752586d2.svg#gilroy-regular) format("svg")}@font-face{font-family:"/gilroyRegular/gilroy-regular";src:url(/static/media/gilroy-regular.1d051d9d.eot);src:url(/static/media/gilroy-regular.1d051d9d.eot?#iefix) format("embedded-opentype"),url(/static/media/gilroy-regular.00b02679.woff2) format("woff2"),url(/static/media/gilroy-regular.31d54a4b.woff) format("woff"),url(/static/media/gilroy-regular.b91b0127.ttf) format("truetype"),url(/static/media/gilroy-regular.752586d2.svg#gilroy-regular) format("svg")}:root{--grayL:#2f3339;--grayM:#1d2025;--grayD:#101217;--chartButton:#22252b;--green:#74b13e;--gold:#f7c873}body{margin:0;overflow-x:hidden;z-index:1;background-color:#101217;background-color:var(--grayD)}body *{color:#fff}a{cursor:pointer;text-decoration:none}.goldText{color:#f7c873!important;color:var(--gold)!important}path{color:inherit}.inline{display:-webkit-inline-flex;display:inline-flex}.errorComponent{height:100%;width:100%;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;align-items:center}.componentSigninEnterButton{background-color:var(--grayL)} + +/*!*material*!*/.positionInLogoName{display:-webkit-inline-flex;display:inline-flex;-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center;text-decoration:none;outline:none}.logoNameSVG{width:28px;height:30px;margin-right:17px}.logoNameBlack{font-family:"Gilroy-Bold"}.logoNameBlack,.logoNameBroker{text-transform:uppercase;font-size:14px;font-weight:600}.logoNameBroker{font-family:"Gilroy-UltraLight"}.MuiTypography-colorPrimary{color:#fff!important}.grayTextFieldsPositions{height:77px}.grayFieldBlockPasswords{display:-webkit-flex;display:flex;margin-top:5px}.signinEnvelope{margin-right:11px} + +/*!*material*!*/.grayTextFieldsPositions{height:115px}.signinCastle{margin-right:16px} + +/*!*material*!*/.componentSigninFormWelcomeTexts{margin-top:24px}.componentSigninFormWelcome{margin:0;font-size:21px;font-family:"/gilroyRegular/gilroy-regular"}.componentSigninFormWeHappy{margin-top:6px;font-size:11px;font-weight:800;font-family:"/gilroyRegular/gilroy-regular"}.grayTextFieldsPositions{height:90px;width:209px;margin-top:28px;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:end;align-items:end;-webkit-justify-content:space-between;justify-content:space-between}.grayFieldBlock{display:-webkit-inline-flex;display:inline-flex}.iconGrayTextField{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center}.iconGrayTextField>img{width:20px}.signinEnvelope{height:15px;margin-right:13px}.signinCastle{height:20px;margin-right:13px}.componentSigninFormCheckbox{margin:23px 0 0 -10px;display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.componentSigninFormCheckboxRemember,.componentSigninFormForget{font-size:11px;font-weight:800;font-family:"/gilroyRegular/gilroy-regular"}.componentSigninFormForget{margin:1px 0 0;color:var(--gold)}.componentSigninEnterButton{height:52px;width:209px;margin-top:35px}.componentSigninNoAcc{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;margin-top:22px}.componentSigninNoAcc a,.componentSigninNoAcc p{font-size:11px;font-weight:800;font-family:"/gilroyRegular/gilroy-regular"}.componentSigninNoAcc a,.iHaveAccount{color:var(--gold);border-bottom:1px solid var(--gold)}.iHaveAccount{font-size:12px;font-family:"/gilroyRegular/gilroy-regular"} + +/*!*material*!*/.adminAuthPagePosition{height:100vh;width:100vw;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;align-items:center;-webkit-flex-direction:column;flex-direction:column}.preloaderPosition{margin:auto}.dashboardSidebarButton{height:30px;width:20px;margin-left:5px}.dashboardSidebarButton1{height:40px;width:30px}.dashboardSidebarButton2{margin-left:4px;height:20px} +/*# sourceMappingURL=main.c8146c09.chunk.css.map */ \ No newline at end of file diff --git a/tests/chunk.js b/tests/chunk.js new file mode 100644 index 0000000..dbb5c4e --- /dev/null +++ b/tests/chunk.js @@ -0,0 +1,3 @@ +/*! For license information please see 2.7f11d937.chunk.js.LICENSE.txt */ +n.concat=function(){this[H].atom_.reportObserved();for(var e=arguments.length,t=new Array(e),n=0;nXn){for(var t=Xn;t=0&&n++}e=lr(e),t=lr(t);var u="[object Array]"===i;if(!u){if("object"!=typeof e||"object"!=typeof t)return!1;var l=e.constructor,s=t.constructor;if(l!==s&&!(g(l)&&l instanceof l&&g(s)&&s instanceof s)&&"constructor"in e&&"constructor"in t)return!1}if(0===n)return!1;n<0&&(n=-1),a=a||[];for(var c=(r=r||[]).length;c--;)if(r[c]===e)return a[c]===t;if(r.push(e),a.push(t),u){if((c=e.length)!==t.length)return!1;for(;c--;)if(!ur(e[c],t[c],n-1,r,a))return!1}else{var d,f=Object.keys(e);if(c=f.length,Object.keys(t).length!==c)return!1;for(;c--;)if(!_(t,d=f[c])||!ur(e[d],t[d],n-1,r,a))return!1}return r.pop(),a.pop(),!0}function lr(e){return Sn(e)?e.slice():C(e)||Mn(e)||O(e)||Ln(e)?Array.from(e.entries()):e}function sr(e){return e[Symbol.iterator]=cr,e}function cr(){return this}function dr(e,t,n){return e.get?Se:!e.set&&(g(e.value)?function(e){var t=null==e?void 0:e.constructor;return!!t&&("GeneratorFunction"===t.name||"GeneratorFunction"===t.displayName)}(e.value)?!qt(e.value)&&Yt:!_t(e.value)&&(n?jt.bound:jt):t)}["Symbol","Map","Set","Symbol"].forEach((function(e){"undefined"===typeof o()[e]&&r("MobX requires global '"+e+"' to be available or polyfilled")})),"object"===typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__&&__MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx({spy:function(e){return console.warn("[mobx.spy] Is a no-op in production builds"),function(){}},extras:{getDebugName:ar},$mobx:H})}).call(this,n(86))},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(203);function a(e){if("string"!==typeof e)throw new Error(Object(r.a)(7));return e.charAt(0).toUpperCase()+e.slice(1)}},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,"a",(function(){return r}))},,function(e,t,n){"use strict";n.r(t),n.d(t,"hexToRgb",(function(){return r.h})),n.d(t,"rgbToHex",(function(){return r.l})),n.d(t,"hslToRgb",(function(){return r.i})),n.d(t,"decomposeColor",(function(){return r.c})),n.d(t,"recomposeColor",(function(){return r.k})),n.d(t,"getContrastRatio",(function(){return r.f})),n.d(t,"getLuminance",(function(){return r.g})),n.d(t,"emphasize",(function(){return r.d})),n.d(t,"fade",(function(){return r.e})),n.d(t,"alpha",(function(){return r.a})),n.d(t,"darken",(function(){return r.b})),n.d(t,"lighten",(function(){return r.j})),n.d(t,"createTheme",(function(){return a.b})),n.d(t,"createMuiTheme",(function(){return a.a})),n.d(t,"unstable_createMuiStrictModeTheme",(function(){return i})),n.d(t,"createStyles",(function(){return u.a})),n.d(t,"makeStyles",(function(){return l.a})),n.d(t,"responsiveFontSizes",(function(){return b})),n.d(t,"styled",(function(){return y.a})),n.d(t,"easing",(function(){return D.c})),n.d(t,"duration",(function(){return D.b})),n.d(t,"useTheme",(function(){return x.a})),n.d(t,"withStyles",(function(){return w.a})),n.d(t,"withTheme",(function(){return _})),n.d(t,"createGenerateClassName",(function(){return F.a})),n.d(t,"jssPreset",(function(){return T.a})),n.d(t,"ServerStyleSheets",(function(){return L})),n.d(t,"StylesProvider",(function(){return B.b})),n.d(t,"MuiThemeProvider",(function(){return I.a})),n.d(t,"ThemeProvider",(function(){return I.a}));var r=n(16),a=n(97),o=n(204);function i(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:{},n=t.breakpoints,r=void 0===n?["sm","md","lg"]:n,a=t.disableAlign,o=void 0!==a&&a,i=t.factor,u=void 0===i?2:i,l=t.variants,d=void 0===l?["h1","h2","h3","h4","h5","h6","subtitle1","subtitle2","body1","body2","caption","button","overline"]:l,p=Object(s.a)({},e);p.typography=Object(s.a)({},p.typography);var b=p.typography,y=h(b.htmlFontSize),D=r.map((function(e){return p.breakpoints.values[e]}));return d.forEach((function(e){var t=b[e],n=parseFloat(y(t.fontSize,"rem"));if(!(n<=1)){var r=n,a=1+(r-1)/u,i=t.lineHeight;if(!f(i)&&!o)throw new Error(Object(c.a)(6));f(i)||(i=parseFloat(y(i,"rem"))/parseFloat(n));var l=null;o||(l=function(e){return m({size:e,grid:v({pixels:4,lineHeight:i,htmlFontSize:b.htmlFontSize})})}),b[e]=Object(s.a)({},t,g({cssProperty:"fontSize",min:a,max:r,unit:"rem",breakpoints:D,transform:l}))}})),p}var y=n(135),D=n(35),x=n(29),w=n(6),E=n(5),C=n(0),O=n.n(C),k=(n(7),n(55)),S=n.n(k),j=n(170);function A(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.defaultTheme,n=function(e){var n=O.a.forwardRef((function(n,r){var a=n.innerRef,o=Object(E.a)(n,["innerRef"]),i=Object(j.a)()||t;return O.a.createElement(e,Object(s.a)({theme:i,ref:a||r},o))}));return S()(n,e),n};return n}A();var _=A({defaultTheme:n(68).a}),F=n(259),T=n(206),P=n(61),M=n(45),R=n(40),B=n(312),L=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object(P.a)(this,e),this.options=t}return Object(M.a)(e,[{key:"collect",value:function(e){var t=new Map;this.sheetsRegistry=new R.b;var n=Object(F.a)();return O.a.createElement(B.b,Object(s.a)({sheetsManager:t,serverGenerateClassName:n,sheetsRegistry:this.sheetsRegistry},this.options),e)}},{key:"toString",value:function(){return this.sheetsRegistry?this.sheetsRegistry.toString():""}},{key:"getStyleElement",value:function(e){return O.a.createElement("style",Object(s.a)({id:"jss-server-side",key:"jss-server-side",dangerouslySetInnerHTML:{__html:this.toString()}},e))}}]),e}(),I=n(322)},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(0),a=n(53);function o(e,t){return r.useMemo((function(){return null==e&&null==t?null:function(n){Object(a.a)(e,n),Object(a.a)(t,n)}}),[e,t])}},function(e,t,n){"use strict";n.d(t,"h",(function(){return o})),n.d(t,"l",(function(){return i})),n.d(t,"i",(function(){return u})),n.d(t,"c",(function(){return l})),n.d(t,"k",(function(){return s})),n.d(t,"f",(function(){return c})),n.d(t,"g",(function(){return d})),n.d(t,"d",(function(){return f})),n.d(t,"e",(function(){return p})),n.d(t,"a",(function(){return h})),n.d(t,"b",(function(){return m})),n.d(t,"j",(function(){return v}));var r=n(203);function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return Math.min(Math.max(t,e),n)}function o(e){e=e.substr(1);var t=new RegExp(".{1,".concat(e.length>=6?2:1,"}"),"g"),n=e.match(t);return n&&1===n[0].length&&(n=n.map((function(e){return e+e}))),n?"rgb".concat(4===n.length?"a":"","(").concat(n.map((function(e,t){return t<3?parseInt(e,16):Math.round(parseInt(e,16)/255*1e3)/1e3})).join(", "),")"):""}function i(e){if(0===e.indexOf("#"))return e;var t=l(e).values;return"#".concat(t.map((function(e){return function(e){var t=e.toString(16);return 1===t.length?"0".concat(t):t}(e)})).join(""))}function u(e){var t=(e=l(e)).values,n=t[0],r=t[1]/100,a=t[2]/100,o=r*Math.min(a,1-a),i=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(e+n/30)%12;return a-o*Math.max(Math.min(t-3,9-t,1),-1)},u="rgb",c=[Math.round(255*i(0)),Math.round(255*i(8)),Math.round(255*i(4))];return"hsla"===e.type&&(u+="a",c.push(t[3])),s({type:u,values:c})}function l(e){if(e.type)return e;if("#"===e.charAt(0))return l(o(e));var t=e.indexOf("("),n=e.substring(0,t);if(-1===["rgb","rgba","hsl","hsla"].indexOf(n))throw new Error(Object(r.a)(3,e));var a=e.substring(t+1,e.length-1).split(",");return{type:n,values:a=a.map((function(e){return parseFloat(e)}))}}function s(e){var t=e.type,n=e.values;return-1!==t.indexOf("rgb")?n=n.map((function(e,t){return t<3?parseInt(e,10):e})):-1!==t.indexOf("hsl")&&(n[1]="".concat(n[1],"%"),n[2]="".concat(n[2],"%")),"".concat(t,"(").concat(n.join(", "),")")}function c(e,t){var n=d(e),r=d(t);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}function d(e){var t="hsl"===(e=l(e)).type?l(u(e)).values:e.values;return t=t.map((function(e){return(e/=255)<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)})),Number((.2126*t[0]+.7152*t[1]+.0722*t[2]).toFixed(3))}function f(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.15;return d(e)>.5?m(e,t):v(e,t)}function p(e,t){return h(e,t)}function h(e,t){return e=l(e),t=a(t),"rgb"!==e.type&&"hsl"!==e.type||(e.type+="a"),e.values[3]=t,s(e)}function m(e,t){if(e=l(e),t=a(t),-1!==e.type.indexOf("hsl"))e.values[2]*=1-t;else if(-1!==e.type.indexOf("rgb"))for(var n=0;n<3;n+=1)e.values[n]*=1-t;return s(e)}function v(e,t){if(e=l(e),t=a(t),-1!==e.type.indexOf("hsl"))e.values[2]+=(100-e.values[2])*t;else if(-1!==e.type.indexOf("rgb"))for(var n=0;n<3;n+=1)e.values[n]+=(255-e.values[n])*t;return s(e)}},function(e,t,n){"use strict";function r(e,t){return e===t}function a(e,t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,a=0;a1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:r,n=null,o=null;return function(){return a(t,n,arguments)||(o=e.apply(null,arguments)),n=arguments,o}}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(2),a=n(0),o=n.n(a),i=n(115);function u(e,t){var n=function(t,n){return o.a.createElement(i.a,Object(r.a)({ref:n},t),e)};return n.muiName=i.a.muiName,o.a.memo(o.a.forwardRef(n))}},function(e,t,n){"use strict";!function e(){if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(235)},,function(e,t,n){(function(e){e.exports=function(){"use strict";var t,n;function r(){return t.apply(null,arguments)}function a(e){t=e}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function i(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function u(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function l(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(u(e,t))return!1;return!0}function s(e){return void 0===e}function c(e){return"number"===typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,r=[];for(n=0;n>>0;for(t=0;t0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+r}var B=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,L=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,I={},N={};function z(e,t,n,r){var a=r;"string"===typeof r&&(a=function(){return this[r]()}),e&&(N[e]=a),t&&(N[t[0]]=function(){return R(a.apply(this,arguments),t[1],t[2])}),n&&(N[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),e)})}function V(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function H(e){var t,n,r=e.match(B);for(t=0,n=r.length;t1&&void 0!==arguments[1]&&arguments[1],n=ee.indexOf(e),r=ee.slice(n+1).concat(ee.slice(0,n));return t?r.reverse():r}var ne="flip",re="clockwise",ae="counterclockwise";function oe(e,t,n,r){var a=[0,0],o=-1!==["right","left"].indexOf(r),i=e.split(/(\+|\-)/).map((function(e){return e.trim()})),u=i.indexOf(I(i,(function(e){return-1!==e.search(/,|\s/)})));i[u]&&-1===i[u].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,s=-1!==u?[i.slice(0,u).concat([i[u].split(l)[0]]),[i[u].split(l)[1]].concat(i.slice(u+1))]:[i];return(s=s.map((function(e,r){var a=(1===r?!o:o)?"height":"width",i=!1;return e.reduce((function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,i=!0,e):i?(e[e.length-1]+=t,i=!1,e):e.concat(t)}),[]).map((function(e){return function(e,t,n,r){var a=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),o=+a[1],i=a[2];if(!o)return e;if(0===i.indexOf("%")){var u=void 0;switch(i){case"%p":u=n;break;case"%":case"%r":default:u=r}return O(u)[t]/100*o}if("vh"===i||"vw"===i)return("vh"===i?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*o;return o}(e,a,t,n)}))}))).forEach((function(e,t){e.forEach((function(n,r){K(n)&&(a[t]+=n*("-"===e[r-1]?-1:1))}))})),a}var ie={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],r=t.split("-")[1];if(r){var a=e.offsets,o=a.reference,i=a.popper,u=-1!==["bottom","top"].indexOf(n),l=u?"left":"top",s=u?"width":"height",c={start:E({},l,o[l]),end:E({},l,o[l]+o[s]-i[s])};e.offsets.popper=C({},i,c[r])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n=t.offset,r=e.placement,a=e.offsets,o=a.popper,i=a.reference,u=r.split("-")[0],l=void 0;return l=K(+n)?[+n,0]:oe(n,o,i,u),"left"===u?(o.top+=l[0],o.left-=l[1]):"right"===u?(o.top+=l[0],o.left+=l[1]):"top"===u?(o.left+=l[0],o.top-=l[1]):"bottom"===u&&(o.left+=l[0],o.top+=l[1]),e.popper=o,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var n=t.boundariesElement||p(e.instance.popper);e.instance.reference===n&&(n=p(n));var r=H("transform"),a=e.instance.popper.style,o=a.top,i=a.left,u=a[r];a.top="",a.left="",a[r]="";var l=F(e.instance.popper,e.instance.reference,t.padding,n,e.positionFixed);a.top=o,a.left=i,a[r]=u,t.boundaries=l;var s=t.priority,c=e.offsets.popper,d={primary:function(e){var n=c[e];return c[e]l[e]&&!t.escapeWithReference&&(r=Math.min(c[n],l[e]-("right"===e?c.width:c.height))),E({},n,r)}};return s.forEach((function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";c=C({},c,d[t](e))})),e.offsets.popper=c,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,r=t.reference,a=e.placement.split("-")[0],o=Math.floor,i=-1!==["top","bottom"].indexOf(a),u=i?"right":"bottom",l=i?"left":"top",s=i?"width":"height";return n[u]o(r[u])&&(e.offsets.popper[l]=o(r[u])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!Q(e.instance.modifiers,"arrow","keepTogether"))return e;var r=t.element;if("string"===typeof r){if(!(r=e.instance.popper.querySelector(r)))return e}else if(!e.instance.popper.contains(r))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var a=e.placement.split("-")[0],o=e.offsets,u=o.popper,l=o.reference,s=-1!==["left","right"].indexOf(a),c=s?"height":"width",d=s?"Top":"Left",f=d.toLowerCase(),p=s?"left":"top",h=s?"bottom":"right",m=R(r)[c];l[h]-mu[h]&&(e.offsets.popper[f]+=l[f]+m-u[h]),e.offsets.popper=O(e.offsets.popper);var v=l[f]+l[c]/2-m/2,g=i(e.instance.popper),b=parseFloat(g["margin"+d]),y=parseFloat(g["border"+d+"Width"]),D=v-e.offsets.popper[f]-b-y;return D=Math.max(Math.min(u[c]-m,D),0),e.arrowElement=r,e.offsets.arrow=(E(n={},f,Math.round(D)),E(n,p,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(e,t){if(V(e.instance.modifiers,"inner"))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var n=F(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),r=e.placement.split("-")[0],a=B(r),o=e.placement.split("-")[1]||"",i=[];switch(t.behavior){case ne:i=[r,a];break;case re:i=te(r);break;case ae:i=te(r,!0);break;default:i=t.behavior}return i.forEach((function(u,l){if(r!==u||i.length===l+1)return e;r=e.placement.split("-")[0],a=B(r);var s=e.offsets.popper,c=e.offsets.reference,d=Math.floor,f="left"===r&&d(s.right)>d(c.left)||"right"===r&&d(s.left)d(c.top)||"bottom"===r&&d(s.top)d(n.right),m=d(s.top)d(n.bottom),g="left"===r&&p||"right"===r&&h||"top"===r&&m||"bottom"===r&&v,b=-1!==["top","bottom"].indexOf(r),y=!!t.flipVariations&&(b&&"start"===o&&p||b&&"end"===o&&h||!b&&"start"===o&&m||!b&&"end"===o&&v),D=!!t.flipVariationsByContent&&(b&&"start"===o&&h||b&&"end"===o&&p||!b&&"start"===o&&v||!b&&"end"===o&&m),x=y||D;(f||g||x)&&(e.flipped=!0,(f||g)&&(r=i[l+1]),x&&(o=function(e){return"end"===e?"start":"start"===e?"end":e}(o)),e.placement=r+(o?"-"+o:""),e.offsets.popper=C({},e.offsets.popper,L(e.instance.popper,e.offsets.reference,e.placement)),e=N(e.instance.modifiers,e,"flip"))})),e},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],r=e.offsets,a=r.popper,o=r.reference,i=-1!==["left","right"].indexOf(n),u=-1===["top","left"].indexOf(n);return a[i?"left":"top"]=o[n]-(u?a[i?"width":"height"]:0),e.placement=B(t),e.offsets.popper=O(a),e}},hide:{order:800,enabled:!0,fn:function(e){if(!Q(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=I(e.instance.modifiers,(function(e){return"preventOverflow"===e.name})).boundaries;if(t.bottomn.right||t.top>n.bottom||t.right2&&void 0!==arguments[2]?arguments[2]:{};x(this,e),this.scheduleUpdate=function(){return requestAnimationFrame(r.update)},this.update=a(this.update.bind(this)),this.options=C({},e.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=t&&t.jquery?t[0]:t,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(C({},e.Defaults.modifiers,i.modifiers)).forEach((function(t){r.options.modifiers[t]=C({},e.Defaults.modifiers[t]||{},i.modifiers?i.modifiers[t]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(e){return C({name:e},r.options.modifiers[e])})).sort((function(e,t){return e.order-t.order})),this.modifiers.forEach((function(e){e.enabled&&o(e.onLoad)&&e.onLoad(r.reference,r.popper,r.options,e,r.state)})),this.update();var u=this.options.eventsEnabled;u&&this.enableEventListeners(),this.state.eventsEnabled=u}return w(e,[{key:"update",value:function(){return z.call(this)}},{key:"destroy",value:function(){return W.call(this)}},{key:"enableEventListeners",value:function(){return q.call(this)}},{key:"disableEventListeners",value:function(){return $.call(this)}}]),e}();ue.Utils=("undefined"!==typeof window?window:e).PopperUtils,ue.placements=J,ue.Defaults=ie,t.a=ue}).call(this,n(86))},function(e,t,n){"use strict";var r=n(76),a=n(77);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(n(0)),i=(0,r(n(78)).default)(o.createElement("path",{d:"M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"}),"StarBorder");t.default=i},function(e,t,n){"use strict";var r=n(76),a=n(77);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(n(0)),i=(0,r(n(78)).default)(o.createElement("path",{d:"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"}),"Send");t.default=i},function(e,t,n){"use strict";var r=n(76),a=n(77);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(n(0)),i=(0,r(n(78)).default)(o.createElement("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"}),"Search");t.default=i},function(e,t,n){"use strict";var r=n(76),a=n(77);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(n(0)),i=(0,r(n(78)).default)(o.createElement("path",{d:"M14.59 8L12 10.59 9.41 8 8 9.41 10.59 12 8 14.59 9.41 16 12 13.41 14.59 16 16 14.59 13.41 12 16 9.41 14.59 8zM12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"}),"HighlightOff");t.default=i},function(e,t,n){"use strict";var r=n(76),a=n(77);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(n(0)),i=(0,r(n(78)).default)(o.createElement("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"}),"ChevronLeft");t.default=i},function(e,t,n){"use strict";var r=n(76),a=n(77);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(n(0)),i=(0,r(n(78)).default)(o.createElement("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close");t.default=i},function(e,t,n){var r;r=function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=4)}([function(e,t,n){"use strict";var r=n(2),a=n(1),o=n(3),i=o.removeEles,u=o.setStyles,l=o.createElement,s=o.getPixelRatio,c=o.getOffset;e.exports=function(e){var t=a({},r,e),n=this,o=n.container(),d=void 0,f={options:t,handlers:[],container:l({class:"cxtmenu"})},p=f.container,h=l(),m=l({tag:"canvas"}),v=[],g=m.getContext("2d"),b=100,y=2*(b+t.activePadding),D=void 0,x=void 0;function w(e,t){S.drawBg=[e,t]}function E(e,n){g.globalCompositeOperation="source-over",g.clearRect(0,0,y,y),g.fillStyle=t.fillColor;for(var r=2*Math.PI/v.length,a=Math.PI/2,o=a+r,i=0;io+t.spotlightPadding?o+t.spotlightPadding:t.indicatorSize;g.beginPath(),g.fillRect(-f/2,-f/2,f,f),g.closePath(),g.fill(),g.rotate(-d),g.translate(-s,-c),g.beginPath(),g.arc(r+t.activePadding,r+t.activePadding,o+t.spotlightPadding,0,2*Math.PI,!0),g.closePath(),g.fill(),g.globalCompositeOperation="source-over"}function O(){var e=s(),t=y,n=y;m.width=t*e,m.height=n*e,m.style.width=t+"px",m.style.height=n+"px",g.setTransform(1,0,0,1,0,0),g.scale(e,e)}o.insertBefore(p,o.firstChild),p.appendChild(h),h.appendChild(m),u(p,{position:"absolute",zIndex:t.zIndex,userSelect:"none",pointerEvents:"none"}),["mousedown","mousemove","mouseup","contextmenu"].forEach((function(e){p.addEventListener(e,(function(e){return e.preventDefault(),!1}))})),u(h,{display:"none",width:y+"px",height:y+"px",position:"absolute",zIndex:1,marginLeft:-t.activePadding+"px",marginTop:-t.activePadding+"px",userSelect:"none"}),m.width=y,m.height=y;var k=!0,S={},j=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||function(e){return setTimeout(e,16)};O(),function e(){S.drawBg&&E.apply(null,S.drawBg),S.drawCommands&&C.apply(null,S.drawCommands),S={},k&&j(e)}();var A=void 0,_=void 0,F=void 0,T={on:function(e,t,r){var a=r;return"core"===t&&(a=function(e){if(e.cyTarget===n||e.target===n)return r.apply(this,[e])}),f.handlers.push({events:e,selector:t,fn:a}),"core"===t?n.on(e,a):n.on(e,t,a),this}};function P(){k=!1,function(){for(var e=f.handlers,t=0;t0,o=(r?n.touches[0].pageX:n.pageX)-window.pageXOffset,i=(r?n.touches[0].pageY:n.pageY)-window.pageYOffset;D=void 0;var u=o-x.left-A,l=i-x.top-_;0===u&&(u=.01);var s=Math.sqrt(u*u+l*l),c=(l*l-s*s-u*u)/(-2*s*u),f=Math.acos(c),p=void 0;if(d&&d.isNode instanceof Function&&d.isNode()&&!d.isParent()&&!t.atMouse?(p=d.renderedOuterWidth(),F=p/2,F=!t.adaptativeNodeSpotlightRadius&&t.minSpotlightRadius?Math.max(F,t.minSpotlightRadius):F,F=!t.adaptativeNodeSpotlightRadius&&t.maxSpotlightRadius?Math.min(F,t.maxSpotlightRadius):F):(F=(p=1)/2,F=t.minSpotlightRadius?Math.max(F,t.minSpotlightRadius):F,F=t.maxSpotlightRadius?Math.min(F,t.maxSpotlightRadius):F),b=p/2+(t.menuRadius instanceof Function?t.menuRadius(d):Number(t.menuRadius)),sb+t.activePadding+t.outsideMenuCancel)w(b,F);else{w(b,F);var h=u*b/s,m=l*b/s;l>0&&(f=Math.PI+Math.abs(f-Math.PI));for(var g=2*Math.PI/v.length,y=Math.PI/2,E=y+g,C=0;C1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:document,n=t.querySelectorAll(e),r=0;r2&&void 0!==arguments[2]?arguments[2]:{clone:!0},a=n.clone?Object(r.a)({},e):e;return o(e)&&o(t)&&Object.keys(t).forEach((function(r){"__proto__"!==r&&(o(t[r])&&r in e?a[r]=i(e[r],t[r],n):a[r]=t[r])})),a}},function(e,t,n){"use strict";var r=n(2),a=n(5),o=n(0),i=(n(7),n(19)),u=n(46),l=n(114),s=n(15),c=n(29),d=n(35),f=n(51);function p(e,t){var n=function(e,t){var n,r=t.getBoundingClientRect();if(t.fakeTransform)n=t.fakeTransform;else{var a=window.getComputedStyle(t);n=a.getPropertyValue("-webkit-transform")||a.getPropertyValue("transform")}var o=0,i=0;if(n&&"none"!==n&&"string"===typeof n){var u=n.split("(")[1].split(")")[0].split(",");o=parseInt(u[4],10),i=parseInt(u[5],10)}return"left"===e?"translateX(".concat(window.innerWidth,"px) translateX(").concat(o-r.left,"px)"):"right"===e?"translateX(-".concat(r.left+r.width-o,"px)"):"up"===e?"translateY(".concat(window.innerHeight,"px) translateY(").concat(i-r.top,"px)"):"translateY(-".concat(r.top+r.height-i,"px)")}(e,t);n&&(t.style.webkitTransform=n,t.style.transform=n)}var h={enter:d.b.enteringScreen,exit:d.b.leavingScreen},m=o.forwardRef((function(e,t){var n=e.children,d=e.direction,m=void 0===d?"down":d,v=e.in,g=e.onEnter,b=e.onEntered,y=e.onEntering,D=e.onExit,x=e.onExited,w=e.onExiting,E=e.style,C=e.timeout,O=void 0===C?h:C,k=e.TransitionComponent,S=void 0===k?l.a:k,j=Object(a.a)(e,["children","direction","in","onEnter","onEntered","onEntering","onExit","onExited","onExiting","style","timeout","TransitionComponent"]),A=Object(c.a)(),_=o.useRef(null),F=o.useCallback((function(e){_.current=i.findDOMNode(e)}),[]),T=Object(s.a)(n.ref,F),P=Object(s.a)(T,t),M=function(e){return function(t){e&&(void 0===t?e(_.current):e(_.current,t))}},R=M((function(e,t){p(m,e),Object(f.b)(e),g&&g(e,t)})),B=M((function(e,t){var n=Object(f.a)({timeout:O,style:E},{mode:"enter"});e.style.webkitTransition=A.transitions.create("-webkit-transform",Object(r.a)({},n,{easing:A.transitions.easing.easeOut})),e.style.transition=A.transitions.create("transform",Object(r.a)({},n,{easing:A.transitions.easing.easeOut})),e.style.webkitTransform="none",e.style.transform="none",y&&y(e,t)})),L=M(b),I=M(w),N=M((function(e){var t=Object(f.a)({timeout:O,style:E},{mode:"exit"});e.style.webkitTransition=A.transitions.create("-webkit-transform",Object(r.a)({},t,{easing:A.transitions.easing.sharp})),e.style.transition=A.transitions.create("transform",Object(r.a)({},t,{easing:A.transitions.easing.sharp})),p(m,e),D&&D(e)})),z=M((function(e){e.style.webkitTransition="",e.style.transition="",x&&x(e)})),V=o.useCallback((function(){_.current&&p(m,_.current)}),[m]);return o.useEffect((function(){if(!v&&"down"!==m&&"right"!==m){var e=Object(u.a)((function(){_.current&&p(m,_.current)}));return window.addEventListener("resize",e),function(){e.clear(),window.removeEventListener("resize",e)}}}),[m,v]),o.useEffect((function(){v||V()}),[v,V]),o.createElement(S,Object(r.a)({nodeRef:_,onEnter:R,onEntered:L,onEntering:B,onExit:N,onExited:z,onExiting:I,appear:!0,in:v,timeout:O},j),(function(e,t){return o.cloneElement(n,Object(r.a)({ref:P,style:Object(r.a)({visibility:"exited"!==e||v?void 0:"hidden"},E,n.props.style)},t))}))}));t.a=m},function(e,t,n){"use strict";n.d(t,"a",(function(){return Me}));var r=n(40),a=Date.now(),o="fnValues"+a,i="fnStyle"+ ++a,u=function(){return{onCreateRule:function(e,t,n){if("function"!==typeof t)return null;var a=Object(r.d)(e,{},n);return a[i]=t,a},onProcessStyle:function(e,t){if(o in t||i in t)return e;var n={};for(var r in e){var a=e[r];"function"===typeof a&&(delete e[r],n[r]=a)}return t[o]=n,e},onUpdate:function(e,t,n,r){var a=t,u=a[i];u&&(a.style=u(e)||{});var l=a[o];if(l)for(var s in l)a.prop(s,l[s](e),r)}}},l=n(2),s="@global",c="@global ",d=function(){function e(e,t,n){for(var a in this.type="global",this.at=s,this.isProcessed=!1,this.key=e,this.options=n,this.rules=new r.a(Object(l.a)({},n,{parent:this})),t)this.rules.add(a,t[a]);this.rules.process()}var t=e.prototype;return t.getRule=function(e){return this.rules.get(e)},t.addRule=function(e,t,n){var r=this.rules.add(e,t,n);return r&&this.options.jss.plugins.onProcessRule(r),r},t.replaceRule=function(e,t,n){var r=this.rules.replace(e,t,n);return r&&this.options.jss.plugins.onProcessRule(r),r},t.indexOf=function(e){return this.rules.indexOf(e)},t.toString=function(e){return this.rules.toString(e)},e}(),f=function(){function e(e,t,n){this.type="global",this.at=s,this.isProcessed=!1,this.key=e,this.options=n;var r=e.substr(c.length);this.rule=n.jss.createRule(r,t,Object(l.a)({},n,{parent:this}))}return e.prototype.toString=function(e){return this.rule?this.rule.toString(e):""},e}(),p=/\s*,\s*/g;function h(e,t){for(var n=e.split(p),r="",a=0;a-1){var a=ve[e];if(!Array.isArray(a))return U+ee(a)in t&&Y+a;if(!r)return!1;for(var o=0;ot?1:-1:e.length-t.length};return{onProcessStyle:function(t,n){if("style"!==n.type)return t;for(var r={},a=Object.keys(t).sort(e),o=0;o3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4?arguments[4]:void 0,o=[t,n].concat(Object(g.a)(r)),i=["TEMPLATE","SCRIPT","STYLE"];[].forEach.call(e.children,(function(e){1===e.nodeType&&-1===o.indexOf(e)&&-1===i.indexOf(e.tagName)&&D(e,a)}))}function E(e,t){var n=-1;return e.some((function(e,r){return!!t(e)&&(n=r,!0)})),n}function C(e,t){var n,r=[],a=[],o=e.container;if(!t.disableScrollLock){if(function(e){var t=Object(s.a)(e);return t.body===e?Object(y.a)(t).innerWidth>t.documentElement.clientWidth:e.scrollHeight>e.clientHeight}(o)){var i=Object(b.a)();r.push({value:o.style.paddingRight,key:"padding-right",el:o}),o.style["padding-right"]="".concat(x(o)+i,"px"),n=Object(s.a)(o).querySelectorAll(".mui-fixed"),[].forEach.call(n,(function(e){a.push(e.style.paddingRight),e.style.paddingRight="".concat(x(e)+i,"px")}))}var u=o.parentElement,l="HTML"===u.nodeName&&"scroll"===window.getComputedStyle(u)["overflow-y"]?u:o;r.push({value:l.style.overflow,key:"overflow",el:l}),l.style.overflow="hidden"}return function(){n&&[].forEach.call(n,(function(e,t){a[t]?e.style.paddingRight=a[t]:e.style.removeProperty("padding-right")})),r.forEach((function(e){var t=e.value,n=e.el,r=e.key;t?n.style.setProperty(r,t):n.style.removeProperty(r)}))}}var O=function(){function e(){Object(m.a)(this,e),this.modals=[],this.containers=[]}return Object(v.a)(e,[{key:"add",value:function(e,t){var n=this.modals.indexOf(e);if(-1!==n)return n;n=this.modals.length,this.modals.push(e),e.modalRef&&D(e.modalRef,!1);var r=function(e){var t=[];return[].forEach.call(e.children,(function(e){e.getAttribute&&"true"===e.getAttribute("aria-hidden")&&t.push(e)})),t}(t);w(t,e.mountNode,e.modalRef,r,!0);var a=E(this.containers,(function(e){return e.container===t}));return-1!==a?(this.containers[a].modals.push(e),n):(this.containers.push({modals:[e],container:t,restore:null,hiddenSiblingNodes:r}),n)}},{key:"mount",value:function(e,t){var n=E(this.containers,(function(t){return-1!==t.modals.indexOf(e)})),r=this.containers[n];r.restore||(r.restore=C(r,t))}},{key:"remove",value:function(e){var t=this.modals.indexOf(e);if(-1===t)return t;var n=E(this.containers,(function(t){return-1!==t.modals.indexOf(e)})),r=this.containers[n];if(r.modals.splice(r.modals.indexOf(e),1),this.modals.splice(t,1),0===r.modals.length)r.restore&&r.restore(),e.modalRef&&D(e.modalRef,!0),w(r.container,e.mountNode,e.modalRef,r.hiddenSiblingNodes,!1),this.containers.splice(n,1);else{var a=r.modals[r.modals.length-1];a.modalRef&&D(a.modalRef,!1)}return t}},{key:"isTopModal",value:function(e){return this.modals.length>0&&this.modals[this.modals.length-1]===e}}]),e}(),k=n(265),S={root:{zIndex:-1,position:"fixed",right:0,bottom:0,top:0,left:0,backgroundColor:"rgba(0, 0, 0, 0.5)",WebkitTapHighlightColor:"transparent"},invisible:{backgroundColor:"transparent"}},j=o.forwardRef((function(e,t){var n=e.invisible,i=void 0!==n&&n,u=e.open,l=Object(r.a)(e,["invisible","open"]);return u?o.createElement("div",Object(a.a)({"aria-hidden":!0,ref:t},l,{style:Object(a.a)({},S.root,i?S.invisible:{},l.style)})):null}));var A=new O,_=o.forwardRef((function(e,t){var n=Object(u.a)(),m=Object(l.a)({name:"MuiModal",props:Object(a.a)({},e),theme:n}),v=m.BackdropComponent,g=void 0===v?j:v,b=m.BackdropProps,y=m.children,x=m.closeAfterTransition,w=void 0!==x&&x,E=m.container,C=m.disableAutoFocus,O=void 0!==C&&C,S=m.disableBackdropClick,_=void 0!==S&&S,F=m.disableEnforceFocus,T=void 0!==F&&F,P=m.disableEscapeKeyDown,M=void 0!==P&&P,R=m.disablePortal,B=void 0!==R&&R,L=m.disableRestoreFocus,I=void 0!==L&&L,N=m.disableScrollLock,z=void 0!==N&&N,V=m.hideBackdrop,H=void 0!==V&&V,W=m.keepMounted,U=void 0!==W&&W,Y=m.manager,G=void 0===Y?A:Y,q=m.onBackdropClick,$=m.onClose,K=m.onEscapeKeyDown,X=m.onRendered,Z=m.open,Q=Object(r.a)(m,["BackdropComponent","BackdropProps","children","closeAfterTransition","container","disableAutoFocus","disableBackdropClick","disableEnforceFocus","disableEscapeKeyDown","disablePortal","disableR +//# sourceMappingURL=2.7f11d937.chunk.js.map \ No newline at end of file diff --git a/tests/db_test.go b/tests/db_test.go new file mode 100644 index 0000000..8996819 --- /dev/null +++ b/tests/db_test.go @@ -0,0 +1,665 @@ +package tests + +import ( + "context" + "github.com/pioz/faker" + "math" + "math/rand" + "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal" + "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" + "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/quiz" + "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/repository/result" + "penahub.gitlab.yandexcloud.net/backend/quiz/core.git/clients/auth" + + //"database/sql" + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/assert" + bdd "github.com/themakers/bdd" +) + +const baseURL = "http://localhost:" +const authClientUrl = "test.com" +const postgresCred string = "host=localhost port=35432 user=squiz password=Redalert2 dbname=squiz sslmode=disable" +const appPort = "1488" +const storerPort = "1489" +const answererPort = "1490" +const healthChecksPort = "5489" + +var types4testing = []string{ + model.TypeVariant, + model.TypeImages, + model.TypeVarImages, + model.TypeFile, + model.TypeText, + model.TypeEmoji, + model.TypeSelect, + model.TypeDate, + model.TypeNumber, + model.TypePage, + model.TypeRating, +} + +func TestDAL(t *testing.T) { + //login := "D" + strconv.FormatInt(time.Now().Unix(), 10) + //token := registerUser(login) + // + //m, ok := token.Claims.(jwt.MapClaims) + //if !ok { + // panic("malformed JWT") + //} + // + //id, ok := m["id"].(string) + //if !ok || id == "" { + // panic("missing id claim in JWT") + //} + + id := "123" + + ctx := context.Background() + authClient := auth.NewAuthClient(authClientUrl) + fmt.Println(id) + + bdd.Scenario(t, "DAL testing", func(t *testing.T, runID string) { + var ( + err error + d *dal.DAL + records []model.Quiz + questions []model.Question + answersSession string + ) + bdd.Act(t, "Postgres Tables Creating", func() { + + bdd.Test(t, "test dbconnect", func() { + d, err = dal.New(ctx, postgresCred, authClient) + assert.NoError(t, err, nil) + assert.NotNil(t, d, nil) + }) + + //bdd.Test(t, "positive test of table creating", func() { + // err = d.Init() + // assert.NoError(t, err, nil) + //}) + // + //bdd.Test(t, "negative test of table creating", func() { + // err = d.Init() + // assert.NoError(t, err, nil) + //}) + }) + + bdd.Act(t, "create quiz testing", func() { + record := model.Quiz{ + AccountId: id, + Fingerprinting: true, + Repeatable: true, + NotePrevented: true, + MailNotifications: true, + UniqueAnswers: true, + Name: "test", + Description: "test", + Config: `{"Mailing": {"When": "test","Theme": "Quiz test","Reply": "test","ReplName": "test"}}`, + Status: model.StatusDraft, + Limit: 100, + DueTo: uint64(time.Now().Add(time.Hour).Unix()), + TimeOfPassing: 60, + Pausable: true, + GroupId: 2, + } + statuses4creating := []string{ + model.StatusDraft, + model.StatusStart, + model.StatusStop, + model.StatusOffLimit, + model.StatusTimeout, + model.StatusTemplate, + } + + for i := 0; i < 100; i++ { + + record2 := model.Quiz{ + AccountId: id, + Fingerprinting: true, + Repeatable: true, + NotePrevented: true, + MailNotifications: true, + UniqueAnswers: true, + Name: record.Name + fmt.Sprint(i), + Description: "test", + Config: `{"Mailing": {"When": "test","Theme": "Quiz test","Reply": "test","ReplName": "test"}}`, + Status: statuses4creating[rand.Intn(len(statuses4creating))], + Limit: 100, + DueTo: uint64(time.Now().Add(time.Hour).Unix()), + ParentIds: []int32{}, + TimeOfPassing: 60, + Pausable: true, + GroupId: 1, + } + + bdd.Test(t, "positive quiz storing", func() { + err := d.QuizRepo.CreateQuiz(ctx, &record2) + assert.NoError(t, err, nil) + assert.NotZero(t, record2.Id, nil) + assert.NotEqual(t, record2.CreatedAt, nil) + assert.NotEqual(t, record2.UpdatedAt, nil) + records = append(records, record2) + }) + } + + for i := 0; i < len(records)-1; i++ { + if records[i].Status == model.StatusStart { + + bdd.Test(t, "get quiz by qid", func() { + qu, err := d.QuizRepo.GetQuizByQid(ctx, records[i].Qid) + assert.Equal(t, records[i].Id, qu.Id) + assert.NoError(t, err, nil) + }) + } + + bdd.Test(t, "get quiz by id", func() { + qu, err := d.QuizRepo.GetQuizById(ctx, id, records[i].Id) + assert.Equal(t, records[i].Id, qu.Id) + assert.Equal(t, records[i].Qid, qu.Qid) + assert.NoError(t, err, nil) + }) + + bdd.Test(t, "get quiz config", func() { + _, _, err := d.QuizRepo.GetQuizConfig(ctx, records[i].Id) + assert.NoError(t, err, nil) + }) + } + + for i := 0; i < len(records)%80; i++ { + bdd.Test(t, "update quiz", func() { + updquiz := model.Quiz{ + Id: records[i].Id, + Qid: records[i].Qid, + AccountId: id, + Deleted: records[i].Deleted, + Archived: records[i].Archived, + Fingerprinting: records[i].Fingerprinting, + Repeatable: records[i].Repeatable, + NotePrevented: records[i].NotePrevented, + MailNotifications: records[i].MailNotifications, + UniqueAnswers: records[i].UniqueAnswers, + Name: faker.String() + records[i].Name, + Description: faker.String() + records[i].Description, + Config: faker.String() + records[i].Config, + Status: records[i].Status, + Limit: records[i].Limit, + DueTo: records[i].DueTo, + TimeOfPassing: records[i].TimeOfPassing, + Pausable: records[i].Pausable, + Version: records[i].Version, + VersionComment: records[i].VersionComment, + ParentIds: records[i].ParentIds, + CreatedAt: records[i].CreatedAt, + UpdatedAt: records[i].UpdatedAt, + QuestionsCount: records[i].QuestionsCount, + SessionCount: records[i].SessionCount, + PassedCount: records[i].PassedCount, + AverageTime: records[i].AverageTime, + Super: records[i].Super, + GroupId: records[i].GroupId, + } + err := d.QuizRepo.UpdateQuiz(ctx, id, updquiz) + assert.NoError(t, err, nil) + }) + bdd.Test(t, "move to history quiz", func() { + qu, err := d.QuizRepo.MoveToHistoryQuiz(ctx, records[i].Id, id) + assert.Equal(t, records[i].Id+100, qu.Id) + assert.NoError(t, err, nil) + }) + } + + bdd.Test(t, "negative test quiz storing1", func() { + record.Name = faker.StringWithSize(300) + err := d.QuizRepo.CreateQuiz(ctx, &record) + assert.Error(t, err, nil) + }) + + bdd.Test(t, "negative test quiz storing2", func() { + record.Status = model.StatusTemplate + err := d.QuizRepo.CreateQuiz(ctx, &record) + assert.Error(t, err, nil) + }) + }) + + bdd.Act(t, "get list of quizes", func() { + bdd.Test(t, "get list of quizes", func() { + res, _, err := d.QuizRepo.GetQuizList(ctx, quiz.GetQuizListDeps{ + Limit: 10, + Offset: 0, + From: 0, + To: 0, + Group: 0, + Deleted: false, + Archived: false, + Super: true, + Search: "", + Status: "", + AccountId: id, + }) + assert.NoError(t, err, nil) + assert.Equal(t, 0, len(res), nil) + //assert.Greater(t, cnt, uint64(0), nil) + }) + }) + + bdd.Act(t, "create question testing", func() { + quix4filling := records[rand.Intn(len(records))] + for _, questionType := range types4testing { + bdd.Test(t, fmt.Sprintf("positive question creating: %s", questionType), func() { + question := model.Question{ + Id: 0, + QuizId: quix4filling.Id, + Title: "testNone", + Description: "sample text", + Type: questionType, + Required: true, + Deleted: false, + Page: 0, + Content: "test", + Version: 0, + ParentIds: nil, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + } + err := d.QuestionRepo.CreateQuestion(ctx, &question) + assert.NoError(t, err, nil) + assert.NotZero(t, question.Id, nil) + questions = append(questions, question) + + bdd.Test(t, "get question list", func() { + ques, count, err := d.QuestionRepo.GetQuestionList(ctx, 0, 10, 1226358000, 1289430000, quix4filling.Id, false, true, "", questionType) + fmt.Println(ques) + fmt.Println(count) + assert.NoError(t, err, nil) + }) + }) + } + + bdd.Test(t, "test create answers", func() { + testanswers := make([]model.Answer, 0) + for i := 0; i < 15; i++ { + recAns := model.Answer{ + Content: "test", + QuestionId: questions[0].Id, + Result: false, + Email: faker.String(), + QuizId: faker.Uint64(), + } + testanswers = append(testanswers, recAns) + } + answersSession = faker.String() + + anss, err := d.AnswerRepo.CreateAnswers(ctx, testanswers, answersSession, "seeeeeeeesssion", questions[0].QuizId) + if len(err) != 0 { + assert.NoError(t, err[0], nil) + } + + if len(anss) != len(testanswers) { + panic("test create answers crushed") + } + }) + + bdd.Test(t, "Get All Answers By Quiz ID(session)", func() { + ansss, err := d.AnswerRepo.GetAllAnswersByQuizID(ctx, answersSession) + assert.NoError(t, err, nil) + assert.Equal(t, 1, len(ansss)) + }) + + bdd.Test(t, "update question", func() { + for i := 0; i < len(questions)%80; i++ { + + bdd.Test(t, "get question title", func() { + title, tipe, err := d.QuestionRepo.GetQuestionTitleByID(ctx, questions[i].Id) + assert.NoError(t, err, nil) + assert.Equal(t, questions[i].Title, title) + assert.Equal(t, questions[i].Type, tipe) + }) + + updateques := model.Question{ + Id: questions[i].Id, + QuizId: questions[i].QuizId, + Title: faker.String() + questions[i].Title, + Description: faker.String() + questions[i].Description, + Type: questions[i].Type, + Required: questions[i].Required, + Deleted: questions[i].Deleted, + Page: questions[i].Page, + Content: faker.String() + questions[i].Content, + Version: questions[i].Version, + ParentIds: questions[i].ParentIds, + CreatedAt: questions[i].CreatedAt, + UpdatedAt: questions[i].UpdatedAt, + } + + err := d.QuestionRepo.UpdateQuestion(ctx, updateques) + assert.NoError(t, err, nil) + + bdd.Test(t, "move to history question", func() { + que, err := d.QuestionRepo.MoveToHistoryQuestion(ctx, questions[i].Id) + assert.NoError(t, err, nil) + assert.Equal(t, questions[i].Id+11, que.Id) + }) + } + }) + + bdd.Test(t, "negative question creating: overflow title", func() { + question := model.Question{ + Id: 0, + QuizId: quix4filling.Id, + Title: faker.StringWithSize(1024), + Description: "sample text", + Type: model.TypeText, + Required: true, + Deleted: false, + Page: 0, + Content: "test", + Version: 0, + ParentIds: nil, + CreatedAt: time.Time{}, + UpdatedAt: time.Time{}, + } + err := d.QuestionRepo.CreateQuestion(ctx, &question) + assert.Error(t, err, nil) + }) + bdd.Test(t, "negative question creating: invalid status", func() { + question := model.Question{ + Id: 0, + QuizId: quix4filling.Id, + Title: `testNonete`, + Description: "sample text", + Type: "test", + Required: true, + Deleted: true, + Page: 0, + Content: "test", + Version: 0, + ParentIds: nil, + CreatedAt: time.Time{}, + UpdatedAt: time.Time{}, + } + err := d.QuestionRepo.CreateQuestion(ctx, &question) + assert.Error(t, err, nil) + }) + }) + + bdd.Act(t, "edit some questions", func() { + bdd.Test(t, "positive delete question", func() { + question, err := d.QuestionRepo.DeleteQuestion(ctx, questions[0].Id) + assert.NoError(t, err) + assert.True(t, question.Deleted) + questions[0] = question + }) + bdd.Test(t, "negative delete question", func() { + question, err := d.QuestionRepo.DeleteQuestion(ctx, math.MaxUint64) + assert.Error(t, err) + assert.Zero(t, question.Id) + }) + bdd.Test(t, "positive create new version of question", func() { + questions[0].Deleted = true + questions[0].Version += 1 + questions[0].ParentIds = append(questions[0].ParentIds, int32(questions[0].Id)) + questions[0].Title = faker.StringWithSize(100) + + err := d.QuestionRepo.CreateQuestion(ctx, &questions[0]) + assert.NoError(t, err) + }) + }) + + bdd.Act(t, "edit some quizes", func() { + bdd.Test(t, "positive delete quiz", func() { + quiz, err := d.QuizRepo.DeleteQuiz(ctx, id, records[0].Id) + fmt.Println(quiz) + assert.NoError(t, err) + assert.True(t, quiz.Deleted) + records[0].Id = quiz.Id + }) + bdd.Test(t, "negative delete question", func() { + quiz, err := d.QuizRepo.DeleteQuiz(ctx, id, math.MaxUint64) + assert.Error(t, err) + assert.Zero(t, quiz.Id) + }) + bdd.Test(t, "positive create new version of question", func() { + records[0].Deleted = true + records[0].Version += 1 + records[0].ParentIds = append(records[0].ParentIds, int32(records[0].Id)) + records[0].Name = faker.StringWithSize(100) + + err := d.QuizRepo.CreateQuiz(ctx, &records[0]) + assert.NoError(t, err) + }) + }) + + bdd.Act(t, "update expired quizes", func() { + bdd.Test(t, "check that we have quizes for expiration", func() { + record2 := model.Quiz{ + AccountId: id, + Fingerprinting: true, + Repeatable: true, + NotePrevented: true, + MailNotifications: true, + UniqueAnswers: true, + Name: faker.StringWithSize(100), + Description: "test", + Config: "test", + Status: model.StatusStart, + Limit: 0, + DueTo: uint64(time.Now().Add(-time.Hour).Unix()), + TimeOfPassing: 0, + Pausable: false, + } + err := d.QuizRepo.CreateQuiz(ctx, &record2) + assert.NoError(t, err, nil) + assert.NotZero(t, record2.Id, nil) + assert.NotEqual(t, record2.CreatedAt, nil) + assert.NotEqual(t, record2.UpdatedAt, nil) + }) + }) + + bdd.Act(t, "copy question flow", func() { + bdd.Test(t, "duplicate question", func() { + copiedQuestion, err := d.QuestionRepo.CopyQuestion(ctx, questions[4].Id, 0) + assert.NoError(t, err) + assert.Equal(t, questions[4].QuizId, copiedQuestion.QuizId) + assert.NotEqual(t, questions[4].Id, copiedQuestion.Id) + }) + bdd.Test(t, "copy question to another quiz", func() { + copiedQuestion, err := d.QuestionRepo.CopyQuestion(ctx, questions[4].Id, records[10].Id) + assert.NoError(t, err) + assert.Equal(t, records[10].Id, copiedQuestion.QuizId) + assert.NotEqual(t, questions[4].Id, copiedQuestion.Id) + }) + }) + + bdd.Act(t, "copy quiz flow", func() { + bdd.Test(t, "quiz duplication", func() { + copiesQuiz, err := d.QuizRepo.CopyQuiz(ctx, records[10].AccountId, records[10].Id) + assert.NoError(t, err) + assert.NotEqual(t, records[10].Id, copiesQuiz.Id) + }) + }) + + bdd.Act(t, "get history for quiz", func() { + bdd.Test(t, "positive quiz history", func() { + hist, err := d.QuizRepo.QuizHistory(ctx, quiz.QuizHistoryDeps{ + Id: records[0].Id, + Limit: 100, + Offset: 0, + AccountId: id, + }) + assert.NoError(t, err) + assert.Equal(t, len(hist), 2) + }) + bdd.Test(t, "negative quiz history", func() { + _, err := d.QuizRepo.QuizHistory(ctx, quiz.QuizHistoryDeps{ + Id: math.MaxUint64, + Limit: 100, + Offset: 0, + AccountId: id, + }) + assert.NoError(t, err) + assert.Equal(t, nil, nil) + }) + }) + + bdd.Act(t, "get history for question", func() { + bdd.Test(t, "positive question history", func() { + hist, err := d.QuestionRepo.QuestionHistory(ctx, questions[0].Id, 100, 0) + assert.NoError(t, err) + assert.Equal(t, len(hist), 2) + }) + bdd.Test(t, "negative question history", func() { + _, err := d.QuestionRepo.QuestionHistory(ctx, math.MaxUint64, 100, 0) + assert.NoError(t, err) + }) + }) + + bdd.Act(t, "Worker Stat Process", func() { + err := d.WorkerRepo.WorkerStatProcess(ctx) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Worker Timeout Process", func() { + err := d.WorkerRepo.WorkerTimeoutProcess(ctx) + assert.NoError(t, err, nil) + }) + // todo нужно будет обновить эти тесты связать с выше стоящими + bdd.Act(t, "Get Account By ID", func() { + account, err := d.AccountRepo.GetAccountByID(ctx, "64eb6ce57047f28fdabf69ec") + assert.NoError(t, err, nil) + fmt.Println(account) + }) + + bdd.Act(t, "Get Privileges By Account ID", func() { + privileges, err := d.AccountRepo.GetPrivilegesByAccountID(ctx, "64eb6ce57047f28fdabf69ec") + assert.NoError(t, err, nil) + fmt.Println(privileges) + }) + + bdd.Act(t, "Get Accounts", func() { + accounts, count, err := d.AccountRepo.GetAccounts(ctx, 10, 0) + assert.NoError(t, err, nil) + fmt.Println(accounts) + fmt.Println(len(accounts)) + fmt.Println(count) + }) + + bdd.Act(t, "Update Privilege", func() { + priv := model.ShortPrivilege{ + PrivilegeID: "quizCnt", + PrivilegeName: "Количество Заявок", + Amount: 0, + CreatedAt: time.Now(), + } + err := d.AccountRepo.UpdatePrivilege(ctx, &priv, "047c1109-1fba-47d8-b4ec-6ded153a2ea9") + assert.NoError(t, err, nil) + + }) + + bdd.Act(t, "Insert Privilege", func() { + priv := model.ShortPrivilege{ + PrivilegeID: "quizCnt", + PrivilegeName: "123", + Amount: 123, + CreatedAt: time.Now(), + } + + err := d.AccountRepo.InsertPrivilege(ctx, &priv, "047c1109-1fba-47d8-b4ec-6ded153a2ea9") + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Get Expired", func() { + + priv, err := d.AccountRepo.GetExpired(ctx, "quizCnt") + fmt.Println(priv) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Delete Privilege By ID", func() { + err := d.AccountRepo.DeletePrivilegeByID(ctx, "10") + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Update Privilege Amount", func() { + err := d.AccountRepo.UpdatePrivilegeAmount(ctx, "2", 100000) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Get Acc And Privilege By Email(userid)", func() { + acc, priv, err := d.AccountRepo.GetAccAndPrivilegeByEmail(ctx, "650061935ad320604ff24cc2") + fmt.Println(acc, priv) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Get Quiz Results", func() { + now := time.Now() + + yearAgo := now.AddDate(-1, 0, 0) + + yearAhead := now.AddDate(1, 0, 0) + ansexp, count, err := d.ResultRepo.GetQuizResults(ctx, 9422, result.GetQuizResDeps{ + To: yearAhead, + From: yearAgo, + New: false, + Page: 1, + Limit: 10, + }, true) + assert.NoError(t, err, nil) + fmt.Println(ansexp) + fmt.Println(count) + }) + + bdd.Act(t, "Update Answers Status", func() { + err := d.ResultRepo.UpdateAnswersStatus(ctx, "64eb6ce57047f28fdabf69ec", []uint64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Get Quiz Results CSV", func() { + now := time.Now() + + yearAgo := now.AddDate(-1, 0, 0) + + yearAhead := now.AddDate(1, 0, 0) + ans, err := d.ResultRepo.GetQuizResultsCSV(ctx, 14734, result.GetQuizResDeps{ + To: yearAhead, + From: yearAgo, + New: false, + }) + fmt.Println(ans) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Get Questions", func() { + ques, err := d.ResultRepo.GetQuestions(ctx, 14734) + fmt.Println(ques) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Check Results Owner", func() { + anss, err := d.ResultRepo.CheckResultsOwner(ctx, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "64eb6ce57047f28fdabf69ec") + fmt.Println(anss) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Get Result Answers", func() { + anss, err := d.ResultRepo.GetResultAnswers(ctx, 1) + fmt.Println(anss) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Check Result Owner", func() { + anss, err := d.ResultRepo.CheckResultOwner(ctx, 1, "64eb6ce57047f28fdabf69ec") + assert.Equal(t, anss, true) + assert.NoError(t, err, nil) + }) + + bdd.Act(t, "Soft Delete Result By ID", func() { + err := d.ResultRepo.SoftDeleteResultByID(ctx, 10) + assert.NoError(t, err, nil) + }) + }) +} diff --git a/tests/gilroy-bold.woff2 b/tests/gilroy-bold.woff2 new file mode 100644 index 0000000..6517a9b Binary files /dev/null and b/tests/gilroy-bold.woff2 differ diff --git a/tests/logo192.png b/tests/logo192.png new file mode 100644 index 0000000..fc44b0a Binary files /dev/null and b/tests/logo192.png differ diff --git a/tests/logo512.png b/tests/logo512.png new file mode 100644 index 0000000..a4e47a6 Binary files /dev/null and b/tests/logo512.png differ diff --git a/tests/mail/reminder.tmpl b/tests/mail/reminder.tmpl new file mode 100644 index 0000000..224d542 --- /dev/null +++ b/tests/mail/reminder.tmpl @@ -0,0 +1,193 @@ + + + + + + Document + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +

Квиз для вашего бизнеса

+
+

+ Поступила новая заявка с квиза “{{.QuizConfig.Theme}}”! +

+
+

+ Но у вас закончились средства на балансе :( +

+
+ +
+

+ Аккаунт +

+
+ + + + + +
+ Email + +

+ {{.QuizConfig.Reply}} +

+
+
+

+ Пополните баланс и посмотрите заявку в личном кабинете: +

+
+ + Посмотреть в личном кабинете + +
+
+ + penaquiz.com + +
+ + diff --git a/tests/mail/to_client.tmpl b/tests/mail/to_client.tmpl new file mode 100644 index 0000000..5851261 --- /dev/null +++ b/tests/mail/to_client.tmpl @@ -0,0 +1,515 @@ + + + + + + Document + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ range .AllAnswers }} + {{ if index $.QuestionsMap .QuestionID }} + + + + {{ end }} + {{end}} + + + + + + + + +
+ + +

Квиз для вашего бизнеса

+
+

+ Поступила новая заявка с квиза “{{.QuizConfig.Theme}}”! +

+
+

+ Время заявки: {{ .AnswerTime }} +

+
+ + Посмотреть в личном кабинете + +
+

+ Контакты +

+
+ + + + + + {{ if .AnswerContent.Email }} + + + + + {{ end }} + {{ if .AnswerContent.Phone }} + + + + + {{ end }} + + {{ if .AnswerContent.Telegram }} + + + + + {{ end }} + {{ if .AnswerContent.Wechat }} + + + + + {{ end }} + {{ if .AnswerContent.Viber }} + + + + + {{ end }} + {{ if .AnswerContent.Vk }} + + + + + {{ end }} + {{ if .AnswerContent.Skype }} + + + + + {{ end }} + {{ if .AnswerContent.Whatsup }} + + + + + {{ end }} + {{ if .AnswerContent.Messenger }} + + + + + {{ end }} +
+ Имя + +

+ {{ .AnswerContent.Name}} +

+
+ Email + +

+ {{ .AnswerContent.Email }} +

+
+ Телефон + + {{ .AnswerContent.Phone }} +
+ Telegram + + {{ .AnswerContent.Telegram }} +
+ Wechat + + {{ .AnswerContent.Wechat }} +
+ Viber + + {{ .AnswerContent.Viber }} +
+ Vk + + {{ .AnswerContent.Vk }} +
+ Skype + + {{ .AnswerContent.Skype }} +
+ Whatsup + + {{ .AnswerContent.Whatsup }} +
+ Messenger + + {{ .AnswerContent.Messenger }} +
+
+

+ Ответы +

+
+ + + + + + + + +
+

+ {{ index $.QuestionsMap .QuestionID }} +

+
+ {{ .Content }} +
+
+ + + + + +
+ Страница + + Перейти +
+
+ + penaquiz.com + +
+ + diff --git a/tests/new.txt b/tests/new.txt new file mode 100644 index 0000000..7591f1f --- /dev/null +++ b/tests/new.txt @@ -0,0 +1,28 @@ +goos: linux +goarch: amd64 +pkg: squiz/tests +cpu: Intel(R) Core(TM) i3-6100H CPU @ 2.70GHz +BenchmarkQuizCreation-4 211 7806501 ns/op 3526 B/op 51 allocs/op +BenchmarkQuestionCreation-4 206 6187312 ns/op 2759 B/op 40 allocs/op +BenchmarkQuestionHistory-4 146 7057323 ns/op 3339 B/op 44 allocs/op +BenchmarkQuizCopy-4 98 14264658 ns/op 11907 B/op 167 allocs/op +BenchmarkQuestionDuplicate-4 183 6418405 ns/op 1535 B/op 32 allocs/op +BenchmarkQuestionCopy-4 211 6203381 ns/op 1457 B/op 31 allocs/op +BenchmarkQuiznArchiving-4 201 6179325 ns/op 686 B/op 15 allocs/op +BenchmarkQuizHistory-4 262 5225611 ns/op 2484 B/op 45 allocs/op +BenchmarkQuizDeleting-4 192 6523611 ns/op 2196 B/op 43 allocs/op +panic: runtime error: invalid memory address or nil pointer dereference +[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xd815d3] + +goroutine 445 [running]: +squiz/dal.(*DAL).GetQuizByQid(_, {_, _}, {_, _}) + /home/skeris/go/src/github.com/skeris/squiz/dal/quiz.go:226 +0x533 +squiz/tests.BenchmarkQuizGetByQid.func1(0xc00003ab40) + /home/skeris/go/src/github.com/skeris/squiz/tests/dalbench_test.go:292 +0x14b +testing.(*B).RunParallel.func1() + /snap/go/current/src/testing/benchmark.go:788 +0xcb +created by testing.(*B).RunParallel + /snap/go/current/src/testing/benchmark.go:781 +0x105 +exit status 2 +FAIL squiz/tests 17.522s +FAIL diff --git a/tests/old.txt b/tests/old.txt new file mode 100644 index 0000000..fb9eea8 --- /dev/null +++ b/tests/old.txt @@ -0,0 +1,2 @@ +FAIL squiz/tests [build failed] +FAIL diff --git a/tests/publish_test.go b/tests/publish_test.go new file mode 100644 index 0000000..dbbe308 --- /dev/null +++ b/tests/publish_test.go @@ -0,0 +1,24 @@ +package tests + +import ( + "github.com/gofiber/fiber/v2" + "github.com/stretchr/testify/assert" + "penahub.gitlab.yandexcloud.net/backend/penahub_common/privilege" + "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" + "testing" +) + +func TestPublishPrivileges(t *testing.T) { + clientData := privilege.Client{ + URL: "http://localhost:8001", + ServiceName: "squiz", + Privileges: model.Privileges, + } + fiberClient := &fiber.Client{} + privilegeController := privilege.NewPrivilege(clientData, fiberClient) + + t.Run("PublishPrivileges", func(t *testing.T) { + err := privilegeController.PublishPrivileges() + assert.NoError(t, err) + }) +} diff --git a/tests/smtp_test.go b/tests/smtp_test.go new file mode 100644 index 0000000..1df738d --- /dev/null +++ b/tests/smtp_test.go @@ -0,0 +1,159 @@ +package tests + +import ( + _ "embed" + "github.com/gofiber/fiber/v2" + "github.com/pioz/faker" + "github.com/stretchr/testify/assert" + "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" + "penahub.gitlab.yandexcloud.net/backend/quiz/worker.git/answerwc" + "penahub.gitlab.yandexcloud.net/backend/quiz/worker.git/clients/mailclient" + "testing" + "time" +) + +//go:embed mail/to_client.tmpl +var toClientTemplate string + +//go:embed mail/reminder.tmpl +var reminderTemplate string + +func TestProcessMessageToSMTP(t *testing.T) { + clientDeps := mailclient.ClientDeps{ + Host: "connect.mailclient.bz", + Port: "587", + Sender: "skeris@mailing.pena.digital", + Auth: &mailclient.PlainAuth{Username: "kotilion.95@gmail.com", Password: "vWwbCSg4bf0p"}, + ApiKey: "P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev", + FiberClient: &fiber.Client{}, + } + + client := mailclient.NewClient(clientDeps) + + recipient := "mullinp@internet.ru" + subject := "Test" + + data := mailclient.EmailTemplateData{ + QuizConfig: model.ResultInfo{ + Theme: "Taemplste Quiz", + }, + AnswerContent: model.ResultContent{ + Name: "Pasha", + Phone: "+723456789", + Email: "test@example.com", + //Adress: "chtoto tam", + Telegram: "@test", + Wechat: "test_wechat", + Viber: "+723456789", + Vk: "test_vk", + Skype: "test_skype", + Whatsup: "test_whatsup", + Messenger: "test_messenger", + }, + AllAnswers: []model.ResultAnswer{ + {QuestionID: 1, Content: "Pasha"}, + {QuestionID: 2, Content: "From a friend"}, + }, + QuestionsMap: map[uint64]string{ + 2: "How did you hear about us?", + }, + AnswerTime: time.Now().Format("Monday, 2 January 2006 г., 15:04 UTC-07:00"), + } + + err := client.SendMailWithAttachment(recipient, subject, toClientTemplate, data, nil) + if err != nil { + t.Errorf("Error sending email: %v", err) + } + +} + +func TestProcessReminderToClient(t *testing.T) { + clientDeps := mailclient.ClientDeps{ + Host: "connect.mailclient.bz", + Port: "587", + Sender: "skeris@mailing.pena.digital", + Auth: &mailclient.PlainAuth{Username: "kotilion.95@gmail.com", Password: "vWwbCSg4bf0p"}, + ApiKey: "P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev", + FiberClient: &fiber.Client{}, + } + + client := mailclient.NewClient(clientDeps) + + recipient := "mullinp@internet.ru" + subject := "Test Reminder" + + quizConfig := model.ResultInfo{ + ReplName: "Test Quiz", + Reply: "mullinp@internet.ru", + Theme: "Reminder Theme", + } + + err := client.SendMailWithAttachment(recipient, subject, reminderTemplate, mailclient.EmailTemplateData{ + QuizConfig: quizConfig, + AnswerContent: model.ResultContent{}, + AllAnswers: []model.ResultAnswer{}, + QuestionsMap: nil, + }, nil) + + if err != nil { + t.Errorf("Error sending email: %v", err) + } +} + +func TestProcessMessageToClient(t *testing.T) { + + smtpData := mailclient.ClientDeps{ + Host: "connect.mailclient.bz", + Port: "587", + Sender: "skeris@mailing.pena.digital", + Auth: &mailclient.PlainAuth{Username: "kotilion.95@gmail.com", Password: "vWwbCSg4bf0p"}, + ApiKey: "P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev", + FiberClient: &fiber.Client{}, + } + + mailClient := mailclient.NewClient(smtpData) + + deps := answerwc.DepsSendToClient{ + Redis: nil, + Dal: nil, + MailClient: mailClient, + } + + errChan := make(chan<- error) + + w := answerwc.NewSendToClient(deps, nil, errChan) + + quizConfig := model.QuizConfig{ + Mailing: model.ResultInfo{ + Theme: faker.String(), + }, + } + + questionsMap := map[uint64]string{ + 1: faker.String(), + 2: faker.String(), + } + + account := model.Account{ + Email: "mullinp@internet.ru", + } + + allAnswers := []model.ResultAnswer{ + { + AnswerID: 1, + QuestionID: 1, + }, + { + AnswerID: 2, + QuestionID: 2, + }, + } + + answerContent := model.ResultContent{} + + answerTime := time.Now() + + err := w.ProcessMessageToClient(quizConfig, questionsMap, account, allAnswers, answerContent, answerTime) + + assert.NoError(t, err) +} diff --git a/tests/utils.go b/tests/utils.go new file mode 100644 index 0000000..4d904f3 --- /dev/null +++ b/tests/utils.go @@ -0,0 +1,140 @@ +package tests + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "testing" + + "github.com/golang-jwt/jwt/v5" + "github.com/joho/godotenv" + "github.com/stretchr/testify/assert" +) + +type JWTClient struct { + token *jwt.Token + client http.Client +} + +func (jc *JWTClient) Get(url string, body io.Reader) (resp *http.Response, err error) { + return jc.request(http.MethodGet, url, body, nil) +} + +func (jc *JWTClient) Post(url string, body io.Reader) (resp *http.Response, err error) { + return jc.request(http.MethodPost, url, body, nil) +} + +func (jc *JWTClient) Patch(url string, body io.Reader) (resp *http.Response, err error) { + return jc.request(http.MethodPatch, url, body, nil) +} + +func (jc *JWTClient) Delete(url string, body io.Reader) (resp *http.Response, err error) { + return jc.request(http.MethodDelete, url, body, nil) +} + +func (jc *JWTClient) request(method, url string, body io.Reader, callback func(*http.Request)) (resp *http.Response, err error) { + req, err := http.NewRequest(method, url, body) + if err != nil { + panic(err) + } + + if callback != nil { + callback(req) + } else if method == http.MethodPost { + req.Header.Set("Content-Type", "application/json") + } + + req.Header.Set("Authorization", "Bearer "+jc.token.Raw) + + return jc.client.Do(req) +} + +func (jc *JWTClient) GetExpect(t *testing.T, url string, code int, data interface{}) { + t.Helper() + jc.expect(t, http.MethodGet, url, code, data) +} + +func (jc *JWTClient) PostExpect(t *testing.T, url string, code int, data interface{}) { + t.Helper() + jc.expect(t, http.MethodPost, url, code, data) +} + +func (jc *JWTClient) PatchExpect(t *testing.T, url string, code int, data interface{}) { + t.Helper() + jc.expect(t, http.MethodPatch, url, code, data) +} + +func (jc *JWTClient) expect(t *testing.T, method, url string, code int, data interface{}) { + t.Helper() + request, err := json.Marshal(&data) + assert.NoError(t, err) + body := bytes.NewBuffer(request) + r, err := jc.request(method, url, body, nil) + assert.NoError(t, err) + assert.Equal(t, code, r.StatusCode) +} + +func registerUser(login string) *jwt.Token { + client := &http.Client{} + + err := godotenv.Load("../deployments/test/auth.env.test") + if err != nil { + panic(err) + } + + publicKey := os.Getenv("PUBLIC_ACCESS_SECRET_KEY") + if publicKey == "" { + panic("no public key found") + } + + payload, err := json.Marshal(map[string]string{ + "login": login, + "email": login + "@mail.ru", + "password": "887", + "phoneNumber": "+9008007766", + }) + if err != nil { + panic(err) + } + + req, err := http.NewRequest("POST", "http://localhost:8000/auth/register", bytes.NewBuffer(payload)) + if err != nil { + panic(err) + } + + req.Header.Set("Content-Type", "application/json") + + resp, err := client.Do(req) + if err != nil { + panic(err) + } + defer resp.Body.Close() + + bytes, err := io.ReadAll(resp.Body) + if err != nil { + panic(err) + } + + var response struct { + AccessToken string `json:"accessToken"` + RefreshToken string `json:"refreshToken"` + } + + err = json.Unmarshal(bytes, &response) + if err != nil { + panic(err) + } + + token, err := jwt.Parse(response.AccessToken, func(token *jwt.Token) (any, error) { + return jwt.ParseRSAPublicKeyFromPEM([]byte(publicKey)) + }) + fmt.Println(token) + if err != nil { + panic(err) + } + + return token +}