diff --git a/changelog.d/5-internal/WPB-5667 b/changelog.d/5-internal/WPB-5667 new file mode 100644 index 0000000000..a08d6ed8aa --- /dev/null +++ b/changelog.d/5-internal/WPB-5667 @@ -0,0 +1,3 @@ +Improved how tests are automatically extracted from the `integration` test suite. + +The test extractor parser has been improved to handle block comments, and to more strictly check for Haddock documentation for each test. \ No newline at end of file diff --git a/integration/Setup.hs b/integration/Setup.hs index cfb2d5327d..c04d77808a 100644 --- a/integration/Setup.hs +++ b/integration/Setup.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} {-# LANGUAGE LambdaCase #-} {-# OPTIONS_GHC -Wall #-} @@ -12,18 +13,21 @@ import Data.Maybe import Data.Monoid import qualified Data.Set as Set import Data.String -import Distribution.Simple hiding (Module (..)) +import Distribution.Simple hiding (Language (..), Module (..)) import Distribution.Simple.BuildPaths import Distribution.Simple.LocalBuildInfo import Distribution.Types.BuildInfo import Distribution.Types.Library +import Distribution.Types.PackageDescription import Distribution.Utils.Path +import Language.Haskell.Exts (Comment (..), Decl (TypeSig), Language (..), Module (..), Name (..), ParseMode (..), SrcSpanInfo, associateHaddock, fromParseResult, parseFileWithComments) +import qualified Language.Haskell.Exts as Exts import System.Directory import System.FilePath import Prelude -collectTests :: [FilePath] -> IO [(String, String, String, String)] -collectTests roots = do +collectTests :: FilePath -> [FilePath] -> IO [(String, String, String, String)] +collectTests pkgRoot roots = concat <$> traverse (findAllTests . (<> "/Test")) roots where findAllTests :: FilePath -> IO [(String, String, String, String)] @@ -34,7 +38,7 @@ collectTests roots = do findModuleTests :: FilePath -> FilePath -> IO [(String, String, String, String)] findModuleTests root path = do let modl = "Test." <> toModule root path - tests <- collectTestsInModule path + tests <- collectTestsInModule pkgRoot path pure $ map (\(testName, summary, full) -> (modl, testName, summary, full)) tests toModule :: FilePath -> FilePath -> String @@ -52,41 +56,102 @@ collectTests roots = do concat <$> traverse (findPaths . (d )) entries else pure [d] -contexts :: [a] -> [([a], a)] -contexts = go [] [] - where - go _ctx res [] = res - go ctx res (x : xs) = go (x : ctx) ((ctx, x) : res) xs - stripHaddock :: String -> String stripHaddock = \case - '-' : '-' : ' ' : '|' : ' ' : xs -> xs - '-' : '-' : ' ' : '|' : xs -> xs - '-' : '-' : ' ' : xs -> xs - '-' : '-' : xs -> xs + ' ' : '|' : ' ' : xs -> xs + ' ' : '|' : xs -> xs + ' ' : '^' : ' ' : xs -> xs + ' ' : '^' : xs -> xs + ' ' : xs -> xs xs -> xs collectDescription :: [String] -> (String, String) -collectDescription revLines = - let comments = reverse (map stripHaddock (takeWhile isComment revLines)) - in case uncons comments of - Nothing -> ("", "") - Just (summary, rest) -> (summary, unlines (dropWhile null rest)) +collectDescription ls = + case uncons $ stripHaddock <$> ls of + Nothing -> ("", "") + Just (summary, rest) -> (summary, unlines (dropWhile null rest)) -isComment :: String -> Bool -isComment ('-' : '-' : _) = True -isComment _ = False - -collectTestsInModule :: FilePath -> IO [(String, String, String)] -collectTestsInModule fn = do - s <- readFile fn - let xs = contexts (lines s) - pure $ flip mapMaybe xs $ \(previousLines, line) -> do - case words line of - (name@('t' : 'e' : 's' : 't' : _) : "::" : _) -> do - let (summary, fullDesc) = collectDescription previousLines - pure (name, summary, fullDesc) - _ -> Nothing +collectTestsInModule :: FilePath -> FilePath -> IO [(String, String, String)] +collectTestsInModule pkgRoot fn = do + -- associateHaddock requires all comments that we want to stick onto a test + -- should be in the Haddock style, otherwise they won't make it through the parser. + res <- + associateHaddock . fromParseResult + <$> parseFileWithComments + -- Haskell2010 is the closest we have to getting haskell-src-exts to + -- playing nicely with GHC2021. One annoying feature it can't handle is + -- ImportQualifiedPost, so all of our tests have to use traditional + -- qualified import syntax. + (ParseMode fn Haskell2010 extensions False False Nothing False) + absolutePath + case res of + Module _ _ _ _ decs -> + pure $ + decs >>= \case + TypeSig _ names _ -> mapMaybe testName names + _ -> [] + _ -> error "XmlPage and XmlHybrid handling not set up. Please fix me!" + where + extractComment :: Comment -> String + extractComment (Comment _ _ s) = s + testName :: Name (SrcSpanInfo, [Comment]) -> Maybe (String, String, String) + testName name = + let (n', comments) = + case name of + Ident (_, cs) n -> (n, extractComment <$> cs) + Symbol (_, cs) n -> (n, extractComment <$> cs) + in if "test" `isPrefixOf` n' + then + let (summary, rest) = collectDescription comments + in pure (n', summary, rest) + else Nothing + absolutePath = pkgRoot fn + -- All of the haskell-src-exts supported extensions that we are using. + -- Several that are in the cabal file couldn't be directly copied over, + -- but they aren't causing trouble at the moment. + -- ImportQualifiedPost is an important one we use elsewhere in this repo + -- that we can't use in `integration` as haskell-src-exts doesn't support + -- it currently. + extensions = + [ Exts.EnableExtension Exts.BangPatterns, + Exts.EnableExtension Exts.BlockArguments, + Exts.EnableExtension Exts.ConstraintKinds, + Exts.EnableExtension Exts.DataKinds, + Exts.EnableExtension Exts.DefaultSignatures, + Exts.EnableExtension Exts.DeriveFunctor, + Exts.EnableExtension Exts.DeriveGeneric, + Exts.EnableExtension Exts.DeriveTraversable, + Exts.EnableExtension Exts.DerivingStrategies, + Exts.EnableExtension Exts.DerivingVia, + Exts.EnableExtension Exts.EmptyCase, + Exts.EnableExtension Exts.FlexibleContexts, + Exts.EnableExtension Exts.FlexibleInstances, + Exts.EnableExtension Exts.FunctionalDependencies, + Exts.EnableExtension Exts.GADTs, + Exts.EnableExtension Exts.GeneralizedNewtypeDeriving, + Exts.EnableExtension Exts.InstanceSigs, + Exts.EnableExtension Exts.KindSignatures, + Exts.EnableExtension Exts.LambdaCase, + Exts.EnableExtension Exts.MultiParamTypeClasses, + Exts.EnableExtension Exts.MultiWayIf, + Exts.EnableExtension Exts.NamedFieldPuns, + Exts.EnableExtension Exts.OverloadedLabels, + Exts.EnableExtension Exts.PackageImports, + Exts.EnableExtension Exts.PatternSynonyms, + Exts.EnableExtension Exts.PolyKinds, + Exts.EnableExtension Exts.QuasiQuotes, + Exts.EnableExtension Exts.RankNTypes, + Exts.EnableExtension Exts.RecordWildCards, + Exts.EnableExtension Exts.ScopedTypeVariables, + Exts.EnableExtension Exts.StandaloneDeriving, + Exts.EnableExtension Exts.TupleSections, + Exts.EnableExtension Exts.TypeApplications, + Exts.EnableExtension Exts.TypeFamilies, + Exts.EnableExtension Exts.TypeFamilyDependencies, + Exts.EnableExtension Exts.TypeOperators, + Exts.EnableExtension Exts.UndecidableInstances, + Exts.EnableExtension Exts.ViewPatterns + ] testHooks :: UserHooks -> UserHooks testHooks hooks = @@ -104,7 +169,7 @@ testHooks hooks = for_ (Map.lookup cname (componentNameMap l)) $ \compBIs -> do for_ compBIs $ \compBI -> do let dest = autogenComponentModulesDir l compBI "RunAllTests.hs" - tests <- collectTests roots + tests <- collectTests (dataDir p) roots let modules = Set.toList (Set.fromList (map (\(m, _, _, _) -> m) tests)) createDirectoryIfMissing True (takeDirectory dest) writeFile diff --git a/integration/default.nix b/integration/default.nix index 84d88787e4..36f503e3c9 100644 --- a/integration/default.nix +++ b/integration/default.nix @@ -28,6 +28,7 @@ , extra , filepath , gitignoreSource +, haskell-src-exts , hex , HsOpenSSL , http-client @@ -80,7 +81,14 @@ mkDerivation { src = gitignoreSource ./.; isLibrary = true; isExecutable = true; - setupHaskellDepends = [ base Cabal containers directory filepath ]; + setupHaskellDepends = [ + base + Cabal + containers + directory + filepath + haskell-src-exts + ]; libraryHaskellDepends = [ aeson aeson-pretty diff --git a/integration/integration.cabal b/integration/integration.cabal index 6ed62b2c61..10b067985d 100644 --- a/integration/integration.cabal +++ b/integration/integration.cabal @@ -17,6 +17,7 @@ custom-setup , containers , directory , filepath + , haskell-src-exts common common-all default-language: GHC2021 @@ -50,6 +51,7 @@ common common-all MultiWayIf NamedFieldPuns NoImplicitPrelude + NoImportQualifiedPost OverloadedLabels OverloadedRecordDot PackageImports diff --git a/integration/test/API/Brig.hs b/integration/test/API/Brig.hs index 06c191dbe3..a6c8f01874 100644 --- a/integration/test/API/Brig.hs +++ b/integration/test/API/Brig.hs @@ -1,14 +1,14 @@ module API.Brig where import API.Common -import Data.Aeson qualified as Aeson -import Data.ByteString.Base64 qualified as Base64 -import Data.CaseInsensitive qualified as CI +import qualified Data.Aeson as Aeson +import qualified Data.ByteString.Base64 as Base64 +import qualified Data.CaseInsensitive as CI import Data.Foldable import Data.Function -import Data.Text qualified as T -import Data.Text.Encoding qualified as T -import Data.Vector qualified as V +import qualified Data.Text as T +import qualified Data.Text.Encoding as T +import qualified Data.Vector as V import GHC.Stack import Testlib.Prelude diff --git a/integration/test/API/BrigInternal.hs b/integration/test/API/BrigInternal.hs index e0492dd357..9db84307a1 100644 --- a/integration/test/API/BrigInternal.hs +++ b/integration/test/API/BrigInternal.hs @@ -1,7 +1,7 @@ module API.BrigInternal where import API.Common -import Data.Aeson qualified as Aeson +import qualified Data.Aeson as Aeson import Data.Aeson.Types (Pair) import Data.Function import Data.Maybe diff --git a/integration/test/API/Cargohold.hs b/integration/test/API/Cargohold.hs index 5e08d84d79..4b96bcb276 100644 --- a/integration/test/API/Cargohold.hs +++ b/integration/test/API/Cargohold.hs @@ -1,15 +1,15 @@ module API.Cargohold where -import Codec.MIME.Type qualified as MIME -import Data.Aeson qualified as Aeson +import qualified Codec.MIME.Type as MIME +import qualified Data.Aeson as Aeson import Data.ByteString.Builder -import Data.ByteString.Lazy qualified as LBS -import Data.ByteString.Lazy.Char8 qualified as LBSC -import Data.Text qualified as T +import qualified Data.ByteString.Lazy as LBS +import qualified Data.ByteString.Lazy.Char8 as LBSC +import qualified Data.Text as T import Data.Text.Encoding import Data.Time.Clock import GHC.Stack -import Network.HTTP.Client qualified as HTTP +import qualified Network.HTTP.Client as HTTP import Testlib.Prelude type LByteString = LBS.ByteString diff --git a/integration/test/API/Common.hs b/integration/test/API/Common.hs index b51125fca6..42e3397329 100644 --- a/integration/test/API/Common.hs +++ b/integration/test/API/Common.hs @@ -3,7 +3,7 @@ module API.Common where import Control.Monad import Control.Monad.IO.Class import Data.Array ((!)) -import Data.Array qualified as Array +import qualified Data.Array as Array import System.Random (randomRIO) import Testlib.Prelude diff --git a/integration/test/API/Federator.hs b/integration/test/API/Federator.hs index 089b79c45c..8a46c229bb 100644 --- a/integration/test/API/Federator.hs +++ b/integration/test/API/Federator.hs @@ -2,7 +2,7 @@ module API.Federator where import Data.Function import GHC.Stack -import Network.HTTP.Client qualified as HTTP +import qualified Network.HTTP.Client as HTTP import Testlib.Prelude getMetrics :: diff --git a/integration/test/API/Galley.hs b/integration/test/API/Galley.hs index 4a5822115e..f5b326dd85 100644 --- a/integration/test/API/Galley.hs +++ b/integration/test/API/Galley.hs @@ -6,15 +6,15 @@ module API.Galley where import API.Common import Control.Lens hiding ((.=)) import Control.Monad.Reader -import Data.Aeson qualified as Aeson -import Data.Aeson.Types qualified as Aeson -import Data.ByteString.Base64 qualified as B64 -import Data.ByteString.Base64.URL qualified as B64U -import Data.ByteString.Char8 qualified as BS -import Data.ByteString.Lazy qualified as LBS -import Data.ProtoLens qualified as Proto +import qualified Data.Aeson as Aeson +import qualified Data.Aeson.Types as Aeson +import qualified Data.ByteString.Base64 as B64 +import qualified Data.ByteString.Base64.URL as B64U +import qualified Data.ByteString.Char8 as BS +import qualified Data.ByteString.Lazy as LBS +import qualified Data.ProtoLens as Proto import Data.ProtoLens.Labels () -import Data.UUID qualified as UUID +import qualified Data.UUID as UUID import Numeric.Lens import Proto.Otr as Proto import Testlib.Prelude diff --git a/integration/test/API/GalleyInternal.hs b/integration/test/API/GalleyInternal.hs index f683e41a63..d1a84aa104 100644 --- a/integration/test/API/GalleyInternal.hs +++ b/integration/test/API/GalleyInternal.hs @@ -1,8 +1,8 @@ module API.GalleyInternal where -import Data.Aeson qualified as Aeson +import qualified Data.Aeson as Aeson import Data.String.Conversions (cs) -import Data.Vector qualified as Vector +import qualified Data.Vector as Vector import GHC.Stack import Testlib.Prelude diff --git a/integration/test/MLS/Util.hs b/integration/test/MLS/Util.hs index 17ffca1b70..23686c5f18 100644 --- a/integration/test/MLS/Util.hs +++ b/integration/test/MLS/Util.hs @@ -11,22 +11,22 @@ import Control.Monad.Codensity import Control.Monad.Cont import Control.Monad.Reader import Control.Monad.Trans.Maybe -import Data.Aeson qualified as A -import Data.Aeson qualified as Aeson -import Data.ByteString qualified as BS -import Data.ByteString.Base64 qualified as Base64 -import Data.ByteString.Char8 qualified as B8 -import Data.ByteString.Char8 qualified as C8 +import qualified Data.Aeson as A +import qualified Data.Aeson as Aeson +import qualified Data.ByteString as BS +import qualified Data.ByteString.Base64 as Base64 +import qualified Data.ByteString.Char8 as B8 +import qualified Data.ByteString.Char8 as C8 import Data.Default import Data.Foldable import Data.Function -import Data.Map qualified as Map +import qualified Data.Map as Map import Data.Maybe -import Data.Set qualified as Set -import Data.Text.Encoding qualified as T +import qualified Data.Set as Set +import qualified Data.Text.Encoding as T import Data.Traversable -import Data.UUID qualified as UUID -import Data.UUID.V4 qualified as UUIDV4 +import qualified Data.UUID as UUID +import qualified Data.UUID.V4 as UUIDV4 import GHC.Stack import Notifications import System.Directory diff --git a/integration/test/SetupHelpers.hs b/integration/test/SetupHelpers.hs index e7d8c749f0..e71c938541 100644 --- a/integration/test/SetupHelpers.hs +++ b/integration/test/SetupHelpers.hs @@ -9,7 +9,7 @@ import API.Common import API.Galley import Control.Monad.Reader import Data.Aeson hiding ((.=)) -import Data.Aeson.Types qualified as Aeson +import qualified Data.Aeson.Types as Aeson import Data.Default import Data.Function import Data.UUID.V1 (nextUUID) diff --git a/integration/test/Test/AccessUpdate.hs b/integration/test/Test/AccessUpdate.hs index c2e6674c01..0152c6e63e 100644 --- a/integration/test/Test/AccessUpdate.hs +++ b/integration/test/Test/AccessUpdate.hs @@ -27,7 +27,18 @@ import SetupHelpers import Testlib.Prelude import Testlib.ResourcePool --- @SF.Federation @SF.Separation @TSFI.RESTfulAPI @S2 +-- These two commented out tests exist to test the Setup.hs code. +-- Both of these tests should not appear in the output. + +-- testBar :: HasCallStack => App () +-- testBar = pure () + +{- +testBaz :: HasCallStack => App () +testBaz = pure () +-} + +-- | @SF.Federation @SF.Separation @TSFI.RESTfulAPI @S2 -- -- The test asserts that, among others, remote users are removed from a -- conversation when an access update occurs that disallows guests from diff --git a/integration/test/Test/AssetDownload.hs b/integration/test/Test/AssetDownload.hs index c595c84f0e..2d73fb7ff9 100644 --- a/integration/test/Test/AssetDownload.hs +++ b/integration/test/Test/AssetDownload.hs @@ -3,7 +3,7 @@ module Test.AssetDownload where import API.Cargohold import GHC.Stack import Network.HTTP.Client (Request (redirectCount)) -import Network.HTTP.Client qualified as HTTP +import qualified Network.HTTP.Client as HTTP import SetupHelpers import Testlib.Prelude diff --git a/integration/test/Test/Brig.hs b/integration/test/Test/Brig.hs index f35fbd1856..8fd19ca4d3 100644 --- a/integration/test/Test/Brig.hs +++ b/integration/test/Test/Brig.hs @@ -1,13 +1,13 @@ module Test.Brig where -import API.Brig qualified as BrigP -import API.BrigInternal qualified as BrigI +import qualified API.Brig as BrigP +import qualified API.BrigInternal as BrigI import API.Common (randomName) import Data.Aeson.Types hiding ((.=)) -import Data.Set qualified as Set +import qualified Data.Set as Set import Data.String.Conversions -import Data.UUID qualified as UUID -import Data.UUID.V4 qualified as UUID +import qualified Data.UUID as UUID +import qualified Data.UUID.V4 as UUID import GHC.Stack import SetupHelpers import Testlib.Assertions diff --git a/integration/test/Test/Client.hs b/integration/test/Test/Client.hs index caacd2051a..b512c08d08 100644 --- a/integration/test/Test/Client.hs +++ b/integration/test/Test/Client.hs @@ -3,7 +3,7 @@ module Test.Client where import API.Brig -import API.Brig qualified as API +import qualified API.Brig as API import API.Gundeck import Control.Lens hiding ((.=)) import Control.Monad.Codensity diff --git a/integration/test/Test/Conversation.hs b/integration/test/Test/Conversation.hs index 2b58404698..7ea60da566 100644 --- a/integration/test/Test/Conversation.hs +++ b/integration/test/Test/Conversation.hs @@ -27,8 +27,8 @@ import Control.Applicative import Control.Concurrent (threadDelay) import Control.Monad.Codensity import Control.Monad.Reader -import Data.Aeson qualified as Aeson -import Data.Text qualified as T +import qualified Data.Aeson as Aeson +import qualified Data.Text as T import GHC.Stack import Notifications import SetupHelpers hiding (deleteUser) diff --git a/integration/test/Test/Demo.hs b/integration/test/Test/Demo.hs index 102d6dc0f5..9691212c5f 100644 --- a/integration/test/Test/Demo.hs +++ b/integration/test/Test/Demo.hs @@ -3,10 +3,10 @@ -- | This module is meant to show how Testlib can be used module Test.Demo where -import API.Brig qualified as BrigP -import API.BrigInternal qualified as BrigI -import API.GalleyInternal qualified as GalleyI -import API.Nginz qualified as Nginz +import qualified API.Brig as BrigP +import qualified API.BrigInternal as BrigI +import qualified API.GalleyInternal as GalleyI +import qualified API.Nginz as Nginz import Control.Monad.Cont import GHC.Stack import SetupHelpers diff --git a/integration/test/Test/Errors.hs b/integration/test/Test/Errors.hs index 54f714fac0..795c862ded 100644 --- a/integration/test/Test/Errors.hs +++ b/integration/test/Test/Errors.hs @@ -4,9 +4,9 @@ module Test.Errors where import API.Brig import Control.Monad.Codensity import Control.Monad.Reader -import Data.Aeson qualified as Aeson -import Network.HTTP.Types qualified as HTTP -import Network.Wai qualified as Wai +import qualified Data.Aeson as Aeson +import qualified Network.HTTP.Types as HTTP +import qualified Network.Wai as Wai import SetupHelpers import Testlib.Mock import Testlib.Prelude diff --git a/integration/test/Test/Federation.hs b/integration/test/Test/Federation.hs index b52ea59f87..6ac43c3d3c 100644 --- a/integration/test/Test/Federation.hs +++ b/integration/test/Test/Federation.hs @@ -2,17 +2,17 @@ module Test.Federation where -import API.Brig qualified as BrigP +import qualified API.Brig as BrigP import API.Galley import Control.Lens import Control.Monad.Codensity import Control.Monad.Reader -import Data.ProtoLens qualified as Proto +import qualified Data.ProtoLens as Proto import Data.ProtoLens.Labels () import Notifications import Numeric.Lens -import Proto.Otr qualified as Proto -import Proto.Otr_Fields qualified as Proto +import qualified Proto.Otr as Proto +import qualified Proto.Otr_Fields as Proto import SetupHelpers import Testlib.Prelude import Testlib.ResourcePool diff --git a/integration/test/Test/Federator.hs b/integration/test/Test/Federator.hs index 99bdf155f2..cabf7a1a52 100644 --- a/integration/test/Test/Federator.hs +++ b/integration/test/Test/Federator.hs @@ -5,7 +5,7 @@ module Test.Federator where import API.Brig import API.Federator (getMetrics) import Data.Attoparsec.Text -import Data.ByteString qualified as BS +import qualified Data.ByteString as BS import Data.String.Conversions import Data.Text import SetupHelpers (randomUser) @@ -23,7 +23,7 @@ runFederatorMetrics getService = do where expectedString = "# TYPE http_request_duration_seconds histogram" --- The metrics setup for both internal and external federator servers +-- | The metrics setup for both internal and external federator servers -- are the same, so we can simply run the same test for both. testFederatorMetricsInternal :: App () testFederatorMetricsInternal = runFederatorMetrics federatorInternal diff --git a/integration/test/Test/MLS.hs b/integration/test/Test/MLS.hs index 6c58081fbc..049d3d8d4a 100644 --- a/integration/test/Test/MLS.hs +++ b/integration/test/Test/MLS.hs @@ -4,9 +4,9 @@ module Test.MLS where import API.Brig (claimKeyPackages, deleteClient) import API.Galley -import Data.ByteString.Base64 qualified as Base64 -import Data.ByteString.Char8 qualified as B8 -import Data.Text.Encoding qualified as T +import qualified Data.ByteString.Base64 as Base64 +import qualified Data.ByteString.Char8 as B8 +import qualified Data.Text.Encoding as T import MLS.Util import Notifications import SetupHelpers diff --git a/integration/test/Test/MLS/One2One.hs b/integration/test/Test/MLS/One2One.hs index 2252ab344e..ccd8365477 100644 --- a/integration/test/Test/MLS/One2One.hs +++ b/integration/test/Test/MLS/One2One.hs @@ -18,8 +18,8 @@ module Test.MLS.One2One where import API.Galley -import Data.ByteString.Base64 qualified as Base64 -import Data.ByteString.Char8 qualified as B8 +import qualified Data.ByteString.Base64 as Base64 +import qualified Data.ByteString.Char8 as B8 import MLS.Util import Notifications import SetupHelpers diff --git a/integration/test/Test/MLS/SubConversation.hs b/integration/test/Test/MLS/SubConversation.hs index 4f5767f4af..42cdb0ec95 100644 --- a/integration/test/Test/MLS/SubConversation.hs +++ b/integration/test/Test/MLS/SubConversation.hs @@ -3,7 +3,7 @@ module Test.MLS.SubConversation where import API.Galley import Control.Monad.Trans (lift) import Control.Monad.Trans.Maybe (MaybeT (runMaybeT)) -import Data.Set qualified as Set +import qualified Data.Set as Set import MLS.Util import Notifications import SetupHelpers diff --git a/integration/test/Test/MLS/Unreachable.hs b/integration/test/Test/MLS/Unreachable.hs index 9ac4e31f38..be8564352f 100644 --- a/integration/test/Test/MLS/Unreachable.hs +++ b/integration/test/Test/MLS/Unreachable.hs @@ -47,7 +47,7 @@ testAddUsersSomeReachable = do resp.status `shouldMatchInt` 533 (resp.json %. "unreachable_backends" & asList) `shouldMatch` [d] --- There is analogous counterpart for Proteus in the 'Test.Conversation' module. +-- | There is analogous counterpart for Proteus in the 'Test.Conversation' module. testAddUserWithUnreachableRemoteUsers :: HasCallStack => App () testAddUserWithUnreachableRemoteUsers = do resourcePool <- asks resourcePool diff --git a/integration/test/Test/Search.hs b/integration/test/Test/Search.hs index 955afd744f..ac66155b1b 100644 --- a/integration/test/Test/Search.hs +++ b/integration/test/Test/Search.hs @@ -1,11 +1,11 @@ module Test.Search where -import API.Brig qualified as BrigP -import API.BrigInternal qualified as BrigI -import API.Common qualified as API +import qualified API.Brig as BrigP +import qualified API.BrigInternal as BrigI +import qualified API.Common as API import API.Galley -import API.Galley qualified as Galley -import API.GalleyInternal qualified as GalleyI +import qualified API.Galley as Galley +import qualified API.GalleyInternal as GalleyI import GHC.Stack import SetupHelpers import Testlib.Assertions diff --git a/integration/test/Testlib/App.hs b/integration/test/Testlib/App.hs index faaf781496..6ffceccee9 100644 --- a/integration/test/Testlib/App.hs +++ b/integration/test/Testlib/App.hs @@ -1,11 +1,11 @@ module Testlib.App where import Control.Monad.Reader -import Control.Retry qualified as Retry +import qualified Control.Retry as Retry import Data.Aeson hiding ((.=)) import Data.IORef -import Data.Text qualified as T -import Data.Yaml qualified as Yaml +import qualified Data.Text as T +import qualified Data.Yaml as Yaml import GHC.Exception import GHC.Stack (HasCallStack) import System.FilePath diff --git a/integration/test/Testlib/Assertions.hs b/integration/test/Testlib/Assertions.hs index 39396ec951..390615730c 100644 --- a/integration/test/Testlib/Assertions.hs +++ b/integration/test/Testlib/Assertions.hs @@ -5,21 +5,21 @@ module Testlib.Assertions where import Control.Exception as E import Control.Monad.Reader import Data.Aeson (Value) -import Data.Aeson qualified as Aeson -import Data.Aeson.Encode.Pretty qualified as Aeson -import Data.ByteString.Base64 qualified as B64 -import Data.ByteString.Lazy qualified as BS +import qualified Data.Aeson as Aeson +import qualified Data.Aeson.Encode.Pretty as Aeson +import qualified Data.ByteString.Base64 as B64 +import qualified Data.ByteString.Lazy as BS import Data.Char import Data.Foldable import Data.Hex import Data.List -import Data.Map qualified as Map -import Data.Text qualified as Text -import Data.Text.Encoding qualified as Text -import Data.Text.Lazy qualified as TL -import Data.Text.Lazy.Encoding qualified as TL +import qualified Data.Map as Map +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text +import qualified Data.Text.Lazy as TL +import qualified Data.Text.Lazy.Encoding as TL import GHC.Stack as Stack -import Network.HTTP.Client qualified as HTTP +import qualified Network.HTTP.Client as HTTP import System.FilePath import Testlib.JSON import Testlib.Printing diff --git a/integration/test/Testlib/Cannon.hs b/integration/test/Testlib/Cannon.hs index 5be8be575e..2eb1be2be7 100644 --- a/integration/test/Testlib/Cannon.hs +++ b/integration/test/Testlib/Cannon.hs @@ -44,10 +44,10 @@ import Control.Concurrent import Control.Concurrent.Async import Control.Concurrent.STM.TChan import Control.Exception (throwIO) -import Control.Exception qualified as E +import qualified Control.Exception as E import Control.Monad import Control.Monad.Catch hiding (bracket) -import Control.Monad.Catch qualified as Catch +import qualified Control.Monad.Catch as Catch import Control.Monad.IO.Class import Control.Monad.Reader (asks) import Control.Monad.STM @@ -60,9 +60,9 @@ import Data.Maybe import Data.Traversable import Data.Word import GHC.Stack -import Network.HTTP.Client qualified as HTTP -import Network.HTTP.Client qualified as Http -import Network.WebSockets qualified as WS +import qualified Network.HTTP.Client as HTTP +import qualified Network.HTTP.Client as Http +import qualified Network.WebSockets as WS import System.Random (randomIO) import System.Timeout (timeout) import Testlib.App diff --git a/integration/test/Testlib/Env.hs b/integration/test/Testlib/Env.hs index 63b99d9633..0593e78347 100644 --- a/integration/test/Testlib/Env.hs +++ b/integration/test/Testlib/Env.hs @@ -8,15 +8,15 @@ import Data.Default import Data.Function ((&)) import Data.Functor import Data.IORef -import Data.Map qualified as Map +import qualified Data.Map as Map import Data.Maybe (fromMaybe) import Data.Set (Set) -import Data.Set qualified as Set +import qualified Data.Set as Set import Data.Traversable (for) -import Data.Yaml qualified as Yaml -import Database.CQL.IO qualified as Cassandra -import Network.HTTP.Client qualified as HTTP -import OpenSSL.Session qualified as OpenSSL +import qualified Data.Yaml as Yaml +import qualified Database.CQL.IO as Cassandra +import qualified Network.HTTP.Client as HTTP +import qualified OpenSSL.Session as OpenSSL import System.Directory import System.Environment (lookupEnv) import System.Exit diff --git a/integration/test/Testlib/HTTP.hs b/integration/test/Testlib/HTTP.hs index 2227d43942..aaa90ed43f 100644 --- a/integration/test/Testlib/HTTP.hs +++ b/integration/test/Testlib/HTTP.hs @@ -1,25 +1,25 @@ module Testlib.HTTP where -import Control.Exception qualified as E +import qualified Control.Exception as E import Control.Monad.Reader -import Data.Aeson qualified as Aeson -import Data.Aeson.Types qualified as Aeson +import qualified Data.Aeson as Aeson +import qualified Data.Aeson.Types as Aeson import Data.ByteString (ByteString) -import Data.ByteString.Char8 qualified as C8 -import Data.ByteString.Lazy qualified as L -import Data.CaseInsensitive qualified as CI +import qualified Data.ByteString.Char8 as C8 +import qualified Data.ByteString.Lazy as L +import qualified Data.CaseInsensitive as CI import Data.Function import Data.List import Data.List.Split (splitOn) import Data.Maybe import Data.String import Data.String.Conversions (cs) -import Data.Text qualified as T -import Data.Text.Encoding qualified as T +import qualified Data.Text as T +import qualified Data.Text.Encoding as T import GHC.Stack -import Network.HTTP.Client qualified as HTTP +import qualified Network.HTTP.Client as HTTP import Network.HTTP.Types (hLocation) -import Network.HTTP.Types qualified as HTTP +import qualified Network.HTTP.Types as HTTP import Network.URI (URI (..), URIAuth (..), parseURI) import Testlib.Assertions import Testlib.Env diff --git a/integration/test/Testlib/JSON.hs b/integration/test/Testlib/JSON.hs index a228aae86d..6e2259b292 100644 --- a/integration/test/Testlib/JSON.hs +++ b/integration/test/Testlib/JSON.hs @@ -6,23 +6,23 @@ import Control.Monad.IO.Class import Control.Monad.Trans.Class import Control.Monad.Trans.Maybe import Data.Aeson hiding ((.=)) -import Data.Aeson qualified as Aeson -import Data.Aeson.Encode.Pretty qualified as Aeson -import Data.Aeson.Key qualified as KM -import Data.Aeson.KeyMap qualified as KM -import Data.Aeson.Types qualified as Aeson +import qualified Data.Aeson as Aeson +import qualified Data.Aeson.Encode.Pretty as Aeson +import qualified Data.Aeson.Key as KM +import qualified Data.Aeson.KeyMap as KM +import qualified Data.Aeson.Types as Aeson import Data.ByteString (ByteString) -import Data.ByteString.Base64 qualified as Base64 -import Data.ByteString.Lazy.Char8 qualified as LC8 +import qualified Data.ByteString.Base64 as Base64 +import qualified Data.ByteString.Lazy.Char8 as LC8 import Data.Foldable import Data.Function import Data.Functor import Data.List.Split (splitOn) import Data.Maybe (fromMaybe) -import Data.Scientific qualified as Sci +import qualified Data.Scientific as Sci import Data.String -import Data.Text qualified as T -import Data.Text.Encoding qualified as T +import qualified Data.Text as T +import qualified Data.Text.Encoding as T import Data.Vector ((!?)) import GHC.Stack import Testlib.Types diff --git a/integration/test/Testlib/Mock.hs b/integration/test/Testlib/Mock.hs index e501452d55..9e957ccd70 100644 --- a/integration/test/Testlib/Mock.hs +++ b/integration/test/Testlib/Mock.hs @@ -7,10 +7,10 @@ import Control.Exception import Control.Monad.Codensity import Control.Monad.Reader import Data.Streaming.Network -import Network.Socket qualified as Socket -import Network.Wai qualified as Wai -import Network.Wai.Handler.Warp qualified as Warp -import Network.Wai.Handler.WarpTLS qualified as Warp +import qualified Network.Socket as Socket +import qualified Network.Wai as Wai +import qualified Network.Wai.Handler.Warp as Warp +import qualified Network.Wai.Handler.WarpTLS as Warp import Testlib.Prelude codensityApp :: (Wai.Request -> Codensity IO Wai.Response) -> Wai.Application diff --git a/integration/test/Testlib/ModService.hs b/integration/test/Testlib/ModService.hs index 09c2b23c30..98084b097b 100644 --- a/integration/test/Testlib/ModService.hs +++ b/integration/test/Testlib/ModService.hs @@ -10,7 +10,7 @@ where import Control.Concurrent import Control.Concurrent.Async -import Control.Exception qualified as E +import qualified Control.Exception as E import Control.Monad.Catch (catch, throwM) import Control.Monad.Codensity import Control.Monad.Extra @@ -25,12 +25,12 @@ import Data.Maybe import Data.Monoid import Data.String import Data.String.Conversions (cs) -import Data.Text qualified as Text -import Data.Text.IO qualified as Text +import qualified Data.Text as Text +import qualified Data.Text.IO as Text import Data.Traversable -import Data.Yaml qualified as Yaml +import qualified Data.Yaml as Yaml import GHC.Stack -import Network.HTTP.Client qualified as HTTP +import qualified Network.HTTP.Client as HTTP import System.Directory (copyFile, createDirectoryIfMissing, doesDirectoryExist, doesFileExist, listDirectory, removeDirectoryRecursive, removeFile) import System.FilePath import System.IO diff --git a/integration/test/Testlib/One2One.hs b/integration/test/Testlib/One2One.hs index ebecfd46ee..0ef4ab6ff5 100644 --- a/integration/test/Testlib/One2One.hs +++ b/integration/test/Testlib/One2One.hs @@ -20,13 +20,13 @@ module Testlib.One2One (generateRemoteAndConvIdWithDomain) where import Control.Error (atMay) -import Crypto.Hash qualified as Crypto +import qualified Crypto.Hash as Crypto import Data.Bits import Data.ByteArray (convert) import Data.ByteString -import Data.ByteString qualified as B +import qualified Data.ByteString as B import Data.ByteString.Conversion -import Data.ByteString.Lazy qualified as L +import qualified Data.ByteString.Lazy as L import Data.UUID as UUID import SetupHelpers (randomUser) import Testlib.Prelude diff --git a/integration/test/Testlib/Prelude.hs b/integration/test/Testlib/Prelude.hs index 27c9db153c..4f29605a22 100644 --- a/integration/test/Testlib/Prelude.hs +++ b/integration/test/Testlib/Prelude.hs @@ -169,7 +169,7 @@ import Prelude (^), (^^), ) -import Prelude qualified as P +import qualified Prelude as P ---------------------------------------------------------------------------- -- Lifted functions from Prelude diff --git a/integration/test/Testlib/ResourcePool.hs b/integration/test/Testlib/ResourcePool.hs index db685049da..560967c06d 100644 --- a/integration/test/Testlib/ResourcePool.hs +++ b/integration/test/Testlib/ResourcePool.hs @@ -18,16 +18,16 @@ import Control.Monad.IO.Class import Data.Foldable (for_) import Data.Functor import Data.IORef -import Data.Set qualified as Set +import qualified Data.Set as Set import Data.String -import Data.Text qualified as T +import qualified Data.Text as T import Data.Tuple import Database.CQL.IO import GHC.Stack (HasCallStack) import Network.AMQP.Extended import Network.RabbitMqAdmin import System.IO -import Testlib.Ports qualified as Ports +import qualified Testlib.Ports as Ports import Testlib.Types import Prelude diff --git a/integration/test/Testlib/Run.hs b/integration/test/Testlib/Run.hs index bba75ed064..de574293ee 100644 --- a/integration/test/Testlib/Run.hs +++ b/integration/test/Testlib/Run.hs @@ -7,9 +7,9 @@ import Control.Monad.Codensity import Control.Monad.IO.Class import Control.Monad.Reader import Crypto.Error -import Crypto.PubKey.Ed25519 qualified as Ed25519 +import qualified Crypto.PubKey.Ed25519 as Ed25519 import Data.ByteArray (convert) -import Data.ByteString qualified as B +import qualified Data.ByteString as B import Data.Foldable import Data.Function import Data.Functor diff --git a/integration/test/Testlib/Types.hs b/integration/test/Testlib/Types.hs index d08773d000..025ef39ba7 100644 --- a/integration/test/Testlib/Types.hs +++ b/integration/test/Testlib/Types.hs @@ -11,31 +11,31 @@ import Control.Monad.Catch import Control.Monad.Reader import Control.Monad.Trans.Control import Data.Aeson -import Data.Aeson qualified as Aeson +import qualified Data.Aeson as Aeson import Data.ByteString (ByteString) -import Data.ByteString qualified as BS -import Data.ByteString.Char8 qualified as C8 -import Data.ByteString.Lazy qualified as L -import Data.CaseInsensitive qualified as CI +import qualified Data.ByteString as BS +import qualified Data.ByteString.Char8 as C8 +import qualified Data.ByteString.Lazy as L +import qualified Data.CaseInsensitive as CI import Data.Char (toLower) import Data.Default import Data.Functor import Data.IORef import Data.List import Data.Map -import Data.Map qualified as Map +import qualified Data.Map as Map import Data.Set (Set) -import Data.Set qualified as Set +import qualified Data.Set as Set import Data.String -import Data.Text qualified as T -import Data.Text.Encoding qualified as T +import qualified Data.Text as T +import qualified Data.Text.Encoding as T import Data.Time import Data.Word import GHC.Generics (Generic) import GHC.Records import GHC.Stack -import Network.HTTP.Client qualified as HTTP -import Network.HTTP.Types qualified as HTTP +import qualified Network.HTTP.Client as HTTP +import qualified Network.HTTP.Types as HTTP import Network.URI import UnliftIO (MonadUnliftIO) import Prelude diff --git a/integration/test/Testlib/XML.hs b/integration/test/Testlib/XML.hs index 35235dec4d..1ec66d3e9b 100644 --- a/integration/test/Testlib/XML.hs +++ b/integration/test/Testlib/XML.hs @@ -1,11 +1,11 @@ module Testlib.XML where -import Data.Array qualified as Array +import qualified Data.Array as Array import Data.Fixed import Data.Time import Testlib.Types -import Text.Regex.Base qualified as Regex -import Text.Regex.TDFA.String qualified as Regex +import qualified Text.Regex.Base as Regex +import qualified Text.Regex.TDFA.String as Regex import Text.XML.Light import Prelude