elm-review/tests/NoUnapprovedLicenseTest.elm
2022-12-08 16:27:43 +01:00

166 lines
5.0 KiB
Elm

module NoUnapprovedLicenseTest exposing (all)
import Elm.Docs
import Elm.Project
import Json.Decode as Decode
import NoUnapprovedLicense exposing (rule)
import Review.Project as Project exposing (Project)
import Review.Project.Dependency as Dependency exposing (Dependency)
import Review.Test
import Test exposing (Test, describe, test)
createProject : String -> Project
createProject license =
Project.new
|> Project.addElmJson (createElmJson applicationElmJson)
|> Project.addDependency (dependency license)
createElmJson : String -> { path : String, raw : String, project : Elm.Project.Project }
createElmJson rawElmJson =
case Decode.decodeString Elm.Project.decoder rawElmJson of
Ok elmJson ->
{ path = "elm.json"
, raw = rawElmJson
, project = elmJson
}
Err _ ->
Debug.todo "Invalid elm.json supplied to test"
applicationElmJson : String
applicationElmJson =
"""
{
"type": "application",
"source-directories": [
"src"
],
"elm-version": "0.19.1",
"dependencies": {
"direct": {
"elm/core": "1.0.0",
"author/dependency": "1.0.0"
},
"indirect": {}
},
"test-dependencies": {
"direct": {},
"indirect": {}
}
}"""
dependency : String -> Dependency
dependency license =
let
modules : List Elm.Docs.Module
modules =
[ { name = "Foo"
, comment = ""
, unions = []
, aliases = []
, values = []
, binops = []
}
]
rawElmJson : String
rawElmJson =
"""
{
"type": "package",
"name": "author/dependency",
"summary": "Summary",
"license": \"""" ++ license ++ """",
"version": "1.0.0",
"exposed-modules": [
"Foo"
],
"elm-version": "0.19.0 <= v < 0.20.0",
"dependencies": {
"elm/core": "1.0.0 <= v < 2.0.0"
},
"test-dependencies": {}
}
"""
elmJson : Elm.Project.Project
elmJson =
createElmJson rawElmJson
|> .project
in
Dependency.create
"author/dependency"
elmJson
modules
sourceCode : String
sourceCode =
"""
module A exposing (a)
a = 1
"""
all : Test
all =
describe "NoUnapprovedLicense"
[ test "should not report anything if there is no `elm.json` file" <|
\() ->
sourceCode
|> Review.Test.run (rule { allowed = [], forbidden = [] })
|> Review.Test.expectDataExtract """
{
"elm/core": "BSD-3-Clause"
}"""
, test "should not report anything if all dependencies have a license that is allowed" <|
\() ->
sourceCode
|> Review.Test.runWithProjectData (createProject "MIT") (rule { allowed = [ "MIT" ], forbidden = [] })
|> Review.Test.expectDataExtract """
{
"author/dependency": "MIT"
}"""
, test "should report an error if a dependency has an unknown license" <|
\() ->
sourceCode
|> Review.Test.runWithProjectData (createProject "BSD-3-Clause") (rule { allowed = [ "MIT" ], forbidden = [] })
|> Review.Test.expect
[ Review.Test.elmJsonErrors
[ Review.Test.error
{ message = "Unknown license `BSD-3-Clause` for dependency `author/dependency`"
, details =
[ "Talk to your legal team and see if this license is allowed. If it is allowed, add it to the list of allowed licenses. Otherwise, add it to the list of forbidden licenses and remove this dependency."
, "More info about licenses at https://spdx.org/licenses."
]
, under = "author/dependency"
}
]
, Review.Test.dataExtract """
{
"author/dependency": "BSD-3-Clause"
}"""
]
, test "should report an error if a dependency has a forbidden license" <|
\() ->
sourceCode
|> Review.Test.runWithProjectData (createProject "BSD-3-Clause") (rule { allowed = [ "MIT" ], forbidden = [ "BSD-3-Clause" ] })
|> Review.Test.expect
[ Review.Test.elmJsonErrors
[ Review.Test.error
{ message = "Forbidden license `BSD-3-Clause` for dependency `author/dependency`"
, details = [ "This license has been marked as forbidden and you should therefore not use this package." ]
, under = "author/dependency"
}
]
, Review.Test.dataExtract """
{
"author/dependency": "BSD-3-Clause"
}"""
]
]