git.iko.soy/rowtype-yoga/purescript-docs-search
on master help sign in
Add puppeteer tests
226fc38klntsky
package.json+2−1
@@ -15,7 +15,7 @@
15 "CHANGELOG.md"
15 "CHANGELOG.md"
16 ],
16 ],
17 "scripts": {
17 "scripts": {
18− "test": "spago test && npm run check-version",
18+ "test": "spago docs --no-search && ./dist/purescript-docs-search build-index && spago test && npm run check-version",
19 "bundle-app": "spago bundle-app --no-build --no-install -m Docs.Search.App --to dist/docs-search-app.js",
19 "bundle-app": "spago bundle-app --no-build --no-install -m Docs.Search.App --to dist/docs-search-app.js",
20 "parcel-app": "parcel build --no-source-maps --target browser --out-file dist/docs-search-app.js dist/docs-search-app.js",
20 "parcel-app": "parcel build --no-source-maps --target browser --out-file dist/docs-search-app.js dist/docs-search-app.js",
21 "build-app": "npm run bundle-app && npm run parcel-app",
21 "build-app": "npm run bundle-app && npm run parcel-app",
@@ -47,6 +47,7 @@
47 "glob": "^7.1.6",
47 "glob": "^7.1.6",
48 "markdown-it": "^11.0.0",
48 "markdown-it": "^11.0.0",
49 "parcel": "^1.12.4",
49 "parcel": "^1.12.4",
50+ "puppeteer": "^5.2.1",
50 "spago": "^0.15.3"
51 "spago": "^0.15.3"
51 }
52 }
52}
53}
packages.dhall+13−1
@@ -4,7 +4,7 @@ let mkPackage =
4let upstream =
4let upstream =
5 https://github.com/purescript/package-sets/releases/download/psc-0.13.8/packages.dhall sha256:0e95ec11604dc8afc1b129c4d405dcc17290ce56d7d0665a0ff15617e32bbf03
5 https://github.com/purescript/package-sets/releases/download/psc-0.13.8/packages.dhall sha256:0e95ec11604dc8afc1b129c4d405dcc17290ce56d7d0665a0ff15617e32bbf03
6
6
7−let overrides = { metadata = upstream.metadata // { version = "v0.13.0" } }
7+let overrides = {=}
8
8
9let additions =
9let additions =
10 { halogen =
10 { halogen =
@@ -89,6 +89,18 @@ let additions =
89 ]
89 ]
90 "https://github.com/klntsky/purescript-bower-json.git"
90 "https://github.com/klntsky/purescript-bower-json.git"
91 "v1.0.0"
91 "v1.0.0"
92+ , toppokki =
93+ mkPackage
94+ [ "prelude"
95+ , "record"
96+ , "functions"
97+ , "node-http"
98+ , "aff-promise"
99+ , "node-buffer"
100+ , "node-fs-aff"
101+ ]
102+ "https://github.com/justinwoo/purescript-toppokki.git"
103+ "v2.4.0"
92 }
104 }
93
105
94in upstream // overrides // additions
106in upstream // overrides // additions
spago.dhall+1
@@ -36,6 +36,7 @@
36 , "test-unit"
36 , "test-unit"
37 , "web-dom"
37 , "web-dom"
38 , "web-html"
38 , "web-html"
39+ , "toppokki"
39 , "web-storage"
40 , "web-storage"
40 ]
41 ]
41, packages =
42, packages =
test/Main.purs+2
@@ -8,6 +8,7 @@ import Test.TypeQuery as TypeQuery
8import Test.IndexBuilder as IndexBuilder
8import Test.IndexBuilder as IndexBuilder
9import Test.Declarations as Declarations
9import Test.Declarations as Declarations
10import Test.ModuleIndex as ModuleIndex
10import Test.ModuleIndex as ModuleIndex
11+import Test.UI as UI
11
12
12import Test.Extra (assertRight)
13import Test.Extra (assertRight)
13
14
@@ -24,6 +25,7 @@ import Test.Unit.Main (runTest)
24main :: Effect Unit
25main :: Effect Unit
25main = do
26main = do
26 runTest mainTest
27 runTest mainTest
28+ UI.main
27
29
28mainTest :: TestSuite
30mainTest :: TestSuite
29mainTest = do
31mainTest = do
test/Test/UI.pursnew file+67
@@ -0,0 +1,67 @@
1+module Test.UI where
2+
3+import Prelude
4+
5+import Data.Array as Array
6+import Data.Foldable (for_)
7+import Data.Newtype (unwrap)
8+import Effect (Effect)
9+import Effect.Aff (Aff, launchAff_)
10+import Effect.Class (liftEffect)
11+import Effect.Console as Console
12+import Foreign (Foreign)
13+import Foreign as Foreign
14+import Node.FS.Sync (realpath)
15+import Test.Unit.Assert as Assert
16+import Toppokki as T
17+
18+
19+main :: Effect Unit
20+main = launchAff_ do
21+ path <- liftEffect $ realpath "."
22+
23+ let indexHTML = T.URL $ "file://" <> path <> "/generated-docs/html/index.html"
24+ prim = T.URL $ "file://" <> path <> "/generated-docs/html/Prim.html"
25+ docsSearch = T.URL $ "file://" <> path <> "/generated-docs/html/Docs.Search.App.html"
26+
27+ for_ [ indexHTML, prim, docsSearch ] \url -> do
28+ withPage url \page -> do
29+ void $ T.pageWaitForSelector (T.Selector "#group-modules__label") { timeout: 10000 } page
30+ log $ "has module grouping: " <> unwrap url
31+
32+ withPage url \page -> do
33+ T.keyboardPress (T.KeyboardKey "s") {} page
34+ void $ T.keyboardType "slice" {} page
35+ T.keyboardPress (T.KeyboardKey "Enter") {} page
36+ void $ T.pageWaitForSelector (T.Selector ".result__actions__item") { timeout: 10000 } page
37+ log $ "has working search field: " <> unwrap url
38+
39+ withPage url \page -> do
40+ T.keyboardPress (T.KeyboardKey "s") {} page
41+ void $ T.keyboardType "a -> b" {} page
42+ T.keyboardPress (T.KeyboardKey "Enter") {} page
43+ void $ T.pageWaitForSelector (T.Selector ".result__actions__item") { timeout: 10000 } page
44+ arr <- readStringArray <$> T.unsafeEvaluateStringFunction getResultTitlesCode page
45+ Assert.assert "resulting array contains unsafeCoerce" (Array.elem "unsafeCoerce" arr)
46+ log $ "is able to find unsafeCoerce by type: " <> unwrap url
47+
48+ withPage (T.URL $ unwrap url <> "#search:unsafeCoerce") \page -> do
49+ void $ T.pageWaitForSelector (T.Selector ".result__actions__item") { timeout: 10000 } page
50+ arr <- readStringArray <$> T.unsafeEvaluateStringFunction getResultTitlesCode page
51+ Assert.assert "resulting array contains unsafeCoerce" (Array.elem "unsafeCoerce" arr)
52+ log $ "can read URI hash: " <> unwrap url
53+
54+ where
55+ log = liftEffect <<< Console.log
56+ getResultTitlesCode = "[].map.call(document.querySelectorAll('.result__title'), el => el.textContent)"
57+ readStringArray :: Foreign -> Array String
58+ readStringArray = Foreign.unsafeFromForeign
59+
60+
61+withPage :: forall a. T.URL -> (T.Page -> Aff a) -> Aff Unit
62+withPage url f = do
63+ browser <- T.launch {}
64+ page <- T.newPage browser
65+ T.goto url page
66+ void $ f page
67+ T.close browser