Add tests and improve testing experience
This commit is contained in:
parent
5fc811e797
commit
5ce99a5a3d
3 changed files with 111 additions and 7 deletions
|
|
@ -23,7 +23,7 @@ const baseUrl = "http://localhost:" & $port & "/"
|
||||||
template withBackend(body: untyped): untyped =
|
template withBackend(body: untyped): untyped =
|
||||||
## Starts a new backend instance.
|
## Starts a new backend instance.
|
||||||
|
|
||||||
spawn runProcess("nimble -y runbackend")
|
spawn runProcess("nimble -y testbackend")
|
||||||
defer:
|
defer:
|
||||||
discard execCmd("killall " & backend)
|
discard execCmd("killall " & backend)
|
||||||
|
|
||||||
|
|
@ -46,6 +46,8 @@ template withBackend(body: untyped): untyped =
|
||||||
import browsertests/[scenario1, threads, issue181, categories]
|
import browsertests/[scenario1, threads, issue181, categories]
|
||||||
|
|
||||||
proc main() =
|
proc main() =
|
||||||
|
# Kill any already running instances
|
||||||
|
discard execCmd("killall geckodriver")
|
||||||
spawn runProcess("geckodriver -p 4444 --log config")
|
spawn runProcess("geckodriver -p 4444 --log config")
|
||||||
defer:
|
defer:
|
||||||
discard execCmd("killall geckodriver")
|
discard execCmd("killall geckodriver")
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import unittest, options, common
|
import unittest, options, common, os
|
||||||
|
|
||||||
import webdriver
|
import webdriver
|
||||||
|
|
||||||
|
|
@ -43,6 +43,65 @@ proc categoriesUserTests(session: Session, baseUrl: string) =
|
||||||
|
|
||||||
ensureExists title, LinkTextSelector
|
ensureExists title, LinkTextSelector
|
||||||
|
|
||||||
|
test "can navigate to categories page":
|
||||||
|
with session:
|
||||||
|
click "#categories-btn"
|
||||||
|
|
||||||
|
ensureExists "#categories-list"
|
||||||
|
|
||||||
|
test "can view post under category":
|
||||||
|
with session:
|
||||||
|
|
||||||
|
# create a few threads
|
||||||
|
click "#new-thread-btn"
|
||||||
|
sendKeys "#thread-title", "Post 1"
|
||||||
|
|
||||||
|
selectCategory "fun"
|
||||||
|
sendKeys "#reply-textarea", "Post 1"
|
||||||
|
|
||||||
|
click "#create-thread-btn"
|
||||||
|
navigate baseUrl
|
||||||
|
|
||||||
|
|
||||||
|
click "#new-thread-btn"
|
||||||
|
sendKeys "#thread-title", "Post 2"
|
||||||
|
|
||||||
|
selectCategory "announcements"
|
||||||
|
sendKeys "#reply-textarea", "Post 2"
|
||||||
|
|
||||||
|
click "#create-thread-btn"
|
||||||
|
navigate baseUrl
|
||||||
|
|
||||||
|
|
||||||
|
click "#new-thread-btn"
|
||||||
|
sendKeys "#thread-title", "Post 3"
|
||||||
|
|
||||||
|
selectCategory "default"
|
||||||
|
sendKeys "#reply-textarea", "Post 3"
|
||||||
|
|
||||||
|
click "#create-thread-btn"
|
||||||
|
navigate baseUrl
|
||||||
|
|
||||||
|
|
||||||
|
click "#categories-btn"
|
||||||
|
ensureExists "#categories-list"
|
||||||
|
|
||||||
|
click "#category-default"
|
||||||
|
checkText "#threads-list .thread-title", "Post 3"
|
||||||
|
for element in session.waitForElements("#threads-list .category-name"):
|
||||||
|
# Have to user "innerText" because elements are hidden on this page
|
||||||
|
assert element.getProperty("innerText") == "Default"
|
||||||
|
|
||||||
|
selectCategory "announcements"
|
||||||
|
checkText "#threads-list .thread-title", "Post 2"
|
||||||
|
for element in session.waitForElements("#threads-list .category-name"):
|
||||||
|
assert element.getProperty("innerText") == "Announcements"
|
||||||
|
|
||||||
|
selectCategory "fun"
|
||||||
|
checkText "#threads-list .thread-title", "Post 1"
|
||||||
|
for element in session.waitForElements("#threads-list .category-name"):
|
||||||
|
assert element.getProperty("innerText") == "Fun"
|
||||||
|
|
||||||
session.logout()
|
session.logout()
|
||||||
|
|
||||||
proc categoriesAdminTests(session: Session, baseUrl: string) =
|
proc categoriesAdminTests(session: Session, baseUrl: string) =
|
||||||
|
|
@ -76,6 +135,17 @@ proc categoriesAdminTests(session: Session, baseUrl: string) =
|
||||||
|
|
||||||
checkText "#category-selection .selected-category", name
|
checkText "#category-selection .selected-category", name
|
||||||
|
|
||||||
|
test "category adding disabled on admin logout":
|
||||||
|
with session:
|
||||||
|
navigate(baseUrl & "c/0")
|
||||||
|
ensureExists "#add-category"
|
||||||
|
logout()
|
||||||
|
|
||||||
|
checkIsNone "#add-category"
|
||||||
|
navigate baseUrl
|
||||||
|
|
||||||
|
login "admin", "admin"
|
||||||
|
|
||||||
session.logout()
|
session.logout()
|
||||||
|
|
||||||
proc test*(session: Session, baseUrl: string) =
|
proc test*(session: Session, baseUrl: string) =
|
||||||
|
|
@ -84,4 +154,4 @@ proc test*(session: Session, baseUrl: string) =
|
||||||
categoriesUserTests(session, baseUrl)
|
categoriesUserTests(session, baseUrl)
|
||||||
categoriesAdminTests(session, baseUrl)
|
categoriesAdminTests(session, baseUrl)
|
||||||
|
|
||||||
session.navigate(baseUrl)
|
session.navigate(baseUrl)
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,22 @@ const actionDelayMs {.intdefine.} = 0
|
||||||
macro with*(obj: typed, code: untyped): untyped =
|
macro with*(obj: typed, code: untyped): untyped =
|
||||||
## Execute a set of statements with an object
|
## Execute a set of statements with an object
|
||||||
expectKind code, nnkStmtList
|
expectKind code, nnkStmtList
|
||||||
result = code
|
|
||||||
|
template checkCompiles(res, default) =
|
||||||
|
when compiles(res):
|
||||||
|
res
|
||||||
|
else:
|
||||||
|
default
|
||||||
|
|
||||||
|
result = code.copy
|
||||||
|
|
||||||
# Simply inject obj into call
|
# Simply inject obj into call
|
||||||
for i in 0 ..< result.len:
|
for i in 0 ..< result.len:
|
||||||
if result[i].kind in {nnkCommand, nnkCall}:
|
if result[i].kind in {nnkCommand, nnkCall} and $result[i][0].toStrLit != "assert":
|
||||||
result[i].insert(1, obj)
|
result[i].insert(1, obj)
|
||||||
|
|
||||||
|
result = getAst(checkCompiles(result, code))
|
||||||
|
|
||||||
proc elementIsSome(element: Option[Element]): bool =
|
proc elementIsSome(element: Option[Element]): bool =
|
||||||
return element.isSome
|
return element.isSome
|
||||||
|
|
||||||
|
|
@ -73,8 +82,31 @@ proc waitForElement*(
|
||||||
sleep(actionDelayMs)
|
sleep(actionDelayMs)
|
||||||
|
|
||||||
while true:
|
while true:
|
||||||
let loading = session.findElement(selector, strategy)
|
try:
|
||||||
if waitCondition(loading):
|
let loading = session.findElement(selector, strategy)
|
||||||
|
if waitCondition(loading):
|
||||||
|
return loading
|
||||||
|
finally:
|
||||||
|
discard
|
||||||
|
sleep(pollTime)
|
||||||
|
waitTime += pollTime
|
||||||
|
|
||||||
|
if waitTime > timeout:
|
||||||
|
doAssert false, "Wait for load time exceeded"
|
||||||
|
|
||||||
|
proc waitForElements*(
|
||||||
|
session: Session, selector: string, strategy=CssSelector,
|
||||||
|
timeout=20000, pollTime=50
|
||||||
|
): seq[Element] =
|
||||||
|
var waitTime = 0
|
||||||
|
|
||||||
|
when actionDelayMs > 0:
|
||||||
|
sleep(actionDelayMs)
|
||||||
|
|
||||||
|
while true:
|
||||||
|
let loading = session.findElements(selector, strategy)
|
||||||
|
echo loading
|
||||||
|
if loading.len > 0:
|
||||||
return loading
|
return loading
|
||||||
sleep(pollTime)
|
sleep(pollTime)
|
||||||
waitTime += pollTime
|
waitTime += pollTime
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue