summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/SlackBuilder/InfoSpec.hs150
-rw-r--r--test/SlackBuilder/LatestVersionCheckSpec.hs53
-rw-r--r--test/SlackBuilder/PackageSpec.hs26
-rw-r--r--test/Spec.hs1
4 files changed, 230 insertions, 0 deletions
diff --git a/test/SlackBuilder/InfoSpec.hs b/test/SlackBuilder/InfoSpec.hs
new file mode 100644
index 0000000..769a45e
--- /dev/null
+++ b/test/SlackBuilder/InfoSpec.hs
@@ -0,0 +1,150 @@
+{- This Source Code Form is subject to the terms of the Mozilla Public License,
+ v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ obtain one at https://mozilla.org/MPL/2.0/. -}
+
+module SlackBuilder.InfoSpec
+ ( spec
+ ) where
+
+import Crypto.Hash (Digest, MD5, digestFromByteString)
+import qualified Data.ByteString as ByteString
+import Data.ByteString.Char8 (ByteString)
+import Data.Maybe (maybeToList)
+import qualified Data.Text.Encoding as Text
+import Data.Void (Void)
+import SlackBuilder.Info
+import Test.Hspec (Spec, describe, it, shouldBe)
+import Test.Hspec.Megaparsec (parseSatisfies, shouldSucceedOn)
+import Text.Megaparsec (parse)
+import Text.Megaparsec.Error (ParseErrorBundle)
+import Text.URI (mkURI)
+
+parseInfoFile'
+ :: ByteString
+ -> Either (ParseErrorBundle ByteString Void) PackageInfo
+parseInfoFile' = parse parseInfoFile ""
+
+infoDownload0 :: ByteString
+infoDownload0 = "PRGNAM=\"pkgnam\"\n\
+ \VERSION=\"1.2.3\"\n\
+ \HOMEPAGE=\"homepage\"\n\
+ \DOWNLOAD=\"\"\n\
+ \MD5SUM=\"\"\n\
+ \DOWNLOAD_x86_64=\"\"\n\
+ \MD5SUM_x86_64=\"\"\n\
+ \REQUIRES=\"\"\n\
+ \MAINTAINER=\"Z\"\n\
+ \EMAIL=\"test@example.com\"\n"
+
+infoDownload1 :: ByteString
+infoDownload1 = "PRGNAM=\"pkgnam\"\n\
+ \VERSION=\"1.2.3\"\n\
+ \HOMEPAGE=\"homepage\"\n\
+ \DOWNLOAD=\"https://dlackware.com/download.tar.gz\"\n\
+ \MD5SUM=\"0102030405060708090a0b0c0d0e0f10\"\n\
+ \DOWNLOAD_x86_64=\"\"\n\
+ \MD5SUM_x86_64=\"\"\n\
+ \REQUIRES=\"\"\n\
+ \MAINTAINER=\"Z\"\n\
+ \EMAIL=\"test@example.com\"\n"
+
+maybeToDoubleList :: forall a. Maybe a -> [a]
+maybeToDoubleList xs = [y | x <- maybeToList xs, y <- [x, x]]
+
+checksumSample :: [Digest MD5]
+checksumSample = maybeToList $ digestFromByteString (ByteString.pack [1 .. 16])
+
+spec :: Spec
+spec = do
+ describe "parseInfoFile" $ do
+ it "returns package on a valid input" $
+ parseInfoFile' `shouldSucceedOn` infoDownload1
+
+ it "returns an array with one element if one download is given" $
+ let condition = (== 1) . length . checksums
+ in parseInfoFile' infoDownload1 `parseSatisfies` condition
+
+ it "translates checksum characters into the binary format" $
+ let expected = ["0102030405060708090a0b0c0d0e0f10"]
+ condition = (== expected) . fmap show . checksums
+ in parseInfoFile' infoDownload1 `parseSatisfies` condition
+
+ it "accepts an empty downloads list" $
+ parseInfoFile' `shouldSucceedOn` infoDownload0
+
+ it "parses a package name with a dot" $
+ let given =
+ "PRGNAM=\"pkgnam.yaml\"\n\
+ \VERSION=\"1.2.3\"\n\
+ \HOMEPAGE=\"homepage\"\n\
+ \DOWNLOAD=\"https://dlackware.com/download.tar.gz\"\n\
+ \MD5SUM=\"0102030405060708090a0b0c0d0e0f10\"\n\
+ \DOWNLOAD_x86_64=\"\"\n\
+ \MD5SUM_x86_64=\"\"\n\
+ \REQUIRES=\"\"\n\
+ \MAINTAINER=\"Z\"\n\
+ \EMAIL=\"test@example.com\"\n"
+ in parseInfoFile' `shouldSucceedOn` given
+
+ it "parses to downloads in a single line" $
+ let given =
+ "PRGNAM=\"pkgnam.yaml\"\n\
+ \VERSION=\"1.2.3\"\n\
+ \HOMEPAGE=\"homepage\"\n\
+ \DOWNLOAD=\"https://dlackware.com/download1.tar.gz https://dlackware.com/download2.tar.gz\"\n\
+ \MD5SUM=\"0102030405060708090a0b0c0d0e0f10 0102030405060708090a0b0c0d0e0f11\"\n\
+ \DOWNLOAD_x86_64=\"\"\n\
+ \MD5SUM_x86_64=\"\"\n\
+ \REQUIRES=\"\"\n\
+ \MAINTAINER=\"Z\"\n\
+ \EMAIL=\"test@example.com\"\n"
+ in parseInfoFile' `shouldSucceedOn` given
+
+ it "parses downloads continuing on the next line" $
+ let given =
+ "PRGNAM=\"pkgnam.yaml\"\n\
+ \VERSION=\"1.2.3\"\n\
+ \HOMEPAGE=\"homepage\"\n\
+ \DOWNLOAD=\"https://dlackware.com/download1.tar.gz \\\n\
+ \ https://dlackware.com/download2.tar.gz\"\n\
+ \MD5SUM=\"0102030405060708090a0b0c0d0e0f10 \\\n\
+ \ 0102030405060708090a0b0c0d0e0f11\"\n\
+ \DOWNLOAD_x86_64=\"\"\n\
+ \MD5SUM_x86_64=\"\"\n\
+ \REQUIRES=\"\"\n\
+ \MAINTAINER=\"Z\"\n\
+ \EMAIL=\"test@example.com\"\n"
+ in parseInfoFile' `shouldSucceedOn` given
+
+ describe "generate" $ do
+ it "generates an .info file without downloads" $
+ let given = PackageInfo "pkgnam" "1.2.3" "homepage" [] [] [] [] [] "Z" "test@example.com"
+ in generate given `shouldBe` Text.decodeUtf8 infoDownload0
+
+ it "splits multiple downloads into multiple lines" $
+ let downloads' = maybeToDoubleList
+ $ mkURI "https://dlackware.com/download.tar.gz"
+ checksums' = maybeToDoubleList
+ $ digestFromByteString (ByteString.pack [1.. 16])
+ given = PackageInfo
+ "pkgnam" "1.2.3" "homepage" downloads' checksums' [] [] [] "Z" "test@example.com"
+ expected = "PRGNAM=\"pkgnam\"\n\
+ \VERSION=\"1.2.3\"\n\
+ \HOMEPAGE=\"homepage\"\n\
+ \DOWNLOAD=\"https://dlackware.com/download.tar.gz \\\n\
+ \ https://dlackware.com/download.tar.gz\"\n\
+ \MD5SUM=\"0102030405060708090a0b0c0d0e0f10 \\\n\
+ \ 0102030405060708090a0b0c0d0e0f10\"\n\
+ \DOWNLOAD_x86_64=\"\"\n\
+ \MD5SUM_x86_64=\"\"\n\
+ \REQUIRES=\"\"\n\
+ \MAINTAINER=\"Z\"\n\
+ \EMAIL=\"test@example.com\"\n"
+ in generate given `shouldBe` expected
+
+ it "prints the checksum as a sequence of hexadecimal numbers" $
+ let downloads' = maybeToList
+ $ mkURI "https://dlackware.com/download.tar.gz"
+ given = PackageInfo
+ "pkgnam" "1.2.3" "homepage" downloads' checksumSample [] [] [] "Z" "test@example.com"
+ in generate given `shouldBe` Text.decodeUtf8 infoDownload1
diff --git a/test/SlackBuilder/LatestVersionCheckSpec.hs b/test/SlackBuilder/LatestVersionCheckSpec.hs
new file mode 100644
index 0000000..54901c1
--- /dev/null
+++ b/test/SlackBuilder/LatestVersionCheckSpec.hs
@@ -0,0 +1,53 @@
+{- This Source Code Form is subject to the terms of the Mozilla Public License,
+ v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ obtain one at https://mozilla.org/MPL/2.0/. -}
+
+module SlackBuilder.LatestVersionCheckSpec
+ ( spec
+ ) where
+
+import SlackBuilder.LatestVersionCheck
+import Test.Hspec (Spec, describe, it, shouldBe)
+
+spec :: Spec
+spec = do
+ describe "match" $ do
+ it "matches an exact tag prefixed with v" $
+ let expected = Just "2.6.0"
+ actual = match "(v)2.6.0" "v2.6.0"
+ in actual `shouldBe` expected
+
+ it "matches a glob pattern prefixed with v" $
+ let expected = Just "2.6.0"
+ actual = match "(v)*" "v2.6.0"
+ in actual `shouldBe` expected
+
+ it "matches digits" $
+ let expected = Just "2.6.0"
+ actual = match "(v)2.6.\\d" "v2.6.0"
+ in actual `shouldBe` expected
+
+ it "matches digits and dots" $
+ let expected = Just "2.6.0"
+ actual = match "(v)\\." "v2.6.0"
+ in actual `shouldBe` expected
+
+ it "rejects unexpected suffix" $
+ let expected = Nothing
+ actual = match "(v)\\." "v2.6.0-rc1"
+ in actual `shouldBe` expected
+
+ it "rejects remaining umatched characters" $
+ let expected = Nothing
+ actual = match "2.6.0-rc1" "2.6.0"
+ in actual `shouldBe` expected
+
+ it "consumes the last token matching nothing" $
+ let expected = Just "abc"
+ actual = match "abc\\d\\d" "abc"
+ in actual `shouldBe` expected
+
+ it "matches at least one digit" $
+ let expected = Nothing
+ actual = match "1.\\D.3" "1..3"
+ in actual `shouldBe` expected
diff --git a/test/SlackBuilder/PackageSpec.hs b/test/SlackBuilder/PackageSpec.hs
new file mode 100644
index 0000000..79fce72
--- /dev/null
+++ b/test/SlackBuilder/PackageSpec.hs
@@ -0,0 +1,26 @@
+{- This Source Code Form is subject to the terms of the Mozilla Public License,
+ v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ obtain one at https://mozilla.org/MPL/2.0/. -}
+
+module SlackBuilder.PackageSpec
+ ( spec
+ ) where
+
+import SlackBuilder.Package
+import Test.Hspec (Spec, describe, it, shouldBe)
+import Text.URI.QQ (uri)
+
+spec :: Spec
+spec = do
+ describe "renderDownloadWithVersion" $ do
+ it "renders text as URL" $
+ let given = DownloadTemplate "https://example.com"
+ actual = renderDownloadWithVersion given "1.2"
+ expected = Just [uri|https://example.com|]
+ in actual `shouldBe` expected
+
+ it "renders the components in order" $
+ let given = DownloadTemplate "https://example.com/{version}/segment"
+ actual = renderDownloadWithVersion given "1.2"
+ expected = Just [uri|https://example.com/1.2/segment|]
+ in actual `shouldBe` expected
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
index 0000000..a824f8c
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}