menu-traversals #108
141
internal/handlers/ussd/menu_traversal_test.go
Normal file
141
internal/handlers/ussd/menu_traversal_test.go
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
package ussd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"path"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.defalsify.org/vise.git/db"
|
||||||
|
fsdb "git.defalsify.org/vise.git/db/fs"
|
||||||
|
"git.defalsify.org/vise.git/engine"
|
||||||
|
"git.defalsify.org/vise.git/persist"
|
||||||
|
"git.defalsify.org/vise.git/resource"
|
||||||
|
"git.grassecon.net/urdt/ussd/internal/storage"
|
||||||
|
"git.grassecon.net/urdt/ussd/testdata"
|
||||||
|
testdataloader "github.com/peteole/testdata-loader"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
dataGenerated bool = false
|
||||||
|
dataDir string = testdata.DataDir
|
||||||
|
BaseDir = testdataloader.GetBasePath()
|
||||||
|
)
|
||||||
|
|
||||||
|
type testWrapper struct {
|
||||||
|
resource.Resource
|
||||||
|
db db.Db
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateTestData(t *testing.T) {
|
||||||
|
if dataGenerated {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
dataDir, err = testdata.Generate()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTestWrapper(path string) testWrapper {
|
||||||
|
ctx := context.Background()
|
||||||
|
store := fsdb.NewFsDb()
|
||||||
|
store.Connect(ctx, path)
|
||||||
|
rs := resource.NewDbResource(store)
|
||||||
|
rs.With(db.DATATYPE_STATICLOAD)
|
||||||
|
wr := testWrapper{
|
||||||
|
rs,
|
||||||
|
store,
|
||||||
|
}
|
||||||
|
rs.AddLocalFunc("quit", quit)
|
||||||
|
|
||||||
|
return wr
|
||||||
|
}
|
||||||
|
|
||||||
|
func quit(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
|
return resource.Result{
|
||||||
|
Content: "Thank you for using Sarafu network",
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTerms(t *testing.T) {
|
||||||
|
generateTestData(t)
|
||||||
|
ctx := context.Background()
|
||||||
|
rs := newTestWrapper(dataDir)
|
||||||
|
cfg := engine.Config{
|
||||||
|
Root: "terms",
|
||||||
|
FlagCount: uint32(9),
|
||||||
|
}
|
||||||
|
store := storage.NewThreadGdbmDb()
|
||||||
|
storeFile := path.Join(baseDir, "state.gdbm")
|
||||||
|
err := store.Connect(ctx, storeFile)
|
||||||
|
if err != nil {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
pr := persist.NewPersister(store)
|
||||||
|
en := engine.NewEngine(cfg, &rs)
|
||||||
|
en.WithPersister(pr)
|
||||||
|
if pr.GetState() == nil || pr.GetMemory() == nil {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
_, err = en.Exec(ctx, []byte{})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
w := bytes.NewBuffer(nil)
|
||||||
|
_, err = en.Flush(ctx, w)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
b := w.Bytes()
|
||||||
|
|
||||||
|
expect_str := `Do you agree to terms and conditions?
|
||||||
|
1:yes
|
||||||
|
2:no`
|
||||||
|
|
||||||
|
if !bytes.Equal(b, []byte(expect_str)) {
|
||||||
|
t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", expect_str, b)
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
expectedSymbol string
|
||||||
|
input []byte
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Test accept terms option(yes)",
|
||||||
|
expectedSymbol: "create_pin",
|
||||||
|
input: []byte("1"),
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// name: "Test reject terms option(no)",
|
||||||
|
// input: []byte("2"),
|
||||||
|
// expectedSymbol: "quit",
|
||||||
|
// },
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
_, err = en.Exec(ctx, tt.input)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
w := bytes.NewBuffer(nil)
|
||||||
|
_, err = en.Flush(ctx, w)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
b = w.Bytes()
|
||||||
|
fmt.Println("result", string(b))
|
||||||
|
symbol, _ := pr.State.Where()
|
||||||
|
|
||||||
|
if symbol != tt.expectedSymbol {
|
||||||
|
t.Fatalf("expected symbol to be 'create_pin', got %s", symbol)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
0
testdata/main.vis
vendored
Normal file
0
testdata/main.vis
vendored
Normal file
119
testdata/testdata.go
vendored
Normal file
119
testdata/testdata.go
vendored
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
package testdata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"git.defalsify.org/vise.git/db"
|
||||||
|
fsdb "git.defalsify.org/vise.git/db/fs"
|
||||||
|
"git.defalsify.org/vise.git/logging"
|
||||||
|
"git.defalsify.org/vise.git/vm"
|
||||||
|
testdataloader "github.com/peteole/testdata-loader"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func outNew(sym string, b []byte, tpl string, data map[string]string) error {
|
||||||
|
logg.Debugf("testdata out", "sym", sym)
|
||||||
|
store.SetPrefix(db.DATATYPE_TEMPLATE)
|
||||||
|
err := store.Put(ctx, []byte(sym), []byte(tpl))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
store.SetPrefix(db.DATATYPE_BIN)
|
||||||
|
err = store.Put(ctx, []byte(sym), b)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
store.SetPrefix(db.DATATYPE_STATICLOAD)
|
||||||
|
for k, v := range data {
|
||||||
|
logg.Debugf("testdata out staticload", "sym", sym, "k", k, "v", v)
|
||||||
|
err = store.Put(ctx, []byte(k), []byte(v))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ctx = context.Background()
|
||||||
|
store = fsdb.NewFsDb()
|
||||||
|
out = outNew
|
||||||
|
logg = logging.NewVanilla().WithDomain("testdata")
|
||||||
|
BaseDir = testdataloader.GetBasePath()
|
||||||
|
DataDir = ""
|
||||||
|
dirLock = false
|
||||||
|
)
|
||||||
|
|
||||||
|
type genFunc func() error
|
||||||
|
|
||||||
|
func terms() error {
|
||||||
|
b := []byte{}
|
||||||
|
b = vm.NewLine(b, vm.MOUT, []string{"yes", "1"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.MOUT, []string{"no", "2"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.HALT, nil, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.INCMP, []string{"create_pin", "1"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.INCMP, []string{"quit", "2"}, nil, nil)
|
||||||
|
tpl := "Do you agree to terms and conditions?"
|
||||||
|
return out("terms", b, tpl, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func createPin() error {
|
||||||
|
b := []byte{}
|
||||||
|
b = vm.NewLine(b, vm.MOUT, []string{"exit", "0"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.HALT, nil, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.INCMP, []string{"0", "1"}, nil, nil)
|
||||||
|
tpl := "create pin"
|
||||||
|
return out("create_pin", b, tpl, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func quit() error {
|
||||||
|
// b := []byte{}
|
||||||
|
// b = vm.NewLine(b, vm.LOAD, []string{"quit"}, []byte{0x00}, nil)
|
||||||
|
// //b = vm.NewLine(b, vm.RELOAD, []string{"quit"}, []byte{0x00}, nil)
|
||||||
|
// b = vm.NewLine(b, vm.HALT, nil, nil, nil)
|
||||||
|
|
||||||
|
// return out("quit", b, "quit", nil)
|
||||||
|
b := vm.NewLine(nil, vm.LOAD, []string{"quit"}, []byte{0x00}, nil)
|
||||||
|
b = vm.NewLine(b, vm.RELOAD, []string{"quit"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.HALT, nil, nil, nil)
|
||||||
|
|
||||||
|
fp := path.Join(DataDir, "nothing.bin")
|
||||||
|
err := os.WriteFile(fp, b, 0600)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func generate() error {
|
||||||
|
err := os.MkdirAll(DataDir, 0755)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
store = fsdb.NewFsDb()
|
||||||
|
store.Connect(ctx, DataDir)
|
||||||
|
store.SetLock(db.DATATYPE_TEMPLATE, false)
|
||||||
|
store.SetLock(db.DATATYPE_BIN, false)
|
||||||
|
store.SetLock(db.DATATYPE_MENU, false)
|
||||||
|
store.SetLock(db.DATATYPE_STATICLOAD, false)
|
||||||
|
|
||||||
|
fns := []genFunc{terms, createPin, quit}
|
||||||
|
for _, fn := range fns {
|
||||||
|
err = fn()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Generate() (string, error) {
|
||||||
|
dir, err := ioutil.TempDir("", "vise_testdata_")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
DataDir = dir
|
||||||
|
dirLock = true
|
||||||
|
err = generate()
|
||||||
|
return dir, err
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user