content: module Composer.ComposerLockSpec (
    spec,
  ) where
  
  import Data.Aeson
  import Data.ByteString qualified as BS
  import Data.Map.Strict qualified as Map
  import Data.Set qualified as Set
  import DepTypes
  import GraphUtil
  import Strategy.Composer
  import Test.Hspec
  
  dependencyOne :: Dependency
  dependencyOne =
    Dependency
      { dependencyType = ComposerType
      , dependencyName = "one"
      , dependencyVersion = Just (CEq "1.0.0")
      , dependencyLocations = []
      , dependencyEnvironments = Set.singleton EnvProduction
      , dependencyTags = Map.empty
      }
  
  dependencyTwo :: Dependency
  dependencyTwo =
    Dependency
      { dependencyType = ComposerType
      , dependencyName = "two"
      , dependencyVersion = Just (CEq "2.0.0")
      , dependencyLocations = []
      , dependencyEnvironments = Set.singleton EnvProduction
      , dependencyTags = Map.empty
      }
  
  dependencyThree :: Dependency
  dependencyThree =
    Dependency
      { dependencyType = ComposerType
      , dependencyName = "three"
      , dependencyVersion = Just (CEq "3.0.0")
      , dependencyLocations = []
      , dependencyEnvironments = Set.singleton EnvProduction
      , dependencyTags = Map.empty
      }
  
  dependencyFour :: Dependency
  dependencyFour =
    Dependency
      { dependencyType = ComposerType
      , dependencyName = "four"
      , dependencyVersion = Just (CEq "4.0.0")
      , dependencyLocations = []
      , dependencyEnvironments = Set.singleton EnvProduction
      , dependencyTags = Map.empty
      }
  
  dependencyFive :: Dependency
  dependencyFive =
    Dependency
      { dependencyType = ComposerType
      , dependencyName = "five"
      , dependencyVersion = Just (CEq "5.0.0")
      , dependencyLocations = []
      , dependencyEnvironments = Set.singleton EnvDevelopment
      , dependencyTags = Map.empty
      }
  
  dependencySourceless :: Dependency
  dependencySourceless =
    Dependency
      { dependencyType = ComposerType
      , dependencyName = "sourceless"
      , dependencyVersion = Just (CEq "5.0.0")
      , dependencyLocations = []
      , dependencyEnvironments = Set.singleton EnvProduction
      , dependencyTags = Map.empty
      }
  
  spec :: Spec
  spec = do
    testFile <- runIO (BS.readFile "test/Composer/testdata/composer.lock")
    describe "composer.lock analyzer" $
      it "reads a file and constructs an accurate graph" $
        case eitherDecodeStrict testFile of
          Right res -> do
            let graph = buildGraph res
            expectDeps [dependencyOne, dependencyTwo, dependencyThree, dependencyFour, dependencyFive, dependencySourceless] graph
            expectDirect [dependencyOne, dependencyTwo, dependencyThree, dependencyFour, dependencyFive, dependencySourceless] graph
            expectEdges [(dependencyOne, dependencyTwo), (dependencyOne, dependencyTwo), (dependencyTwo, dependencyFour)] graph
          Left err -> expectationFailure $ show err
  