menu-traversals #108
88
enginetest/engine.go
Normal file
88
enginetest/engine.go
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
package enginetest
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
|
||||||
|
"git.defalsify.org/vise.git/engine"
|
||||||
|
"git.defalsify.org/vise.git/logging"
|
||||||
|
"git.defalsify.org/vise.git/persist"
|
||||||
|
"git.defalsify.org/vise.git/resource"
|
||||||
|
"git.grassecon.net/urdt/ussd/internal/handlers"
|
||||||
|
"git.grassecon.net/urdt/ussd/internal/storage"
|
||||||
|
)
|
||||||
|
var (
|
||||||
|
logg = logging.NewVanilla()
|
||||||
|
scriptDir = path.Join("services", "registration")
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestEngine(sessionId string) (engine.Engine,*persist.Persister){
|
||||||
|
ctx := context.Background()
|
||||||
|
ctx = context.WithValue(ctx, "SessionId", sessionId)
|
||||||
|
pfp := path.Join(scriptDir, "pp.csv")
|
||||||
|
|
||||||
|
cfg := engine.Config{
|
||||||
|
Root: "root",
|
||||||
|
SessionId: sessionId,
|
||||||
|
OutputSize: uint32(106),
|
||||||
|
FlagCount: uint32(16),
|
||||||
|
}
|
||||||
|
|
||||||
|
dbDir := ".test_state"
|
||||||
|
resourceDir := scriptDir
|
||||||
|
menuStorageService := storage.NewMenuStorageService(dbDir, resourceDir)
|
||||||
|
|
||||||
|
err := menuStorageService.EnsureDbDir()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
rs, err := menuStorageService.GetResource(ctx)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
pe, err := menuStorageService.GetPersister(ctx)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
userdatastore, err := menuStorageService.GetUserdataDb(ctx)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
dbResource, ok := rs.(*resource.DbResource)
|
||||||
|
if !ok {
|
||||||
|
fmt.Fprintf(os.Stderr, err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
lhs, err := handlers.NewLocalHandlerService(pfp, true, dbResource, cfg, rs)
|
||||||
|
lhs.SetDataStore(&userdatastore)
|
||||||
|
lhs.SetPersister(pe)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
hl, err := lhs.GetHandler()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
en := lhs.GetEngine()
|
||||||
|
en = en.WithFirst(hl.Init)
|
||||||
|
|
||||||
|
//en = en.WithDebug(nil)
|
||||||
|
return en,pe
|
||||||
|
|
||||||
|
}
|
@ -1,141 +0,0 @@
|
|||||||
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)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
61
menu_traversal_test.go
Normal file
61
menu_traversal_test.go
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.defalsify.org/vise.git/engine"
|
||||||
|
|
||||||
|
"git.grassecon.net/urdt/ussd/enginetest"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TestCase struct {
|
||||||
|
Input []string `json:"input"`
|
||||||
|
Expected string `json:"expected"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserRegistration struct {
|
||||||
|
UserRegistration []TestCase `json:"user_registration"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type TestData struct {
|
||||||
|
UserRegistration []TestCase `json:"user_registration"`
|
||||||
|
PinCheck []TestCase `json:"pincheck"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUserRegistration(t *testing.T) {
|
||||||
|
en, pe := enginetest.TestEngine("session1234112")
|
||||||
|
w := bytes.NewBuffer(nil)
|
||||||
|
file, err := os.Open("test_data.json")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error opening file:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
var testData TestData
|
||||||
|
decoder := json.NewDecoder(file)
|
||||||
|
if err := decoder.Decode(&testData); err != nil {
|
||||||
|
fmt.Println("Error decoding JSON:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var inputBuilder strings.Builder
|
||||||
|
for _, testCase := range testData.UserRegistration {
|
||||||
|
inputBuilder.WriteString(strings.Join(testCase.Input, "\n") + "\n")
|
||||||
|
}
|
||||||
|
readers := bufio.NewReader(strings.NewReader(inputBuilder.String()))
|
||||||
|
engine.Loop(context.Background(), en, readers, w, nil)
|
||||||
|
st := pe.GetState()
|
||||||
|
sym, _ := st.Where()
|
||||||
|
b := w.Bytes()
|
||||||
|
fmt.Println("Menu:",string(b))
|
||||||
|
fmt.Println("Rendering symbol:", sym)
|
||||||
|
|
||||||
|
}
|
18
test_data.json
Normal file
18
test_data.json
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"user_registration": [
|
||||||
|
{
|
||||||
|
"input": ["0", "0","1234","1234"],
|
||||||
|
"expected": "Registration successful"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pincheck": [
|
||||||
|
{
|
||||||
|
"input": ["1234"],
|
||||||
|
"expected": "PIN valid"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": ["5678"],
|
||||||
|
"expected": "PIN invalid"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
5
testdata/testdata.go
vendored
5
testdata/testdata.go
vendored
@ -4,7 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
|
||||||
"git.defalsify.org/vise.git/db"
|
"git.defalsify.org/vise.git/db"
|
||||||
fsdb "git.defalsify.org/vise.git/db/fs"
|
fsdb "git.defalsify.org/vise.git/db/fs"
|
||||||
"git.defalsify.org/vise.git/logging"
|
"git.defalsify.org/vise.git/logging"
|
||||||
@ -12,8 +13,6 @@ import (
|
|||||||
testdataloader "github.com/peteole/testdata-loader"
|
testdataloader "github.com/peteole/testdata-loader"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func outNew(sym string, b []byte, tpl string, data map[string]string) error {
|
func outNew(sym string, b []byte, tpl string, data map[string]string) error {
|
||||||
logg.Debugf("testdata out", "sym", sym)
|
logg.Debugf("testdata out", "sym", sym)
|
||||||
store.SetPrefix(db.DATATYPE_TEMPLATE)
|
store.SetPrefix(db.DATATYPE_TEMPLATE)
|
||||||
|
Loading…
Reference in New Issue
Block a user