packages feed

purl-0.1.0.0: test/Spec.hs

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Monad
import Data.Bifunctor (Bifunctor (bimap))
import Data.Map.Strict qualified as M
import Data.Purl
import Data.Text (Text)
import Test.Tasty
import Test.Tasty.HUnit

main :: IO ()
main = defaultMain $
    testCase "Data.Purl" $ do
        forM_ examples $ \(purlString, expectedPurl) -> do
            case parsePurl purlString of
                Left e -> assertFailure (show e)
                Right purl -> do
                    purl @?= expectedPurl
                    purlText purl @?= purlString

examples :: [(Text, Purl)]
examples =
    [
        ( "pkg:bitbucket/birkenfeld/pygments-main@244fd47e07d1014f0aed9c"
        , (newPurlOther "bitbucket" (PurlName "pygments-main"))
            { purlNamespace = Just $ PurlNamespace ["birkenfeld"]
            , purlVersion = Just $ PurlVersion "244fd47e07d1014f0aed9c"
            }
        )
    ,
        ( "pkg:deb/debian/curl@7.50.3-1?arch=i386&distro=jessie"
        , (newPurlOther "deb" (PurlName "curl"))
            { purlNamespace = Just $ PurlNamespace ["debian"]
            , purlVersion = Just $ PurlVersion "7.50.3-1"
            , purlQualifiers = mkQualifiers [("arch", "i386"), ("distro", "jessie")]
            }
        )
    ,
        ( "pkg:docker/cassandra@sha256:244fd47e07d1004f0aed9c"
        , (newPurlOther "docker" (PurlName "cassandra"))
            { purlVersion = Just $ PurlVersion "sha256:244fd47e07d1004f0aed9c"
            }
        )
    ,
        ( "pkg:docker/customer/dockerimage@sha256:244fd47e07d1004f0aed9c?repository_url=gcr.io"
        , (newPurlOther "docker" (PurlName "dockerimage"))
            { purlNamespace = Just $ PurlNamespace ["customer"]
            , purlVersion = Just $ PurlVersion "sha256:244fd47e07d1004f0aed9c"
            , purlQualifiers = mkQualifiers [("repository_url", "gcr.io")]
            }
        )
    ,
        ( "pkg:gem/jruby-launcher@1.1.2?platform=java"
        , (newPurlOther "gem" (PurlName "jruby-launcher"))
            { purlVersion = Just $ PurlVersion "1.1.2"
            , purlQualifiers = mkQualifiers [("platform", "java")]
            }
        )
    ,
        ( "pkg:gem/ruby-advisory-db-check@0.12.4"
        , (newPurlOther "gem" (PurlName "ruby-advisory-db-check"))
            { purlVersion = Just $ PurlVersion "0.12.4"
            }
        )
    ,
        ( "pkg:github/package-url/purl-spec@244fd47e07d1004f0aed9c"
        , (newPurlOther "github" (PurlName "purl-spec"))
            { purlNamespace = Just $ PurlNamespace ["package-url"]
            , purlVersion = Just $ PurlVersion "244fd47e07d1004f0aed9c"
            }
        )
    ,
        ( "pkg:golang/google.golang.org/genproto#googleapis/api/annotations"
        , (newPurlOther "golang" (PurlName "genproto"))
            { purlNamespace = Just $ PurlNamespace ["google.golang.org"]
            , purlSubPath = Just $ PurlSubPath ["googleapis", "api", "annotations"]
            }
        )
    ,
        ( "pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?packaging=sources"
        , (newPurlOther "maven" (PurlName "batik-anim"))
            { purlNamespace = Just $ PurlNamespace ["org.apache.xmlgraphics"]
            , purlVersion = Just $ PurlVersion "1.9.1"
            , purlQualifiers = mkQualifiers [("packaging", "sources")]
            }
        )
    ,
        ( "pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?repository_url=repo.spring.io/release"
        , (newPurlOther "maven" (PurlName "batik-anim"))
            { purlNamespace = Just $ PurlNamespace ["org.apache.xmlgraphics"]
            , purlVersion = Just $ PurlVersion "1.9.1"
            , purlQualifiers = mkQualifiers [("repository_url", "repo.spring.io/release")]
            }
        )
    ,
        ( "pkg:golang/google.golang.org/genproto#googleapis/api/annotations"
        , (newPurlOther "golang" (PurlName "genproto"))
            { purlNamespace = Just $ PurlNamespace ["google.golang.org"]
            , purlSubPath = Just $ PurlSubPath ["googleapis", "api", "annotations"]
            }
        )
    ,
        ( "pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?packaging=sources"
        , (newPurlOther "maven" (PurlName "batik-anim"))
            { purlNamespace = Just $ PurlNamespace ["org.apache.xmlgraphics"]
            , purlVersion = Just $ PurlVersion "1.9.1"
            , purlQualifiers = mkQualifiers [("packaging", "sources")]
            }
        )
    ,
        ( "pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?repository_url=repo.spring.io/release"
        , (newPurlOther "maven" (PurlName "batik-anim"))
            { purlNamespace = Just $ PurlNamespace ["org.apache.xmlgraphics"]
            , purlVersion = Just $ PurlVersion "1.9.1"
            , purlQualifiers = mkQualifiers [("repository_url", "repo.spring.io/release")]
            }
        )
    ,
        ( "pkg:npm/%40angular/animation@12.3.1"
        , (newPurlOther "npm" (PurlName "animation"))
            { purlNamespace = Just $ PurlNamespace ["%40angular"]
            , purlVersion = Just $ PurlVersion "12.3.1"
            }
        )
    ,
        ( "pkg:npm/foobar@12.3.1"
        , (newPurlOther "npm" (PurlName "foobar"))
            { purlVersion = Just $ PurlVersion "12.3.1"
            }
        )
    ,
        ( "pkg:nuget/EnterpriseLibrary.Common@6.0.1304"
        , (newPurlOther "nuget" (PurlName "EnterpriseLibrary.Common"))
            { purlVersion = Just $ PurlVersion "6.0.1304"
            }
        )
    ,
        ( "pkg:pypi/django@1.11.1"
        , (newPurlOther "pypi" (PurlName "django"))
            { purlVersion = Just $ PurlVersion "1.11.1"
            }
        )
    ,
        ( "pkg:rpm/fedora/curl@7.50.3-1.fc25?arch=i386&distro=fedora-25"
        , (newPurlOther "rpm" (PurlName "curl"))
            { purlNamespace = Just $ PurlNamespace ["fedora"]
            , purlVersion = Just $ PurlVersion "7.50.3-1.fc25"
            , purlQualifiers = mkQualifiers [("arch", "i386"), ("distro", "fedora-25")]
            }
        )
    ,
        ( "pkg:rpm/opensuse/curl@7.56.1-1.1.?arch=i386&distro=opensuse-tumbleweed"
        , (newPurlOther "rpm" (PurlName "curl"))
            { purlNamespace = Just $ PurlNamespace ["opensuse"]
            , purlVersion = Just $ PurlVersion "7.56.1-1.1."
            , purlQualifiers = mkQualifiers [("arch", "i386"), ("distro", "opensuse-tumbleweed")]
            }
        )
    ]
  where
    mkQualifiers = M.fromList . map (bimap PurlQualifierKey PurlQualifierValue)