File: WaiAppEmbeddedTest.hs

package info (click to toggle)
haskell-wai-app-static 3.1.9-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 188 kB
  • sloc: haskell: 1,448; makefile: 4
file content (102 lines) | stat: -rw-r--r-- 3,911 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}

module WaiAppEmbeddedTest (embSpec) where

import Codec.Compression.GZip (compress)
import EmbeddedTestEntries
import Network.Wai
import Network.Wai.Application.Static (staticApp)
import Network.Wai.Test
import Test.Hspec
import WaiAppStatic.Storage.Embedded
import WaiAppStatic.Types

defRequest :: Request
defRequest = defaultRequest

embSpec :: Spec
embSpec = do
    let embedSettings settings = flip runSession (staticApp settings)
    let embed = embedSettings $(mkSettings mkEntries)
    describe "embedded, compressed entry" $ do
        it "served correctly" $ embed $ do
            req <- request (setRawPathInfo defRequest "e1.txt")
            assertStatus 200 req
            assertHeader "Content-Type" "text/plain" req
            assertHeader "Content-Encoding" "gzip" req
            assertHeader "ETag" "Etag 1" req
            assertNoHeader "Last-Modified req" req
            assertBody (compress $ body 1000 'A') req

        it "304 when valid if-none-match sent" $ embed $ do
            req <-
                request
                    (setRawPathInfo defRequest "e1.txt")
                        { requestHeaders = [("If-None-Match", "Etag 1")]
                        }
            assertStatus 304 req

        it "ssIndices works" $ do
            let testSettings =
                    $(mkSettings mkEntries)
                        { ssIndices = [unsafeToPiece "index.html"]
                        }
            embedSettings testSettings $ do
                req <- request defRequest
                assertStatus 200 req
                assertBody "index file" req

        it "ssIndices works with trailing slashes" $ do
            let testSettings =
                    $(mkSettings mkEntries)
                        { ssIndices = [unsafeToPiece "index.html"]
                        }
            embedSettings testSettings $ do
                req <- request (setRawPathInfo defRequest "/foo/")
                assertStatus 200 req
                assertBody "index file in subdir" req

    describe "embedded, uncompressed entry" $ do
        it "too short" $ embed $ do
            req <- request (setRawPathInfo defRequest "e2.txt")
            assertStatus 200 req
            assertHeader "Content-Type" "text/plain" req
            assertNoHeader "Content-Encoding" req
            assertHeader "ETag" "Etag 2" req
            assertBody "ABC" req

        it "wrong mime" $ embed $ do
            req <- request (setRawPathInfo defRequest "somedir/e3.txt")
            assertStatus 200 req
            assertHeader "Content-Type" "xxx" req
            assertNoHeader "Content-Encoding" req
            assertHeader "ETag" "Etag 3" req
            assertBody (body 1000 'A') req

    describe "reloadable entry" $
        it "served correctly" $
            embed $ do
                req <- request (setRawPathInfo defRequest "e4.css")
                assertStatus 200 req
                assertHeader "Content-Type" "text/css" req
                assertNoHeader "Content-Encoding" req
                assertHeader "ETag" "Etag 4" req
                assertBody (body 2000 'Q') req

    describe "entries without etags" $ do
        it "embedded entry" $ embed $ do
            req <- request (setRawPathInfo defRequest "e5.txt")
            assertStatus 200 req
            assertHeader "Content-Type" "text/plain" req
            assertHeader "Content-Encoding" "gzip" req
            assertNoHeader "ETag" req
            assertBody (compress $ body 1000 'Z') req

        it "reload entry" $ embed $ do
            req <- request (setRawPathInfo defRequest "e6.txt")
            assertStatus 200 req
            assertHeader "Content-Type" "text/plain" req
            assertNoHeader "Content-Encoding" req
            assertNoHeader "ETag" req
            assertBody (body 1000 'W') req