packages feed

cabal-install-3.18.2.0: tests/UnitTests/Distribution/Client/HttpUtils.hs

module UnitTests.Distribution.Client.HttpUtils
  ( tests
  ) where

import Distribution.Client.Compat.Prelude
import Prelude ()

import Distribution.Client.HttpUtils
  ( HttpTransport (..)
  , isOldHackageURI
  , remoteRepoTryUpgradeToHttps
  )
import Distribution.Client.Types (RemoteRepo (..), RepoName (..))
import Distribution.Verbosity (Verbosity (..), defaultVerbosityHandles, normal)
import Network.URI (URI, nullURI, parseURI)

import Test.Tasty
import Test.Tasty.HUnit

tests :: [TestTree]
tests =
  [ testGroup
      "isOldHackageURI"
      [ testCase "old hackage archive URI" $
          case parseURI "http://hackage.haskell.org/packages/archive" of
            Just uri -> assertBool "should be old hackage URI" (isOldHackageURI uri)
            Nothing -> assertFailure "failed to parse URI"
      , testCase "modern hackage package URI" $
          case parseURI "http://hackage.haskell.org/package/foo" of
            Just uri -> assertBool "should not be old hackage URI" (not (isOldHackageURI uri))
            Nothing -> assertFailure "failed to parse URI"
      , testCase "non-hackage URI" $
          case parseURI "http://example.com/packages/archive" of
            Just uri -> assertBool "should not be old hackage URI" (not (isOldHackageURI uri))
            Nothing -> assertFailure "failed to parse URI"
      ]
  , testGroup
      "remoteRepoTryUpgradeToHttps"
      [ testCase "upgrade http to https when supported" $ do
          let dummyUri = fromMaybe nullURI (parseURI "http://hackage.haskell.org/")
              repo = emptyTestRemoteRepo (RepoName "hackage") dummyUri
              dummyTransport =
                HttpTransport
                  { getHttp = \_ _ _ _ _ -> error "unused"
                  , postHttp = \_ _ _ _ -> error "unused"
                  , postHttpFile = \_ _ _ _ -> error "unused"
                  , putHttpFile = \_ _ _ _ _ -> error "unused"
                  , transportSupportsHttps = True
                  , transportManuallySelected = False
                  }
              normalVerbosity = Verbosity normal defaultVerbosityHandles
          upgraded <- remoteRepoTryUpgradeToHttps normalVerbosity dummyTransport repo
          show (remoteRepoURI upgraded) @?= "https://hackage.haskell.org/"
      ]
  ]

emptyTestRemoteRepo :: RepoName -> URI -> RemoteRepo
emptyTestRemoteRepo name uri =
  RemoteRepo
    { remoteRepoName = name
    , remoteRepoURI = uri
    , remoteRepoSecure = Nothing
    , remoteRepoRootKeys = []
    , remoteRepoKeyThreshold = 0
    , remoteRepoShouldTryHttps = True
    }