Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
haskell-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
159
Issues
159
List
Board
Labels
Milestones
Merge Requests
7
Merge Requests
7
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
haskell-gargantext
Commits
0457d4c4
Verified
Commit
0457d4c4
authored
Oct 18, 2024
by
Przemyslaw Kaminski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[worker] test fixes
Start worker in tests
parent
7e3fe8f6
Pipeline
#6855
failed with stages
in 111 minutes and 29 seconds
Changes
18
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
166 additions
and
84 deletions
+166
-84
gargantext.cabal
gargantext.cabal
+3
-0
EnvTypes.hs
src/Gargantext/API/Admin/EnvTypes.hs
+2
-0
Worker.hs
src/Gargantext/Core/Config/Worker.hs
+3
-0
CentralExchange.hs
src/Gargantext/Core/Notifications/CentralExchange.hs
+2
-2
Worker.hs
src/Gargantext/Core/Worker.hs
+22
-24
Broker.hs
src/Gargantext/Core/Worker/Broker.hs
+13
-8
Env.hs
src/Gargantext/Core/Worker/Env.hs
+6
-6
Prelude.hs
src/Gargantext/Database/Prelude.hs
+18
-1
test_config.toml
test-data/test_config.toml
+2
-0
Table.hs
test/Test/API/Private/Table.hs
+0
-2
Setup.hs
test/Test/API/Setup.hs
+22
-19
DocumentSearch.hs
test/Test/Database/Operations/DocumentSearch.hs
+1
-0
NodeStory.hs
test/Test/Database/Operations/NodeStory.hs
+2
-1
Setup.hs
test/Test/Database/Setup.hs
+48
-11
Types.hs
test/Test/Database/Types.hs
+4
-7
Utils.hs
test/Test/Utils.hs
+0
-2
Db.hs
test/Test/Utils/Db.hs
+18
-0
Main.hs
test/drivers/hspec/Main.hs
+0
-1
No files found.
gargantext.cabal
View file @
0457d4c4
...
...
@@ -861,6 +861,7 @@ test-suite garg-test-hspec
import:
defaults
, testDependencies
build-depends: haskell-bee
type: exitcode-stdio-1.0
main-is: drivers/hspec/Main.hs
other-modules:
...
...
@@ -885,6 +886,7 @@ test-suite garg-test-hspec
Test.Server.ReverseProxy
Test.Types
Test.Utils
Test.Utils.Db
hs-source-dirs:
test
ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
...
...
@@ -903,3 +905,4 @@ benchmark garg-bench
ghc-options: "-with-rtsopts=-T -A32m"
if impl(ghc >= 8.6)
ghc-options: "-with-rtsopts=--nonmoving-gc"
src/Gargantext/API/Admin/EnvTypes.hs
View file @
0457d4c4
...
...
@@ -18,6 +18,8 @@ module Gargantext.API.Admin.EnvTypes (
,
env_central_exchange
,
env_dispatcher
,
env_jwt_settings
,
env_pool
,
env_nodeStory
,
menv_firewall
,
dev_env_logger
...
...
src/Gargantext/Core/Config/Worker.hs
View file @
0457d4c4
{-# LANGUAGE TemplateHaskell #-}
{-|
Module : Gargantext.Core.Config.Worker
Description : Worker TOML file config
...
...
@@ -84,3 +86,4 @@ findDefinitionByName (WorkerSettings { _wsDefinitions }) workerName =
-- wdToRedisBrokerInitParams wd = BRedis.RedisBrokerInitParams <$> (wdToRedisConnectInfo wd)
makeLenses
'W
o
rkerSettings
src/Gargantext/Core/Notifications/CentralExchange.hs
View file @
0457d4c4
...
...
@@ -63,7 +63,7 @@ gServer (NotificationsConfig { .. }) = do
forever
$
do
-- putText "[central_exchange] receiving"
r
<-
recv
s
logMsg
ioLogger
INFO
$
"[central_exchange] received: "
<>
show
r
logMsg
ioLogger
DEBUG
$
"[central_exchange] received: "
<>
show
r
-- C.putStrLn $ "[central_exchange] " <> r
atomically
$
TChan
.
writeTChan
tChan
r
where
...
...
@@ -78,7 +78,7 @@ gServer (NotificationsConfig { .. }) = do
-- void $ sendNonblocking s_dispatcher r
void
$
timeout
100
_000
$
send
s_dispatcher
r
Just
(
UpdateTreeFirstLevel
node_id
)
->
do
logMsg
ioLogger
INFO
$
"[central_exchange] update tree: "
<>
show
node_id
logMsg
ioLogger
DEBUG
$
"[central_exchange] update tree: "
<>
show
node_id
-- putText $ "[central_exchange] sending that to the dispatcher: " <> show node_id
-- To make this more robust, use withAsync so we don't
-- block the main thread (send is blocking)
...
...
src/Gargantext/Core/Worker.hs
View file @
0457d4c4
...
...
@@ -38,6 +38,24 @@ import Gargantext.Utils.Jobs.Monad ( MonadJobStatus(noJobHandle) )
initWorkerState
::
(
HasWorkerBroker
PGMQBroker
Job
)
=>
WorkerEnv
->
WorkerDefinition
->
IO
(
Worker
.
State
PGMQBroker
Job
)
initWorkerState
env
(
WorkerDefinition
{
..
})
=
do
let
gargConfig
=
env
^.
hasConfig
broker
<-
initBrokerWithDBCreate
gargConfig
pure
$
Worker
.
State
{
broker
,
queueName
=
_wdQueue
,
name
=
T
.
unpack
_wdName
,
performAction
=
performAction
env
,
onMessageReceived
=
Nothing
,
onJobFinish
=
Nothing
,
onJobTimeout
=
Nothing
,
onJobError
=
Nothing
}
-- | Spawn a worker with PGMQ broker
-- TODO:
-- - reduce size of DB pool
...
...
@@ -49,18 +67,8 @@ withPGMQWorker :: (HasWorkerBroker PGMQBroker Job)
->
WorkerDefinition
->
(
Async
()
->
Worker
.
State
PGMQBroker
Job
->
IO
()
)
->
IO
()
withPGMQWorker
env
(
WorkerDefinition
{
..
})
cb
=
do
let
gargConfig
=
env
^.
hasConfig
broker
<-
initBrokerWithDBCreate
gargConfig
let
state'
=
Worker
.
State
{
broker
,
queueName
=
_wdQueue
,
name
=
T
.
unpack
_wdName
,
performAction
=
performAction
env
,
onMessageReceived
=
Nothing
,
onJobFinish
=
Nothing
,
onJobTimeout
=
Nothing
,
onJobError
=
Nothing
}
withPGMQWorker
env
wd
cb
=
do
state'
<-
initWorkerState
env
wd
withAsync
(
Worker
.
run
state'
)
(
\
a
->
cb
a
state'
)
...
...
@@ -69,18 +77,8 @@ withPGMQWorkerSingle :: (HasWorkerBroker PGMQBroker Job)
->
WorkerDefinition
->
(
Async
()
->
Worker
.
State
PGMQBroker
Job
->
IO
()
)
->
IO
()
withPGMQWorkerSingle
env
(
WorkerDefinition
{
..
})
cb
=
do
let
gargConfig
=
env
^.
hasConfig
broker
<-
initBrokerWithDBCreate
gargConfig
let
state'
=
Worker
.
State
{
broker
,
queueName
=
_wdQueue
,
name
=
T
.
unpack
_wdName
,
performAction
=
performAction
env
,
onMessageReceived
=
Nothing
,
onJobFinish
=
Nothing
,
onJobTimeout
=
Nothing
,
onJobError
=
Nothing
}
withPGMQWorkerSingle
env
wd
cb
=
do
state'
<-
initWorkerState
env
wd
withAsync
(
Worker
.
runSingle
state'
)
(
\
a
->
cb
a
state'
)
...
...
src/Gargantext/Core/Worker/Broker.hs
View file @
0457d4c4
{-# LANGUAGE TupleSections #-}
{-|
Module : Gargantext.Core.Worker.Broker
Description : Broker utilities
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
-}
module
Gargantext.Core.Worker.Broker
(
initBrokerWithDBCreate
)
...
...
@@ -13,8 +22,8 @@ import Database.PostgreSQL.Simple qualified as PSQL
import
Gargantext.Core.Config
(
GargConfig
(
..
),
gc_worker
)
import
Gargantext.Core.Config.Worker
(
WorkerSettings
(
..
))
import
Gargantext.Core.Worker.Jobs.Types
(
Job
(
..
))
import
Gargantext.Database.Prelude
(
createDBIfNotExists
)
import
Gargantext.Prelude
import
Shelly
qualified
as
SH
...
...
@@ -27,11 +36,7 @@ initBrokerWithDBCreate gc@(GargConfig { _gc_database_config }) = do
-- By using gargantext db credentials, we create pgmq db (if needed)
let
WorkerSettings
{
..
}
=
gc
^.
gc_worker
let
psqlDB
=
TE
.
decodeUtf8
$
PSQL
.
postgreSQLConnectionString
_gc_database_config
-- For the \gexec trick, see:
-- https://stackoverflow.com/questions/18389124/simulate-create-database-if-not-exists-for-postgresql
(
_res
,
_ec
)
<-
SH
.
shelly
$
SH
.
silently
$
SH
.
escaping
False
$
do
let
sql
=
"
\"
SELECT 'CREATE DATABASE "
<>
(
T
.
pack
$
PSQL
.
connectDatabase
_wsDatabase
)
<>
"' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '"
<>
(
T
.
pack
$
PSQL
.
connectDatabase
_wsDatabase
)
<>
"')
\\
gexec
\"
"
result
<-
SH
.
run
"echo"
[
sql
,
"|"
,
"psql"
,
"-d"
,
"
\"
"
<>
psqlDB
<>
"
\"
"
]
(
result
,)
<$>
SH
.
lastExitCode
createDBIfNotExists
psqlDB
(
T
.
pack
$
PSQL
.
connectDatabase
_wsDatabase
)
initBroker
$
PGMQBrokerInitParams
_wsDatabase
_wsDefaultVisibilityTimeout
src/Gargantext/Core/Worker/Env.hs
View file @
0457d4c4
...
...
@@ -48,12 +48,12 @@ import System.Log.FastLogger qualified as FL
data
WorkerEnv
=
WorkerEnv
{
_w_env_config
::
!
GargConfig
,
_w_env_logger
::
!
(
Logger
(
GargM
WorkerEnv
IOException
))
,
_w_env_pool
::
!
(
Pool
Connection
)
,
_w_env_nodeStory
::
!
NodeStoryEnv
,
_w_env_mail
::
!
Mail
.
MailConfig
,
_w_env_nlp
::
!
NLPServerMap
{
_w_env_config
::
~
GargConfig
,
_w_env_logger
::
~
(
Logger
(
GargM
WorkerEnv
IOException
))
,
_w_env_pool
::
~
(
Pool
Connection
)
,
_w_env_nodeStory
::
~
NodeStoryEnv
,
_w_env_mail
::
~
Mail
.
MailConfig
,
_w_env_nlp
::
~
NLPServerMap
}
...
...
src/Gargantext/Database/Prelude.hs
View file @
0457d4c4
...
...
@@ -9,8 +9,10 @@ Portability : POSIX
-}
{-# LANGUAGE ConstraintKinds
, ScopedTypeVariables
#-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections #-}
module
Gargantext.Database.Prelude
where
...
...
@@ -37,6 +39,7 @@ import Opaleye (Unpackspec, showSql, FromFields, Select, runSelect, SqlJsonb, De
import
Opaleye.Aggregate
(
countRows
)
import
Opaleye.Internal.Constant
qualified
import
Opaleye.Internal.Operators
qualified
import
Shelly
qualified
as
SH
-------------------------------------------------------
class
HasConnectionPool
env
where
...
...
@@ -207,3 +210,17 @@ restrictMaybe :: ( Default Opaleye.Internal.Operators.IfPP b b
restrictMaybe
v
cond
=
matchMaybe
v
$
\
case
Nothing
->
toFields
True
Just
v'
->
cond
v'
-- | Creates a PostgreSQL DB if it doesn't exist.
-- Accepts a pg connection string and db name as argument.
createDBIfNotExists
::
Text
->
Text
->
IO
()
createDBIfNotExists
connStr
dbName
=
do
-- For the \gexec trick, see:
-- https://stackoverflow.com/questions/18389124/simulate-create-database-if-not-exists-for-postgresql
(
_res
,
_ec
)
<-
SH
.
shelly
$
SH
.
silently
$
SH
.
escaping
False
$
do
let
sql
=
"
\"
SELECT 'CREATE DATABASE "
<>
dbName
<>
"' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '"
<>
dbName
<>
"')
\\
gexec
\"
"
result
<-
SH
.
run
"echo"
[
sql
,
"|"
,
"psql"
,
"-d"
,
"
\"
"
<>
connStr
<>
"
\"
"
]
(
result
,)
<$>
SH
.
lastExitCode
return
()
test-data/test_config.toml
View file @
0457d4c4
...
...
@@ -46,6 +46,7 @@ max_docs_scrapers = 10000
js_job_timeout
=
1800
js_id_timeout
=
1800
# NOTE This is overridden by Test.Database.Setup
[database]
host
=
"127.0.0.1"
port
=
5432
...
...
@@ -77,6 +78,7 @@ All = "corenlp://localhost:9000"
default_visibility_timeout
=
1
# NOTE This is overridden by Test.Database.Setup
[worker.database]
host
=
"127.0.0.1"
port
=
5432
...
...
test/Test/API/Private/Table.hs
View file @
0457d4c4
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module
Test.API.Private.Table
(
...
...
test/Test/API/Setup.hs
View file @
0457d4c4
...
...
@@ -18,15 +18,12 @@ import Data.ByteString.Lazy.Char8 qualified as C8L
import
Data.Cache
qualified
as
InMemory
import
Data.Streaming.Network
(
bindPortTCP
)
import
Gargantext.API
(
makeApp
)
import
Gargantext.API.Admin.EnvTypes
(
Mode
(
Mock
),
Env
(
..
))
import
Gargantext.API.Admin.Settings
import
Gargantext.API.Admin.EnvTypes
(
Mode
(
Mock
),
Env
(
..
),
env_dispatcher
)
import
Gargantext.API.Errors.Types
import
Gargantext.API.Prelude
import
Gargantext.Core.Notifications.Dispatcher
qualified
as
D
import
Gargantext.Core.Config
(
_gc_secrets
,
gc_frontend_config
,
gc_jobs
,
hasConfig
)
import
Gargantext.Core.Config.Types
(
SettingsFile
(
..
),
jc_js_job_timeout
,
jc_js_id_timeout
,
fc_appPort
,
jwtSettings
)
import
Gargantext.Core.Config.Utils
(
readConfig
)
import
Gargantext.Core.NodeStory
import
Gargantext.Core.Types.Individu
import
Gargantext.Database.Action.Flow
import
Gargantext.Database.Action.User.New
...
...
@@ -53,7 +50,7 @@ import Prelude
import
Servant.Auth.Client
()
import
Servant.Client
import
Servant.Job.Async
qualified
as
ServantAsync
import
Test.Database.Setup
(
withTestDB
,
fakeTomlPath
,
testEnvToPgConnectionInfo
)
import
Test.Database.Setup
(
withTestDB
,
fakeTomlPath
)
import
Test.Database.Types
import
UnliftIO
qualified
...
...
@@ -75,23 +72,23 @@ instance Functor SpecContext where
newTestEnv
::
TestEnv
->
Logger
(
GargM
Env
BackendInternalError
)
->
Warp
.
Port
->
IO
Env
newTestEnv
testEnv
logger
port
=
do
tomlFile
@
(
SettingsFile
sf
)
<-
fakeTomlPath
SettingsFile
sf
<-
fakeTomlPath
!
manager_env
<-
newTlsManager
!
config_env
<-
readConfig
tomlFile
<&>
(
gc_frontend_config
.
fc_appPort
)
.~
port
let
config_env
=
test_config
testEnv
&
(
gc_frontend_config
.
fc_appPort
)
.~
port
prios
<-
withLogger
()
$
\
ioLogger
->
Jobs
.
readPrios
ioLogger
(
sf
<>
".jobs"
)
let
prios'
=
Jobs
.
applyPrios
prios
Jobs
.
defaultPrios
!
self_url_env
<-
parseBaseUrl
$
"http://0.0.0.0:"
<>
show
port
dbParam
<-
pure
$
testEnvToPgConnectionInfo
testEnv
!
pool
<-
newPool
dbParam
--
dbParam <- pure $ testEnvToPgConnectionInfo testEnv
--
!pool <- newPool dbParam
!
nodeStory_env
<-
fromDBNodeStoryEnv
pool
--
!nodeStory_env <- fromDBNodeStoryEnv pool
!
scrapers_env
<-
ServantAsync
.
newJobEnv
ServantAsync
.
defaultSettings
manager_env
secret
<-
Jobs
.
genSecret
let
jobs_settings
=
(
Jobs
.
defaultJobSettings
1
secret
)
&
Jobs
.
l_jsJobTimeout
.~
(
fromIntegral
$
config_env
^.
hasConfig
^.
gc_jobs
.
jc_js_job_timeout
)
&
Jobs
.
l_jsIDTimeout
.~
(
fromIntegral
$
config_env
^.
hasConfig
^.
gc_jobs
.
jc_js_id_timeout
)
&
Jobs
.
l_jsJobTimeout
.~
(
fromIntegral
$
config_env
^.
hasConfig
^.
gc_jobs
.
jc_js_job_timeout
)
&
Jobs
.
l_jsIDTimeout
.~
(
fromIntegral
$
config_env
^.
hasConfig
^.
gc_jobs
.
jc_js_id_timeout
)
!
jobs_env
<-
Jobs
.
newJobEnv
jobs_settings
prios'
manager_env
!
_env_jwt_settings
<-
jwtSettings
(
_gc_secrets
config_env
)
...
...
@@ -100,8 +97,12 @@ newTestEnv testEnv logger port = do
pure
$
Env
{
_env_logger
=
logger
,
_env_pool
=
pool
,
_env_nodeStory
=
nodeStory_env
-- , _env_pool = pool
-- , _env_pool = Prelude.error "[Test.API.Setup.Env] pool not needed, but forced somewhere"
,
_env_pool
=
_DBHandle
$
test_db
testEnv
-- , _env_nodeStory = nodeStory_env
-- , _env_nodeStory = Prelude.error "[Test.API.Setup.Env] env nodeStory not needed, but forced somewhere"
,
_env_nodeStory
=
test_nodeStory
testEnv
,
_env_manager
=
manager_env
,
_env_scrapers
=
scrapers_env
,
_env_jobs
=
jobs_env
...
...
@@ -150,11 +151,13 @@ withTestDBAndPort action =
withTestDBAndNotifications
::
D
.
Dispatcher
->
(((
TestEnv
,
Warp
.
Port
),
Application
)
->
IO
()
)
->
IO
()
withTestDBAndNotifications
dispatcher
action
=
do
withTestDB
$
\
testEnv
->
do
app
<-
withLoggerHoisted
Mock
$
\
ioLogger
->
do
env
<-
newTestEnv
testEnv
ioLogger
8080
makeApp
$
env
{
_env_dispatcher
=
dispatcher
}
let
stgs
=
Warp
.
defaultSettings
{
settingsOnExceptionResponse
=
showDebugExceptions
}
Warp
.
testWithApplicationSettings
stgs
(
pure
app
)
$
\
port
->
action
((
testEnv
,
port
),
app
)
withLoggerHoisted
Mock
$
\
ioLogger
->
do
env
<-
newTestEnv
testEnv
ioLogger
8080
<&>
env_dispatcher
.~
dispatcher
app
<-
makeApp
env
let
stgs
=
Warp
.
defaultSettings
{
settingsOnExceptionResponse
=
showDebugExceptions
}
Warp
.
testWithApplicationSettings
stgs
(
pure
app
)
$
\
port
->
action
((
testEnv
,
port
),
app
)
-- | Starts the backend server /and/ the microservices proxy, the former at
-- a random port, the latter at a predictable port.
...
...
test/Test/Database/Operations/DocumentSearch.hs
View file @
0457d4c4
...
...
@@ -22,6 +22,7 @@ import Data.Aeson.Types
import
Gargantext.Core
import
Gargantext.Core.NLP
(
nlpServerGet
)
import
Gargantext.Core.Types.Individu
import
Gargantext.Core.Worker.Env
()
-- instance HasNodeError
import
Gargantext.Database.Action.Flow
import
Gargantext.Database.Action.Search
import
Gargantext.Database.Admin.Types.Hyperdata.Document
...
...
test/Test/Database/Operations/NodeStory.hs
View file @
0457d4c4
...
...
@@ -12,7 +12,7 @@ Portability : POSIX
module
Test.Database.Operations.NodeStory
where
import
Control.Lens
((
^.
),
(
.~
),
(
?~
),
_2
)
import
Control.Lens
((
?~
),
_2
)
import
Control.Monad.Reader
import
Data.Map.Strict
qualified
as
Map
import
Data.Map.Strict.Patch
qualified
as
PM
...
...
@@ -26,6 +26,7 @@ import Gargantext.Core.NodeStory
import
Gargantext.Core.Text.Ngrams
(
NgramsType
(
..
))
import
Gargantext.Core.Types.Individu
import
Gargantext.Core.Types
(
ListType
(
..
),
ListId
,
NodeId
,
UserId
)
import
Gargantext.Core.Worker.Env
()
-- instance HasNodeError
import
Gargantext.Database.Action.User
(
getUserId
)
import
Gargantext.Database.Admin.Config
(
userMaster
)
import
Gargantext.Database.Prelude
(
runPGSQuery
)
...
...
test/Test/Database/Setup.hs
View file @
0457d4c4
{-# LANGUAGE TupleSections #-}
module
Test.Database.Setup
(
withTestDB
,
fakeTomlPath
,
testEnvToPgConnectionInfo
)
where
import
Async.Worker
qualified
as
Worker
import
Data.Maybe
(
fromJust
)
import
Data.Pool
hiding
(
withResource
)
import
Data.Pool
qualified
as
Pool
import
Data.String
(
fromString
)
...
...
@@ -15,18 +18,22 @@ import Database.PostgreSQL.Simple.Options qualified as Client
import
Database.PostgreSQL.Simple.Options
qualified
as
Opts
import
Database.Postgres.Temp
qualified
as
Tmp
import
Gargantext.API.Admin.EnvTypes
(
Mode
(
Mock
))
import
Gargantext.
API.Admin.Settings
import
Gargantext.
Core.Config
import
Gargantext.Core.Config.Types
(
SettingsFile
(
..
))
import
Gargantext.Core.Config.Utils
(
readConfig
)
import
Gargantext.Core.Config.Worker
(
wsDatabase
,
wsDefinitions
)
import
Gargantext.Core.NodeStory
(
fromDBNodeStoryEnv
)
import
Gargantext.Core.Worker
(
initWorkerState
)
import
Gargantext.Core.Worker.Env
(
WorkerEnv
(
..
))
import
Gargantext.Prelude
import
Gargantext.Core.Config
import
Gargantext.System.Logging
(
withLoggerHoisted
)
import
Paths_gargantext
import
Prelude
qualified
import
Shelly
hiding
(
FilePath
,
run
)
import
Shelly
qualified
as
SH
import
Test.Database.Types
import
Test.Utils.Db
(
tmpDBToConnInfo
)
-- | Test DB settings.
dbUser
,
dbPassword
,
dbName
::
Prelude
.
String
...
...
@@ -41,7 +48,8 @@ gargDBSchema :: IO FilePath
gargDBSchema
=
getDataFileName
"devops/postgres/schema.sql"
teardown
::
TestEnv
->
IO
()
teardown
TestEnv
{
..
}
=
do
teardown
TestEnv
{
..
}
=
do
killThread
test_worker_tid
destroyAllResources
$
_DBHandle
test_db
Tmp
.
stop
$
_DBTmp
test_db
...
...
@@ -70,19 +78,48 @@ setup = do
case
res
of
Left
err
->
Prelude
.
fail
$
show
err
Right
db
->
do
let
connInfo
=
tmpDBToConnInfo
db
gargConfig
<-
fakeTomlPath
>>=
readConfig
pool
<-
createPool
(
PG
.
connectPostgreSQL
(
Tmp
.
toConnectionString
db
))
(
PG
.
close
)
2
60
2
-- fix db since we're using tmp-postgres
<&>
(
gc_database_config
.~
connInfo
)
<&>
(
gc_worker
.
wsDatabase
.~
(
connInfo
{
PG
.
connectDatabase
=
"pgmq_test"
}))
let
idleTime
=
60.0
let
maxResources
=
2
let
poolConfig
=
defaultPoolConfig
(
PG
.
connectPostgreSQL
(
Tmp
.
toConnectionString
db
))
PG
.
close
idleTime
maxResources
pool
<-
newPool
(
setNumStripes
(
Just
2
)
poolConfig
)
bootstrapDB
db
pool
gargConfig
ugen
<-
emptyCounter
test_nodeStory
<-
fromDBNodeStoryEnv
pool
withLoggerHoisted
Mock
$
\
logger
->
do
pure
$
TestEnv
{
test_db
=
DBHandle
pool
db
,
test_config
=
gargConfig
,
test_nodeStory
,
test_usernameGen
=
ugen
,
test_logger
=
logger
}
let
idleTime
=
60.0
let
maxResources
=
2
let
wPoolConfig
=
defaultPoolConfig
(
PG
.
connect
$
gargConfig
^.
gc_worker
.
wsDatabase
)
PG
.
close
idleTime
maxResources
wPool
<-
newPool
(
setNumStripes
(
Just
2
)
wPoolConfig
)
withLoggerHoisted
Mock
$
\
wioLogger
->
do
let
wEnv
=
WorkerEnv
{
_w_env_config
=
gargConfig
,
_w_env_logger
=
wioLogger
,
_w_env_pool
=
wPool
,
_w_env_nodeStory
=
test_nodeStory
,
_w_env_mail
=
Prelude
.
error
"[wEnv] w_env_mail requested but not available"
,
_w_env_nlp
=
Prelude
.
error
"[wEnv] w_env_nlp requested but not available"
}
wState
<-
initWorkerState
wEnv
(
fromJust
$
head
$
gargConfig
^.
gc_worker
.
wsDefinitions
)
test_worker_tid
<-
forkIO
(
Worker
.
run
wState
)
pure
$
TestEnv
{
test_db
=
DBHandle
pool
db
,
test_config
=
gargConfig
,
test_nodeStory
,
test_usernameGen
=
ugen
,
test_logger
=
logger
,
test_worker_tid
}
withTestDB
::
(
TestEnv
->
IO
()
)
->
IO
()
withTestDB
=
bracket
setup
teardown
...
...
test/Test/Database/Types.hs
View file @
0457d4c4
...
...
@@ -30,20 +30,19 @@ import Gargantext.API.Admin.EnvTypes
import
Gargantext.API.Admin.Orchestrator.Types
import
Gargantext.API.Errors.Types
import
Gargantext.API.Prelude
import
Gargantext.Core.Config
(
HasConfig
(
..
))
import
Gargantext.Core.Config
import
Gargantext.Core.Config.Mail
(
MailConfig
(
..
),
LoginType
(
NoAuth
),
SendEmailType
(
LogEmailToConsole
))
import
Gargantext.Core.Mail.Types
(
HasMail
(
..
))
import
Gargantext.Core.NLP
(
HasNLPServer
(
..
))
import
Gargantext.Core.NodeStory
import
Gargantext.Database.Prelude
(
HasConnectionPool
(
..
))
import
Gargantext.Database.Query.Table.Node.Error
import
Gargantext.Core.Config
import
Gargantext.Core.Config.Mail
(
MailConfig
(
..
),
LoginType
(
NoAuth
),
SendEmailType
(
LogEmailToConsole
))
import
Gargantext.System.Logging
(
HasLogger
(
..
),
Logger
,
MonadLogger
(
..
))
import
Gargantext.Utils.Jobs
import
Network.URI
(
parseURI
)
import
Prelude
qualified
import
System.Log.FastLogger
qualified
as
FL
newtype
Counter
=
Counter
{
_Counter
::
IORef
Int
}
deriving
Eq
...
...
@@ -62,6 +61,7 @@ data TestEnv = TestEnv {
,
test_nodeStory
::
!
NodeStoryEnv
,
test_usernameGen
::
!
Counter
,
test_logger
::
!
(
Logger
(
GargM
TestEnv
BackendInternalError
))
,
test_worker_tid
::
!
ThreadId
}
newtype
TestMonad
a
=
TestMonad
{
runTestMonad
::
ReaderT
TestEnv
IO
a
}
...
...
@@ -96,9 +96,6 @@ data DBHandle = DBHandle {
,
_DBTmp
::
Tmp
.
DB
}
instance
HasNodeError
IOException
where
_NodeError
=
prism'
(
Prelude
.
userError
.
show
)
(
const
Nothing
)
instance
HasConnectionPool
TestEnv
where
connPool
=
to
(
_DBHandle
.
test_db
)
...
...
test/Test/Utils.hs
View file @
0457d4c4
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
module
Test.Utils
where
...
...
test/Test/Utils/Db.hs
0 → 100644
View file @
0457d4c4
module
Test.Utils.Db
where
import
Data.Maybe
(
fromJust
)
import
Database.PostgreSQL.Simple
qualified
as
PSQL
import
Database.PostgreSQL.Simple.Options
qualified
as
PSOpts
import
Database.Postgres.Temp
qualified
as
Tmp
import
Gargantext.Prelude
tmpDBToConnInfo
::
Tmp
.
DB
->
PSQL
.
ConnectInfo
tmpDBToConnInfo
db
=
PSQL
.
ConnectInfo
{
connectHost
=
fromJust
$
getLast
$
PSOpts
.
host
opts
,
connectPort
=
fromIntegral
$
fromJust
$
getLast
$
PSOpts
.
port
opts
,
connectUser
=
fromJust
$
getLast
$
PSOpts
.
user
opts
,
connectPassword
=
fromJust
$
getLast
$
PSOpts
.
password
opts
,
connectDatabase
=
fromJust
$
getLast
$
PSOpts
.
dbname
opts
}
where
opts
=
Tmp
.
toConnectionOptions
db
test/drivers/hspec/Main.hs
View file @
0457d4c4
...
...
@@ -8,7 +8,6 @@ import Control.Monad
import
Data.Text
(
isInfixOf
)
import
Gargantext.Core.Notifications.CentralExchange
qualified
as
CE
import
Gargantext.Core.Notifications.Dispatcher
qualified
as
D
import
Gargantext.Core.Notifications.Dispatcher.Types
qualified
as
DT
import
Gargantext.Core.Config.Types
(
NotificationsConfig
(
..
))
import
Shelly
hiding
(
FilePath
)
import
System.IO
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment