From 5eb0e931b21c803d9c0e0b5b6b8bb337a8689e42 Mon Sep 17 00:00:00 2001 From: Pavel Date: Wed, 13 Mar 2024 20:23:27 +0300 Subject: [PATCH] update --- go.mod | 20 +- go.sum | 50 ++- tests/Dockerfile | 6 + tests/chunk.css | 10 + tests/chunk.js | 3 + tests/db_test.go | 665 ++++++++++++++++++++++++++++++++++++++ tests/gilroy-bold.woff2 | Bin 0 -> 26452 bytes tests/logo192.png | Bin 0 -> 5347 bytes tests/logo512.png | Bin 0 -> 9664 bytes tests/mail/reminder.tmpl | 193 +++++++++++ tests/mail/to_client.tmpl | 515 +++++++++++++++++++++++++++++ tests/new.txt | 28 ++ tests/old.txt | 2 + tests/publish_test.go | 24 ++ tests/smtp_test.go | 159 +++++++++ tests/utils.go | 140 ++++++++ 16 files changed, 1808 insertions(+), 7 deletions(-) create mode 100644 tests/Dockerfile create mode 100644 tests/chunk.css create mode 100644 tests/chunk.js create mode 100644 tests/db_test.go create mode 100644 tests/gilroy-bold.woff2 create mode 100644 tests/logo192.png create mode 100644 tests/logo512.png create mode 100644 tests/mail/reminder.tmpl create mode 100644 tests/mail/to_client.tmpl create mode 100644 tests/new.txt create mode 100644 tests/old.txt create mode 100644 tests/publish_test.go create mode 100644 tests/smtp_test.go create mode 100644 tests/utils.go 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 0000000000000000000000000000000000000000..6517a9b42cf83a5e66177cfd337b43db46efa534 GIT binary patch literal 26452 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 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 +}