Add tests and improve testing experience

This commit is contained in:
Joey Yakimowich-Payne 2020-02-18 13:56:38 -07:00 committed by Andreas Rumpf
commit 5ce99a5a3d
3 changed files with 111 additions and 7 deletions

View file

@ -23,7 +23,7 @@ const baseUrl = "http://localhost:" & $port & "/"
template withBackend(body: untyped): untyped =
## Starts a new backend instance.
spawn runProcess("nimble -y runbackend")
spawn runProcess("nimble -y testbackend")
defer:
discard execCmd("killall " & backend)
@ -46,6 +46,8 @@ template withBackend(body: untyped): untyped =
import browsertests/[scenario1, threads, issue181, categories]
proc main() =
# Kill any already running instances
discard execCmd("killall geckodriver")
spawn runProcess("geckodriver -p 4444 --log config")
defer:
discard execCmd("killall geckodriver")

View file

@ -1,4 +1,4 @@
import unittest, options, common
import unittest, options, common, os
import webdriver
@ -43,6 +43,65 @@ proc categoriesUserTests(session: Session, baseUrl: string) =
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()
proc categoriesAdminTests(session: Session, baseUrl: string) =
@ -76,6 +135,17 @@ proc categoriesAdminTests(session: Session, baseUrl: string) =
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()
proc test*(session: Session, baseUrl: string) =
@ -84,4 +154,4 @@ proc test*(session: Session, baseUrl: string) =
categoriesUserTests(session, baseUrl)
categoriesAdminTests(session, baseUrl)
session.navigate(baseUrl)
session.navigate(baseUrl)

View file

@ -8,13 +8,22 @@ const actionDelayMs {.intdefine.} = 0
macro with*(obj: typed, code: untyped): untyped =
## Execute a set of statements with an object
expectKind code, nnkStmtList
result = code
template checkCompiles(res, default) =
when compiles(res):
res
else:
default
result = code.copy
# Simply inject obj into call
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 = getAst(checkCompiles(result, code))
proc elementIsSome(element: Option[Element]): bool =
return element.isSome
@ -73,8 +82,31 @@ proc waitForElement*(
sleep(actionDelayMs)
while true:
let loading = session.findElement(selector, strategy)
if waitCondition(loading):
try:
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
sleep(pollTime)
waitTime += pollTime