git.iko.soy/rowtype-yoga/purescript-docs-search
on master help sign in
Add puppeteer tests
commit226fc3855571bbe4b04416a3bc02a7d04c397604 authorklntsky <klntsky@gmail.com> dateThu 6 Aug 2020, 11:34 (6 years ago) parent853ace8
5 files changed+85−2
package.json+2−1 packages.dhall+13−1 spago.dhall+1 test/Main.purs+2 test/Test/UI.purs+67
package.json+2−1
@@ -15,7 +15,7 @@
1515 "CHANGELOG.md"
1616 ],
1717 "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",
1919 "bundle-app": "spago bundle-app --no-build --no-install -m Docs.Search.App --to dist/docs-search-app.js",
2020 "parcel-app": "parcel build --no-source-maps --target browser --out-file dist/docs-search-app.js dist/docs-search-app.js",
2121 "build-app": "npm run bundle-app && npm run parcel-app",
@@ -47,6 +47,7 @@
4747 "glob": "^7.1.6",
4848 "markdown-it": "^11.0.0",
4949 "parcel": "^1.12.4",
50+ "puppeteer": "^5.2.1",
5051 "spago": "^0.15.3"
5152 }
5253}
packages.dhall+13−1
@@ -4,7 +4,7 @@ let mkPackage =
44let upstream =
55 https://github.com/purescript/package-sets/releases/download/psc-0.13.8/packages.dhall sha256:0e95ec11604dc8afc1b129c4d405dcc17290ce56d7d0665a0ff15617e32bbf03
66
7−let overrides = { metadata = upstream.metadata // { version = "v0.13.0" } }
7+let overrides = {=}
88
99let additions =
1010 { halogen =
@@ -89,6 +89,18 @@ let additions =
8989 ]
9090 "https://github.com/klntsky/purescript-bower-json.git"
9191 "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"
92104 }
93105
94106in upstream // overrides // additions
spago.dhall+1
@@ -36,6 +36,7 @@
3636 , "test-unit"
3737 , "web-dom"
3838 , "web-html"
39+ , "toppokki"
3940 , "web-storage"
4041 ]
4142, packages =
test/Main.purs+2
@@ -8,6 +8,7 @@ import Test.TypeQuery as TypeQuery
88import Test.IndexBuilder as IndexBuilder
99import Test.Declarations as Declarations
1010import Test.ModuleIndex as ModuleIndex
11+import Test.UI as UI
1112
1213import Test.Extra (assertRight)
1314
@@ -24,6 +25,7 @@ import Test.Unit.Main (runTest)
2425main :: Effect Unit
2526main = do
2627 runTest mainTest
28+ UI.main
2729
2830mainTest :: TestSuite
2931mainTest = 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