1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-03-19 21:28:32 +02:00
ferret/pkg/runtime/expressions/waitfor_event_test.go
Tim Voronov 742bdae0ae
Feature/#263 waitfor event (#590)
* Added new WAITFOR syntax

* Added support of event options

* Added support of options

* Added support of using WAITFOR EVENT in variable assignment
2021-07-13 21:34:22 -04:00

204 lines
4.7 KiB
Go

package expressions_test
import (
"context"
"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/runtime/events"
"github.com/MontFerret/ferret/pkg/runtime/expressions"
"github.com/MontFerret/ferret/pkg/runtime/expressions/literals"
"testing"
"time"
. "github.com/smartystreets/goconvey/convey"
"github.com/MontFerret/ferret/pkg/runtime/values"
)
type MockedObservable struct {
*values.Object
subscribers map[string]chan events.Event
Args map[string][]*values.Object
}
func NewMockedObservable() *MockedObservable {
return &MockedObservable{
Object: values.NewObject(),
subscribers: map[string]chan events.Event{},
Args: map[string][]*values.Object{},
}
}
func (m *MockedObservable) Emit(eventName string, args core.Value, err error, timeout int64) {
ch := make(chan events.Event)
m.subscribers[eventName] = ch
go func() {
<-time.After(time.Millisecond * time.Duration(timeout))
ch <- events.Event{
Data: args,
Err: err,
}
}()
}
func (m *MockedObservable) Subscribe(_ context.Context, eventName string, opts *values.Object) <-chan events.Event {
calls, found := m.Args[eventName]
if !found {
calls = make([]*values.Object, 0, 10)
m.Args[eventName] = calls
}
m.Args[eventName] = append(calls, opts)
return m.subscribers[eventName]
}
func TestWaitForEventExpression(t *testing.T) {
Convey("Should create a return expression", t, func() {
variable, err := expressions.NewVariableExpression(core.NewSourceMap("test", 1, 10), "test")
So(err, ShouldBeNil)
sourceMap := core.NewSourceMap("test", 2, 10)
expression, err := expressions.NewWaitForEventExpression(
sourceMap,
literals.NewStringLiteral("test"),
variable,
nil,
nil,
)
So(err, ShouldBeNil)
So(expression, ShouldNotBeNil)
})
Convey("Should wait for an event", t, func() {
mock := NewMockedObservable()
eventName := "foobar"
variable, err := expressions.NewVariableExpression(
core.NewSourceMap("test", 1, 10),
"observable",
)
So(err, ShouldBeNil)
sourceMap := core.NewSourceMap("test", 2, 10)
expression, err := expressions.NewWaitForEventExpression(
sourceMap,
literals.NewStringLiteral(eventName),
variable,
nil,
nil,
)
So(err, ShouldBeNil)
scope, _ := core.NewRootScope()
So(scope.SetVariable("observable", mock), ShouldBeNil)
mock.Emit(eventName, values.None, nil, 100)
_, err = expression.Exec(context.Background(), scope)
So(err, ShouldBeNil)
})
Convey("Should receive opts", t, func() {
mock := NewMockedObservable()
eventName := "foobar"
variable, err := expressions.NewVariableExpression(
core.NewSourceMap("test", 1, 10),
"observable",
)
So(err, ShouldBeNil)
prop, err := literals.NewObjectPropertyAssignment(
literals.NewStringLiteral("value"),
literals.NewStringLiteral("bar"),
)
So(err, ShouldBeNil)
sourceMap := core.NewSourceMap("test", 2, 10)
expression, err := expressions.NewWaitForEventExpression(
sourceMap,
literals.NewStringLiteral(eventName),
variable,
literals.NewObjectLiteralWith(prop),
nil,
)
So(err, ShouldBeNil)
scope, _ := core.NewRootScope()
So(scope.SetVariable("observable", mock), ShouldBeNil)
mock.Emit(eventName, values.None, nil, 100)
_, err = expression.Exec(context.Background(), scope)
So(err, ShouldBeNil)
opts := mock.Args[eventName][0]
So(opts, ShouldNotBeNil)
})
Convey("Should return event arg", t, func() {
mock := NewMockedObservable()
eventName := "foobar"
variable, err := expressions.NewVariableExpression(
core.NewSourceMap("test", 1, 10),
"observable",
)
So(err, ShouldBeNil)
sourceMap := core.NewSourceMap("test", 2, 10)
expression, err := expressions.NewWaitForEventExpression(
sourceMap,
literals.NewStringLiteral(eventName),
variable,
nil,
nil,
)
So(err, ShouldBeNil)
scope, _ := core.NewRootScope()
So(scope.SetVariable("observable", mock), ShouldBeNil)
arg := values.NewString("foo")
mock.Emit(eventName, arg, nil, 100)
out, err := expression.Exec(context.Background(), scope)
So(err, ShouldBeNil)
So(out.String(), ShouldEqual, arg.String())
})
Convey("Should timeout", t, func() {
mock := NewMockedObservable()
eventName := "foobar"
variable, err := expressions.NewVariableExpression(
core.NewSourceMap("test", 1, 10),
"observable",
)
So(err, ShouldBeNil)
sourceMap := core.NewSourceMap("test", 2, 10)
expression, err := expressions.NewWaitForEventExpression(
sourceMap,
literals.NewStringLiteral(eventName),
variable,
nil,
nil,
)
So(err, ShouldBeNil)
scope, _ := core.NewRootScope()
So(scope.SetVariable("observable", mock), ShouldBeNil)
_, err = expression.Exec(context.Background(), scope)
So(err, ShouldNotBeNil)
})
}