hadolint-2.1.0: test/Spec.hs
import qualified ConfigSpec
import qualified Data.Text as Text
import qualified DL3000
import qualified DL3001
import qualified DL3002
import qualified DL3003
import qualified DL3004
import qualified DL3005
import qualified DL3006
import qualified DL3007
import qualified DL3008
import qualified DL3009
import qualified DL3010
import qualified DL3011
import qualified DL3012
import qualified DL3013
import qualified DL3014
import qualified DL3015
import qualified DL3016
import qualified DL3017
import qualified DL3018
import qualified DL3019
import qualified DL3020
import qualified DL3021
import qualified DL3022
import qualified DL3023
import qualified DL3024
import qualified DL3025
import qualified DL3026
import qualified DL3027
import qualified DL3028
import qualified DL3029
import qualified DL3030
import qualified DL3031
import qualified DL3032
import qualified DL3033
import qualified DL3034
import qualified DL3035
import qualified DL3036
import qualified DL3037
import qualified DL3038
import qualified DL3039
import qualified DL3040
import qualified DL3041
import qualified DL3042
import qualified DL3043
import qualified DL3044
import qualified DL3045
import qualified DL3046
import qualified DL3047
import qualified DL3048
import qualified DL3049
import qualified DL3050
import qualified DL3051
import qualified DL3052
import qualified DL3053
import qualified DL3054
import qualified DL3055
import qualified DL3056
import qualified DL3057
import qualified DL3058
import qualified DL4001
import qualified DL4003
import qualified DL4004
import qualified DL4005
import qualified DL4006
import Hadolint.Formatter.TTY (formatError)
import Helpers
import Language.Docker.Parser
import qualified Shellcheck
import qualified ShellSpec
import Test.HUnit hiding (Label)
import Test.Hspec
main :: IO ()
main =
hspec $ do
let ?rulesConfig = mempty -- default implicit parameter running the checkers
describe "format error" $
it "display error after line pos" $ do
let ast = parseText "FOM debian:jessie"
expectedMsg =
"<string>:1:1 unexpected 'F' expecting '#', ADD, ARG, CMD, COPY, ENTRYPOINT, "
<> "ENV, EXPOSE, FROM, HEALTHCHECK, LABEL, MAINTAINER, ONBUILD, RUN, SHELL, STOPSIGNAL, "
<> "USER, VOLUME, WORKDIR, or end of input "
case ast of
Left err -> assertEqual "Unexpected error msg" expectedMsg (formatError err)
Right _ -> assertFailure "AST should fail parsing"
--
describe "Rules can be ignored with inline comments" $ do
it "ignores single rule" $
let dockerFile =
[ "FROM ubuntu",
"# hadolint ignore=DL3002",
"USER root"
]
in ruleCatchesNot "DL3002" $ Text.unlines dockerFile
it "ignores only the given rule" $
let dockerFile =
[ "FROM scratch",
"# hadolint ignore=DL3001",
"USER root"
]
in ruleCatches "DL3002" $ Text.unlines dockerFile
it "ignores only the given rule, when multiple passed" $
let dockerFile =
[ "FROM scratch",
"# hadolint ignore=DL3001,DL3002",
"USER root"
]
in ruleCatchesNot "DL3002" $ Text.unlines dockerFile
it "ignores the rule only if directly above the instruction" $
let dockerFile =
[ "# hadolint ignore=DL3001,DL3002",
"FROM ubuntu",
"USER root"
]
in ruleCatches "DL3002" $ Text.unlines dockerFile
it "won't ignore the rule if passed invalid rule names" $
let dockerFile =
[ "FROM scratch",
"# hadolint ignore=crazy,DL3002",
"USER root"
]
in ruleCatches "DL3002" $ Text.unlines dockerFile
it "ignores multiple rules correctly, even with some extra whitespace" $
let dockerFile =
[ "FROM node as foo",
"# hadolint ignore=DL3023, DL3021",
"COPY --from=foo bar baz ."
]
in do
ruleCatchesNot "DL3023" $ Text.unlines dockerFile
ruleCatchesNot "DL3021" $ Text.unlines dockerFile
--
describe "Regression Tests" $ do
it "Comments with backslashes at the end are just comments" $
let dockerFile =
[ "FROM alpine:3.6",
"# The following comment makes hadolint still complain about DL4006",
"# \\",
"# should solve DL4006",
"SHELL [\"/bin/sh\", \"-o\", \"pipefail\", \"-c\"]",
"# RUN with pipe. causes DL4006, but should be fixed by above SHELL",
"RUN echo \"kaka\" | sed 's/a/o/g' >> /root/afile"
]
in ruleCatches "DL4006" $ Text.unlines dockerFile
it "`ARG` can correctly unset variables" $
let dockerFile =
[ "ARG A_WITHOUT_EQ",
"ARG A_WITH_EQ=",
"RUN echo bla"
]
in assertChecks
(Text.unlines dockerFile)
(assertBool "No Warnings or Errors should be triggered" . null)
-- Run tests for the Config module
ConfigSpec.tests
-- Run tests for the Shell module
ShellSpec.tests
-- Run rule tests
Shellcheck.tests
DL3000.tests
DL3001.tests
DL3002.tests
DL3003.tests
DL3004.tests
DL3005.tests
DL3006.tests
DL3007.tests
DL3008.tests
DL3009.tests
DL3010.tests
DL3011.tests
DL3012.tests
DL3013.tests
DL3014.tests
DL3015.tests
DL3016.tests
DL3017.tests
DL3018.tests
DL3019.tests
DL3020.tests
DL3021.tests
DL3022.tests
DL3023.tests
DL3024.tests
DL3025.tests
DL3026.tests
DL3027.tests
DL3028.tests
DL3029.tests
DL3030.tests
DL3031.tests
DL3032.tests
DL3033.tests
DL3034.tests
DL3035.tests
DL3036.tests
DL3037.tests
DL3038.tests
DL3039.tests
DL3040.tests
DL3041.tests
DL3042.tests
DL3043.tests
DL3044.tests
DL3045.tests
DL3046.tests
DL3047.tests
DL3048.tests
DL3049.tests
DL3050.tests
DL3051.tests
DL3052.tests
DL3053.tests
DL3054.tests
DL3055.tests
DL3056.tests
DL3057.tests
DL3058.tests
DL4001.tests
DL4003.tests
DL4004.tests
DL4005.tests
DL4006.tests