packages feed

shellify-0.10.0: test/Spec.hs

import Test.Hspec (describe, hspec, it, shouldBe)

import Options
import TestHelpers


main = hspec $ do

  describe "When passing option combinations" $ do
    it "should print a message saying no package is specified when no argument is supplied" $
      shellifyWithArgs ""
        `shouldReturnSubstring`
      "without any packages specified"

    it "should complain if no package is specified" $
      shellifyWithArgs "nipkgs#cowsay"
        `shouldReturnSubstring`
      "without any packages specified"

    it "should show help text when requested" $ do
      shellifyWithArgs "-h"
          `shouldReturnSubstring` "USAGE:"
      shellifyWithArgs "--help"
          `shouldReturnSubstring` "USAGE:"

    it "should not support -p with shell" $ do
      shellifyWithArgs "shell -p cowsay"
         `shouldBe`
        Left "-p not supported with new style commands"
      shellifyWithArgs "shell nixpkgs#python --packages foo nixpkgs#cowsay"
         `shouldBe`
        Left "--packages not supported with new style commands"

    it "should allow a simple command to be specified with a package" $
      theOptions "-p python --command cowsay"
        `shouldBe`
      Right def{packages=["python"], command=Just "cowsay"}

    it "should allow a simple command to be specified before a package" $
      theOptions "--run cowsay -p python"
        `shouldBe`
      Right def{packages=["python"], command=Just "cowsay"}

    it "should allow a simple command to be specified before and after a package" $
      theOptions "-p cowsay --command cowsay -p python"
        `shouldBe`
      Right def{packages=[ "cowsay", "python" ], command=Just "cowsay"}

    it "Should fail if command has no argument" $ do
      shellifyWithArgs "--command -p python"
          `shouldReturnSubstring` "Argument missing to switch"
      shellifyWithArgs "--command"
          `shouldReturnSubstring` "Argument missing to switch"

    it "should be able to specify one program to install after other arguments" $
      "foo -p python"
        `shouldResultInPackages`
      [ "python" ]

    it "should support multiple packages passed to -p" $
      "-p python cowsay"
        `shouldResultInPackages`
      [ "cowsay", "python" ]

    it "should only accept packages up to the next switch" $
      "-p python --arg x 2"
        `shouldResultInPackages`
      [ "python" ]

    it "should support multiple adjacent -p switches" $
      "-p python -p cowsay"
        `shouldResultInPackages`
      [ "python", "cowsay" ]

    it "should support separated -p switches" $
      "-p cowsay --foo -p python"
        `shouldResultInPackages`
      [ "cowsay", "python" ]

    it "should support long switches" $
      "--packages cowsay"
        `shouldResultInPackages`
      [ "cowsay" ]

    it "should support new shell commands" $
      theOptions "shell nixpkgs#python nixpkgs#cowsay"
        `shouldBe`
      Right def{packages=[ "nixpkgs#python", "nixpkgs#cowsay" ], generateFlake=True}

  describe "when two buildInputs are required from two sources" $
    shellifyWithArgs "--with-flake shell foo#cowsay nixpkgs#python"
      `shouldReturnShellAndFlakeTextDefinedBy`
    "inputs-from-know-and-unknown-sources"

  describe "when using 2 simple buildInputs from one source" $
    shellifyWithArgs "shell --with-flake python cowsay"
      `shouldReturnShellAndFlakeTextDefinedBy`
    "two-nixpkgs-inputs"

  describe "when pulling from 2 different known sources" $
    shellifyWithArgs "shell nixpkgs#python blender-bin#blender_3_5"
      `shouldReturnShellAndFlakeTextDefinedBy`
    "inputs-from-different-registries"

  describe "when working with 2 nixkgs buildInputs" $
      shellifyWithArgs "shell nixpkgs#python nixpkgs#cowsay"
        `shouldReturnShellTextDefinedBy`
      "two-nixpkgs-inputs"

  describe "when working with multiple repos for known and unknown sources" $
      shellifyWithArgs "shell nixpkgs#python foo#cowsay"
        `shouldReturnShellTextDefinedBy`
      "multiple-repository-sources"

  describe "when a command is specified" $
      shellifyWithArgs "-p python -p cowsay --command cowsay"
        `shouldReturnShellTextDefinedBy`
      "two-build-inputs-and-command"