Code source du site TeacherCorner.lamdera.app, contenant une suite d'outils permettant d'automatiser la production de documents pédagogiques.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

232 lines
7.5 KiB

module Tests.Entry exposing (suite)
import Bytes.Encode as Encode
import Expect exposing (Expectation)
import Hex.Convert
import Test exposing (..)
import Tests.Zip
import Time exposing (Posix, Zone)
import Zip
import Zip.Entry exposing (..)
withSample : String -> (Entry -> Expectation) -> () -> Expectation
withSample name expect =
Tests.Zip.withSample
(\zip ->
case zip |> Zip.getEntry name of
Just entry ->
expect entry
Nothing ->
Expect.fail ("Failed to load entry: " ++ name)
)
versionsDir : (Entry -> Expectation) -> () -> Expectation
versionsDir =
withSample "sample/versions/"
versionJson : (Entry -> Expectation) -> () -> Expectation
versionJson =
withSample "sample/version.json"
unsupported : (Entry -> Expectation) -> () -> Expectation
unsupported =
withSample "sample/unsupported"
corrupted : (Entry -> Expectation) -> () -> Expectation
corrupted =
withSample "sample/corrupted"
corruptedDeflate : (Entry -> Expectation) -> () -> Expectation
corruptedDeflate =
withSample "sample/corrupted_deflate"
v1 : (Entry -> Expectation) -> () -> Expectation
v1 =
withSample "sample/versions/v1.txt"
testEntryMeta : Meta -> Entry -> List Test
testEntryMeta meta entry =
[ test "keeps the right path" <|
\_ ->
entry
|> path
|> Expect.equal meta.path
, test "keeps the right comment" <|
\_ ->
entry
|> comment
|> Just
|> Expect.equal meta.comment
, test "keeps the right timestamp" <|
\_ ->
entry
|> lastModified (Tuple.first meta.lastModified)
|> Tests.Zip.sameDosTime (Tuple.second meta.lastModified)
]
timestamp : ( Zone, Posix )
timestamp =
( Time.utc, Time.millisToPosix 1611189269538 )
suite : Test
suite =
describe "Zip.Entry"
[ describe "path"
[ test "returns the correct value" <|
versionJson (path >> Expect.equal "sample/version.json")
]
, describe "basename"
[ test "works with nested files" <|
v1 (basename >> Expect.equal "v1.txt")
, test "works with nested directories" <|
withSample "sample/versions/" (basename >> Expect.equal "versions")
, test "works with root entries" <|
withSample "sample/" (basename >> Expect.equal "sample")
]
, describe "extractedSize"
[ test "returns the correct value" <|
v1 (extractedSize >> Expect.equal 12)
]
, describe "compressedSize"
[ test "returns the correct value" <|
v1 (compressedSize >> Expect.equal 14)
]
, describe "lastModified"
[ test "returns the correct value" <|
versionJson (lastModified Time.utc >> Expect.equal (Time.millisToPosix 1610361772000))
]
, describe "comment"
[ test "returns the correct value" <|
versionJson (comment >> Expect.equal "")
]
, describe "isDirectory"
[ test "returns False if file" <|
versionJson (isDirectory >> Expect.equal False)
, test "returns True if directory" <|
versionsDir (isDirectory >> Expect.equal True)
]
, describe "checksum"
[ test "returns the correct value" <|
versionJson (checksum >> Expect.equal 804172212)
]
, describe "extracting"
[ test "returns uncompressed text" <|
versionJson
(toString
>> Result.toMaybe
>> Expect.equal (Just "{ \"required\": 2 }\n")
)
, test "returns uncompressed bytes" <|
v1
(toBytes
>> Result.toMaybe
>> Expect.equal (Hex.Convert.toBytes "68656C6C6F2C20776F726C64210A")
)
, test "checks integrity" <|
corrupted (toBytes >> Expect.equal (Err IntegrityError))
, test "fails on unsupported compression method" <|
unsupported
(\entry ->
case toBytes entry of
Err (UnsupportedCompression 0x0A _) ->
Expect.pass
_ ->
Expect.fail "Did not fail with Unsupported Compression"
)
, test "fails on corrupted flate data" <|
corruptedDeflate (toBytes >> Expect.equal (Err InflateError))
]
, describe "store" <|
let
meta =
{ path = "data/hi.txt"
, lastModified = timestamp
, comment = Just "hello world comment"
}
entry =
store meta (Encode.encode <| Encode.string "hello world")
in
[ test "keeps the right data" <|
\_ ->
entry
|> toString
|> Expect.equal (Ok "hello world")
, test "does not compress" <|
\_ ->
compressedSize entry
|> Expect.equal (extractedSize entry)
, test "does not mark as directory" <|
\_ ->
entry
|> isDirectory
|> Expect.equal False
]
++ testEntryMeta meta entry
, describe "compress" <|
let
meta =
{ path = "data/hi.txt"
, lastModified = timestamp
, comment = Just "nested file"
}
entry =
compress meta (Encode.encode <| Encode.string "hello world")
in
[ test "keeps the right data" <|
\_ ->
entry
|> toString
|> Expect.equal (Ok "hello world")
, test "does compress" <|
\_ ->
compressedSize entry
|> Expect.notEqual (extractedSize entry)
, test "does not mark as directory" <|
\_ ->
entry
|> isDirectory
|> Expect.equal False
]
++ testEntryMeta meta entry
, describe "createDirectory" <|
let
meta =
{ path = "data/"
, lastModified = timestamp
, comment = Just "directory"
}
entry =
createDirectory meta
in
[ test "marks as directory" <|
\_ ->
entry
|> isDirectory
|> Expect.equal True
, test "appends slash if missing" <|
\_ ->
createDirectory
{ path = "data"
, lastModified = timestamp
, comment = Nothing
}
|> path
|> Expect.equal "data/"
]
++ testEntryMeta meta entry
]