elm-review/tests/NoDeprecatedTest.elm
2022-06-29 23:42:52 +02:00

1309 lines
57 KiB
Elm

module NoDeprecatedTest exposing (all)
import Elm.Docs
import Elm.Project
import Elm.Type
import Json.Decode as Decode
import NoDeprecated 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)
all : Test
all =
describe "NoDeprecated"
[ valueTests
, typeTests
, parametersTests
, letTests
, caseExpressionTests
, fieldsTests
, portsTests
, fromOtherModulesTests
, dependencyElementsTests
, dependencyTests
]
valueTests : Test
valueTests =
describe "Values"
[ test "should not report an error when using a non-deprecated element" <|
\() ->
[ """module A exposing (..)
import Other
a = Other.normalFunction
""", """module Other exposing (..)
normalFunction = 1
""" ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectNoErrors
, test "should report an error when referencing a local function whose name contains '@deprecated'" <|
\() ->
"""module A exposing (..)
somethingDeprecated = 1
a = somethingDeprecated
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "somethingDeprecated"
}
|> Review.Test.atExactly { start = { row = 4, column = 5 }, end = { row = 4, column = 24 } }
]
, test "should report an error when referencing a local function whose documentation contains '@deprecated'" <|
\() ->
"""module A exposing (..)
a = something
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
something = 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "something"
}
|> Review.Test.atExactly { start = { row = 2, column = 5 }, end = { row = 2, column = 14 } }
]
, test "should report an error when referencing a local function whose documentation starts with '@deprecated'" <|
\() ->
"""module A exposing (..)
a = something
{-| @deprecated This is deprecated, use Y instead.
-}
something = 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "something"
}
|> Review.Test.atExactly { start = { row = 2, column = 5 }, end = { row = 2, column = 14 } }
]
, test "should report an error when referencing a local function whose documentation has a line starting with '**@deprecated'" <|
\() ->
"""module A exposing (..)
a = something
{-| Something
**@deprecated This is deprecated, use Y instead.**
-}
something = 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "something"
}
|> Review.Test.atExactly { start = { row = 2, column = 5 }, end = { row = 2, column = 14 } }
]
, test "should report an error when referencing a local function whose documentation starts with '**@deprecated**'" <|
\() ->
"""module A exposing (..)
a = something
{-| **@deprecated** This is deprecated, use Y instead.
-}
something = 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "something"
}
|> Review.Test.atExactly { start = { row = 2, column = 5 }, end = { row = 2, column = 14 } }
]
, test "should report an error when referencing a function from a module whose name contains 'deprecated' (qualified import)" <|
\() ->
[ """module A exposing (..)
import Some.DeprecatedModule
a = Some.DeprecatedModule.something
""", moduleWithDeprecatedInItsName ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Some.DeprecatedModule.something"
}
]
)
]
, test "should report an error when referencing a function from a module whose name contains 'deprecated' (unqualifed import)" <|
\() ->
[ """module A exposing (..)
import Some.DeprecatedModule as S
a = S.something
""", moduleWithDeprecatedInItsName ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "S.something"
}
]
)
]
, test "should report an error when referencing a function from a module whose name contains 'deprecated' (record update)" <|
\() ->
[ """module A exposing (..)
import Some.DeprecatedModule exposing (something)
a = { something | b = 1 }
""", moduleWithDeprecatedInItsName ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "something"
}
|> Review.Test.atExactly { start = { row = 3, column = 7 }, end = { row = 3, column = 16 } }
]
)
]
, test "should report an error when referencing a function from a module whose documentation has a '@deprecated' annotation" <|
\() ->
[ """module A exposing (..)
import Some.Module
a = Some.Module.something
""", """module Some.Module exposing (..)
{-| @deprecated Use some other module instead -}
import Basics
a = 1
""" ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Some.Module.something"
}
]
)
]
, test "should not report an error when referencing a function whose name contains deprecated but is marked as an exception (local reference)" <|
\() ->
"""module A exposing (..)
type Status = Deprecated | NotDeprecated
a = [ Deprecated, NotDeprecated ]
"""
|> Review.Test.run
(NoDeprecated.defaults
|> NoDeprecated.withExceptionsForElements [ "A.Deprecated", "A.NotDeprecated" ]
|> rule
)
|> Review.Test.expectNoErrors
, test "should not report an error when referencing a function whose name contains deprecated but is marked as an exception (other module reference)" <|
\() ->
[ """module A exposing (..)
import Status
a = [ Status.Deprecated, Status.NotDeprecated ]
""", """module Status exposing (Status)
type Status = Deprecated | NotDeprecated
""" ]
|> Review.Test.runOnModules
(NoDeprecated.defaults
|> NoDeprecated.withExceptionsForElements [ "Status.Deprecated", "Status.NotDeprecated" ]
|> rule
)
|> Review.Test.expectNoErrors
, test "should report a configuration error when giving an invalid exception " <|
\() ->
NoDeprecated.defaults
|> NoDeprecated.withExceptionsForElements [ "malformedStuff" ]
|> rule
|> Review.Test.expectConfigurationError
{ message = "Invalid exceptions provided in the configuration"
, details =
[ "The names provided to the withExceptionsForElements function should look like 'Some.Module.value' or 'MyModule.Type', which wasn't the case for the following types:"
, " - malformedStuff"
]
}
]
moduleWithDeprecatedInItsName : String
moduleWithDeprecatedInItsName =
"""module Some.DeprecatedModule exposing (..)
a = 1
"""
typeTests : Test
typeTests =
describe "Types"
[ test "should report an error when referencing a custom type constructor whose name contains 'deprecated'" <|
\() ->
"""module A exposing (..)
type Deprecated = Deprecated
a = Deprecated
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Deprecated"
}
|> Review.Test.atExactly { start = { row = 3, column = 5 }, end = { row = 3, column = 15 } }
]
, test "should report an error when referencing a type alias constructor whose name contains 'deprecated'" <|
\() ->
"""module A exposing (..)
type alias Deprecated = {}
a = Deprecated
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Deprecated"
}
|> Review.Test.atExactly { start = { row = 3, column = 5 }, end = { row = 3, column = 15 } }
]
, test "should not report an error when referencing a non-deprecated type alias or type alias constructor" <|
\() ->
"""module A exposing (..)
type alias TypeAlias = {}
a : TypeAlias
a = TypeAlias
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectNoErrors
, test "should report an error when referencing a type whose name contains 'deprecated' (top-level declaration annotation)" <|
\() ->
"""module A exposing (..)
type Deprecated = Int
a : Deprecated
a = 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Deprecated"
}
|> Review.Test.atExactly { start = { row = 3, column = 5 }, end = { row = 3, column = 15 } }
]
, test "should report an error when referencing a type whose name contains 'deprecated' (top-level declaration)" <|
\() ->
"""module A exposing (..)
type Deprecated = Deprecated Int
a (Deprecated value) = 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Deprecated"
}
|> Review.Test.atExactly { start = { row = 3, column = 4 }, end = { row = 3, column = 14 } }
]
, test "should report an error when referencing a custom type whose documentation contains '@deprecated' (top-level declaration)" <|
\() ->
"""module A exposing (..)
a : Something
a = 1
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
type Something = Foo Int
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Something"
}
|> Review.Test.atExactly { start = { row = 2, column = 5 }, end = { row = 2, column = 14 } }
]
, test "should report an error when referencing a custom type constructor whose documentation contains '@deprecated' (top-level declaration)" <|
\() ->
"""module A exposing (..)
a (A value) = 1
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
type Something = A Int
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "A"
}
|> Review.Test.atExactly { start = { row = 2, column = 4 }, end = { row = 2, column = 5 } }
]
, test "should report an error when referencing a type alias whose documentation contains '@deprecated' (top-level declaration)" <|
\() ->
"""module A exposing (..)
a : Something
a = 1
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
type alias Something = Int
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Something"
}
|> Review.Test.atExactly { start = { row = 2, column = 5 }, end = { row = 2, column = 14 } }
]
, test "should report an error when referencing a type alias constructor whose documentation contains '@deprecated' (top-level declaration)" <|
\() ->
"""module A exposing (..)
a = Something 1
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
type alias Something = { b : Int }
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Something"
}
|> Review.Test.atExactly { start = { row = 2, column = 5 }, end = { row = 2, column = 14 } }
]
, test "should report an error when referencing a type whose name contains 'deprecated' (custom type declaration)" <|
\() ->
"""module A exposing (..)
type alias Deprecated = String
type A = Thing ( A, { b : Deprecated } )
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Deprecated"
}
|> Review.Test.atExactly { start = { row = 3, column = 27 }, end = { row = 3, column = 37 } }
]
, test "should report an error when referencing a type whose name contains 'deprecated' (type alias declaration)" <|
\() ->
"""module A exposing (..)
type alias Deprecated = String
type alias A = Thing { b : Deprecated }
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Deprecated"
}
|> Review.Test.atExactly { start = { row = 3, column = 28 }, end = { row = 3, column = 38 } }
]
]
parametersTests : Test
parametersTests =
describe "Parameters"
[ test "should report an error when having a parameter whose name contains 'deprecated' (top-level declaration)" <|
\() ->
"""module A exposing (..)
a thingDeprecated = 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
]
, under = "thingDeprecated"
}
]
, test "should report an error when destructuring a field whose name contains 'deprecated' (top-level declaration)" <|
\() ->
"""module A exposing (..)
a ({deprecated}) = 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "deprecated"
}
]
, test "should report an error when using a parameter alias whose name contains 'deprecated' (top-level declaration)" <|
\() ->
"""module A exposing (..)
a (( x, y ) as deprecated) = 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
]
, under = "deprecated"
}
]
]
letTests : Test
letTests =
describe "Let expressions"
[ test "should report an error when referencing a type whose name contains 'deprecated' (let declaration annotation)" <|
\() ->
"""module A exposing (..)
type Deprecated = Int
a =
let
b : Deprecated
b = 1
in
b
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Deprecated"
}
|> Review.Test.atExactly { start = { row = 5, column = 13 }, end = { row = 5, column = 23 } }
]
, test "should report an error when referencing a type whose name contains 'deprecated' (let declaration)" <|
\() ->
"""module A exposing (..)
type Deprecated = Deprecated Int
a =
let
b (Deprecated value) = 1
in
b
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Deprecated"
}
|> Review.Test.atExactly { start = { row = 5, column = 12 }, end = { row = 5, column = 22 } }
]
, test "should report an error when having a parameter whose name contains 'deprecated' (let declaration)" <|
\() ->
"""module A exposing (..)
a =
let
b thingDeprecated = 1
in
b
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
]
, under = "thingDeprecated"
}
]
, test "should report an error when referencing a type whose name contains 'deprecated' (let destructuring)" <|
\() ->
"""module A exposing (..)
type Deprecated = Deprecated Int
a =
let
(Deprecated b) = 1
in
b
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "Deprecated"
}
|> Review.Test.atExactly { start = { row = 5, column = 10 }, end = { row = 5, column = 20 } }
]
]
caseExpressionTests : Test
caseExpressionTests =
describe "Case expressions"
[ test "should report an error when referencing a type whose name contains 'deprecated' (case expression)" <|
\() ->
"""module A exposing (..)
type A = ThingDeprecated Int | Thing
a =
case x of
ThingDeprecated b -> 1
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ThingDeprecated"
}
|> Review.Test.atExactly { start = { row = 5, column = 9 }, end = { row = 5, column = 24 } }
]
]
fieldsTests : Test
fieldsTests =
describe "Fields"
[ test "should report an error when referencing a field whose name contains 'deprecated' (record access)" <|
\() ->
"""module A exposing (..)
a = some.thingDeprecated
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "thingDeprecated"
}
]
, test "should report an error when referencing a field whose name contains 'deprecated' (record access function)" <|
\() ->
"""module A exposing (..)
a = .thingDeprecated
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = ".thingDeprecated"
}
]
]
portsTests : Test
portsTests =
describe "Ports"
[ test "should report an error when referencing a type whose name contains 'deprecated' (Sub port)" <|
\() ->
"""module A exposing (..)
type alias DeprecatedString = String
port input : (DeprecatedString -> msg) -> Sub msg
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "DeprecatedString"
}
|> Review.Test.atExactly { start = { row = 3, column = 15 }, end = { row = 3, column = 31 } }
]
, test "should report an error when referencing a type whose name contains 'deprecated' (Cmd port)" <|
\() ->
"""module A exposing (..)
type alias DeprecatedString = String
port output : DeprecatedString -> Cmd msg
"""
|> Review.Test.run (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "DeprecatedString"
}
|> Review.Test.atExactly { start = { row = 3, column = 15 }, end = { row = 3, column = 31 } }
]
]
fromOtherModulesTests : Test
fromOtherModulesTests =
describe "From other modules"
[ test "should report an error when referencing a value from a deprecated module" <|
\() ->
[ """module A exposing (..)
import OtherModule
a = OtherModule.something
""", deprecatedModule ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "OtherModule.something"
}
]
)
]
, test "should report an error when referencing a custom type from a deprecated module" <|
\() ->
[ """module A exposing (..)
import OtherModule
a : OtherModule.CustomType
a = 1
""", deprecatedModule ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "OtherModule.CustomType"
}
]
)
]
, test "should report an error when referencing a custom type constructor from a deprecated module" <|
\() ->
[ """module A exposing (..)
import OtherModule
a = OtherModule.Constructor
""", deprecatedModule ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "OtherModule.Constructor"
}
]
)
]
, test "should report an error when referencing a type alias from a deprecated module" <|
\() ->
[ """module A exposing (..)
import OtherModule
a : OtherModule.Alias
a = 1
""", modulesWithDeprecatedThings ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "OtherModule.Alias"
}
]
)
]
, test "should report an error when referencing a deprecated value from a different module" <|
\() ->
[ """module A exposing (..)
import OtherModule
a = OtherModule.value
""", modulesWithDeprecatedThings ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "OtherModule.value"
}
]
)
]
, test "should report an error when referencing a deprecated custom type from a different module" <|
\() ->
[ """module A exposing (..)
import OtherModule
a : OtherModule.CustomType
a = 1
""", modulesWithDeprecatedThings ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "OtherModule.CustomType"
}
]
)
]
, test "should report an error when referencing a constructor of a deprecated custom type from a different module" <|
\() ->
[ """module A exposing (..)
import OtherModule
a = OtherModule.Constructor
""", modulesWithDeprecatedThings ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "OtherModule.Constructor"
}
]
)
]
, test "should report an error when referencing a deprecated type alias from a different module" <|
\() ->
[ """module A exposing (..)
import OtherModule
a : OtherModule.Alias
a = 1
""", modulesWithDeprecatedThings ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "OtherModule.Alias"
}
]
)
]
, test "should report an error when referencing a constructor of a deprecated record alias from a different module" <|
\() ->
[ """module A exposing (..)
import OtherModule
a = OtherModule.RecordAlias
""", modulesWithDeprecatedThings ]
|> Review.Test.runOnModules (rule NoDeprecated.defaults)
|> Review.Test.expectErrorsForModules
[ ( "A"
, [ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "OtherModule.RecordAlias"
}
]
)
]
]
dependencyElementsTests : Test
dependencyElementsTests =
describe "Elements from dependencies"
[ test "should report an error when referencing a value from a deprecated dependency module" <|
\() ->
"""module A exposing (..)
import ModuleFromDependency_1
a = ModuleFromDependency_1.something
"""
|> Review.Test.runWithProjectData projectWithDeprecations (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ModuleFromDependency_1.something"
}
]
, test "should report an error when referencing a custom type from a deprecated dependency module" <|
\() ->
"""module A exposing (..)
import ModuleFromDependency_1
a : ModuleFromDependency_1.CustomType
a = 1
"""
|> Review.Test.runWithProjectData projectWithDeprecations (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ModuleFromDependency_1.CustomType"
}
]
, test "should report an error when referencing a custom type constructor from a deprecated dependency module" <|
\() ->
"""module A exposing (..)
import ModuleFromDependency_1
a = ModuleFromDependency_1.Constructor
"""
|> Review.Test.runWithProjectData projectWithDeprecations (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ModuleFromDependency_1.Constructor"
}
]
, test "should report an error when referencing a type alias from a deprecated dependency module" <|
\() ->
"""module A exposing (..)
import ModuleFromDependency_1
a : ModuleFromDependency_1.Alias
a = 1
"""
|> Review.Test.runWithProjectData projectWithDeprecations (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The module where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ModuleFromDependency_1.Alias"
}
]
, test "should report an error when referencing a deprecated value from a dependency" <|
\() ->
"""module A exposing (..)
import ModuleFromDependency_2
a = ModuleFromDependency_2.value
"""
|> Review.Test.runWithProjectData projectWithDeprecations (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ModuleFromDependency_2.value"
}
]
, test "should report an error when referencing a deprecated custom type from a dependency" <|
\() ->
"""module A exposing (..)
import ModuleFromDependency_2
a : ModuleFromDependency_2.CustomType
a = 1
"""
|> Review.Test.runWithProjectData projectWithDeprecations (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ModuleFromDependency_2.CustomType"
}
]
, test "should report an error when referencing a constructor of a deprecated custom type from a dependency" <|
\() ->
"""module A exposing (..)
import ModuleFromDependency_2
a = ModuleFromDependency_2.Constructor
"""
|> Review.Test.runWithProjectData projectWithDeprecations (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ModuleFromDependency_2.Constructor"
}
]
, test "should report an error when referencing a deprecated type alias from a dependency" <|
\() ->
"""module A exposing (..)
import ModuleFromDependency_2
a : ModuleFromDependency_2.Alias
a = 1
"""
|> Review.Test.runWithProjectData projectWithDeprecations (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ModuleFromDependency_2.Alias"
}
]
, test "should report an error when referencing a constructor of a deprecated record alias from a dependency" <|
\() ->
"""module A exposing (..)
import ModuleFromDependency_2
a = ModuleFromDependency_2.RecordAlias
"""
|> Review.Test.runWithProjectData projectWithDeprecations (rule NoDeprecated.defaults)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "This element was marked as deprecated and should not be used anymore."
, "Please check its documentation to know the alternative solutions."
]
, under = "ModuleFromDependency_2.RecordAlias"
}
]
]
dependencyTests : Test
dependencyTests =
describe "Deprecating dependencies"
[ test "should report an error when referencing a value from a deprecated dependency module" <|
\() ->
"""module A exposing (..)
import OkModule
a = OkModule.something
"""
|> Review.Test.runWithProjectData projectWithDeprecations
(NoDeprecated.defaults
|> NoDeprecated.dependencies [ "author/package" ]
|> rule
)
|> Review.Test.expectErrors
[ Review.Test.error
{ message = "Found new usage of deprecated element"
, details =
[ "The dependency where this element is defined was marked as deprecated and should not be used anymore."
, "Please check its documentation or your review configuration to know the alternative solutions."
]
, under = "OkModule.something"
}
]
, test "should report a global error when deprecating a package not in the dependencies" <|
\() ->
"""module A exposing (..)
import OkModule
a = OkModule.something
"""
|> Review.Test.run
(NoDeprecated.defaults
|> NoDeprecated.dependencies [ "author/package" ]
|> rule
)
|> Review.Test.expectGlobalErrors
[ { message = "Could not find package `author/package`"
, details =
[ "You marked this package as deprecated, but I can't find it in your dependencies."
, "It could be a typo, or maybe you've successfully removed it from your project?"
]
}
]
]
deprecatedModule : String
deprecatedModule =
"""module OtherModule exposing (..)
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
import Basics
a = 1
"""
modulesWithDeprecatedThings : String
modulesWithDeprecatedThings =
"""module OtherModule exposing (..)
import Basics
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
type CustomType = Constructor
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
type alias Alias = Int
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
type alias RecordAlias = {}
{-| Does X.
@deprecated This is deprecated, use Y instead.
-}
value = 1
"""
projectWithDeprecations : Project
projectWithDeprecations =
Project.addDependency dependency Project.new
dependency : Dependency
dependency =
Dependency.create
"author/package"
(createElmJsonProject dependencyElmJson)
dependencyModules
createElmJsonProject : String -> Elm.Project.Project
createElmJsonProject rawElmJson =
case Decode.decodeString Elm.Project.decoder rawElmJson of
Ok project ->
project
Err error ->
Debug.todo ("[elm.json]: " ++ Debug.toString error)
dependencyModules : List Elm.Docs.Module
dependencyModules =
[ { name = "ModuleFromDependency_1"
, comment = """{-| Does X.
@deprecated This is deprecated, use Y instead. -}
"""
, unions =
[ { name = "CustomType"
, comment = ""
, args = []
, tags = [ ( "Constructor", [] ) ]
}
]
, aliases =
[ { name = "Alias"
, comment = ""
, args = []
, tipe = Elm.Type.Tuple []
}
]
, values =
[ { name = "value"
, comment = ""
, tipe = Elm.Type.Tuple []
}
]
, binops = []
}
, { name = "ModuleFromDependency_2"
, comment = ""
, unions =
[ { name = "CustomType"
, comment = """{-| Does X.
@deprecated This is deprecated, use Y instead. -}
"""
, args = []
, tags = [ ( "Constructor", [] ) ]
}
]
, aliases =
[ { name = "Alias"
, comment = """{-| Does X.
@deprecated This is deprecated, use Y instead. -}
"""
, args = []
, tipe = Elm.Type.Tuple []
}
, { name = "RecordAlias"
, comment = """{-| Does X.
@deprecated This is deprecated, use Y instead. -}
"""
, args = []
, tipe = Elm.Type.Record [] Nothing
}
]
, values =
[ { name = "value"
, comment = """{-| Does X.
@deprecated This is deprecated, use Y instead. -}
"""
, tipe = Elm.Type.Tuple []
}
]
, binops = []
}
, { name = "OkModule"
, comment = ""
, unions = []
, aliases = []
, values =
[ { name = "value"
, comment = ""
, tipe = Elm.Type.Tuple []
}
]
, binops = []
}
]
dependencyElmJson : String
dependencyElmJson =
"""{
"type": "package",
"name": "author/package",
"summary": "Moods for tests",
"license": "MIT",
"version": "1.0.0",
"exposed-modules": [
"ModuleFromDependency_1",
"ModuleFromDependency_2"
],
"elm-version": "0.19.0 <= v <= 0.20.0",
"dependencies": {},
"test-dependencies": {}
}"""