packages feed

cachix-0.3.0: test/NixConfSpec.hs

{-# LANGUAGE QuasiQuotes #-}

module NixConfSpec where

import Cachix.Api (BinaryCache (..))
import Cachix.Client.NixConf as NixConf
import Data.String.Here
import Protolude
import Test.Hspec

property :: Text -> Expectation
property x = NixConf.render <$> parse x `shouldBe` Right x

bc :: BinaryCache
bc = BinaryCache
  { name = "name",
    uri = "https://name.cachix.org",
    isPublic = True,
    publicSigningKeys = ["pub"],
    githubUsername = "foobar"
    }

spec :: Spec
spec = do
  describe "render . parse" $ do
    it "handles single value substituters"
      $ property "substituters = a\n"
    it "handles multi value substituters"
      $ property "substituters = a b c\n"
    it "handles all known keys"
      $ property "substituters = a b c\ntrusted-users = him me\ntrusted-public-keys = a\n"
    it "random content"
      $ property "blabla = foobar\nfoo = bar\n"
  describe "add" $ do
    it "merges binary caches from both files"
      $ let globalConf =
              NixConf
                [ Substituters ["bc1"],
                  TrustedPublicKeys ["pub1"]
                  ]
            localConf =
              NixConf
                [ Substituters ["bc2"],
                  TrustedPublicKeys ["pub2"]
                  ]
            result =
              NixConf
                [ Substituters [defaultPublicURI, "bc1", "bc2", "https://name.cachix.org"],
                  TrustedPublicKeys [defaultSigningKey, "pub1", "pub2", "pub"]
                  ]
       in add bc [globalConf, localConf] localConf `shouldBe` result
    it "is noop if binary cache exists in one file"
      $ let globalConf =
              NixConf
                [ Substituters [defaultPublicURI, "https://name.cachix.org"],
                  TrustedPublicKeys [defaultSigningKey, "pub"]
                  ]
            localConf = NixConf []
            result =
              NixConf
                [ Substituters [defaultPublicURI, "https://name.cachix.org"],
                  TrustedPublicKeys [defaultSigningKey, "pub"]
                  ]
       in add bc [globalConf, localConf] localConf `shouldBe` result
    it "preserves other nixconf entries"
      $ let globalConf =
              NixConf
                [ Substituters ["http"],
                  TrustedPublicKeys ["pub1"],
                  TrustedUsers ["user"],
                  Other "foo"
                  ]
            localConf =
              NixConf
                [ TrustedUsers ["user2"],
                  Other "bar"
                  ]
            result =
              NixConf
                [ TrustedUsers ["user2"],
                  Other "bar",
                  Substituters [defaultPublicURI, "http", "https://name.cachix.org"],
                  TrustedPublicKeys [defaultSigningKey, "pub1", "pub"]
                  ]
       in add bc [globalConf, localConf] localConf `shouldBe` result
    it "removed duplicates"
      $ let globalConf =
              NixConf
                [ Substituters ["bc1", "bc1"],
                  TrustedPublicKeys ["pub1", "pub1"]
                  ]
            localConf =
              NixConf
                [ Substituters ["bc2", "bc2"],
                  TrustedPublicKeys ["pub2", "pub2"]
                  ]
            result =
              NixConf
                [ Substituters [defaultPublicURI, "bc1", "bc2", "https://name.cachix.org"],
                  TrustedPublicKeys [defaultSigningKey, "pub1", "pub2", "pub"]
                  ]
       in add bc [globalConf, localConf] localConf `shouldBe` result
    it "adds binary cache and defaults if no existing entries exist"
      $ let globalConf = NixConf []
            localConf = NixConf []
            result =
              NixConf
                [ Substituters [defaultPublicURI, "https://name.cachix.org"],
                  TrustedPublicKeys [defaultSigningKey, "pub"]
                  ]
       in add bc [globalConf, localConf] localConf `shouldBe` result
  describe "parse" $ do
    it "parses substituters"
      $ parse "substituters = a\n"
      `shouldBe` (Right $ NixConf [Substituters ["a"]])
    it "parses long key"
      $ parse "binary-caches-parallel-connections = 40\n"
      `shouldBe` (Right $ NixConf [Other "binary-caches-parallel-connections = 40"])
    it "parses substituters with multiple values"
      $ parse "substituters = a b c\n"
      `shouldBe` (Right $ NixConf [Substituters ["a", "b", "c"]])
    it "parses equal sign after the first key as literal"
      $ parse "substituters = a b c= d\n"
      `shouldBe` (Right $ NixConf [Substituters ["a", "b", "c=", "d"]])
    it "parses with missing endline"
      $ parse "allowed-users = *"
      `shouldBe` (Right $ NixConf [Other "allowed-users = *"])
    it "parses a complex example"
      $ parse realExample
      `shouldBe` ( Right
                     $ NixConf
                         [ Other "",
                           Substituters ["a", "b", "c"],
                           TrustedUsers ["him", "me"],
                           TrustedPublicKeys ["a"],
                           Other "blabla =  asd",
                           Other "# comment",
                           Other "",
                           Other ""
                           ]
                   )

realExample :: Text
realExample =
  [hereLit|
substituters = a  b c
trusted-users = him me
trusted-public-keys  =  a
blabla =  asd
# comment


|]