| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- import com.weEat.controllers.UserController
- import javax.inject.Inject
- import play.api.test.Helpers._
- import play.api.test.FakeRequest
- import play.api.libs.json.Json
- import org.openqa.selenium.By
- import org.scalatest.{Assertion,BeforeAndAfterAll,BeforeAndAfterEach}
- import org.scalatestplus.play._
- import org.scalatestplus.play.guice.GuiceOneServerPerSuite
- import com.weEat.shared.models.User
- import scala.concurrent.{Future,blocking}
- import scala.concurrent.duration._
- import scala.language.postfixOps
- import java.util.concurrent.TimeoutException
- import org.bson.types.ObjectId
- class IntegrationSpec @Inject()(
- userController: UserController
- ) extends PlaySpec
- with BeforeAndAfterAll
- with BeforeAndAfterEach
- with GuiceOneServerPerSuite
- with AllBrowsersPerTest {
- val users = Seq(
- (User(new ObjectId(), "test", "user", "tuser@sample.org"), "password"),
- (User(new ObjectId(), "another", "user", "usert@sample.org"), "password")
- )
- override def beforeAll() = {
- val Some(resp) = route(app, FakeRequest(PUT, "/v1/user/").withJsonBody(
- Json.parse(s"""|{
- | "fname": "${users(0)._1.fname}",
- | "lname": "${users(0)._1.lname}",
- | "email": "${users(0)._1.email}",
- | "password": "${users(0)._2}"
- |}""".stripMargin)
- ))
- status(resp) mustEqual OK
- }
- override def afterAll() = {
- implicit val ec: scala.concurrent.ExecutionContext = scala.concurrent.ExecutionContext.global
- Future.sequence(Seq(
- userController.deleteUser(users(0)._1._id),
- )).map { (deletes) =>
- deletes must matchPattern {
- case Seq(_) =>
- }
- }
-
- // val Some(resp) = route(app, FakeRequest(DELETE, s"/v1/user/${users(0)._id}"))
- // status(resp) mustEqual OK
- // val Some(resp) = route(app, FakeRequest(DELETE, s"/v1/user/${users(1)._id}"))
- // status(resp) mustEqual OK
- }
- override lazy val browsers = Vector(
- FirefoxInfo(firefoxProfile),
- //ChromeInfo
- )
- val address = s"http://localhost:$port"
- /* Will repeatedly attempt to test until a result is returned.
- * A None value implies the test is not yet ready to run and will be attempted
- * again after the frequency has passed..
- *
- * A Some value means the test has completed with the contained assertion
- * result.
- */
- def poll(
- test: () => Option[Assertion],
- frequency: Duration = 100.millisecond
- ): Future[Assertion] = {
- test() match {
- case Some(result) => Future.successful(result)
- case None => {
- blocking {
- Thread.sleep(frequency.toMillis)
- }
- poll(test, frequency)
- }
- }
- }
- def waitForReady[T](
- timeout: Duration = 1 minute,
- period: Duration = 100 millisecond
- )(fn: => T): Future[T] =
- if (executeScript("return jQuery.active == 0 && selAsyncCount == 0;").asInstanceOf[Boolean])
- Future.successful(fn)
- else if (timeout < 0.second)
- Future.failed(new TimeoutException())
- else {
- blocking {
- Thread.sleep(period.toMillis)
- }
- waitForReady(timeout - period, period)(fn)
- }
- def sharedTests(browser: BrowserInfo) = {
- "The register menu" must {
- "display when register button is clicked " + browser.name in {
- go to address
- click on id("btn-signup")
- waitForReady() {
- click on id("view-register").webElement.findElement(By.xpath("./.."))
- //id("content").webElement.getText mustEqual ("")
- }
- }
- def testUserList() = {
- val Some(resp) = route(app, FakeRequest(GET, "/v1/user/"))
- status(resp) mustEqual OK
- contentAsJson(resp).as[Seq[String]] must matchPattern {
- case Seq(user1, user2) =>
- }
- }
- "accept a new user " + browser.name in {
- go to address
- click on id("btn-signup")
- waitForReady() {
- textField("email").value = users(1)._1.email
- name("password").webElement.sendKeys(users(1)._2)
- name("password2").webElement.sendKeys(users(1)._2)
- textField("fname").value = users(1)._1.fname
- textField("lname").value = users(1)._1.lname
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- find("#view-register") must be (None)
- id("btn-logout").webElement must be ("displayed")
- // id("content").webElement.getText
- // .mustEqual(s"Hello, ${users(1)._1.fname} ${users(1)._1.lname}!")
- // testUserList()
- }
- }
- }
- "reject a used email " + browser.name in {
- go to address
- click on id("btn-signup")
- waitForReady() {
- textField("email").value = users(0)._1.email
- name("password").webElement.sendKeys("_"+users(0)._2)
- name("password2").webElement.sendKeys("_"+users(0)._2)
- textField("fname").value = "_"+users(0)._1.fname
- textField("lname").value = "_"+users(0)._1.lname
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- cssSelector(".alert-danger").webElement.getText
- .mustEqual("Error: This email address is already registered.")
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- testUserList()
- }
- }
- }
- "reject an invalid email " + browser.name in {
- go to address
- click on id("btn-signup")
- waitForReady() {
- textField("email").value = "hello World!"
- name("password").webElement.sendKeys("_"+users(0)._2)
- name("password2").webElement.sendKeys("_"+users(0)._2)
- textField("fname").value = "_"+users(0)._1.fname
- textField("lname").value = "_"+users(0)._1.lname
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- cssSelector(".alert-danger").webElement.getText
- .mustEqual("Error: Invalid email.")
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- testUserList()
- }
- }
- }
- "reject a password below 8 characters " + browser.name in {
- go to address
- click on id("btn-signup")
- waitForReady() {
- textField("email").value = "_"+users(0)._1.email
- name("password").webElement.sendKeys("1234567")
- name("password2").webElement.sendKeys("1234567")
- textField("fname").value = "_"+users(0)._1.fname
- textField("lname").value = "_"+users(0)._1.lname
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- cssSelector(".alert-danger").webElement.getText
- .mustEqual("Error: Password too short (Minimum 8 characters).")
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- testUserList()
- }
- }
- }
- "reject a non-matching passwords " + browser.name in {
- go to address
- click on id("btn-signup")
- waitForReady() {
- textField("email").value = "_"+users(0)._1.email
- name("password").webElement.sendKeys(users(0)._2)
- name("password2").webElement.sendKeys("_"+users(0)._2)
- textField("fname").value = "_"+users(0)._1.fname
- textField("lname").value = "_"+users(0)._1.lname
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- cssSelector(".alert-danger").webElement.getText
- .mustEqual("Error: Passwords do not match.")
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- testUserList()
- }
- }
- }
- }
- "The login menu" must {
- "display when login button is clicked " + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- click on id("view-login").webElement.findElement(By.xpath("./.."))
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- }
- }
- "accept user created from API " + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- textField("email").value = users(0)._1.email
- name("password").webElement.sendKeys(users(0)._2)
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- find("#view-login") must be (None)
- id("btn-logout").webElement must be ("displayed")
- // id("content").webElement.getText
- // .mustEqual(s"Hello, ${users(0)._1.fname} ${users(0)._1.lname}!")
- }
- }
- }
- "accept user created from UI " + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- textField("email").value = users(1)._1.email
- name("password").webElement.sendKeys(users(1)._2)
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- find("#view-login") must be (None)
- id("btn-logout").webElement must be ("displayed")
- // id("content").webElement.getText
- // .mustEqual(s"Hello, ${users(1)._1.fname} ${users(1)._1.lname}!")
- }
- }
- }
- "reject an incorrect email " + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- textField("email").value = "_"+users(1)._1.email
- name("password").webElement.sendKeys(users(0)._2)
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- cssSelector(".alert-danger").webElement.getText
- .mustEqual("Error: Invalid client or client is not authorized")
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- }
- }
- }
- "reject an incorrect password " + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- textField("email").value = users(1)._1.email
- name("password").webElement.sendKeys("_"+users(0)._2)
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- cssSelector(".alert-danger").webElement.getText
- .mustEqual("Error: Invalid client or client is not authorized")
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- }
- }
- }
- "reject an incorrect email and password " + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- textField("email").value = "_"+users(1)._1.email
- name("password").webElement.sendKeys("_"+users(0)._2)
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- cssSelector(".alert-danger").webElement.getText
- .mustEqual("Error: Invalid client or client is not authorized")
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- }
- }
- }
- "maintain login info across refresh " + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- textField("email").value = users(1)._1.email
- name("password").webElement.sendKeys(users(1)._2)
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- go to address
- waitForReady() {
- find("#view-login") must be (None)
- id("btn-logout").webElement must be ("displayed")
- // id("content").webElement.getText
- // .mustEqual(s"Hello, ${users(1)._1.fname} ${users(1)._1.lname}!")
- id("btn-logout").webElement must be ("displayed")
- }
- }
- }
- }
- }
- "The logout button" must {
- "not display when not logged in " + browser.name in {
- go to address
- waitForReady() {
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- }
- }
- "display when logged in" + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- textField("email").value = users(0)._1.email
- name("password").webElement.sendKeys(users(0)._2)
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- id("btn-logout").webElement must be ("displayed")
- }
- }
- }
- "remove user information when clicked " + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- textField("email").value = users(0)._1.email
- name("password").webElement.sendKeys(users(0)._2)
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- click on id("btn-logout")
- waitForReady() {
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- }
- }
- }
- }
- "remove stored user information when clicked " + browser.name in {
- go to address
- click on id("btn-login")
- waitForReady() {
- textField("email").value = users(0)._1.email
- name("password").webElement.sendKeys(users(0)._2)
- click on cssSelector("*[data-cb='success']")
- waitForReady() {
- click on id("btn-logout")
- waitForReady() {
- go to address
- id("btn-logout").webElement mustNot be ("displayed")
- //id("content").webElement.getText mustEqual("")
- }
- }
- }
- }
- }
- }
- }
|