Using Elastic4s to register a query with the percolator - scala

I'm trying to register a percolator query with the elastic4s library. After much research I've found I need to use something like:
val myQuery = """ { "query" : { "match" : { "foo" : "bar" } } } """
esClient.execute( register id 12345 into "baz" query myQuery )
As if I'm doing this:
curl -XPUT 'localhost:9200/baz/.percolator/12345' -d '{
"query" : {
"match" : {
"foo" : "bar"
}
}
}'
But whenever I try running esClient.execute I end up getting a few parsing errors, but it works fine through the curl:
[info] org.elasticsearch.index.percolator.PercolatorException: failed to parse query [987654]
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parsePercolatorDocument(PercolatorQueriesRegistry.java:182)
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry$RealTimePercolatorOperationListener.preIndex(PercolatorQueriesRegistry.java:301)
[info] at org.elasticsearch.index.indexing.ShardIndexingService.preIndex(ShardIndexingService.java:146)
[info] at org.elasticsearch.index.shard.IndexShard.index(IndexShard.java:565)
[info] at org.elasticsearch.index.engine.Engine$Index.execute(Engine.java:836)
[info] at org.elasticsearch.action.support.replication.TransportReplicationAction.executeIndexRequestOnPrimary(TransportReplicationAction.java:1073)
[info] at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:170)
[info] at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.performOnPrimary(TransportReplicationAction.java:579)
[info] at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase$1.doRun(TransportReplicationAction.java:452)
[info] at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
[info] ...
[info] Cause: org.elasticsearch.index.query.QueryParsingException: Failed to parse query [{"query":{"match":{"foo":"bar"}}}]
[info] at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:243)
[info] at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:257)
[info] at org.elasticsearch.index.query.IndexQueryParserService.parseInnerQuery(IndexQueryParserService.java:244)
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parseQuery(PercolatorQueriesRegistry.java:208)
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parsePercolatorDocument(PercolatorQueriesRegistry.java:179)
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry$RealTimePercolatorOperationListener.preIndex(PercolatorQueriesRegistry.java:301)
[info] at org.elasticsearch.index.indexing.ShardIndexingService.preIndex(ShardIndexingService.java:146)
[info] at org.elasticsearch.index.shard.IndexShard.index(IndexShard.java:565)
[info] at org.elasticsearch.index.engine.Engine$Index.execute(Engine.java:836)
[info] at org.elasticsearch.action.support.replication.TransportReplicationAction.executeIndexRequestOnPrimary(TransportReplicationAction.java:1073)
[info] ...
[info] Cause: org.apache.lucene.queryparser.classic.ParseException: Cannot parse '{"query":{"match":{"foo":"bar"}}}': Encountered " "}" "} "" at line 1, column 30.
[info] Was expecting one of:
[info] "TO" ...
[info] <RANGE_QUOTED> ...
[info] <RANGE_GOOP> ...
[info] at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:123)
[info] at org.apache.lucene.queryparser.classic.MapperQueryParser.parse(MapperQueryParser.java:848)
[info] at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:227)
[info] at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:257)
[info] at org.elasticsearch.index.query.IndexQueryParserService.parseInnerQuery(IndexQueryParserService.java:244)
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parseQuery(PercolatorQueriesRegistry.java:208)
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parsePercolatorDocument(PercolatorQueriesRegistry.java:179)
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry$RealTimePercolatorOperationListener.preIndex(PercolatorQueriesRegistry.java:301)
[info] at org.elasticsearch.index.indexing.ShardIndexingService.preIndex(ShardIndexingService.java:146)
[info] at org.elasticsearch.index.shard.IndexShard.index(IndexShard.java:565)
[info] ...
[info] Cause: org.apache.lucene.queryparser.classic.ParseException: Encountered " "}" "} "" at line 1, column 30.
[info] Was expecting one of:
[info] "TO" ...
[info] <RANGE_QUOTED> ...
[info] <RANGE_GOOP> ...
[info] at org.apache.lucene.queryparser.classic.QueryParser.generateParseException(QueryParser.java:698)
[info] at org.apache.lucene.queryparser.classic.QueryParser.jj_consume_token(QueryParser.java:580)
[info] at org.apache.lucene.queryparser.classic.QueryParser.Term(QueryParser.java:394)
[info] at org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:247)
[info] at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:171)
[info] at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:160)
[info] at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:118)
[info] at org.apache.lucene.queryparser.classic.MapperQueryParser.parse(MapperQueryParser.java:848)
[info] at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:227)
[info] at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:257)
[info] ...
So I've got the feeling that I need to format the query differently, but it's not in the docs and I can't seem to find any examples out there. I've tried a few other formats like so:
val myQuery2 = """ "query" : { "match" : { "foo" : "bar" } } """
val myQuery3 = """ { "match" : { "foo" : "bar" } } """
val myQuery4 = """ "match" : { "foo" : "bar" } """
But nothing seems to be able to work, the only thing I've gotten to work was just having it like:
val myQuery5 = "query"
But with this I cannot specify what I actually want to match on. Anyone have any experience with this, or any ideas?

The query method accepts a string, but the string is a query string and not a json fragment as you have tried. If the query string format is not suitable, then you need to create the query using the elastic4s query dsl, eg
termQuery("field", "value")
or
matchQuery("field", "value")
etc. There are many query types, and they can be nested with a bool query.

Related

initializate value only once before all tests runs

I want to initializate value only once before all tests runs
Now the value insertDbScheme create scheme in every test, if it possible to run it only once. Insert scheme from sbt task not suitable
I have two tests
test1:
class Test1 extends Specification with InsertDbScheme {
"test" in {
insertDbScheme
// some code
ok
}
}
test2:
class Test2 extends Specification with InsertDbScheme {
"test" in {
insertDbScheme
// some code
ok
}
}
and a base trait that insert scheme to database
trait InsertDbScheme {
lazy val insertDbScheme = {
println("insert scheme to database")
}
}
result of running tests
insert scheme to database
insert scheme to database
[info] Test1
[info]
[info] + test
[info]
[info]
[info] Total for specification Test1
[info] Finished in 152 ms
[info] 1 example, 0 failure, 0 error
[info]
[info] Test2
[info]
[info] + test
[info]
[info]
[info] Total for specification Test2
[info] Finished in 152 ms
[info] 1 example, 0 failure, 0 error
[info]
[info] ScalaCheck
[info] Passed: Total 0, Failed 0, Errors 0, Passed 0
[info] Passed: Total 2, Failed 0, Errors 0, Passed 2
[success] Total time: 12 s, completed May 18, 2017 6:35:21 PM
You can use an object to make sure it's lazy val is only instantiated once:
trait InsertDbScheme {
import InsertDbScheme._
lazy val insertDbScheme = insertDbSchemeOnce
}
object InsertDbScheme {
lazy val insertDbSchemeOnce = {
println("insert scheme to database")
}
}
The easiest thing is to use a variable in a InsertDbScheme object:
trait InsertDbScheme {
def insertDbScheme = synchronized {
if (!InsertDbScheme.done) {
println("insert scheme to database")
InsertDbScheme.done = true
}
}
}
object InsertDbScheme {
var done = false
}

Scala Play 2 Framework: PrivilegedActionException: null

So, i study play 2 framework + slick. code is simple query to db with slick. And get exception. And I don't understand what to do.
my controller:
class IndexController #Inject()(taskRepo: TaskRepo) extends Controller {
def index = Action.async { implicit rs =>
taskRepo.all().map(tasks => Ok(views.html.index(tasks)))
}
}
and exception:
[info] ! #6pp163f7m - Internal server error, for (GET) [/] ->
[info]
[info] play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[PrivilegedActionException: null]]
[info] at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:269)
[info] at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:195)
[info] at play.core.server.Server$class.logExceptionAndGetResult$1(Server.scala:45)
[info] at play.core.server.Server$class.getHandlerFor(Server.scala:65)
[info] at play.core.server.NettyServer.getHandlerFor(NettyServer.scala:45)
[info] at play.core.server.netty.PlayRequestHandler.handle(PlayRequestHandler.scala:81)
[info] at play.core.server.netty.PlayRequestHandler.channelRead(PlayRequestHandler.scala:162)
[info] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:307)
[info] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:293)
[info] at com.typesafe.netty.http.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:129)
[info] Caused by: java.security.PrivilegedActionException: null
[info] at java.security.AccessController.doPrivileged(Native Method)
[info] at play.runsupport.Reloader$.play$runsupport$Reloader$$withReloaderContextClassLoader(Reloader.scala:39)
[info] at play.runsupport.Reloader.reload(Reloader.scala:336)
[info] at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:118)
[info] at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:116)
[info] at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
[info] at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
[info] at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
[info] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
[info] at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
[info] Caused by: java.util.concurrent.TimeoutException: Futures timed out after [300000 milliseconds]
[info] at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
[info] at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)
[info] at scala.concurrent.Await$$anonfun$result$1.apply(package.scala:190)
[info] at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
[info] at scala.concurrent.Await$.result(package.scala:190)
[info] at play.forkrun.ForkRun$$anonfun$askForReload$1.apply(ForkRun.scala:128)
[info] at play.forkrun.ForkRun$$anonfun$askForReload$1.apply(ForkRun.scala:126)
[info] at play.runsupport.Reloader$$anonfun$reload$1.apply(Reloader.scala:338)
[info] at play.runsupport.Reloader$$anon$3.run(Reloader.scala:43)
[info] at java.security.AccessController.doPrivileged(Native Method)
what i do wrong?
Problem was in Futures timed out after [300000 milliseconds]
in build.sbt change fork in run := true to fork in run := false

Testing of click event fails

I am following the official tutorial of scala.js, and in the testing part there is some code like this:
package tutorial.webapp
import utest._
import org.scalajs.jquery.{JQuery, jQuery}
object TutorialTest extends TestSuite {
// Initialize App
TutorialApp.setupUI
def tests = TestSuite {
'HelloWorld {
val ps = jQuery("p:contains('Hello World')")
log("Number of hello-world paragraphs", ps.length)
assert(ps.length == 1)
}
'ButtonClick {
def messageCount =
jQuery("p:contains('Bang!')").length
val button = jQuery("button:contains('Click me!')")
log("Number of bang paragraphs", messageCount)
log("Number of button", button.length)
assert(button.length == 1)
assert(messageCount == 0)
for (c <- 1 to 5) {
log("Number of bang paragraphs", messageCount)
log("Number of button", button.length)
button.click()
assert(messageCount == c)
}
}
def log[A](header: String, msg: A): Unit = {
println(
"""
|
|
|=========================================
|%s : %s
|=========================================
|
|
""".format(header, msg.toString).stripMargin)
}
}
The event-based tests in the for loop fail in sbt test:
> test
[info] Compiling 1 Scala source to /Users/kaiyin/personal_config_bin_files/workspace/scalajsLearn/target/scala-2.11/test-classes...
=========================================
Number of hello-world paragraphs : 1
=========================================
=========================================
Number of bang paragraphs : 0
=========================================
=========================================
Number of button : 1
=========================================
=========================================
Number of bang paragraphs : 0
=========================================
=========================================
Number of button : 1
=========================================
[info] 1/3 tutorial.webapp.TutorialTest.HelloWorld Success
[info] 2/3 tutorial.webapp.TutorialTest.ButtonClick
[info] utest.AssertionError: assert(messageCount == c)
[info] c: Int = 1
[info] 3/3 tutorial.webapp.TutorialTest Success
[info] -----------------------------------Results-----------------------------------
[info] tutorial.webapp.TutorialTest Success
[info] HelloWorld Success
[info] ButtonClick Failure('utest.AssertionError: assert(messageCount == c)
[info] c: Int = 1')
[info] Failures:
[info] 2/3 tutorial.webapp.TutorialTest.ButtonClick
[info] utest.AssertionError: assert(messageCount == c)
[info] c: Int = 1
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/StackTrace.scala:39:42)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/StackTrace.scala:33:17)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/javalanglib/src/main/scala/java/lang/Throwables.scala:24:50)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/javalanglib/src/main/scala/java/lang/Throwables.scala:12:19)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Errors.scala:20:45)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/asserts/package.scala:19:5)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/asserts/package.scala:38:56)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:15:38)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/asserts/Asserts.scala:74:22)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:15:38)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/collection/IndexedSeqOptimized.scala:33:24)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/js/WrappedArray.scala:20:13)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/asserts/Asserts.scala:72:16)
[info] (file:/Users/kaiyin/personal_config_bin_files/workspace/scalajsLearn/src/test/scala/tutorial/webapp/TutorialTest.scala:32:15)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/scalalib/overrides-2.11/scala/collection/immutable/Range.scala:160:8)
[info] (file:/Users/kaiyin/personal_config_bin_files/workspace/scalajsLearn/src/test/scala/tutorial/webapp/TutorialTest.scala:28:14)
[info] (file:/Users/kaiyin/personal_config_bin_files/workspace/scalajsLearn/src/test/scala/tutorial/webapp/TutorialTest.scala:12:25)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:166:31)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:164:27)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:61:78)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:10:30)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/util/Try.scala:192:16)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:61:48)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:61:48)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/Option.scala:158:5)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:61:93)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:61:93)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/util/Try.scala:237:43)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/util/Try.scala:237:43)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:10:30)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/util/Try.scala:192:16)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/util/Try.scala:237:41)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/Future.scala:235:25)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/Future.scala:235:20)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:15:38)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:32:19)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/ExecutionContext.scala:16:21)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:40:25)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:280:61)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:270:28)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/Future.scala:235:16)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:153:9)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:61:37)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:59:11)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Future.scala:24:20)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Future.scala:23:15)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/ExecutionContext.scala:16:21)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Future.scala:31:29)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/Future.scala:492:114)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:107:14)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:82:100)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:81:54)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/Option.scala:158:5)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:81:47)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:83:24)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:15:38)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/Future.scala:251:31)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/Future.scala:249:16)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:15:38)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:32:19)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/ExecutionContext.scala:16:21)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:40:25)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:280:61)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:270:28)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/Future.scala:249:16)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Promise.scala:153:9)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:82:100)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:81:54)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/Option.scala:158:5)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:81:47)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:88:38)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:59:11)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Future.scala:24:20)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Future.scala:23:15)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/ExecutionContext.scala:16:21)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/impl/Future.scala:31:29)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/concurrent/Future.scala:492:114)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:107:14)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/framework/Model.scala:133:22)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/package.scala:135:6)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/runner/BaseRunner.scala:70:21)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/runner/BaseRunner.scala:95:35)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:30:68)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/runner/Task.scala:48:19)
[info] (file:/Users/haoyi/Dropbox%20(Personal)/Workspace/utest-new/utest/js/../shared/src/main/scala/utest/runner/Task.scala:31:17)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/Slave.scala:104:36)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/Slave.scala:104:36)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:10:30)
[info] (https://raw.githubusercontent.com/scala/scala/v2.11.7/src/library/scala/util/Try.scala:192:16)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/Slave.scala:104:23)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/Slave.scala:36:18)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/Slave.scala:31:7)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.5/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:10:30)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/Slave.scala:69:7)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/Slave.scala:30:28)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/BridgeBase.scala:34:20)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/BridgeBase.scala:19:14)
[info] (https://raw.githubusercontent.com/scala-js/scala-js/v0.6.0/test-interface/src/main/scala/org/scalajs/testinterface/internal/BridgeBase.scala:19:14)
[info] Tests: 3
[info] Passed: 2
[info] Failed: 1
[error] Failed tests:
[error] tutorial.webapp.TutorialTest
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 2 s, completed 27 oct. 2015 21:00:35
The entire project is here: https://github.com/kindlychung/scalajstutorial
The click behavior is defined here:
package tutorial.webapp
/**
* Created by IDEA on 27/10/15.
*/
import scala.scalajs.js.JSApp
import org.scalajs.dom
import dom.document
import scala.scalajs.js.annotation.JSExport
import org.scalajs.jquery.jQuery
object TutorialApp extends JSApp {
def main(): Unit = {
setupUI
setupBehavior
}
def appendPar(targetNode: dom.Node, text: String): Unit = {
val parNode = document.createElement("p")
val textNode = document.createTextNode(text)
parNode.appendChild(textNode)
targetNode.appendChild(parNode)
}
def addClickedMessage(msg: String): Unit = {
jQuery("body").append("<p>%s</p>".format(msg))
}
def setupUI: Unit = {
jQuery("body").append("<p>Hello World!</p>")
jQuery("body").append("""<button id="click-me-button" type="button">Click me!</button>""")
}
def setupBehavior: Unit = {
jQuery("#click-me-button").click(() => addClickedMessage("Bang!"))
}
}
Your button indeed does nothing. Your test does not call setupBehavior, which registers the click event on the button. Therefore, calling click() doesn't do anything. No message is added, and the test correctly reports that there is no message.
Make sure to call setupBehavior to fix your issue.

sbt - defining custom configuration for sequential tests

Some of my tests require that they are sequentially executed. I read about custom configurations on http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Testing.html but I am missing something because my configuration is not working properly.
Here it is:
import sbt._
import Keys._
object SchedulingBackendBuild extends Build {
lazy val SequentialTest = config("sequentialTest") extend(Test)
def sequentialTestFilter(name: String): Boolean = {
println("===seq test filter")
name endsWith "SeqSpec"
}
def unitTestFilter(name: String): Boolean = {
println("===unit test filter")
!sequentialTestFilter(name)
}
lazy val root = Project(id = "scheduling-backend",
base = file("."),
settings = Project.defaultSettings
).configs(SequentialTest)
.settings(inConfig(SequentialTest)(Defaults.testTasks): _*)
.settings(
testOptions in Test ++= Seq(Tests.Filter(unitTestFilter)),
testOptions in SequentialTest ++= Seq(Tests.Filter(sequentialTestFilter))
)
}
I want test to only execute tests that are not ending with SeqSpec and this is working, but when I try to execute sequentialTest:test no tests are executed. I added println to my filters and I can see that even if I execute sequentialTest:test I am getting
===unit test filter
===seq test filter
===seq test filter
so both filters are executed.
When I type inspect sequentialTest:testOptions I am getting
[info] Task: scala.collection.Seq[sbt.TestOption]
[info] Description:
[info] Options for running tests.
[info] Provided by:
[info] {file:/path/to/project/scheduling-backend/}scheduling-backend/sequentialTest:testOptions
[info] Defined at:
[info] /path/to/project/scheduling-backend/project/Build.scala:22
[info] Reverse dependencies:
[info] sequentialTest:testOnly::testOptions
[info] sequentialTest:testQuick::testOptions
[info] sequentialTest:test::testOptions
[info] Delegates:
[info] sequentialTest:testOptions
[info] test:testOptions
[info] runtime:testOptions
[info] compile:testOptions
[info] *:testOptions
[info] {.}/sequentialTest:testOptions
[info] {.}/test:testOptions
[info] {.}/runtime:testOptions
[info] {.}/compile:testOptions
[info] {.}/*:testOptions
[info] */sequentialTest:testOptions
[info] */test:testOptions
[info] */runtime:testOptions
[info] */compile:testOptions
[info] */*:testOptions
[info] Related:
[info] sequentialTest:testOnly::testOptions
[info] sequentialTest:testQuick::testOptions
[info] test:testOptions
[info] test:testQuick::testOptions
[info] */*:testOptions
[info] test:testOnly::testOptions
[info] test:test::testOptions
[info] sequentialTest:test::testOptions
so for me it looks ok, line 22 is testOptions in SequentialTest ++= Seq(Tests.Filter(sequentialTestFilter))
Partial answer: if I change ++= operator (appending to the sequence) to := (replacing the sequence) everything works fine (and := operators are used in the documentation). Even so I would want to know why ++= in this case is bad choice.

How do you use play scala specs2 matchers across multiple files

I am using Play 2.2.1 with scala and trying to test with Specs2 matchers across multiple files. Everything works fine in one very large ApplicationSpec.scala file but I would like to move the code to separate files.
The following code is what I am using to test across multiple files but it is very intermittent.
ApplicationSpec.scala file
import org.specs2.mutable._
import org.specs2.mutable.Specification
import org.specs2.matcher.JsonMatchers
import org.specs2.runner._
import org.junit.runner._
#RunWith(classOf[JUnitRunner])
class ApplicationSpec extends PlaySpecification with JsonMatchers {
"Test using another file" should {
testing
"End of test" in {"End" must beEqualTo("End")}
}
This function is located inside the ApplicationSpec.scala file
def testing() {
"Multiple files" should {
"Testing testFile1" in {
testFile1.test1
testFile1.test2
"Test1 and Test2 should print before this line" in { 1 must beEqualTo(1)}
}
"Testing testFile2" in {
testFile2.test3
testFile2.test4
"Test3 and Test4 should print before this line" in { 1 must beEqualTo(1)}
}
}
}
testFile1.scala
object testFile1 extends ApplicationSpec {
def test1 {
"testFile1 - test1" in {1 must beEqualTo(1)}
}
def test2 {
"testFile1 - test2" in {1 must beEqualTo(1)}
}
}
testFile2.scala
object testFile2 extends ApplicationSpec {
def test3 {
"testFile2 - test3" in {1 must beEqualTo(1)}
}
def test4 {
"testFile2 - tes4" in {1 must beEqualTo(1)}
}
}
Test results Each time "play test" is run test1, test2, and test3, test4 may or may not print out. Sometimes all four tests show up or none of the tests are printed.
+ test WS logic
[info]
[info] Test using another file should
[info]
[info] Multiple files should
[info]
[info] Testing testFile1
[info] + Test1 and Test2 should print before this line
[info]
[info] Testing testFile2
[info] + testFile2 - test3
[info] + testFile2 - tes4
[info] + Test3 and Test4 should print before this line
[info] + End of test
[info]
[info] Total for specification testFile2
[info] Finished in 1 second, 713 ms
[info] 6 examples, 0 failure, 0 error
[info] testFile1
[info]
[info] Application should
[info] + test WS logic
[info]
[info] Test using another file should
[info]
[info] Multiple files should
[info]
[info] Testing testFile1
[info] + testFile1 - test1
[info] + testFile1 - test2
[info] + Test1 and Test2 should print before this line
[info]
[info] Testing testFile2
[info] + Test3 and Test4 should print before this line
[info] + End of test
[info]
[info] Total for specification testFile1
[info] Finished in 111 ms
[info] 6 examples, 0 failure, 0 error
[info] ApplicationSpec
[info]
[info] Application should
[info] + test WS logic
[info]
[info] Test using another file should
[info]
[info] Multiple files should
[info]
[info] Testing testFile1
[info] + Test1 and Test2 should print before this line
[info]
[info] Testing testFile2
[info] + Test3 and Test4 should print before this line
[info] + End of test
[info]
[info] Total for specification ApplicationSpec
[info] Finished in 99 ms
[info] 4 examples, 0 failure, 0 error
You can use traits to declare examples then import them to the main specification by mixing them in:
class TestSpec extends org.specs2.mutable.Specification with testFile1 with testFile2 {
"Test using another file" should {
testing
"End of test" in {"End" must beEqualTo("End")}
}
def testing {
"Multiple files" should {
"Testing testFile1" in {
tests1
"Test1 and Test2 should print before this line" in { 1 must beEqualTo(1)}
}
"Testing testFile2" in {
tests2
"Test3 and Test4 should print before this line" in { 1 must beEqualTo(1)}
}
}
}
trait testFile1 extends org.specs2.mutable.Specification {
def tests1 = {
"testFile1 - test1" in {1 must beEqualTo(1)}
"testFile1 - test2" in {1 must beEqualTo(1)}
}
}
trait testFile2 extends org.specs2.mutable.Specification {
def tests2 = {
"testFile2 - test3" in {1 must beEqualTo(1)}
"testFile2 - tes4" in {1 must beEqualTo(1)}
}
}